NNIE模型转换环境搭建

NNIE模型转换环境搭建

《NNIE模型转换环境搭建》

  推荐使用开源项目 https://github.com/RaySue/NNIE-lite ,使用NNIE像使用ncnn一样简单。

Key Words:多版本gcc安装、NNIE模型转换


Beijing, 2020

作者:RaySue

Code:https://github.com/RaySue/NNIE-lite

Agile Pioneer  

  • 实验环境: Ubuntu18.04

  海思只给提供了一个模型转换工具nnie_mapper,是把caffe模型转为nnie硬件支持的.wk的压缩模型文件。模型的原始值是float32表示的,而用8bit量化得到的是用int8来量化存储的,所以一般来说.wk模型的大小只有原始模型的四分之一,但是我转的模型却没有变小,而是变大了一点。

  因为海思并没有提供nnie_mapper的源码,所以我需要查看该执行文件依赖哪些动态库:readelf -d nnie_mapper_12 来查看依赖哪些库,并对应 Hisvp 开发指南找到相应的版本。


安装多版本gcc (gcc 4.8.5)

GNU编译器集合(GCC)是C,C ++,Objective-C,Fortran,Ada,Go和D编程语言的编译器和库的集合。许多开源项目包括GNU工具和Linux内核都是用GCC编译的。

  • Ubuntu 多版本 gcc 的安装和切换 参考:
  • 首先更新包列表:sudo apt update
  • 键入以下命令安装build-essential软件包:sudo apt install build-essential
  • 多版本安装:
    • 使用命令将ubuntu-toolchain-r/test PPA添加到您的系统:sudo apt install software-properties-common
    • sudo add-apt-repository ppa:ubuntu-toolchain-r/test
    • 安装多个版本的GCC&G++:
      sudo apt install gcc-4.8 g++-4.8 gcc-7 g++-7 gcc-8 g++-8 gcc-9 g++-9
    • 默认版本是具有最高优先级的版本,在我们的例子中是gcc-4.8

增加 gcc/g++ 的可选项

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 48 --slave /usr/bin/g++ g++ /usr/bin/g++-4.8 

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 80 --slave /usr/bin/g++ g++ /usr/bin/g++-8

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 --slave /usr/bin/g++ g++ /usr/bin/g++-9

版本切换命令

# 切换 gcc 版本, 选择4.8.5再进行后续编译操作
sudo update-alternatives --config gcc 

编译protobuf 3.5.1

下载地址:https://github.com/google/protobuf/releases 找3.5.1

编译安装

  • 1.tar -xvf protobuf; cd protobuf
  • 2.autogen.sh
  • 3.configure -prefix=/you/want/to/install/
  • 4.make
  • 5.make check
  • 6.make install
  • 7.把lib路径加入到LD_LIBRARY_PATH中,把bin加到PATH中(通过编辑~/.bashrc即可)

编译 opencv 3.4.0

下载地址
OpenCV - https://opencv.org/
opencv_contrib - github

安装依赖

  • 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 libtiff-dev libjasper-dev libdc1394-22-dev

编译安装

  • tar -xvzf opencv-3.4.0.tar.gz

  • cd opencv-3.4.0

  • 安装opencv_contrib【如果编译过程出现问题就不编译opencv_contrib即可】

    • mv …/opencv_contrib-3.4.0 ./
  • mkdir build; mkdir install

    cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/x/x –D WITH_VTK=ON -D OPENCV_EXTRA_MODULES_PATH=/x/x/opencv_contrib-3.4.0/modules/ -D CUDA_NVCC_FLAGS="-std=c++11 --expt-relaxed-constexpr" -D WITH_NVCUVID=OFF -D BUILD_opencv_cudacodec=OFF -D ENABLE_CXX11=YES  ..
    
    • OPENCV_EXTRA_MODULES_PATH=你的opencv_contrib/modules的位置
    • CMAKE_INSTALL_PREFIX=你想安装的位置
    • cuda10以上没有dynlink_nvcuvid.h和nvcuvid.h,所以要将BUILD_opencv_cudacodec=OFF
    • 如果编译opencv-contrib需要下载boost之类的可以不编译这个,即去掉OPENCV_EXTRA_MODULES_PATH
  • make

  • make check

  • make install

  • CMAKE_INSTALL_PREFIX 中就是你需要的include lib bin


模型转换

注意

你的gcc的版本最好是4.8,我的是4.8.5,而且你的protobuf需要是在这个版本下编译的,否则会报错
undefined symbol:_ZN6google8protobuf8internal26fixed_address_empty_stringE

用命令:nm -s libprotobuf.so|grep _ZN6google8protobuf8internal26fixed_address_empty_stringE 会发现有这个符号,但是多了B5cxx11,这个是和编译程序的 gcc 程序有关系,由于 protobuf 的源码中含有c++程序,所以需要使用 gcc4.8.5 和 g++4.8.5 来编译 protobuf 才行。

模型转换命令:

nnie_mapper_12 model.cfg

model.cfg 文件介绍:

[prototxt_file]  model.prototxt          # caffe 的prototxt  
[caffemodel_file] model.caffemodel       # caffe 的model文件
[batch_num] 1                            # [单张模式/多张模式]
[net_type] 0                             
[sparse_rate] 0                          # 0 - 不稀疏处理 0.5 - 0.5稀疏
[compile_mode] 1                         # 0 - 高速模式损失精度 1 - 高精度模式
[is_simulation] 0                        # 0 - 芯片模式 1 - 仿真模式用于pc端 
[log_level] 2
[instruction_name] save_model   # 存储的NNIE模型文件名 
[image_list] ./file_list.txt    # 用于存储数据的绝对路径,30张左右的样例数据用于量化模型
[image_type] 1           # 1 - 表示网络数据输入为 SVP_BLOB_TYPE_U8(普通的灰度图和RGB图)类型; 此时要求 image_list 配置是 RGB 图或者灰度图片的 list 文件;
[mean_file] ./mean.txt   # 均值文件,用于数据的标准化,每行代表一个通道要减去的值
[norm_type] 5            # 0 - 不做预处理 5 - 减通道均值后再乘以 data_scale
[RGB_order] BGR 
[data_scale] 1           # 0.00390625 = 1/ 256;1 就是不缩放
[internal_stride] 16  # 数据的维度必须是16的倍数,否则按16的倍数补全,默认为16,修改无效




参考

[1] 海思AI芯片:https://blog.csdn.net/avideointerfaces/article/details/100178343
[2] 多版本GCC安装:https://www.linuxidc.com/Linux/2019-06/159059.htm

你可能感兴趣的:(NNIE-lite)