模型压缩和加速是深度学习模型在终端部署优化过程中不可或取的一环.
文章目录
0. 模型压缩和加速
模型压缩参考文献
参考博客:
模型优化加速工具有很多可以参考这位仁兄的博客: 模型转换和压缩加速工具
没有时间一一尝试,选择了一个github星星比较多的作为个人学习样例,ncnn是企鹅的开源产品,支持国产…
下面开始我的100公里个人障碍赛…
1. Pytorch->onnx->ncnn
Pytorch转换为ncnn模型进行后期部署
- 官方推荐转换流程: Pytorch模型–>onnx模型 —onnx2ncnn—> ncnn模型
- 还有一种之前见过的: Pytorch模型–>caffe模型–caffe2ncnn–> ncnn模型
该示例采用第一种流程。
楼主系统: Ubuntu 19.04, 建议16.04
1.1 Pytorch->onnx
- Pytorch模型 --> onnx模型: 当前torch支持将 pytorch模型导出为onnx模型,楼主
torch-version=1.2
下面为转换脚本,其中xxx部分需根据自己模型进行设置。执行该脚本转换xxx.ph模型成xxx.onnx模型import torch import torchvision testInput = torch.randn(m_xxx, c_xxx, h_xxx, w_xxx, device='cuda') model = load your own model input_names = [ "Input" ] + [ "learned_%d" % i for i in range(16) ] output_names = [ "Output" ] torch.onnx.export(model, testInput, "example.onnx", verbose=True, input_names=input_names, output_names=output_names)
1.2 onnx->ncnn
1.2.1 安装opencv
opencv 和 opencv-python 不是一个东西.
opencv官方安装文档(for Linux): opencv-官方安装文档
官方文档给出了在Ubuntu编译安装opencv的一些依赖库的最低版本要求.
-
1 下载opencv源码: opencv 4.1.1
-
2 安装依赖
sudo apt-get install build-essential sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev # 可选安装 sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
gtk2.0 安装成功测试:
$ pkg-config --libs gtk+-2.0
-lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lfontconfig -lfreetype
pkg-config 安装成功测试:
$ pkg-config --version
-
3 编译安装opencv
unzip opencv-4.1.1 cd your_opencv_dir mkdir build && cd build cmake -D CMAKE_BUILD_TYPE=RELEASE -D OPENCV_GENERATE_PKGCONFIG=ON -D CMAKE_INSTALL_PREFIX=/usr/local .. make -j4 sudo make install sudo ldconfig
3.1 - 执行
cmake -D CMAKE_BUILD_TYPE=RELEASE -D OPENCV_GENERATE_PKGCONFIG=ON -D CMAKE_INSTALL_PREFIX=/usr/local ..
提示信息
cmake发现使用的是gtk+-3.0
,并不是gtk+-2.0
.这应该是系统自带的gtk版本,所以个人觉得可以不用安装libgtk2.0-dev了
查看了vim ../CMakeLists.txt
关于GTK的编译配置,发现它GTK-3.x 和 GTK-2.x. 都可以支持, cmake时会自动搜索系统中的GTK版本.默认就是开着的阿(wo c), 网上很多相关文档需要多加确认再执行, 感觉已经跑了80公里了,就快到了.
如下图所示,在cmake时会先判断是否存在HAVE_GTK3
,再查找低版本的GTK2.x.
按照代码逻辑, 如果要使用gtk2.x编译opencv, cmake时WITH_CTK_2_x=ON WITH_GTK=OFF
应该会使用gtk2.0编译(未测试…)
3.2make -j4
最后的这个cv2.cpython-37m-x86_64-linux-gnu.so
是opencv编译的支持python的编译文件,
如果只在python中使用opencv,使用pip install opencv-python
安装即可, 或在将上述编译文件拷贝到python3.x/site-packages/cv2
目录中即可再python中import cv2
导入了3.3
sudo make install
默认opencv编译完成在ls /usr/local/lib
3.4. pkg-config查看opencv,
查看opencv版本,pkg-config --modversion opencv4
查看opencv库pkg-config --libs opencv4
-L/usr/local/lib -lopencv_dnn -lopencv_gapi -lopencv_highgui -lopencv_ml -lopencv_objdetect -lopencv_photo -lopencv_stitching -lopencv_video -lopencv_calib3d -lopencv_features2d -lopencv_flann -lopencv_videoio -lopencv_imgcodecs -lopencv_imgproc -lopencv_core
注意这里
opencv4
对应了/usr/local/lib/pkgconfig/opencv4.pc
, 但好多文档这里都是opencv, 难道是编译老版本opencv有可能opencv.pc
?如果是那么上面的参数也应换成对应的opencv
(未测试…)3.5
sudo ldconfig
-
4 使用自带样例测试opencv(C/C++)
cd yourPath/opencv-4.1.1/samples/cpp/example_cmake
vim Makefile
CXX ?= g++ CXXFLAGS += -c -std=c++11 -Wall $(shell pkg-config --cflags opencv4) LDFLAGS += $(shell pkg-config --libs --static opencv4) all: opencv_example opencv_example: example.o; $(CXX) $< -o $@ $(LDFLAGS) %.o: %.cpp; $(CXX) $< -o $@ $(CXXFLAGS) clean: ; rm -f example.o opencv_example ```
直接利用Makefile编译make
and ./opencv_example
使用cmake: cmake .
and make
and ./opecv_example
然后神奇的事情就发生了,你将看到一个英俊的面容或者是一个可爱的BUG
1.2.1 编译安装ncnn (build for Linux)
参考官方文档: build ncnn for Linux
-
前期准备: 需要 g++ cmake protobuf
g++ 一般用系统自动的就可以
cmake : sudo apt-get install cmake
protobuf:google protobuf是一个灵活的、高效的用于序列化数据的协议。相比较XML和JSON格式,protobuf更小、更快、更便捷。google protobuf是跨语言的,并且自带了一个编译器(protoc),只需要用它进行编译,可以编译成Java、python、C++、C#、Go等代码,然后就可以直接使用,不需要再写其他代码,自带有解析的代码。
方法一:
sudo apt-get install libprotobuf-dev protobuf-compiler
方法二: 下载源码: 官方地址
编译安装protobuf,在下载代码目录tar -xzvf 你的代码.tar.gz ./configure --prefix=/usr/local/protobuf make make check sudo make install sudo ldconfig
查看安装版本:
protoc --version
git clone https://github.com/Tencent/ncnn.git cd ncnn mkdir -p build cd build cmake .. make -j4
编译完成后会在build/tools/onnx目录中生成onnx2ncnn
-
模型转换(onnx->ncnn)
cd build/tools/onnx
cd tools/onnx ./onnx example.onnx example.parm example.bin
-
运行ncnn测试程序,测试程序需要利用opencv读取显示图像,所以安装opencv。
git clone https://github.com/Tencent/ncnn.git cd ncnn vim CMakeLists.txt 去掉 add_subdirectory(examples) 这行代码的注释 mkdir build cd build cmake .. make -j4
编译成功后会在当前目录生成
examples
目录,执行测试代码cp ../examples/squeezenet_v1.1.param examples/ cp ../examples/squeezenet_v1.1.bin examples/ ./squeezent test.jpg # 运行成功会显示top-3的类别id和概率值.
翻过山,掉过坑,还好跑完了…NICE
参考:
- 技术挖掘者@ 深度学习模型转换、模型压缩工具总结
- ncnn@Build for Linux x86
- opencv_toturial@ https://docs.opencv.org/master/d7/d9f/tutorial_linux_install.html
- opencv_releases@https://opencv.org/releases/
- new_delete_@ Ubuntu 18.04安装OpenCV4.0和环境配置
- Alex-xt@ pkg-config 在不同opencv中切换
- ncnn@simplepose.cpp修改opencv bug