yolov5部署2——onnx->ncnn

yolov5部署2——onnx->ncnn

一,ncnn环境搭建
1.电脑需要先安装如下几个库:g++、cmake、protobuf、opencv
protobuf安装:

$ sudo apt-get install autoconf automake libtool curl make g++ unzip
$ git clone https://github.com/google/protobuf.git
$ cd protobuf
$ git submodule update --init --recursive
$ ./autogen.sh
$ ./configure
$ make
$ make check
$ sudo make install
$ sudo ldconfig # refresh shared library cache.

protoc --version#查看版本

2.编译ncnn

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

3.安装问题记录
问题1:
git submodule update --init --recursive时
出现第二次尝试克隆 ‘third_party/benchmark’ 失败,退出
yolov5部署2——onnx->ncnn_第1张图片
解决方法:进入一下“无法克隆”后的那个链接,只要能打开,就可以下载,否则只能多试几次

问题2:
输入sudo ldconfig时出现:
/sbin/ldconfig.real: /usr/local/cuda-10.1/targets/x86_64-linux/lib/libcudnn.so.7 不是符号链接

解决方法:

sudo ldconfig -v

找到报错位置:
yolov5部署2——onnx->ncnn_第2张图片
输入:

sudo ln -sf /usr/local/cuda-10.1/targets/x86_64-linux/lib/libcudnn.so.7.6.5 /usr/local/cuda-10.1/targets/x86_64-linux/lib/libcudnn.so.7

二,onnx转换为ncnn
onnx转ncnn只需要在ncnn/build/tools/onnx/路径下输入:

./onnx2ncnn model.onnx model.param model.bin

将model.onnx文件修改为自己的就行。

在这里插入图片描述
没有其他东西出现就是成功了!
遇到的问题:Unsupported slice step !
原因:yolov5的切片操作没法通过,需要修改程序。
解决方法:需要修改yolov5的代码
修改1:export.py中640修改小一点,看你的显卡决定

parser.add_argument('--img-size', nargs='+', type=int, default=[416, 416], help='image size')

修改2:export.py中设置为true,本身是的话就不用改动了。

model.model[-1].export = True # set Detect() layer export=True

修改3:common.py下的Focus 去除slice数组操作,精度有损失

class Focus(nn.Module):
 # Focus wh information into c-space
 def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True):  # ch_in, ch_out, kernel, stride, padding, groups
     super(Focus, self).__init__()
     self.conv = Conv(c1 * 4, c2, k, s, p, g, act)

 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))

修改4:export.py中导出版本号修改成11,去除class分类,用output

torch.onnx.export(model, img, f, verbose=False, opset_version=11, input_names=['images'],
 output_names=['output'])

接下来就是从新跑一遍程序,生成新的模型文件了。

你可能感兴趣的:(yolo系列算法学习,pytorch,android)