前言
darknet-nnpack
是针对Arm
处理器进行优化的YOLO
版本,虽然只能执行YOLO-tiny
,但是不需要GPU
即可运行,使用YOLOv3-tiny
模型预测用时约为1~1.2s
,是树莓派的合适之选。
步骤
备选方法:直接下载 配置好环境的树莓派系统镜像。安装好系统后即完成环境配置。
下面介绍手动配置的方法。
1. 下载依赖项
sudo apt-get install -y cmake make
2. 安装NNPACK-darknet
首先,进入安放文件的文件夹。
下载并编译NNPACK-darknet
git clone https://github.com/mrhosseini/NNPACK-darknet
mkdir build
cd build
cmake .. -DCMAKE_C_FLAGS=-march=armv6k
make
退回NNPACK-darknet
文件夹后配置环境变量
cd ..
sudo cp `find . -name "*.a" ` /usr/lib/
sudo cp include/nnpack.h /usr/include/
sudo cp deps/pthreadpool/include/pthreadpool.h /usr/include/
过程中如有报错请参见文末错误处理章节。
3. 下载darknet-nnpack
安装依赖项
sudo apt-get install -y clang
下载并编译darknet-nnpack
git clone https://github.com/digitalbrain79/darknet-nnpack.git
cd darknet-nnpack
如果需要和OpenCV结合的话,首先确保安装了OpenCV
,具体的安装方法参见:树莓派下载OpenCV。
然后,编辑Makefile
文件,将文件开头的OPENCV=0
改为OPENCV=1
。
进行编译
make
过程中如有报错请参见文末错误处理章节。
4. 使用YOLO进行预测
可以用来检测图像和视频。命令分别是
图像:./darknet detector test xxx
视频:./darknet detector demo xxx
过程中如有报错请参见文末错误处理章节。
检测图像
因为默认是coco
数据集(80个分类),所以这里也用对应的coco
数据集的权重文件,否则需要特别修改分类数量来对应起来。
下载yolov3-tiny.weights
权重文件
wget https://pjreddie.com/media/files/yolov3-tiny.weights
在darknet-nnpack
目录下,输入命令开始预测
./darknet detect cfg/yolov3-tiny.cfg yolov3-tiny.weights data/dog.jpg
因为没有安装opencv
,所以需要手动打开预测结果图predictions.jpg
。
效果如下
yolo v3
也可以使用,不过极其慢,用了几分钟才出结果,但准确度确实比起tiny
版本高不少。
检测视频
./darknet detector demo ./cfg/coco.data ./cfg/yolov3-tiny.cfg ./yolov3-tiny.weights <视频文件路径> -i 0 -thresh 0.25
如果出现Video-stream stopped!
则说明文件路径错误,导致检测出文件不存在。
检测视频流
这里介绍结合IP摄像头的视频流检测。相同分辨率、帧率的视频流往往比视频的检测速度要快,可能的解释是视频文件往往经过压缩,解压缩步骤需要额外耗时。
手机安装IP Camera
,打开rtsp
服务器,开始推送视频流。
树莓派进入darknet-nnpack
目录
下载权重文件
wget https://pjreddie.com/media/files/yolov3-tiny.weights
开始预测
# ./darknet detector demo <预测用数据路径> <配置文件路径> <权重文件路径> rtsp://<用户名>:<密码>@<ip地址>:<端口/<后缀> -i 0 -thresh <可信度threshold>
./darknet detector demo ./cfg/coco.data ./cfg/yolov3-tiny.cfg ./yolov3-tiny.weights rtsp://admin:admin@172.20.9.53:8554/live -i 0 -thresh 0.25
不过非常的慢,FPS
只有0.1
。
可能的替代方案:
- 自行编写代码
- 奇怪的是有位博主在树莓派4B上跑
darknet-nnpack
,使用yolov3-tiny
能达到每秒2帧:在树莓派RaspberryPi上构建Darknet。已知的不同是使用的系统不同:Debian 11 Bullseye
(本文)VS Debian 10 buster
(他的),但不排除其他可能性
-
YOLO-fastest
(参见YOLO-fastest作者在知乎上的介绍文章)
- 使用
Movidius NCS
+ OpenVINO
(YOLO and Tiny-YOLO object detection on the Raspberry Pi and Movidius NCS)
错误处理
make 时报错 undefined reference to `cpuinfo_deinitialize’
原因是在cmake
步骤中,没有指定系统架构。解决办法如下:
情况一:编译NNPACK-darknet
时出现此问题
进入NNPACK-darknet/build
文件夹中,带上参数-DCMAKE_C_FLAGS=-march=armv6k
重新cmake
,然后再次make
。
cmake .. -DCMAKE_C_FLAGS=-march=armv6k
make
情况二:编译darknet-nnpack
时出现此问题
进入darknet-nnpack
文件夹中,带上参数-DCMAKE_C_FLAGS=-march=armv6k
重新cmake
,然后再次make
。
cmake .. -DCMAKE_C_FLAGS=-march=armv6k
make
检测视频时出现 Video-stream stopped!
视频文件路径错误导致检测出文件不存在。
报错 segment fault
可能是检测图片和检测视频的命令用错了。
图像:./darknet detector test xxx
视频:./darknet detector demo xxx
附录:配置、权重文件下载
更多COCO
数据集的weights
及cfg
文件可以从YOLO官网下载
VOC
权重文件可以在digitalbrain79/darknet-nnpack - github页面下载
参考链接
Raspberry Pi學習筆記(二十七):在Pi上執行YOLOv3
digitalbrain79/darknet-nnpack
mrhosseini/NNPACK-darknet
Make error #189