目标检测 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
|