yoloV5-v3.0-模型转换,pt->onnx->ncnn

个人微信公众号

yoloV5-v3.0-模型转换,pt->onnx->ncnn_第1张图片

版本要求

yolov5的版本是v3.0

pytorch==1.5.0
torchvision==0.6.0

模型训练

网上有很多关于yoloV5训练的教程,可自行百度,如果实在不想找,可以参考下面的几个链接。

  • 【小白CV】手把手教你用YOLOv5训练自己的数据集(从Windows环境配置到模型部署)
  • 【小白CV教程】Pytorch训练YOLOv5并量化压缩(VOC格式数据集)
  • 【小白CV教程】Pytorch训练YOLOv5并量化压缩(VOC格式数据集)
  • Pytorch 版YOLOV5训练自己的数据集
  • yolov5人脸识别(yolov5-facenet-svm)
  • YOLOv5利用ncnn部署系列(1-3)
  • 第二章:YOLOv5训练自己的数据集,零基础小白都能看得懂的教程。YOLOv5 实现目标动态实时检测(训练自己的数据集实现王者荣耀游戏中的识别)
  • yolov5的flask部署python调用,NCNN,TensorRT,deepsort
  • 训练pytorch_yoloV5

pt转onnx

训练结束以后,可以得到last.pt文件,接下来就是如何将pt文件转成为onnx文件了。

修改common.py

注意!YOLOv5在转onnx的时候,有个巨坑,就是在网络模型中有个Focus机制,其中有一个tensor的切片操作,这个操作在转ncnn的时候不被支持,需要对这个模型的切片操作进行修改!
具体的修改是在models文件夹下的common.py文件,其原始代码如下:

class Focus(nn.Module):
    # Focus wh information into c-space
    def __init__(self, c1, c2, k=1):
        super(Focus, self).__init__()
        self.conv = Conv(c1 * 4, c2, k, 1)

    def forward(self, x):  # x(b,c,w,h) -> y(b,4c,w/2,h/2)
        # return self.conv(torch.cat([x, x, x, x], 1)) 
        return self.conv(torch.cat([x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2]], 1))

修改为

class Focus(nn.Module):
    # Focus wh information into c-space
    def __init__(self, c1, c2, k=1):
        super(Focus, self).__init__()
        self.conv = Conv(c1 * 4, c2, k, 1)

    def forward(self, x):  # x(b,c,w,h) -> y(b,4c,w/2,h/2)
        return self.conv(torch.cat([x, x, x, x], 1)) 
        # return self.conv(torch.cat([x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2]], 1))

转换命令

 export PYTHONPATH="$PWD" && python models/onnx_export.py --img-size 320 320

到这里为止,就已经将pt模型转为了onnx模型,可以说已经脱离了pytorch了,但是转ncnn还需要对模型做一个Simplifier操作,因为转出的onnx模型还有许多冗余,这在ncnn里也是不支持的,避免转ncnn时各种报错,就先操作一下把!

python -m onnxsim  yolov5s.onnx yolov5s-sim.onnx

onnx转ncnn

这里直接用大佬开发好的转换工具直接转换

https://convertmodel.com/

yoloV5-v3.0-模型转换,pt->onnx->ncnn_第2张图片
如果没有报错,恭喜你转换成功,如果没有成功,那再返回到上面的步骤,多试几次吧~~~

参考

  • https://convertmodel.com/
  • https://github.com/ultralytics/yolov5/releases/tag/v3.0
  • YOLOv5利用ncnn部署系列(二)
  • https://github.com/DataXujing/YOLO-v5

你可能感兴趣的:(目标检测,ncnn)