树莓派系统:armvl7
Docker version 24.0.5
yolov5-lite 的原始项目参考了:
https://github.com/ppogg/YOLOv5-Lite
第一步:下载docker镜像
由于该项目需要在在docker中运行opencv,而我在使用Dockerfile搭建镜像时会遇到各种环境依赖上的困难,在尝试了多种方法后依然无法解决在Dockerfile中运行"RUN apt-get update"报错的问题,最后选择直接从docker hub 上拉去镜像。
拉去镜像之前,需要先修改docker的镜像源地址;
1.在终端编辑docker文件
vim/etc/docker/daemon.json
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
2.重启docker
Systemctl restart docker.service
3.查看镜像源情况
docker info
在修改完成镜像源后,就可以从docker hub上拉去别人的镜像了
4.在终端输入命令
docker pull danhdoan/opencv4-slim-buster
下载完成后使用以下指令查看镜像的ID
docker images
第2步:更新docker环境
使用命令搭建后台运行的容器(run -dit 可以让容器不会立刻挂掉)
docker run -dit [images_ID] /bin/sh
进入容器
docker exec -it [pod_ID] /bin/bash
通过 "python -V" "pip list" 等指令可以查询当前容器的配置信息
Python 3.7.9
OpenCV 4.4.0
然后就可以尝试在容器内安装onnxruntime
由于博主使用的树莓派是armhf32位系统,onnxruntime的官方安装包已经不再支持了,手动安装则需要使用cmake交叉编译,过程比较复杂。好在有大神已经将其打包成whl并发布,我们可以选择对映的版本进行安装。
链接:https://github.com/nknytk/built-onnxruntime-for-raspberrypi-linux
选择对应python3.7的最新版本下载到本地主机
使用传输命令将安装包传入容器内(在终端执行)
docker cp /home/pc/onnxruntime-1.8.1-cp37-cp37m-linux_armv7l.whl 3e336c18a066:app
进入容器并执行安装命令(在容器内执行)
pip install onnxruntime-1.8.1-cp37-cp37m-linux_armv7l.whl
这时系统会报错,原因是numpy的版本过低,只要执行升级命令就可以了。我这里使用了和安装onnxruntime一样的方法,把numpy=1.21.4的安装包传入容器并安装。
安装成功后可以在终端输入“python”
import cv2
import onnxruntime
如果没有报错,则证明安装成功。
再次使用 docker cp 命令将已经调试好的yolov5-lite项目传输进docker,确保程序里模型路径是正确的。
最后,将该容器重新打包成镜像,方便日后使用。
docker commit -m="描述信息" -a="作者" 容器id 目标镜像名: [TAG]
第三步:部署python程序
1.使用命令将新的镜像部署为容器
docker run -dit --privileged=true --net=host -e DISPLAY=:0.0 -v /tmp:/tmp b842f81d24bf /bin/sh
该程序需要同时调用多个树莓派(宿主机)上的USB设备,所以在创建容器时需要添加额外的命令。
--privileged=true :给予docker容器root权限,使docker可以自由访问宿主机设备;在实际生产环境下应使用 --device="*****"来代替
--e DISPLAY=:0.0 :在不加入这条命令之前,我的程序一直无法运行,会出现报错:
Unable to init server: Could not connect: Connection refused
查找相关资料后,将问题锁定在了cv2.imshow等需要使用图形界面的代码上,注释了改代码中有关屏幕显示的相关代码,程序果然就运行了起来。
在宿主机上运行
xhost +
echo $DISPLAY
返回代码
:0.0
因此,在创建容器时需要加入 “--e DISPLAY=:0.0”,使用这种方法在每次创建新容器时时要重新使用“echo $DISPLAY” 来确定显示器的输出值。
2.进入容器并运行代码
docker exec -it 2870b69b0911 /bin/bash
cd app
python yolov5-lite.py
最终得到图像输出,实验成功在docker上运行了yolov5-lite目标检测程序。
图像输出FPS大概在2.6-2.7之间。