YOLO(You Only Look Once)算法是近年非常知名的深度神经网络结构,由于创始人在v3版本之后便宣布退出领域,于是从v4版之后便出现较多的分支,到2022年8月已经有v5、v6与v7与三大分支争奇斗艳,其中v7版是v4版的增强,由同一个团队进行开发与维护。
这个顶尖算法如果能再搭配NVIDIA TensorRT的辅助,就是名副其实的如虎添翼效果,因此也有非常多技术人员提供基于不同版本YOLO算法搭配TensorRT的推理项目,目前在GITHUB上的相关开源项目数量已经达到三位数。
想利用YOLO算法开发自主项目的工程师,首要的工具就是要在几个不同版本之中挑选合适的神经网络,在这里并不对不同版本去做任何横向的比较,因为性能虽然很重要,但是这些优秀团队所提供的算法在精度vs性能之间的取舍效果是各有所长,并且依旧在不断改善之中,因此做对比是没有意义的。
至于哪种算法比较合适?最直接的方式就是搭建开发环境,实际操作过之后才能有所体会与理解。下面列出三个版本各自提供的requirements.txt文件,是配置环境所需要安装的Python相关库列表:
可以看到YOLOv5与v7的库内容几乎一致,甚至注解内容都一样,很明显感受到v7是基于v5的应用架构上修改算法内容。而v6虽然有些不同之处,但是核心库的内容也几乎与v5雷同,同样也应该是在v5的基础上进行修改。
传统的思路会在设备上使用conda或virtulen等Python的虚拟环境去配置,透过复杂的环境变量设置,将不同应用进行隔离,来解决这些版本上的些微差异问题。
但是虚拟环境方法的严谨度不够,不仅出错率较高,并且移植性并不好,比较推荐的方式,就是利用合适的Docker镜像,为不同版本YOLO创建独立的开发或使用的容器环境,这样就能很轻松地在一台设备上同时启动操作多个YOLO版本,并且未来要将某个版本容器迁移或部署到其他设备上,操作过程也是非常简单的。
接下来的重点就是要挑选合适Jetson设备的Docker镜像,来作为搭建不同版本YOLO应用环境。经过简单整理分析之后,发现三种YOLO版本中有以下三个最主要共性,对环境的影响最为关键:
在NGC里可以找到l4t-pytorch与l4t-ml两大系列镜像,是基于Jetson平台,并且预先安装好Pytorch训练框架,都可以列入选择。
在三个项目里的requirements.txt都有“opencv-python>=4.x.y”的内容,表示都会使用“pip3 install”安装Python版的OpenCV库,但是经过验证之后,发现这种安装OpenCV方式在x86平台是可行,但是在Jetson平台不能被正常调用。
熟悉Jetson设备的读者应该都知道,在JetPack 4.x版本都是配置Ubuntu 18.04操作系统,而Python版本最高到3.6.9;目前JetPack 5.0版本则配置Ubuntu 20.04操作系统,Python版本则为3.8.x。
一种方式是选择基于JetPack 4.x环境创建的r32.x.y版本镜像,然后进入容器后升级Python版本至3.7以上,但是镜像内原本是以Python3.6安装的库,升级之后就得全部在新版本重新安装,因此这种方式并不合适。
另一种方式是选择基于JetPack 5.x环境创建的r34.x.y版本镜像,里面已经安装好Python 3.8版本,剩下需要确认的,就是这个版本镜像在JetPack 4.x环境上是否能够正常操作?如果可以的话,这是目前最理想的选择!
经过上述三个条件的综合筛选,目前最佳方案是NGC上r34.1.0以上版本的l4t-ml系列镜像,也就是l4t-ml:r34.1.x-py3镜像。当然您也可以参考本系列前两篇“从头创建Jetson的容器(1)(2)”的操作步骤,自行从头创建合适的镜像。
接下来以l4t-ml:r34.1.1-py3镜像为基础,来执行这三个版本YOLO的环境配置任务,为了要更方便操作,请使用以下指令下载个别开源项目,以及创建个别的容器:
$ $ $ $ |
mkdir ~/yolo && cd ~/yolo git clone https://github.com/ultralytics/yolov5 git clone https://github.com/meituan/YOLOv6 git clone https://github.com/WongKinYiu/yolov7 |
现在就会在~/yolo目录下生成yolov5、YOLOv6与yolov7三个目录,接下来可以使用变量方式来创建各自的容器:
$ $
$ |
export YOLO_VER=yolov5(或YOLOv6、yolov7) docker run -id --name=$YOLO_VER --network host --runtime nvidia -w /home/yolo -v /home/nvidia/yolo/$YOLO_VER:/home/yolo nvcr.io/nvidia/l4t-ml:r34.1.1-py3 docker exec -it $YOLO_VER bash |
这样就能为每个YOLO版本创建各自的独立容器,进行环境配置工作。为了节省国内用户安装Python相关库的时间,建议进入容器之后先执行以下步骤,使用国内Python源来提升下载速度:
$ |
pip3 config set global.index-url https://mirrors.aliyun.com/pypi/simple/ |
此外,前面提过关于OpenCV部分的问题,由于l4t-ml镜像内已经好OpenCV环境,因此我们必须先把3个开源项目的requirements.txt里的“opencv-python”用“#”号进行关闭,否则会造成调用失败的问题。
接下去就针对个别版本进行配置。
进入相关容器之后,只要执行以下指令就可以:
$ |
pip3 install -r requirements.txt |
安装完毕之后,执行以下指令测试:
$ |
python3 detect.py --source <自行提供的图片> |
如果在run/detect/expN目录下生成推理的结果,就表示环境已经配置正常。
这个版本需要将cmake从系统提供的3.16.3版本升级到3.22以上,在宿主机上可以使用snap方式去安装,但是在Docker容器里面无法使用,因此最直接的方式就是用源码进行编译,执行指令如下:
$
$ $ $ |
wget https://github.com/Kitware/CMake/releases/download/v3.24.0/cmake-3.24.0-linux-aarch64.sh chmod +x cmake-3.24.0-linux-aarch64.sh && ./cmake-3.24.0-linux-aarch64.sh cp cmake-3.24.0-linux-aarch64/bin/cmake /usr/bin ln -s $PWD/cmake-3.24.0-linux-aarch64/share/cmake-3.24/ /usr/share/cmake-3.24 |
完成cmake版本升级之后,同样执行以下指令进行安装:
$ |
pip3 install -r requirements.txt |
安装完毕之后,执行以下指令测试:
$ |
python3 tools/infer.py --weights yolov6s.pt --source <自行提供的图片> |
如果在run/inference/exp目录下生成推理的结果,就表示环境已经配置正常。
这个版本比v5多了几个元素,
$ $ $ |
apt update && apt install -y zip htop screen libgl1-mesa-glx pip3 install seaborn thop pip3 install -r requirements.txt |
安装完毕之后,执行以下指令测试:
$ |
ython3 detect.py --weights yolov7.pt --conf 0.25 --img-size 640 --source <自行提供的图片> |
如果在run/inference/expN目录下生成推理的结果,就表示环境已经配置正常。
以上使用l4t-ml:r34.1.1-py3镜像去创建YOLOv5/v6/v7应用环境的方式,目前在JetPack 4.6.x与JetPack 5.0版本上都能正常执行,这是个最轻松的方式。
至于未来要再配合TensorRT加速引擎的使用,也推荐使用l4t-ml:r34.x.y-py3镜像,为个别项目创建独立的容器,这样可以在Jetson设备上同时创建更多的独立开发环境,对于Jetson Orin与Jetson AGX Xavier这类计算资源较充沛的设备来说,就可以作为一个开发服务器使用,非常方便。
好文章,需要你的鼓励
HPE 推出一系列网络解决方案,旨在帮助零售商增强全渠道体验。这些解决方案提供远程管理、改善用户体验、提高运营效率和物联网安全性。核心技术包括 AI 洞察功能,可自动检测和修复性能问题。HPE 还提供安全连接平台和 IoT 仪表盘,以应对物联网设备带来的安全挑战。
英国两大独立宽带运营商 CityFibre 和 nexfibre 加快在郊区和半农村地区部署全光纤网络。CityFibre 开始在苏塞克斯郡连接超过 5.7 万户家庭和企业,nexfibre 已覆盖 200 万个接入点。这些举措旨在推动全国范围内光纤接入市场的长期竞争,加速英国"千兆项目"的实施进程。