SS928移植Yolov5s全流程
一、ATC基础环境准备
SS928有两个NPU,我们使用里面NNN的npu,所有的参考代码也是npu相关的,另外一个npu在SDK里面是svp_npu,linux系统环境为Ubuntu 18.04 Server版本
1.安装conda
参考百度,或者参考视频 https://www.bilibili.com/video/BV1uH4y1u7FV/?spm_id_from=333.999.0.0
2、安装atc相关环境
需要python3.9.2版本,
具体可以参考SDK里面
《SS928V100R001C02SPC022\ReleaseDoc\zh\01.software\pc\NNN\驱动和开发环境安装指南.pdf》
conda create -n atc python=3.9.2
conda env list
conda config --set auto_activate_base false
conda activate atc
conda deactivate
3、安装atc相关依赖
pip3 install protobuf==3.13.0 --user -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install psutil==5.7.0 --user -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install numpy --user -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install scipy --user -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install decorator==4.4.0 --user -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install sympy==1.5.1 --user -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install cffi==1.12.3 --user -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install pyyaml --user -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install pathlib2 --user -i https://pypi.tuna.tsinghua.edu.cn/simple
4、安装atc软件
安装文件在SDK路径
SS928V100R001C02SPC022\SVP_PC\SVP_PC\NNN_PC\NNN_PC\Ascend-cann-toolkit_5.20.t6.2.b060_linux-x86_64.run
直接用非root权限安装即可
二、转换模型
这部分的详细操作流程请看视频:
2.1 模型来源
直接使用开源模型,别人已经转换好的,如果要自己训练请去官网按官网流程训练,V6.2 为例
YOLOv5 v6.2 export onnx model method https://github.com/shaoshengsong/yolov5_62_export_ncnn
2.2 在conda环境下转换模型 onnx—> om
conda activate atc
source $HOME/Ascend/ascend-toolkit/latest/x86_64-linux/bin/setenv.bash
atc --model=yolov5s_v6.2.onnx --framework=5 --output=yolov5s_v6.2 --soc_version="OPTG" --output_type=FP32 --insert_op_conf=./op.cfg
2.3 op.cfg yuv420输入配置,输入为640*640 yuv420
为什么需要op.cfg 文件请看视频
https://www.bilibili.com/video/BV14J4m1P7Cv/?spm_id_from=333.788.recommend_more_video.0&vd_source=215144fef0f69d0f2d4f28ae29f8bf08
op.cfg文件详细如下
aipp_op {
aipp_mode : static
related_input_rank : 0
max_src_image_size : 1228800
support_rotation : false
input_format : YUV420SP_U8
src_image_size_w : 640
src_image_size_h: 640
cpadding_value: 0.0
crop : false
load_start_pos_w : 0
load_start_pos_h : 0
crop_size_w : 0
crop_size_h : 0
resize : false
resize_output_w : 640
resize_output_h : 640
padding : false
left_padding_size : 0
right_padding_size : 0
top_padding_size : 0
bottom_padding_size : 0
padding_value : 0
csc_switch : true
rbuv_swap_switch : false
ax_swap_switch : false
matrix_r0c0 : 256
matrix_r0c1 : 0
matrix_r0c2 : 0
matrix_r1c0 : 0
matrix_r1c1 : 0
matrix_r1c2 : 0
matrix_r2c0 : 0
matrix_r2c1 : 0
matrix_r2c2 : 0
output_bias_0 : 0
output_bias_1 : 0
output_bias_2 : 0
input_bias_0 : 0
input_bias_1 : 0
input_bias_2 : 0
mean_chn_0 : 0
min_chn_0 : 0.0
var_reci_chn_0 : 0.00392157
}
三、板子端推理
代码主要参考NCNN的前处理、Yolov5的后处理部分代码,接好海思SDKsample代码整理的整个工程,
该工程实现了任何分辨率jpg进行yolov5s 80分类算法的推理,同时把推理结果绘制在图片上的功能
代码整个怎么使用的流程讲解请看视频
https://www.bilibili.com/video/BV14J4m1P7Cv/?spm_id_from=333.788.recommend_more_video.0&vd_source=215144fef0f69d0f2d4f28ae29f8bf08
3.1 代码编译
主要依赖海思交叉编译工具,和Cmake等一些基础工具,生成文件在output目录
git clone https://gitee.com/apchy_ll/ss928_yolov5s.git
cd ss928_yolov5s
./build.sh
3.2 代码板端运行
把整个output目录复制到板端,保证板端ko正确加载
需要加载那些ko请看视频:https://www.bilibili.com/video/BV18b421a7hA/?spm_id_from=333.788&vd_source=215144fef0f69d0f2d4f28ae29f8bf08
cd output
./rudemo.sh test.jpg
3.3 推理效果如下
原始图如下
三、其它
3.1 NCNN的用途
本工程工程中使用了ncnn做了图像前处理,解码图片,resize图片,和后处理draw 框和简单文本的功能,
使用了ncnn里面的后处理部分代码,主要做了ncnn后处理数据的阈值筛选,和nms功能,如果需要自己实现也可以替换该部分代码
具体可以参考视频
https://www.bilibili.com/video/BV1bH4y1u7nv/?spm_id_from=333.788.recommend_more_video.2&vd_source=215144fef0f69d0f2d4f28ae29f8bf08
ncnn代码:https://github.com/Tencent/ncnn.git
3.2 自定义模型修改内容
如下图,yolov5 80分类的结构,有三个输出层output 353 367
在代码里面体现的ss928_yolov5s/svp/npu/yolov5.cpp,
80分类对应三个输出size为
3 * 80 * 80 * 85(80分类+4(中心x+中心Y+w+h)+1(置信度)
3 * 40 * 40 * 85(80分类+4(中心x+中心Y+w+h)+1(置信度)
3 * 20 * 20 * 85(80分类+4(中心x+中心Y+w+h)+1(置信度)
如果需要自己定义的分类个数,就减少85里面对应80的值即可,比如1分类就是
3 * 80 * 80 * 6(1分类+4(中心x+中心Y+w+h)+1(置信度)
3 * 40 * 40 * 6(1分类+4(中心x+中心Y+w+h)+1(置信度)
3 * 20 * 20 * 6(1分类+4(中心x+中心Y+w+h)+1(置信度)
nt ncnn_result(const float *src, unsigned int len) {
const float prob_threshold = 0.25f;
// stride 8
if (len == 3 * 80 * 80 * 85) {
proposals.clear();
printf("----------------3 * 80 * 80 * 85--------------------\n");
ncnn::Mat out;
out.create(85, 80, 80, 3);
// ex.extract("output", out);
memcpy(out.data, src, len * sizeof(float));
// out = out.reshape( 85);
printf("w = %d,h=%d,d=%d,c=%d\n", out.w, out.h, out.d, out.c);
ncnn::Mat anchors(6);
anchors[0] = 10.f;
anchors[1] = 13.f;
anchors[2] = 16.f;
anchors[3] = 30.f;
anchors[4] = 33.f;
anchors[5] = 23.f;
std::vector<Object> objects8;
generate_proposals(anchors, 8, in_pad, out, prob_threshold, objects8);
printf("objects8.size():%d\n", objects8.size());
proposals.insert(proposals.end(), objects8.begin(), objects8.end());
return 0;
}
// stride 16
if (len == 3 * 40 * 40 * 85) {
printf("----------------3 * 40 * 40 * 85--------------------\n");
ncnn::Mat out;
out.create(85, 40, 40, 3);
// out.create(85, 480, 1, 3);
// ex.extract("353", out);
memcpy(out.data, src, len * sizeof(float));
ncnn::Mat anchors(6);
anchors[0] = 30.f;
anchors[1] = 61.f;
anchors[2] = 62.f;
anchors[3] = 45.f;
anchors[4] = 59.f;
anchors[5] = 119.f;
std::vector<Object> objects16;
generate_proposals(anchors, 16, in_pad, out, prob_threshold, objects16);
printf("objects16.size():%d\n", objects16.size());
proposals.insert(proposals.end(), objects16.begin(), objects16.end());
return 0;
}
// stride 32
if (len == 3 * 20 * 20 * 85) {
printf("----------------3 * 20 * 20 * 85--------------------\n");
ncnn::Mat out;
out.create(85, 20, 20, 3);
memcpy(out.data, src, len * sizeof(float));
ncnn::Mat anchors(6);
anchors[0] = 116.f;
anchors[1] = 90.f;
anchors[2] = 156.f;
anchors[3] = 198.f;
anchors[4] = 373.f;
anchors[5] = 326.f;
std::vector<Object> objects32;
generate_proposals(anchors, 32, in_pad, out, prob_threshold, objects32);
printf("objects32.size():%d\n", objects32.size());
proposals.insert(proposals.end(), objects32.begin(), objects32.end());
}
三、感谢
感谢以前的同事帮忙指导算法知识,感谢ncnn群里面的大佬指导ncnn::mat相关知识,和指导bgr2yuv420sp的源代码;
如果有需要请联系:大家共同进步~~
- 分享
- 举报
-
薄凉 2024-09-11 15:29:31回复 举报请问下SVP_NNN 和NNN两个图像引擎可以同时使用吗,看这俩区别也不大
-
耶律大石 2024-06-27 23:45:04回复 举报我现在在x86把模型复制过去了,但是报错: /mnt/usb/output # ./rundemo.sh killall: ss928_yolov5: no process killed usb 4-1.2.3: reset SuperSpeed Gen 1 USB device number 4 using xhci-hcd sd 0:0:0:0: [sda] tag#0 UNKNOWN(0x2003) Result: hostbyte=0x07 driverbyte=0x00 sd 0:0:0:0: [sda] tag#0 CDB: opcode=0x28 28 00 00 03 b4 80 00 01 00 00 print_req_error: I/O error, dev sda, sector 242816 [EVENT] CCECPU(1711,ss928_yolov5):1970-01-01-01:09:04.918.648 [aicpusd_cust_so_manager.cpp:73][AicpuCustSoManagerInit][tid:1711] cust so dir name is /root/cust_aicpu_0_1711/. usb 4-1.2.3: reset SuperSpeed Gen 1 USB device number 4 using xhci-hcd sd 0:0:0:0: [sda] tag#0 UNKNOWN(0x2003) Result: hostbyte=0x07 driverbyte=0x00 sd 0:0:0:0: [sda] tag#0 CDB: opcode=0x28 28 00 00 01 15 90 00 01 00 00 print_req_error: I/O error, dev sda, sector 71056 Usage: ./ss928_yolov5 [imagepath] [EVENT] CCECPU(1711,ss928_yolov5):1970-01-01-01:09:05.519.623 [aicpusd_mpi_mgr.cpp:49][PrintStatisticInfo][tid:1711] Mpi Dvpp event statistic: [0
-
耶律大石 2024-06-24 02:03:07回复 举报1、"OPTG" 找不到,可以直接用 --soc_version=SS928V100不? 2、还有就是[ ERROR][ParseAippCfg][288] Error aipp cfg token : max_src_image_size! [ERROR][GetMapperConfigTop][204] Run failed, error code 0x00000003. [ERROR][GetMapperConfig][241] Run failed, error code 0x00000003. [ERROR][main][54] Run failed, error code 0x00000003 是什么意思呢?
-
木木 回复 耶律大石 2024-06-25 09:31:31回复 举报感觉你用的svn nnn,我们用的nnn这个npu
-
-
耶律大石 2024-06-24 01:27:29回复 举报[ERROR][ParseAippCfg][288] Error aipp cfg token : max_src_image_size! [ERROR][GetMapperConfigTop][204] Run failed, error code 0x00000003. [ERROR][GetMapperConfig][241] Run failed, error code 0x00000003. [ERROR][main][54] Run failed, error code 0x00000003.
-
浏览量:1117次2024-06-06 10:17:20
-
浏览量:1448次2024-01-10 15:17:17
-
浏览量:1051次2023-12-16 22:32:09
-
浏览量:3923次2023-04-12 16:05:14
-
浏览量:4084次2024-05-28 16:26:51
-
浏览量:1652次2024-02-04 17:13:47
-
2023-12-24 00:06:09
-
2023-12-24 14:43:57
-
浏览量:302次2024-09-13 17:34:13
-
浏览量:2690次2024-03-14 14:15:25
-
浏览量:1299次2023-10-28 16:08:09
-
浏览量:1618次2022-12-13 16:47:02
-
浏览量:2099次2023-05-18 10:53:13
-
浏览量:2948次2023-04-01 13:01:00
-
浏览量:722次2023-09-09 13:40:42
-
浏览量:10179次2022-11-10 18:07:40
-
浏览量:6367次2022-11-10 14:33:49
-
浏览量:2054次2024-01-07 22:19:19
-
浏览量:1605次2023-06-30 10:33:51
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
木木
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明