树莓派上使用dockers运行yolov5-lite目标检测项目(onnxruntime)

树莓派系统: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

树莓派上使用dockers运行yolov5-lite目标检测项目(onnxruntime)_第1张图片

选择对应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之间。

你可能感兴趣的:(YOLO,docker,容器)