yolov5的版本是v3.0
pytorch==1.5.0
torchvision==0.6.0
网上有很多关于yoloV5训练的教程,可自行百度,如果实在不想找,可以参考下面的几个链接。
训练结束以后,可以得到last.pt文件,接下来就是如何将pt文件转成为onnx文件了。
注意!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
这里直接用大佬开发好的转换工具直接转换
https://convertmodel.com/
如果没有报错,恭喜你转换成功,如果没有成功,那再返回到上面的步骤,多试几次吧~~~