个人微信公众号
版本要求
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/
如果没有报错,恭喜你转换成功,如果没有成功,那再返回到上面的步骤,多试几次吧~~~
参考
- https://convertmodel.com/
- https://github.com/ultralytics/yolov5/releases/tag/v3.0
- YOLOv5利用ncnn部署系列(二)
- https://github.com/DataXujing/YOLO-v5