飞道的博客

目标检测 YOLOv5 - YOLOv5最新版本 6.2支持ncnn推理

456人阅读  评论(0)

目标检测 YOLOv5 - YOLOv5最新版本 6.2支持ncnn推理

flyfish


环境:Ubuntu18.04

https://github.com/Tencent/ncnn

pt模型导出onnx

导出代码地址

https://github.com/shaoshengsong/yolov5_62_export_ncnn

该版本代码源自 https://github.com/ultralytics/yolov5 的6.2版本

导出命令执行

 python export.py --weights yolov5s_v6.2.pt --img 640 --batch 1 --include onnx torchscript   --simplify

会生成 yolov5s_v6.2.onnx文件
onnx模型导出后可视化结果

ncnn编译

git clone https://github.com/Tencent/ncnn
cd ncnn
mkdir build_pc && cd build_pc
cmake ..
make -j
make install

我这里是把ncnn文件夹改成了ncnn_pc

如果想少编译一些例子
可以到 ncnn_pc/examples/CMakeLists.txt中注释一些

onnx模型转ncnn模型

./onnx2ncnn yolov5s_v6.2.onnx yolov5s_6.2.param yolov5s_6.2.bin

会生成 yolov5s_6.2.param和 yolov5s_6.2.bin两个文件

ncnn模型更改部分

更改 yolov5s_6.2.param文件,画红框的地方更改为 -1

C++代码

本方案是按照C++代码量最少的方案做的更改
所以C++部分只要按照如下更改即可

宏定义

#define  YOLOV5_V62 1   

模型加载

#if YOLOV5_V62
    if (yolov5.load_param("yolov5s_6.2.param"))
        exit(-1);
    if (yolov5.load_model("yolov5s_6.2.bin"))
        exit(-1);
#elif YOLOV5_V60
    if (yolov5.load_param("yolov5s_6.0.param"))
        exit(-1);
    if (yolov5.load_model("yolov5s_6.0.bin"))
        exit(-1);
#else
    yolov5.register_custom_layer("YoloV5Focus", YoloV5Focus_layer_creator);

    if (yolov5.load_param("yolov5s.param"))
        exit(-1);
    if (yolov5.load_model("yolov5s.bin"))
        exit(-1);
#endif

 

两个stride部分

    // stride 16
    {
        ncnn::Mat out;


#if YOLOV5_V62
        ex.extract("353", out);
#elif YOLOV5_V60
        ex.extract("376", out);
#else
        ex.extract("781", out);
#endif
    // stride 32
    {
        ncnn::Mat out;
#if YOLOV5_V62
        ex.extract("367", out);
#elif YOLOV5_V60
        ex.extract("401", out);
#else
        ex.extract("801", out);
#endif

再次执行make编译

ncnn_pc/build_pc$ make 


执行命令

./yolov5 ./bus.jpg 

结果展示


如果要优化模型可以用ncnnoptimize
所在路径ncnn_pc/build_pc/tools/ncnnoptimize


转载:https://blog.csdn.net/flyfish1986/article/details/127669328
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场