一、 写在前面
第一次做移动端部署,经验为零,不断的学习和摸索,完成相关工作,书写只是为了和大佬交流,记录相关工作。
二、模型转换
1.模型转onnx
这里没有好强调的,总而言之坑比较多,我用的模型里面作者重写了state_dict()导致我的模型导入一直有问题,查看了2天代码才找到,完成了onnx转换。
主要代码:
torch.onnx.export(model, input_size, onnx_path, verbose=True, input_names=['input'], output_names=['output'],opset_version=11 )
2 .onnx2ncnn
这里主要参考了知乎的链接
安装相关的工具链: g++, cmake,protobuf,opencv,
其中测试OpenCV没有摄像头用的读取图片的方式:参考链接 中的第4步。
这里插一句:转ncnn模型会报错,知乎链接中的这个问题:
可以使用 onnx-simplifier 完成模型简化,
# 如果onnx转ncnn模型没有报错,这部分可以直接省去,报错再回来转一下模型就行。
# 使用pip安装库
pip3 install onnx-simplifier
# 安装好了库后调用库完成模型转换
Python3 -m onnxsim input_onnxmodel.onnx output_onnxmodel.onnx
完成相关内容安装后开始下载ncnn:ncnn代码仓库
$ git clone https://github.com/Tencent/ncnn.git
$ cd ncnn
$ git submodule update --init
模型转ncnn相关过程,将编译好的ncnn,调用onnx2ncnn完成onnx转换成ncnn的模型,最后的产物是model.bin(存放相关权重的)、model.param(存放相关结构)
# onnx模型转ncnn模型的主要代码,编译好后,会自动生成onnx2ncnn工具,直接调用就行。
./onnx2ncnn model.onnx model.param model.bin
至此,模型已经编译成ncnn了
3. 模型量化
参考git链接
主要步骤是3步
(1)模型转opt
./ncnnoptimize mobilenet.param mobilenet.bin mobilenet-opt.param mobilenet-opt.bin 0
(2)生成table文件
find images/ -type f > imagelist.txt
./ncnn2table mobilenet-opt.param mobilenet-opt.bin imagelist.txt mobilenet.table mean=[104,117,123] norm=[0.017,0.017,0.017] shape=[224,224,3] pixel=BGR thread=8 method=kl
这里单独说一下,find方法是自带的,直接传入images路径就行(第二个参数),然后给出imagelist.txt路径(最后一个参数)
得到如下的txt文件。(无法截图,用代码块代替)
/home/wqg/download/train_data/yemian_fenxi/img/942548_007851.jpg
/home/wqg/download/train_data/yemian_fenxi/img/914579_002196.jpg
/home/wqg/download/train_data/yemian_fenxi/img/1050921_031274.jpg
/home/wqg/download/train_data/yemian_fenxi/img/700936_034999.jpg
/home/wqg/download/train_data/yemian_fenxi/img/916084_002448.jpg
/home/wqg/download/train_data/yemian_fenxi/img/704436_036595.jpg
(3)生成量化后模型
./ncnn2int8 mobilenet-opt.param mobilenet-opt.bin mobilenet-int8.param mobilenet-int8.bin mobilenet.table
三、写在最后,
第一次做移动端部署,还有很多不会的地方,后面还有后处理和库文件的编译,过程艰辛而复杂,问题也比较多,慢慢强大,慢慢成长。