海思Hi3516DV00移植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的模型转化工具链,并能够根据芯片的特性,反馈至模型设计端。
### 海思3516平台上的YOLO模型部署与优化 #### 下载并准备YOLOv8官方代码 为了在海思3516平台上部署YOLO模型,首先需要获取YOLOv8的官方源码。这一步骤确保了后续开发环境的一致性和稳定性[^1]。 ```bash git clone https://github.com/ultralytics/ultralytics.git cd ultralytics/ pip install -r requirements.txt ``` #### 修改模型结构适应硬件特性 针对海思3516DV300的特点,在转换YOLOv8-obb至该平台的过程中加入了DFL(Distributed Focal Loss)模块。这种修改不仅简化了后期处理逻辑,还提高了整体性能效率[^2]。 #### 图像预处理调整 考虑到PyTorch框架默认采用等比例缩放而不填充灰边的方式进行图像尺寸变换,对于特定分辨率如\(640 \times 640\)的情况,则需按照32像素单位来微调最终大小。此操作有助于保持原始数据的比例关系不变的同时满足网络输入规格的要求[^4]。 ```python import cv2 def preprocess_image(image_path, target_size=(640, 640)): img = cv2.imread(image_path) h, w = img.shape[:2] ratio = min(target_size[0]/w, target_size[1]/h) new_w, new_h = int(w*ratio), int(h*ratio) resized_img = cv2.resize(img, (new_w, new_h)) padded_img = np.zeros((target_size[1], target_size[0], 3), dtype=np.uint8) dw, dh = (target_size[0]-new_w)//2, (target_size[1]-new_h)//2 padded_img[dh:new_h+dh, dw:new_w+dw, :] = resized_img return padded_img / 255. ``` #### 模型量化配置 当涉及到模型量化时,需要注意的是训练阶段使用的RGB通道顺序以及相应的归一化参数应当被正确映射到量化过程之中。这样做可以保证量化后的模型依然能够维持较高的精度水平。 #### 推理引擎适配 最后,在完成上述准备工作后,还需参照具体项目中的后端实现细节来进行必要的接口对接工作。特别是关于`anchor_grid`这一属性的应用场景下,务必确认其定义方式与实际检测层相匹配。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

深图智能

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

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

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

打赏作者

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

抵扣说明:

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

余额充值