海思3559 yolov5模型转wk详细笔记

news2024/11/24 15:35:36

文章目录

  • 前言
  • 1.编译caffer
    • 1.1安装虚拟机
    • 1.2安装caffer
    • 1.3编译python接口
  • 2.适应wk的yolov5模型训练
    • 2.1下载yolov5-6.0项目源码
    • 2.2安装yolov5-6.0运行环境
    • 2.3修改模型
    • 2.4修改数据集
    • 2.5修改模型算子
    • 2.6 模型训练
  • 3.模型转换:pt->onnx->caffe->wk
    • 3.1 pt->onnx
    • 3.2 onnx->caffe
    • 3.4 caffe->wk
  • 总结


前言

目前项目需要在海思3559上开发,但查了相关文档,感觉还是比较复杂的。相比于3403、3519的使用atc工具直接从onnx->om,3559需要从onnx->caffer->wk则显得复杂许多,特此记录一下。
下面先给笔者自己在此过程中的架构与各架构的主要任务框图:
在这里插入图片描述


1.编译caffer

1.1安装虚拟机

笔者使用的是VM安装的Ubuntu18.04
这里关于安装虚拟机与换源等操作不再赘述,默认读者都已经准备完成了。

1.2安装caffer

安装依赖库

sudo apt-get update
sudo apt-get install libprotobuf-dev
sudo apt-get install libleveldb-dev
sudo apt-get install libsnappy-dev
sudo apt-get install libopencv-dev
sudo apt-get install libhdf5-serial-dev
sudo apt-get install protobuf-compiler
sudo apt-get install libgflags-dev
sudo apt-get install libgoogle-glog-dev
sudo apt-get install liblmdb-dev
sudo apt-get install libatlas-base-dev
sudo apt-get install --no-install-recommends libboost-all-dev

下载项目源码
由于笔者虚拟机上没梯子,就用zip包的方式下载源码。
下载caffer源码
https://github.com/BVLC/caffe/tags
在这里插入图片描述
下载caffe-plus工程
https://github.com/jnulzl/caffe_plus
在这里插入图片描述
将以上两份zip源码分别解压为caffer与caffe-plus。

添加upsample层和transpose层

将caffe_plus/include/caffe/layers/upsample_layer.hpp
caffe_plus/include/caffe/layers/permute_layer.hpp
复制到caffe/include/caffe/layers/

将caffe_plus/src/caffe/layers/upsample_layer.cpp
caffe_plus/src/caffe/layers/upsample_layer.cu
caffe_plus/src/caffe/layers/permute_layer.cpp
caffe_plus/src/caffe/layers/permute_layer.cu
复制到caffe/src/caffe/layers/

修改caffe.proto文件

gedit caffe/src/caffe/proto/caffe.proto
在optional WindowDataParameter window_data_param = 129;(约第407行)后增加代码:
optional PermuteParameter permute_param = 150;
optional UpsampleParameter upsample_param = 151;

在这里插入图片描述

在末尾增加代码:
message PermuteParameter {
// The new orders of the axes of data. Notice it should be with
// in the same range as the input data, and it starts from 0.
// Do not provide repeated order.
repeated uint32 order = 1;
}
message UpsampleParameter {
optional int32 height = 1 [default = 32];
optional int32 width = 2 [default = 32];
optional int32 height_scale = 3 [default = 2];
optional int32 width_scale = 4 [default = 2];
enum UpsampleOp {
NEAREST = 0;
BILINEAR = 1;
}
optional UpsampleOp mode = 5 [default = BILINEAR];
}

在这里插入图片描述

配置Makefike.config

//进入caffe目录
cd caffe
//备份配置文件
cp Makefike.config.example Makefike.config 
//打开配置文件
gedit Makefile.config

去掉CPU_ONLY前面的#号注释,使得CPU_ONLY := 1

在这里插入图片描述

找到INCLUDE_DIRS 其后面新增内容 /usr/include/hdf5/serial/usr/include
找到LIBRARY_DIRS 其后面新增内容 /usr/lib/x86_64-linux-gnu/hdf5/serial/usr/lib/x86_64-linux-gnu,删除/usr/local/lib
这里的新增/usr/include/usr/lib/x86_64-linux-gnu与删除/usr/local/lib为opencv的配置,需要根据自己的时间情况进行修改,保证能找到对应版本的opencv就行。

在这里插入图片描述

执行编译

make all
make test
make runtest

在这里插入图片描述
安装完成没有报错,全绿说明caffe安装成功,如果其中一项发生错误,make clean重新编译即可。

1.3编译python接口

Ubuntu18.04安装的是python2.7(python)与python3.6(python3),以下操作都是在python2.7下进行的。
先安装pip与fortran

sudo apt install python-pip
sudo apt-get install gfortran
pip install --upgrade pip==20.3.4

打开caffer/python/requirements.txt
将python-dateutil>=1.4,<2
修改为
python-dateutil

在这里插入图片描述
逐行读取requirements.txt进行 pip install

pip install -r requirements.txt

由于需要进行onnx->caffe的操作,所以需要安装onnx包,这里推荐安装1.9.0版本

pip install onnx==1.9.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

将caffe根目录下的python文件所在路径加入到全局环境变量

vim ~/.bashrc

在末尾添加一句:

export PYTHONPATH=/home/lh/data/3559/caffe/python:$PYTHONPATH

路径需根据自己的实际情况修改。
在这里插入图片描述
保存后,并使其生效:

source ~/.bashrc

打开caffer目录下的Makefile.config,找到文件中的PYTHON_INCLUDE

查看python2.7路径是否与实际一致,不一致则需要修改,笔者这里需要修改。
在这里插入图片描述

保存关闭后执行

make pycaffe

输出以下信息表示编译python接口成功:

PROTOC (python) src/caffe/proto/caffe.proto

验证python接口

python
import caffe

在这里插入图片描述
导入caffe模块不报错,则表示安装成功。

2.适应wk的yolov5模型训练

2.1下载yolov5-6.0项目源码

https://github.com/ultralytics/yolov5/tags

在这里插入图片描述

2.2安装yolov5-6.0运行环境

参考之前写的文章:https://blog.csdn.net/JulyLi2019/article/details/111666353

2.3修改模型

打开yolov5-6.0项目工程,将models目录下新建一个yolov5s_hs.yaml:

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license# Parameters
 nc: 80  # number of classes
 depth_multiple: 0.33  # model depth multiple
 width_multiple: 0.50  # layer channel multiple
 anchors:
   - [10,13, 16,30, 33,23]  # P3/8
   - [30,61, 62,45, 59,119]  # P4/16
   - [116,90, 156,198, 373,326]  # P5/32# YOLOv5 v6.0 backbone
 backbone:
   # [from, number, module, args]
   [[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2
    [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
    [-1, 3, C3, [128]],
    [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
    [-1, 6, C3, [256]],
    [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
    [-1, 9, C3, [512]],
    [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
    [-1, 3, C3, [1024]],
    [-1, 1, SPPF, [1024, 5]],  # 9
   ]# YOLOv5 v6.0 head
 head:
   [[-1, 1, Conv, [512, 1, 1]],
   # [-1, 1, nn.Upsample, [None, 2, 'nearest']],
    [ -1, -1, nn.ConvTranspose2d,[ 256, 256, 2, 2 ] ],
    [[-1, 6], 1, Concat, [1]],  # cat backbone P4
    [-1, 3, C3, [512, False]],  # 13[-1, 1, Conv, [256, 1, 1]],
    #[-1, 1, nn.Upsample, [None, 2, 'nearest']],
    [ -1, -1, nn.ConvTranspose2d,[ 128, 128, 2, 2 ] ],
    [[-1, 4], 1, Concat, [1]],  # cat backbone P3
    [-1, 3, C3, [256, False]],  # 17 (P3/8-small)[-1, 1, Conv, [256, 3, 2]],
    [[-1, 14], 1, Concat, [1]],  # cat head P4
    [-1, 3, C3, [512, False]],  # 20 (P4/16-medium)[-1, 1, Conv, [512, 3, 2]],
    [[-1, 10], 1, Concat, [1]],  # cat head P5
    [-1, 3, C3, [1024, False]],  # 23 (P5/32-large)[[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
   ]

这里主要是将上采样层换成了反卷积层,以适应HISI3559平台。

2.4修改数据集

打开yolov5-6.0项目工程,将data目录下新建一个hs.yaml:

# COCO 2017 dataset http://cocodataset.org
# Train command: python train.py --data coco.yaml
# Default dataset location is next to /yolov5:
#   /parent_folder
#     /coco
#     /yolov5


# download command/URL (optional)
# download: bash data/scripts/get_coco.sh

# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: /data/20220221_yolov5_train.txt  # 118287 images
val: /data/20210122_torchssd_test.txt  # 5000 images
# test: /data/devin/data/head_shoulder/yolo_data/20210122_torchssd_test.txt  # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794

# number of classes
nc: 2

# class names
names: [ 'person', 'car' ]

# Print classes
# with open('data/coco.yaml') as f:
#   d = yaml.load(f, Loader=yaml.FullLoader)  # dict
#   for i, x in enumerate(d['names']):
#     print(i, x)

这里根据自己的数据情况进行修改。

2.5修改模型算子

打开yolov5-6.0项目工程,将models目录下common.py中Conv类的激活函数SiLU->ReLU:
此处修改,是因为之前使用的海思的某款芯片对sigmoid激活函数支持不友好,推理很慢,留下了心理阴影,所以采用relu激活函数代替,有时间的同学,也可以不更改尝试一下。
在这里插入图片描述

2.6 模型训练

进入yolov5的anaconda环境并cd项目根目录,运行:

python3 train.py --data hs.yaml --cfg yolov5s_hs.yaml

在这里插入图片描述
会生成对应的pt模型。

3.模型转换:pt->onnx->caffe->wk

3.1 pt->onnx

训练好的模型在yolov5工程中的、/runs/train/exp/weights/目录下执行:

python3 export.py --data hs.yaml --weights runs/train/exp/weights/best.pt --batch 1 --img 640 640 --train --simplify --include onnx --opset 10

将会在runs/train/exp/weights目录下生成一个best.onnx文件。
这里需要注意一下,默认转出来的onnx,名称是是含有“.”这个特殊字符的,如果不修正,会在后续caffe->wk转换中出错。
因此需要修改下模型的输入输出的名称:

# -*- coding: UTF-8 -*- 
import onnx

# 加载模型文件
model = onnx.load("/home/work/yolov5-6.0/runs/train/exp/weights/best.onnx")

# 修改图输入张量名称中的点
for input in model.graph.input:
    input.name = input.name.replace('.', '_')

# 修改图输出张量名称中的点
for output in model.graph.output:
    output.name = output.name.replace('.', '_')

# 保存修改后的模型
onnx.save(model, "modified_model.onnx")
print("finish")

在这里插入图片描述

3.2 onnx->caffe

获取yolov5_onnx2caffe项目:https://github.com/Wulingtian/yolov5_onnx2caffe
在这里插入图片描述
下载zip包后解压到虚拟机上,打开convertCaffe.py文件,将上一步生成的onnx文件copy到虚拟机上,根据自己实际的模型名称进行修改。
在这里插入图片描述
由于convertCaffe.py、onnx2caffe/_operators.py、onnx2caffe/_weightloader.py这个三个文件中含有中文注释,需要其文件的加上

# -*- coding: UTF-8 -*- 

在这里插入图片描述
之后,yolov5_onnx2caffe目录下,运行:

python converCaffe

在这里插入图片描述

出现以上信息则说明onnx->caffe成功,将生成的.caffemodel和.prototxt文件copy到windows上,进行下一步操作。

3.4 caffe->wk

下载安装RuyiStudio:https://repo.harmonyos.com/#/cn/bundles/@huawei%2Fruyistudio/v/2.0.42
在这里插入图片描述
解压,直接运行exe
在这里插入图片描述
创建NNIE工程
在这里插入图片描述
设置名称、选择Empty Project、Cross GCC,点击Next;
在这里插入图片描述
默认操作,点击Next;
在这里插入图片描述
默认操作,点击Finish;
在这里插入图片描述
打开项目下的cfg文件,加载prototxt文件后进行如下Edit配置:
删除最后的三个Transpose层;
修改后面的三个Reshape层,第一个dim改为0,删除第五个dim,第四个dim改为dim的平方。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

其他参数参考一下配置:

在这里插入图片描述
配置完成后保存运行:
在这里插入图片描述
成功后log如下:
在这里插入图片描述
生成wk文件:
在这里插入图片描述
至此,模型转换整个流程就完成了。


总结

海思3559是早些年的芯片,因此在模型转换的方式上相比于3403、3519的使用atc工具直接从onnx->om,3559需要从onnx->caffer->wk则显得稍显复杂。本文记录了yolov5模型由pt->onnx->caffe->wk的过程,希望对读者有所帮助。
后续工作就是要把转换好的wk模型在板端部署了,继续加油咯!!!

参考文档:
https://blog.csdn.net/m0_51714298/article/details/127513820
https://github.com/BVLC/caffe
https://github.com/jnulzl/caffe_plus
https://github.com/Wulingtian/yolov5_onnx2caffe
https://github.com/JimmyLauren/yolo5_caffe_hisi3559?tab=readme-ov-file
https://www.codenong.com/cs106856166/

如果阅读本文对你有用,欢迎关注点赞留言收藏呀!!!
2024年1月18日17:06:42
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1394007.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker安装Nginx并部署MySQL容器构建

一.MySQL容器的构建 1.创建MySQL根目录及配置文件夹&data文件夹 mkdir -p mysql/{conf,data} 2.上传配置文件 将配置文件上传到conf文件夹&#xff08;数据库配置文件已放到置顶资源中&#xff09; 3.命令构建MySQL容器 /soft/mysql/conf/my.cnf:/etc/my.cnf目录为我们…

如何安装配置VisualSVN服务并实现公网访问本地服务【内网穿透】

文章目录 前言1. VisualSVN安装与配置2. VisualSVN Server管理界面配置3. 安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4. 固定公网地址访问 前言 SVN 是 subversion 的缩写&#xff0c;是一个开放源代码的版本控制系统…

STM32入门教程-2023版【4-1】OLED调试工具

关注 点赞 不错过精彩内容 大家好&#xff0c;我是硬核王同学&#xff0c;最近在做免费的嵌入式知识分享&#xff0c;帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作! 一、概述 在这一节先提前介绍一下&#xff0c;在以后的教程中我们会经常用到这个显示屏&#xff0…

javaScript设计模式-工厂

它的好处是消除对象间的耦合度&#xff0c;在派生子类时提供了更大的灵活性。但盲目的把普通的构造函数扔在一边&#xff0c;并不值得提倡。如果要采一不可能另外换用一个类&#xff0c;或都不需要在运行期间在一系列可互换的类中进行选择&#xff0c;就不应该使用。这样在后期…

中仕公考:国考进面后资格复审需要准备什么?

参加国考面试的考生在资格审核阶段需要准备以下材料&#xff1a; 1、本人身份证、学生证或工作证复印件。 2、公共科目笔试准考证复印件。 3、考试报名登记表。 4、本(专)科、研究生各阶段学历、学位证书(应届毕业生没有可以暂时不提供)。 5、报名资料上填写的各类证书材料…

页面数据类型为json,后端接受json数据

项目结构 依赖pom.xml <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.8.RELEASE</version></dependency><dependency><groupId>org.springframework…

一些面试会问到的奇怪问题与面试总结

1.v-for、v-if先后顺序。 官方不建议一起使用&#xff0c;但是有时候面试的时候会问到。 在vue2中是v-for先与v-if的。 源码js编译结果&#xff1a; _c()就是vm.$createElement()&#xff0c;意思是创建一个虚拟的element&#xff0c;就是返回值是VNode。 _l就是renderlist…

C#,入门教程(18)——分支语句(switch-case)的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(17)——条件语句&#xff08;if-else&#xff09;的基础知识https://blog.csdn.net/beijinghorn/article/details/124033376 1、switch概述 switch-case分支语句 可以理解为 大号 的 if-else。 switch语句以switch关键字开头&…

redis7部署集群:包含主从模式、哨兵模式、Cluster集群模式等三种模式

前言&#xff1a; redis部署集群常见的一般有三种模式&#xff1a;主从模式&#xff0c;Sentinel&#xff08;哨兵模式&#xff09;&#xff0c;Redis Cluster&#xff08;高可用Cluster集群&#xff09;&#xff0c;根据不同的需求可自定义选择部署方式。 Redis 主从模式&…

2.【Linux】(进程的状态||深入理解fork||底层剖析||task_struct||进程优先级||并行和并发||详解环境变量)

一.进程 1.进程调度 Linux把所有进程通过双向链表的方式连接起来组成任务队列&#xff0c;操作系统和cpu通过选择一个task_struct执行其代码来调度进程。 2.进程的状态 1.运行态&#xff1a;pcb结构体在运行或在运行队列中排队。 2.阻塞态&#xff1a;等待非cpu资源就绪&am…

工厂企业消防安全AI可视化视频智能监管解决方案

一、方案背景 2023年11月20日下午6时30分许&#xff0c;位于江苏省无锡市惠山区前洲街道的某公司突发严重火灾&#xff0c;共造成7人死亡。这次火灾提醒我们工业安全至关重要&#xff0c;企业都应该时刻保持警惕&#xff0c;加强安全意识和培训&#xff0c;提高应对突发事件的…

RK3568驱动指南|驱动基础进阶篇-进阶8 内核运行ko文件总结

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

DrGraph原理示教 - OpenCV 4 功能 - 形态操作

形态类型 从OpenCV图像处理基本知识来看&#xff0c;膨胀腐蚀操作后&#xff0c;还有形态操作&#xff0c;如开运算、闭运算、梯度、礼帽与黑帽&#xff0c;感觉很多&#xff0c;其实&#xff0c;本质上就是批处理操作&#xff0c;如 开运算&#xff1a;先腐蚀&#xff0c;再膨…

【不用找素材】ECS 游戏Demo制作教程(3) 1.17

一、生成墓碑 新建脚本如下&#xff1a; using Unity.Entities; using Unity.Mathematics;namespace ECSdemo {public struct GraveyardRandom : IComponentData{public Random Value;}}扩充GraveyardMono如下&#xff1a; using Unity.Entities; using Unity.Mathematics; …

AVL树 -- C++实现

AVL树 – C实现 1. AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1…

MySQL表的基本插入查询操作详解

博学而笃志&#xff0c;切问而近思 文章目录 插入插入更新 替换查询全列查询指定列查询查询字段为表达式查询结果指定别名查询结果去重 WHERE 条件基本比较逻辑运算符使用LIKE进行模糊匹配使用IN进行多个值匹配 排序筛选分页结果更新数据删除数据截断表聚合函数COUNTSUMAVGMAXM…

黑马Java——字符串

1.API 1.1API概述 什么是API API (Application Programming Interface) &#xff1a;应用程序编程接口 简单理解&#xff1a;API就是别人已经写好的东西&#xff0c;我们不需要自己编写&#xff0c;直接使用即可 JavaAPI: 指的就是 JDK 中提供的各种功能的 Java类&#xff…

网络编程【1】

【 1 】什么是网络编程 网络编程是指通过计算机网络进行数据交换和通信的编程过程。它涉及到使用网络协议和通信接口&#xff0c;使不同计算机之间能够进行数据传输和通信。 总结&#xff1a; 网络编程的研究前提就是基于互联网 网络编程就是基于互联网写代码 【 2 】为什么…

数字孪生时代,一起探索云端建模的无限潜能

在当今数字孪生时代&#xff0c;云端建模作为一项创新技术正迅速崭露头角。它基于云计算和大数据处理的优势&#xff0c;以及先进的三维建模技术&#xff0c;开启了建筑设计、城市规划和工程领域的全新时代。云端建模不仅实现了高效的数据处理和计算能力&#xff0c;还提供了无…

如何在苹果手机上进行文件管理

摘要 苹果手机没有像安卓系统那样内置文件管理器&#xff0c;但是可以通过使用克魔开发助手来实现强大的文件管理功能。本文介绍了如何使用克魔开发助手在电脑上管理和传输苹果手机的文件。 引言 很多朋友都在使用苹果手机&#xff0c;但是当需要查看手机中的文件时&#xf…