在 RaspberryPi 上跑 YOLO

继续摧残 RaspberryPi 系列……

反正 Telegram 上群友已经看不下去了:“放过它吧…… 它只是个树莓派啊……”

原版 Darknet

原版 Darknet 使用纯 C 编写,可以说什么依赖都没有,直接编译即可。十分 “灵活”。

git clone https://github.com/pjreddie/darknet
cd darknet
make

然后下载 weights 跑 demo。使用 yolo 检测 dogs.jpg 大概耗时 385 秒。

AlexyAB 版

对于没有 GPU 又不想折腾的用户来说,AlexyAB 版是最好的选择。不仅修复了许多错误,而且加入了一些选项,使得纯 CPU 的情况下运行速度更快。

git clone https://github.com/AlexyAB/darknet
cd darknet
make

YOLOv3 Tiny 在 15 秒左右。

不过为了获取更快的速度, 我们需要安装一些其他依赖。

libgomp1
libomp-dev
libfcml-dev

之后修改一下 Makefile,打开上述依赖。YOLO v3 Tiny 在 11 秒左右。

同时,gcc 可以针对 arm 进行一些特殊的优化,也可以打开: 在 CFLAGS 的末尾加上-marm 即可。亲测,加上这个之后,YOLO v3 Tiny 在 7.3 秒左右。

darknet-nnpack

当然了,原版 Darknet 因为各种没有加优化,在 GPU 上速度很快,但是在 CPU 上速度简直不能忍。做项目的时候找到了 “darknet-nnpack” 这个东西。

安装依赖

sudo apt install ninja-build
sudo apt install clang
sudo pip3 install --upgrade git+https://github.com/Maratyszcza/PeachPy
sudo pip3 install --upgrade git+https://github.com/Maratyszcza/confu

NNPACK-darknet

这就是提速用的点金石了。

首先获取原码:

git clone https://github.com/thomaspark-pkj/NNPACK-darknet.git

之后可以看一下 ninja 的版本。这里编译需要 ninja1.7+,如果 ninja 的版本不满足(例如,使用的是 1.5 版本)的话,可以修改 build.ninja 文件,将开头的 ninja_required_version,将 1.7 改为 1.5 即可继续编译。

再然后就是编译 NNPACK-darknet 了:

confu setup
python ./configure.py
ninja
sudo cp -a lib/* /usr/lib/
sudo cp include/nnpack.h /usr/include/
sudo cp deps/pthreadpool/include/pthreadpool.h /usr/include/

darknet-nnpack

下面主角出场:

git clone https://github.com/thomaspark-pkj/darknet-nnpack.git
cd darknet-nnpack
make

应该能顺利完成编译。

下载 weights 跑 demo。使用 yolo 检测 dogs.jpg 大概耗时 8.3 秒。使用 TinyYolov2 大概 1 秒。并且可以使用 RealTimeCamera 的例子,大概 0.8 帧/秒。和 AlexyAB 版本一样,打开一些优化选项之后,可以达到 1 帧/秒。

问题解决办法

python3 configure 出错

参考这个 Issue


Posted

in

by

Comments

《“在 RaspberryPi 上跑 YOLO”》 有 7 条评论

  1. 刘佳忆 的头像
    刘佳忆

    博主真的贴心~能留个联系方式吗?我想跟您请教一下关于深层神经网络的问题,最近被搞得好烦-_-

  2. Ryan 的头像
    Ryan

    您好,

    我後來參考
    https://github.com/shizukachan/darknet-nnpack
    有做出結果,分享給您。

    1. 小金鱼儿 的头像
      小金鱼儿

      谢谢!

    2. 刘佳忆 的头像
      刘佳忆

      请问能不能讲解一下 nnpack 加速以及你改进的 nnpack 加速具体各是什么原理吗?我想详细学习一下,谢谢!

    3. 小金鱼儿 的头像
      小金鱼儿

      我并没有做任何改进,只是希望它在树莓派上跑起来。

      原理好像是更快速的 GEMM,以及充分利用多核 CPU。(直接使用 Darknet 是单 CPU 在跑,用了 NNPACK 之后我发现它变成了多 CPU 一起跑)

  3. Ryan 的头像
    Ryan

    您好
    想請教您 Tiny-YOLO 輸出有結果嗎? 我照著說明做了一次,似乎辨識不出任何東西,還是原圖一張。想請教您有出現這個狀況嗎? 謝謝您

    1. 小金鱼儿 的头像
      小金鱼儿

      Hi~

      It seems that there must be something wrong with the weight of TinyYolo. please refer to this issue. But finally, I can not get any result.

      您好~

      好像是因為 TinyYolo 的權重文件有問題。請參閱這個 Issue。但我最終沒有得到任何結果。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注