海思Hi3516DV00移植yolov5-7.0的模型转化流程说明

海思Hi3516DV300移植yolov5-7.0模型转化流程
该文章已生成可运行项目,

一、YOLOv5

在这里插入图片描述

YOLOv5作为单阶段检测框架的集大成者,凭借其卓越的实时性、高精度和易用性,已成为工业界实际部署的首选方案。yolov5的最新版本是7.0,该版本是官方最后更新的一个版本。yolov5-7.0
在这里插入图片描述

工程化实现卓越:基于PyTorch框架构建,支持动态图机制与ONNX生态的无缝对接
模型轻量化设计:提供n/s/m/l/x五种参数量级,满足不同算力场景需求
数据增强策略完善:集成Mosaic、MixUp等先进增强方法
部署友好性突出:支持TensorRT、OpenVINO等主流推理框架
持续迭代能力:官方维护团队保持每月更新频率,2023年新增实例分割扩展功能

二、模型转换流程

2.1 整体转换流程图

torch.onnx.export
onnx2caffe
HiSVP工具链
PyTorch模型
ONNX模型
Caffe模型
海思WK模型

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 模型转化参数设置

在这里插入图片描述

一些重要参数的解释,主要是需要和模型的预处理需要一一对应。

参数名称参数含义
prototxtcaffe的prototxt文件
caffemodelcaffe的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的模型转化工具链,并能够根据芯片的特性,反馈至模型设计端。
本文章已经生成可运行项目
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深图智能

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值