yolov3和yolov5 android端实时部署(ncnn)

编程知识 更新时间:2023-04-17 20:23:38

1.ncnn编译

安装相关环境:

opencv:https://blog.csdn.net/xiao13mm/article/details/106165477
sudo apt-get install autoconf automake libtool curl make g++ unzip

安装protobuf

sudo apt install protobuf-compiler libprotobuf-dev
  • protobuf 版本问题

    报错: undefined reference to `google::protobuf:

    原因:protoc 的版本,和找到的 protobuf 链接库版本不一致;

    解决:修改两者之一即可

    方案一:修改 progobuf 链接库位置

    # 查找 protoc 位置
    which protoc # 输出 $path/bin/protoc
    # 根据上述位置,设置 链接库位置
    cmake -D Protobuf_INCLUDE_DIR=$path/include \ # 指定 protobuf 路径
    -D Protobuf_LIBRARY=$path/lib/libprotobuf.so \
    -D CMAKE_PREFIX_PATH=$path  \
    -D BUILD_SHARED_LIBS=ON  \ # 建立动态库
    -DCMAKE_BUILD_TYPE=Release -DNCNN_VULKAN=ON -DNCNN_SYSTEM_GLSLANG=ON \ # 支持 gpu
    -DNCNN_BUILD_EXAMPLES=ON  -D CMAKE_INSTALL_PREFIX=./install $cmakepath
    

    例如

    cmake -D Protobuf_INCLUDE_DIR=/media/hao/CODE/LIB/CPP/protobuf/include -D Protobuf_LIBRARY=/media/hao/CODE/LIB/CPP/protobuf/lib/libprotobuf.so -D CMAKE_PREFIX_PATH=/media/hao/CODE/LIB/CPP/protobuf  -D CMAKE_PREFIX_PATH=/media/hao/CODE/LIB/opencv/debug420/install -D BUILD_SHARED_LIBS=ON  -DCMAKE_BUILD_TYPE=Release -DNCNN_VULKAN=ON -DNCNN_SYSTEM_GLSLANG=ON -DNCNN_BUILD_EXAMPLES=ON  -D CMAKE_INSTALL_PREFIX=./install /media/hao/CODE/SOURCE/MOBILE_INFERENCE/ncnn/
    

安装VULKAN

wget https://sdk.lunarg.com/sdk/download/1.2.189.0/linux/vulkansdk-linux-x86_64-1.2.189.0.tar.gz?Human=true -O vulkansdk-linux-x86_64-1.2.189.0.tar.gz
tar -xf vulkansdk-linux-x86_64-1.2.189.0.tar.gz
export VULKAN_SDK=$(pwd)/1.2.189.0/x86_64

编译ncnn

git clone https://github.com/Tencent/ncnn.git
cd ncnn
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -DNCNN_VULKAN=ON -DNCNN_BUILD_EXAMPLES=ON             # -DNCNN_VULKAN=ON  才会调用GPU
make
make install

2.ncnn模型转换和量化(yolov3)

训练的模型格式:https://github/AlexeyAB/darknet/ darknet训练出来的weights

编译完成之后进入#tools/darknet/darknet2ncnn,实现weights转ncnn

#tools/darknet/darknet2ncnn
./darknet2ncnn model.cfg model.weights model.param model.bin

此时为fp32格式

量化成fp16:

#量化成fp16
./ncnnoptimize /media/fandong/sunhao/weights/ziji/mobilenetv2_yolov3.param /media/fandong/sunhao/weights/ziji/mobilenetv2_yolov3.bin yolov3-fp16.param yolov3-fp16.bin 65536

量化成int8:

#fp32 to int8
#创建table
./ncnn2table ../../examples/mobilenetv2_yolov3.param ../../examples/mobilenetv2_yolov3.bin /home/fandong/images/sub.txt yolov3.table mean=[0.0,0.0,0.0] norm=[0.003921569,0.003921569,0.003921569] shape=[416,416,3] pixel=BGR
#量化为int8
./ncnn2int8 ../../examples/mobilenetv2_yolov3.param ../../examples/mobilenetv2_yolov3.bin yolov3-int8.param yolov3-int8.bin yolov3.table

进入build/examples中测试

./yolov3 *.jpg

3.ncnn模型转换和量化(yolov5)

模型转换(pt → onnx → ncnn)

pt→onnx:https://github/ultralytics/yolov5

python models/export.py --weights yolov5s.pt --img 640 --batch 1#pt转onnx
python -m onnxsim yolov5s.onnx yolov5s-sim.onnx #去除多余的memory data

会报错:

Unsupported slice step !
Unsupported slice step !
Unsupported slice step !
Unsupported slice step !
Unsupported slice step !

#yolov5s中col-major space2depth 操作,pytorch没有对应上层api实现
自定义op YoloV5Focus代替掉,修改param

同时这里需要更改:


其中,量化操作同yolov3

进入build/examples中测试

./yolov5 *.jpg

4.工程部署:

github工程地址:https://github/liujiaxing7/ncnn-Android-Yolov5
工程内容:

  • 环境编译 cmake ndk ncnn opencv
  • jni java调用c++
  • c++工程化部分

替换模型文件

替换extract的网络层即可

效果:

更多推荐

yolov3和yolov5 android端实时部署(ncnn)

本文发布于:2023-04-14 03:42:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/e933f5507b16718515214fbb825c44d7.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:实时   ncnn   android

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 74609文章数
  • 14阅读数
  • 0评论数