SS928移植Yolov5s全流程

SS928移植Yolov5s全流程 木木 2024-05-24 08:49:34 342

一、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权限安装即可

二、转换模型

这部分的详细操作流程请看视频:

https://www.bilibili.com/video/BV1sD421A7WA/?spm_id_from=333.788.recommend_more_video.1&vd_source=215144fef0f69d0f2d4f28ae29f8bf08

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的源代码;

如果有需要请联系:大家共同进步~~

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
木木
红包 6 1 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
木木
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区