主要思想
- 使用高通QCS8550开发板,在开发板上的Aidlux融合系统上移植手持缺陷检测仪的yolov5缺陷检测模型。
- 由于aidlite升级到了2.0版本,查了一圈博客都没有可以直接用的代码,因此自己对最新的aidlite目标检测源码做了一次yolov5的移植。
平台介绍
- QCS8550开发板,一款基于高通QCS8550为平台的高算力开发套件,采用4nm制程,集成了Android系统。QCS8550算力高达48Tops,拥有强大的图形处理能力和视频编解码能力,以及丰富的外围接口。另外模组封装可以同时兼容QCS8250和SM8475平台,开发套件面向工业相机、智算服务器、边缘智算盒、工控机、无人机、机器人、视频会议等多种智能物联网设备产品。
- 套件介绍:AidLux
Aidlux融合系统介绍
- 官网平台介绍:AidLux Docs
- AidLux是一个构建在ARM硬件上,基于创新性跨Android/鸿蒙 + Linux融合系统环境的智能物联网 (AIoT) 应用开发和部署平台。
Aidlite-SDK开发工具介绍
- Aidlite-SDK 是跨平台统一 AI 推理中间件,针对不同 AI 框架和不同 AI 芯片的调用进行了抽象,形成统一 API,可实现模型推理实现的解耦合。Aidlite-SDK深度学习开发流程图如下。
官网链接:AidLite SDK for Python | AidLux Docs
Aidlux系统中移植手持缺陷检测模型
模型格式转换
1.使用yolov5-6.2源码中export.py将模型文件pt转onnx格式。
- 代码:yolov5\export.py
- 参数如图:
2.使用AIMO工具将yolov5缺陷检测模型onnx格式文件转为dlc格式文件,具体流程如下。
a.登录AIMO工具网页:https://aimo.aidlux.com/#/convert-record
b.上传模型文件,具体操作如图所示。上传完成点击下一步。
c.选择厂商,芯片,转换框架,具体操作如图所示。
d.设置输入输出参数,选择是否量化,具体操作如图所示。
e.转换后,可查看dlc.aidem模型结构,下载模型文件。具体操作如下图。
f.至此,可将模型转为高通QC8550芯片推理模型所需的dlc格式文件。下载,上传到8550内存中,进行代码移植。
代码移植
代码地址:Aidlite-yolov5-defect
- 修改官方提供的源码snpe2_yolov5_multi.py,针对自己的模型参数,在代码中做如下修改。
- 根据Aidlite-SDK深度学习开发流程图,各个步骤中需要修改的地方如下。
1.指定运行参数acc_type=2,指定 dlc模型文件地址model_path,设置yolov5模型网络的三个输出层的name。
acc_type=2
model_path=yolov5_fp32_snpe216.dlc.aidem
outNode_names="/model/Transpose,/model/Transpose_1,/model/Transpose_2"
三处输出节点的name使用netron工具查看网络结构进行查看,如下图:
2.设置缺陷检测类别数,类别名,模型输入层尺寸,anchors参数(默认不变)。
OBJ_CLASS_NUM = 12 # 12类检测
MODEL_SIZE = 640 # 模型输入层尺寸
# anchors是yolov5官方参数
anchors = [[10, 13, 16, 30, 33, 23],
[30, 61, 62, 45, 59, 119],
[116, 90, 156, 198, 373, 326]]
coco_class = ["aa", "bb", "cc", "dd", "ee", "ff", "gg", "hh", "ii", "jj", "kk", "ll"] # 12类缺陷类别名
3.指定待测图像路径image_path。
image_path = "by33.jpg"
4.指定输入输出尺寸input_shapes/output_shapes。
三处output_shapes值可以使用netron工具查看网络结构进行查询,见第一步查询name图像。
input_shapes = [[1, 3, MODEL_SIZE, MODEL_SIZE]]
output_shapes = [[1,3,96,96,17], [1,3,48,48,17], [1,3,24,24,17]]
5.其余修改
由于我的yolov5_fp32_snpe216.dlc.aidem模型在netron中可以看到在模型结构的末尾输出部分,输出层已经进行了reshape和transpose。下图。
因此在代码中需要注掉相同的代码部分,保证输出的准确。下图 。
6.注意事项
检测头的output_shapes与stride尺度需要对应,移植时关注一下。必要的话调试验证0,1,2分别应该与哪个stride对齐。
7.代码部分修改完成。
测试效果
1.运行snpe2_yolov5_multi.py,和yolov5源码运行detect.py。加载同一张样本by33.jpg。结果如下图所示:
2.改写main.py,实现调用USB摄像头或者mipi摄像头进行视频流缺陷检测效果如下图。