ubuntu19.04- pytorch->onnx->ncnn (pc端)

5 篇文章 0 订阅
1 篇文章 0 订阅

模型压缩和加速是深度学习模型在终端部署优化过程中不可或取的一环.

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
  1. 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.2 make -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

  1. 模型转换(onnx->ncnn)cd build/tools/onnx

    cd tools/onnx
    ./onnx example.onnx example.parm example.bin
    
  2. 运行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

参考:

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值