使用ncnn在树莓派4B上部署nanoDet-m网络(12fps)

使用ncnn在树莓派4B上部署nanoDet-m网络(12fps) 热爱秃头的每一天 2023-06-05 09:11:55 1090

1. 背景

在机器人的应用中,目标检测是一个重要的课题。深度学习的快速发展,在检测的效果方面对比大多数传统检测算法,都有明显的优势。但是将深度学习模型部署到端侧设备上,实现高效的推理,同样是一个问题很多的领域。

在机器人的主控中,树莓派和Jetson系列单板机被使用较多。这篇blog以树莓派4b为例,展示将深度学习模型部署到低算力平台的方法。

与深度学习在GPU上的推理不同,为了实现高效推理,一般都会选择使用推理框架,而不是直接使用python的推理代码进行推理。在CPU侧,常用的推理框架有ncnn、mnn、openvino等;在GPU侧,有tensorrt;高通在htp上,同样有snpe和qnn等推理框架。本blog使用树莓派的CPU进行推理,使用ncnn作为推理框架。

2. 效果

下图所示是在树莓派4b上推理nanoDet-m网络的结果。

图中的两个场景,在被检测目标较为密集的场合,检测算法也能达到11fps,且识别率很高。

除了网络的树莓派端侧推理结果之外,我还统计了一些在推理时,树莓派的相关信息。

将树莓派超频后,推理1分钟多的视频,平均fps可达11.4,最高可达12fps。且温度在合理的范围内。超频后,功耗比不超频状态下多了2.1w左右。

工作状态CPU频率(Hz)CPU温度(℃)GPU频率(Hz)GPU温度(℃)功耗内存占用(with desktop)平均fps
无作业600M34200M33.63.135w318M
推理nanoDet-m1.5G43500M425.357w494M10.3fps
推理nanoDet-m(超频)2.0G51.2700M52.67.446w446M11.4fps

下图是我使用的功耗测试仪

3.nanoDet-m网络

如下图所示是这次要部署的网络,下图仅截取了部分backbone和部分heads网络。

下表是以YOLOv4 tiny作为对比对象的数据。nanoDet-m实现了在较低的FLOPs和params的情况下,得到了不错的mAP值,是一个非常适合端侧低算力设备推理的网络结构。

ModelbackboneresolutionCOCO mAPFLOPsparams
NanoDet-mShuffleNetV2 1.0x320*32020.60.72G0.95M
YOLOv4 tinyCSPDarknet53416x41621.76.5B3.1M

4. 我的树莓派信息

硬件: 树莓派4b、2G RAM、32G ROM、荣耀平板8充电头供电、全套散热装,如下图

软件:raspberry OS、上游分支Debian GNU/Linux 11 (bullseye)。

5. ncnn推理相关软件安装

下面介绍在树莓派4b端侧推理nanoDet-m网络,需要安装的组件以及安装方法。

5.1 安装ncnn

执行uname -a,确保是aarch64架构的系统。

执行如下安装指令

  1. # check for updates
  2. sudo apt-get update
  3. sudo apt-get upgrade
  4. # install dependencies
  5. sudo apt-get install cmake wget
  6. sudo apt-get install build-essential gcc g++
  7. sudo apt-get install libprotobuf-dev protobuf-compiler
  8. # download ncnn
  9. git clone --depth=1 https://github.com/Tencent/ncnn.git
  10. # install ncnn
  11. cd ncnn
  12. mkdir build
  13. cd build
  14. # build 64-bit ncnn
  15. cmake -D NCNN_DISABLE_RTTI=OFF -D NCNN_BUILD_TOOLS=ON \
  16. -D CMAKE_TOOLCHAIN_FILE=../toolchains/aarch64-linux-gnu.toolchain.cmake ..
  17. make -j4
  18. make install
  19. # copy output to dirs
  20. sudo mkdir /usr/local/lib/ncnn
  21. sudo cp -r install/include/ncnn /usr/local/include/ncnn
  22. sudo cp -r install/lib/libncnn.a /usr/local/lib/ncnn/libncnn.a

~/ncnn/build/install/bin文件夹下,有很多转换模型的工具,这在我们后面的博客中会用得到,将onnx模型转换为ncnn支持的模型。

5.2 安装opencv4.5.5

(1)更新EEPROM
树莓派4b支持更新EEPROM中的固件,可有效降低树莓派的运行温度。

  1. sudo rpi-eeprom-update
  2. sudo rpi-eeprom-update -a
  3. sudo reboot

(2) 源码编译安装opencv

不要使用pip或者apt安装opencv,这两种方式不能保证是64bit版本的,性能不能充分在树莓派上发挥出来。

Preferences -> Raspberry Pi Configuration -> Performance -> GPU Memory设置项中,给GPU分配至少128M显存。

执行以下命令安装

  1. # check for updates
  2. sudo apt-get update
  3. sudo apt-get upgrade
  4. # dependencies
  5. sudo apt-get install build-essential cmake git unzip pkg-config
  6. sudo apt-get install libjpeg-dev libpng-dev
  7. sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev
  8. sudo apt-get install libgtk2.0-dev libcanberra-gtk* libgtk-3-dev
  9. sudo apt-get install libgstreamer1.0-dev gstreamer1.0-gtk3
  10. sudo apt-get install libgstreamer-plugins-base1.0-dev gstreamer1.0-gl
  11. sudo apt-get install libxvidcore-dev libx264-dev
  12. sudo apt-get install python3-dev python3-numpy python3-pip
  13. sudo apt-get install libtbb2 libtbb-dev libdc1394-22-dev
  14. sudo apt-get install libv4l-dev v4l-utils
  15. sudo apt-get install libopenblas-dev libatlas-base-dev libblas-dev
  16. sudo apt-get install liblapack-dev gfortran libhdf5-dev
  17. sudo apt-get install libprotobuf-dev libgoogle-glog-dev libgflags-dev
  18. sudo apt-get install protobuf-compiler

下载opencv4.5.5的源码包

  1. cd ~
  2. # 如果网络连接失败,在其他电脑上 访问这个网址下载好,再放到树莓派的 ~/ 目录下
  3. wget -O opencv.zip https://github.com/opencv/opencv/archive/4.5.5.zip
  4. wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.5.5.zip
  5. unzip opencv.zip
  6. unzip opencv_contrib.zip
  7. mv opencv-4.5.5 opencv
  8. mv opencv_contrib-4.5.5 opencv_contrib

在执行编译之前,如果是2G RAM的树莓派,需要扩容swap分区,大于2G RAM的版本可忽略此项。
扩容swap方式(仅限2G RAM)

使用开源代码rpi_zram, 对swap进行扩容,按照github上的README操作就可以。


编译opencv4.5.5

  1. cd ~/opencv
  2. mkdir build
  3. cd build
  4. cmake -D CMAKE_BUILD_TYPE=RELEASE \
  5. -D CMAKE_INSTALL_PREFIX=/usr/local \
  6. -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
  7. -D ENABLE_NEON=ON \
  8. -D WITH_OPENMP=ON \
  9. -D WITH_OPENCL=OFF \
  10. -D BUILD_TIFF=ON \
  11. -D WITH_FFMPEG=ON \
  12. -D WITH_TBB=ON \
  13. -D BUILD_TBB=ON \
  14. -D WITH_GSTREAMER=ON \
  15. -D BUILD_TESTS=OFF \
  16. -D WITH_EIGEN=OFF \
  17. -D WITH_V4L=ON \
  18. -D WITH_LIBV4L=ON \
  19. -D WITH_VTK=OFF \
  20. -D WITH_QT=OFF \
  21. -D OPENCV_ENABLE_NONFREE=ON \
  22. -D INSTALL_C_EXAMPLES=OFF \
  23. -D INSTALL_PYTHON_EXAMPLES=OFF \
  24. -D PYTHON3_PACKAGES_PATH=/usr/lib/python3/dist-packages \
  25. -D OPENCV_GENERATE_PKGCONFIG=ON \
  26. -D BUILD_EXAMPLES=OFF ..
  27. make -j4
  28. sudo make install
  29. sudo ldconfig

验证安装,进入python编程环境

  1. import cv2
  2. print(cv2.__version__)

5.3 安装codeblocks

使用codeblocks在树莓派上进行开发。喜欢remote develop的也可以直接使用vscode的远程开发功能。

6. 推理通路代码

这部分内容,以及模型转换内容、树莓派超频等,我们留在下一节展开说明。

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
热爱秃头的每一天
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区