一、YOLOv5
YOLOv5作为单阶段检测框架的集大成者,凭借其卓越的实时性、高精度和易用性,已成为工业界实际部署的首选方案。yolov5的最新版本是7.0,该版本是官方最后更新的一个版本。yolov5-7.0
工程化实现卓越:基于PyTorch框架构建,支持动态图机制与ONNX生态的无缝对接
模型轻量化设计:提供n/s/m/l/x五种参数量级,满足不同算力场景需求
数据增强策略完善:集成Mosaic、MixUp等先进增强方法
部署友好性突出:支持TensorRT、OpenVINO等主流推理框架
持续迭代能力:官方维护团队保持每月更新频率,2023年新增实例分割扩展功能
二、模型转换流程
2.1 整体转换流程图
2.2 PyTorch转ONNX
使用yolov5项目根目录下的export.py完成转化,主要涉及到以下参数的设置:
--weights #修改为yolov5s.pt文件的路径
--imgsz #修改为想要转化的模型输入尺寸
--device #设置为CPU
--opset #onnx的版本,设置为12
2.3 ONNX到Caffe1.0转换
转化流程中,最麻烦的就是onnx转caffe1.0了。由于Hi3516DV300的工具链仅支持Caffe1.0,所以,许多算子、层结构都不支持。
比较流行的做法是使用,yolov5_onnx2caffe这个开源项目的脚本进行转化。yolov5_onnx2caffe
按照项目的要求,完成环境安装后,运行convertCaffe.py即可完成onnx转caffe的步骤。参数设置如下:
if __name__ == "__main__":
onnx_path = "./weights/yolov5s.onnx" #onnx的路径
prototxt_path = "yolov5s.prototxt" #输出prototxt路径
caffemodel_path = "yolov5s.caffemodel" #输出caffemodel路径
#onnx_path = "/home/willer/nanodet_concat/tools/nanodet-simple.onnx"
#prototxt_path = "./nanodet-simple.prototxt"
#caffemodel_path = "./nanodet-simple.caffemodel"
graph = getGraph(onnx_path)
#convertToCaffe(graph, prototxt_path, caffemodel_path, exis_focus=True, focus_concat_name="Concat_40", focus_conv_name="Conv_41")
#convertToCaffe(graph, prototxt_path, caffemodel_path, exis_focus=True, focus_concat_name="Concat_40")
#convertToCaffe(graph, prototxt_path, caffemodel_path, focus_conv_name="Conv_41")
convertToCaffe(graph, prototxt_path, caffemodel_path)
2.4 Caffe转WK
Hi3516DV300的量化工具叫做RuyiStudio,启动该工具。一般来说,在SDK包中,已经包含该软件。RuyiStudio是绿色软件,无需安装,双击exe即可启动。
2.4.1 搭建NNIE工程
1、file
->new
->nnie-project
2、输入一个非中文的工程名称,SOC version
选择Hi3516DV300。
2.4.2 打开模型转化界面
1、展开项目目录,找到xxx.cfg
文件。
2、使用Mapper Configuration Editor
打开xxx.cfg
文件。
2.4.3 模型转化参数设置
一些重要参数的解释,主要是需要和模型的预处理需要一一对应。
参数名称 | 参数含义 |
---|---|
prototxt | caffe的prototxt文件 |
caffemodel | caffe的caffemodel文件 |
net_type | 网络类型,可以选择RNN、CNN,这里选择CNN |
compile_mode | 量化的精度,可以选择High-precison(高精度、慢)和Low-bandwidth(低精度、快,int16) |
norm_type | 输入图像的预处理类型,这里选择直接归一化到0-1之间,就是data_scale |
image_list | 参考图像的列表,以txt的形式,一行记录一个图像的路径和名称 |
image_type | 输入图像的格式 |
2.4.4模型转化
参数设置完成后,点击make
图标,即可启动模型量化,等待几分钟即可生成wk文件。
三、可能遇到的问题
3.1 Prototxt contains special characters
在caffe转wk的时候,转化工具可能会报错。
Line (14+ 1) "/model.0/conv/Conv" contains special characters, please check it.
Prototxt contains special characters.
解决办法
修改convertCaffe.py,将onnx中的所有节点的命名中的.
和/
进行替换,修改函数为:def getGraph(onnx_path)
修改前:
def getGraph(onnx_path):
model = onnx.load(onnx_path)
model_graph = model.graph
graph = Graph.from_onnx(model_graph)
graph = graph.transformed(transformers)
graph.channel_dims = {}
return graph
修改后:
def getGraph(onnx_path):
model = onnx.load(onnx_path)
model_graph = model.graph
graph = Graph.from_onnx(model_graph)
graph = graph.transformed(transformers)
graph.channel_dims = {}
for i in range(0, len(graph.nodes)):
name = graph.nodes[i].name
name = name.replace('.', '_')
graph.nodes[i].name = name.replace('/', '_')
return graph
重新生成caffe模型,即可解决问题。
3.2 生成WK时间长
在参数配置无误后,对于M、L等参数量较大的模型,工具的量化时间较长,容易出现软件卡死
的现象。
解决办法
配置GPU转化环境或者选择CPU和内存较好的电脑进行转化。
四、小结
- NNIE的配套工具不够完善,项目中使用,尽量使用支持ACNN-Toolkit的芯片。
- 如果只是做目标检测,如入侵检测、流量统计、分类等场景,NNIE是可以满足要求的,转化工具足以支撑。
- 需要打通NNIE的模型转化工具链,并能够根据芯片的特性,反馈至模型设计端。