本文记录笔者在 nvidia TX2 系统上搭建 yolov5 环境的过程。
注意说明的是,本文在文后的文章基础上进行实践,根据自己的经历进行描述和补充。由于能力有限,对本文涉及的知识和相关问题无法回答。
本文不涉及 yolo 深度学习方面的内容。

一、要点

本节对本文进行技术小结。

  • TX2 刷机后,PYthon版本为 3.7.1。
  • 保持T X2 联网,因为需要下载。
  • conda 创建环境,命令行前会有环境名称的提示。
  • 文后的尝试及记录,建议看看。

二、过程

准备工程源码

mkdir -p /opt/nvidia/deepstream/yolo
cd /opt/nvidia/deepstream/yolo
git clone https://github.com/DanaHan/Yolov5-in-Deepstream-5.0.git
git clone https://github.com/wang-xinyu/tensorrtx.git
git clone https://github.com/ultralytics/yolov5.git

安装 conda

如无 conda,则安装之。到 https://github.com/Archiconda/build-tools/releases 下载。本文所用安装脚本为 Archiconda3-0.2.3-Linux-aarch64.sh 。下载到系统,再安装:

chmod +x Archiconda3-0.2.3-Linux-aarch64.sh./Archiconda3-0.2.3-Linux-aarch64.shsource ~/tx/.bashrc

创建 conda 环境

使用如下命令创建名为 yolov5 的 conda 环境:

$ conda create -n yolov5 python

此过程需要手动输入 y 以安装软件包。安装时长取决于联网速度。

成功后,输入conda activate yolov5激活,使用conda deactivate退出。过程日志信息详见文后附录。
进入 conda 环境后,命令行前有环境名称 yolov5,如:

(yolov5) tx@tx-desktop:/opt/nvidia/deepstream/yolo$

安装 yolo 依赖库

切换分支:

cd /opt/nvidia/deepstream/yolo/yolov5
git checkout -b v4.0 v4.0

安装:

pip install scikit-build
pip install -r requirements.txt

执行后命令,提示:

ERROR: Could not find a version that satisfies the requirement torchvision>=0.8.1
ERROR: No matching distribution found for torchvision>=0.8.1

安装 torchvision:

conda install torchvision -c pytorch

在实践中发现该命令无法从官方途径安装。故从源码安装。
到 https://github.com/pytorch/vision/releases 下载源码压缩包,本文所用版本 v0.9.0,下载,并安装:

tar xf vision-0.9.0.tar.gz
cd vision-0.9.0
python setup.py install

安装过程可能提示没有 torch 模块:

ModuleNotFoundError: No module named 'torch'

安装之:

pip install torch

torchvision编译需要等待一段时间。

依赖包安装完成后提示:

Successfully installed Cython-0.29.22 PyYAML-5.4.1 absl-py-0.12.0 cachetools-4.2.1 chardet-4.0.0 cycler-0.10.0 google-auth-1.27.1 google-auth-oauthlib-0.4.3 grpcio-1.36.1 idna-2.10 kiwisolver-1.3.1 markdown-3.3.4 matplotlib-3.3.4 oauthlib-3.1.0 opencv-python-4.5.1.48 pandas-1.2.3 protobuf-3.15.6 pyasn1-0.4.8 pyasn1-modules-0.2.8 pycocotools-2.0.2 python-dateutil-2.8.1 pytz-2021.1 requests-2.25.1 requests-oauthlib-1.3.0 rsa-4.7.2 scipy-1.6.1 seaborn-0.11.1 six-1.15.0 tensorboard-2.4.1 tensorboard-plugin-wit-1.8.0 thop-0.0.31.post2005241907 tqdm-4.59.0 urllib3-1.26.3 werkzeug-1.0.1

在yolov5目录下:

cd /opt/nvidia/deepstream/yolo/yolov5

下载模型文件:

bash weights/download_weights.sh

默认下载到yolov5目录,有文件:yolov5l.pt yolov5m.pt yolov5s.pt yolov5x.pt。可根据实际情况选,本文使用默认值,即yolov5s.pt文件。拷贝到 weights 目录。

继续在 yolov5 目录下,拷贝 gen_wts.py。

cp ../tensorrtx/yolov5/gen_wts.py ./

注意,可修改 gen_wts.py 文件,主要修改'weights/yolov5x.pt' 'yolov5x.wts'名称。

生成wts文件:

python gen_wts.py

最终生成文件:yolov5x.wts。将其拷贝到 Yolov5-in-Deepstream-5.0 目录,并切换到该目录。

cp yolov5s.wts ../Yolov5-in-Deepstream-5.0
cd ../Yolov5-in-Deepstream-5.0

根据实际情况,修改 yolov5.cpp 文件,将 NET 宏改成自己对应的模型。本文使用默认值 s,无须改动。

#define NET s  // s m l x

编译:

mkdir build
cd build
cmake ..
make

生成 yolov5 文件,后面将用该文件生成模型和测试。

生成engine文件:

sudo ./yolov5 -s

注意:程序使用了…/yolov5x.wts,所以 yolov5x.wts 要拷贝 Yolov5-in-Deepstream-5.0 目录。成功输出如下信息:

$sudo ./yolov5 -s
Loading weights: ../yolov5s.wts
Building engine, please wait for a while...
Build engine successfully!

测试:

mkdir ../samples

从网上下载两张 coco 数据集图片,放到 samples 上。

sudo ./yolov5 -d  ../samples

在build可看到有图片文件生成,且标注了,说明成功。

将 libmyplugins.so yolov5s.engine 拷贝到 Deepstream 5.0 目录。

cp yolov5x.engine ../Deepstream\ 5.0/
cp libmyplugins.so ../Deepstream\ 5.0/

Deepstream 测试

在 Yolov5-in-Deepstream-5.0\Deepstream 5.0\nvdsinfer_custom_impl_Yolo 目录执行make,生成libnvdsinfer_custom_impl_Yolo.so文件。进入 Yolov5-in-Deepstream-5.0\Deepstream 5.0 目录中,修改 config_infer_primary_yoloV5.tx 文件。主要修改:

model-engine-file=yolov5s.engine --> model-engine-file=yolov5x.enginecustom-lib-path=objectDetector_Yolo_V5/nvdsinfer_custom_impl_Yolo/libnvdsinfer_custom_impl_Yolo.so --> custom-lib-path=nvdsinfer_custom_impl_Yolo/libnvdsinfer_custom_impl_Yolo.so

将 DeepStream 的 label.txt 拷贝到当前目录(本文使用的是 /opt/nvidia/deepstream/deepstream-5.0/sources/objectDetector_Yolo/labels.txt )。修改 deepstream_app_config_yoloV5.txt 文件的视频地址(本文修改为 uri=file:/opt/nvidia/deepstream/deepstream-5.0/samples/streams/sample_720p.mp4)。使用官方 deepstream-app 程序测试,执行:

LD_PRELOAD=./libmyplugins.so deepstream-app -c deepstream_app_config_yoloV5.txt

可得到识别的结果。

三、参考资源

DeepStream5.0系列之yolov5使用: https://blog.csdn.net/zong596568821xp/article/details/109444343
pytorch源码:https://github.com/pytorch/vision/releases

附1:尝试

一般错误

ModuleNotFoundError: No module named 'Cython'
--> python3.7 -m pip install cythonCould not find a version that satisfies the requirement cmake--> python3.7 -m pip install cmake

torchvision

找不到 torchvision 模块提示如下:

ERROR: Could not find a version that satisfies the requirement torchvision>=0.8.1
ERROR: No matching distribution found for torchvision>=0.8.1

选按通用安装方式:

python3.7 -m pip install torchvision

但错误提示依旧。按网上说法使用如下命令安装:

pip3 install torchvision==0.8.1 -f https://download.pytorch.org/whl/torch_stable.html

但依然失败。再用官方 提供的命令:

conda install torchvision -c pytorch

还是失败。究其原因,可能是没有 aarch64 版本的缘故。所以用源码安装。

生成 egine 文件时提示:

Loading weights: ../yolov5x.wts
[03/10/2021-01:00:59] [E] [TRT] (Unnamed Layer* 14) [Convolution]: kernel weights has count 0 but 12800 was expected
[03/10/2021-01:00:59] [E] [TRT] (Unnamed Layer* 14) [Convolution]: count of 0 weights in kernel, but kernel dimensions (1,1) with 160 input channels, 80 output channels and 1 groups were specified. Expected Weights count is 160 * 1*1 * 80 / 1 = 12800
[03/10/2021-01:00:59] [E] [TRT] Parameter check failed at: ../builder/Network.cpp::addScale::482, condition: shift.count > 0 ? (shift.values != nullptr) : (shift.values == nullptr)
yolov5: /opt/nvidia/deepstream/yolo-in-Deepstream-5.0/common.hpp:190: nvinfer1::IScaleLayer* addBatchNorm2d(nvinfer1::INetworkDefinition*, std::map<std::__cxx11::basic_string<char>, nvinfer1::Weights>&, nvinfer1::ITensor&, std::__cxx11::string, float): Assertion `scale_1' failed.
Aborted

原因是使用 yolov5x 版本,改为默认的 yolov5s 不再出现。
使用 yolov5s.wts 在 AGX Xavier 平台上出现的错误:

 sudo ./yolov5 -s
Loading weights: ../yolov5s.wts
[03/12/2021-16:06:07] [E] [TRT] (Unnamed Layer* 14) [Convolution]: kernel weights has count 0 but 2048 was expected
[03/12/2021-16:06:07] [E] [TRT] (Unnamed Layer* 14) [Convolution]: count of 0 weights in kernel, but kernel dimensions (1,1) with 64 input channels, 32 output channels and 1 groups were specified. Expected Weights count is 64 * 1*1 * 32 / 1 = 2048
[03/12/2021-16:06:07] [E] [TRT] Parameter check failed at: ../builder/Network.cpp::addScale::482, condition: shift.count > 0 ? (shift.values != nullptr) : (shift.values == nullptr)
yolov5: /opt/nvidia/deepstream/yolo/Yolov5-in-Deepstream-5.0/common.hpp:190: nvinfer1::IScaleLayer* addBatchNorm2d(nvinfer1::INetworkDefinition*, std::map<std::__cxx11::basic_string<char>, nvinfer1::Weights>&, nvinfer1::ITensor&, std::__cxx11::string, float): Assertion `scale_1' failed.
Aborted

使用不同平台的 engine 文件的错误(TX2生成,AGX Xavier运行):

$ sudo ./yolov5 -d  ../samples
[03/12/2021-16:12:13] [E] [TRT] INVALID_CONFIG: The engine plan file is generated on an incompatible device, expecting compute 7.2 got compute 6.2, please rebuild.
[03/12/2021-16:12:13] [E] [TRT] engine.cpp (1546) - Serialization Error in deserialize: 0 (Core engine deserialization failure)
[03/12/2021-16:12:13] [E] [TRT] INVALID_STATE: std::exception
[03/12/2021-16:12:13] [E] [TRT] INVALID_CONFIG: Deserialize the cuda engine failed.
yolov5: /opt/nvidia/deepstream/yolo/Yolov5-in-Deepstream-5.0/yolov5.cpp:534: int main(int, char**): Assertion `engine != nullptr' failed.
Aborted

测试时,如果 samples 目录存在非图片时,会提示:

740ms
terminate called after throwing an instance of 'cv::Exception'what():  OpenCV(4.1.1) /home/nvidia/host/build_opencv/nv_opencv/modules/imgcodecs/src/loadsave.cpp:662: error: (-2:Unspecified error) could not find a writer for the specified extension in function 'imwrite_'

解决:图片后缀需正确,如jpg、png。

创建 yolo 环境输出日志

$ conda create -n yolov5 python
Solving environment: done## Package Plan ##environment location: /home/tx/archiconda3/envs/yolov5added / updated specs: - pythonThe following packages will be downloaded:package                    |            build---------------------------|-----------------zlib-1.2.11                |       h7b6447c_2         118 KB  c4aarch64openssl-1.0.2p             |       h7b6447c_0         3.1 MB  c4aarch64sqlite-3.25.2              |       h7ce4240_0         2.2 MB  c4aarch64readline-7.0               |       h7ce4240_5         440 KB  c4aarch64pip-10.0.1                 |           py37_0         1.7 MB  c4aarch64wheel-0.32.1               |           py37_0          34 KB  c4aarch64libgcc-ng-7.3.0            |       h5c90dd9_0         5.9 MB  c4aarch64libstdcxx-ng-7.3.0         |       h5c90dd9_0         2.5 MB  c4aarch64setuptools-40.4.3          |           py37_0         601 KB  c4aarch64xz-5.2.4                   |       h7ce4240_4         345 KB  c4aarch64certifi-2018.10.15         |           py37_0         137 KB  c4aarch64ncurses-6.1                |       h71b71f5_0         1.0 MB  c4aarch64tk-8.6.8                   |       hbc83047_0         3.2 MB  c4aarch64ca-certificates-2018.03.07 |                0         123 KB  c4aarch64python-3.7.2               |       he90a169_0        36.1 MB  c4aarch64libffi-3.2.1               |       h71b71f5_5          51 KB  c4aarch64libedit-3.1.20170329       |       hc058e9b_2         188 KB  c4aarch64------------------------------------------------------------Total:        57.8 MBThe following NEW packages will be INSTALLED:ca-certificates: 2018.03.07-0            c4aarch64certifi:         2018.10.15-py37_0       c4aarch64libedit:         3.1.20170329-hc058e9b_2 c4aarch64libffi:          3.2.1-h71b71f5_5        c4aarch64libgcc-ng:       7.3.0-h5c90dd9_0        c4aarch64libstdcxx-ng:    7.3.0-h5c90dd9_0        c4aarch64ncurses:         6.1-h71b71f5_0          c4aarch64openssl:         1.0.2p-h7b6447c_0       c4aarch64pip:             10.0.1-py37_0           c4aarch64python:          3.7.2-he90a169_0        c4aarch64readline:        7.0-h7ce4240_5          c4aarch64setuptools:      40.4.3-py37_0           c4aarch64sqlite:          3.25.2-h7ce4240_0       c4aarch64tk:              8.6.8-hbc83047_0        c4aarch64wheel:           0.32.1-py37_0           c4aarch64xz:              5.2.4-h7ce4240_4        c4aarch64zlib:            1.2.11-h7b6447c_2       c4aarch64Proceed ([y]/n)? yPreparing transaction: done
Verifying transaction: done
Executing transaction: done
#
# To activate this environment, use
#
#     $ conda activate yolov5
#
# To deactivate an active environment, use
#
#     $ conda deactivate

附2:成果

1、文中涉及的软件包只在 TX2 测试通过,已整合为 aarch64 系统的 docker 镜像,并上传至阿里云仓库备份。
Dockerfile:

FROM busybox
RUN mkdir /yolotools
COPY vision-0.9.0.tar.gz  /yolotools
COPY yolo.tar.bz2  /yolotools
COPY Archiconda3-0.2.3-Linux-aarch64.sh  /yolotools

创建并上传:

docker build -t registry.cn-hangzhou.aliyuncs.com/latelee/yoloenv:aarch64 .
docker push registry.cn-hangzhou.aliyuncs.com/latelee/yoloenv:aarch64

镜像说明:yolo.tar.bz2包含了本文的工程源码。运行后查看容器的 /yolotools 目录。

docker run -itd --name foobar registry.cn-hangzhou.aliyuncs.com/latelee/yoloenv:aarch64 sh
docker exec -it foobar ls /yolotools

在宿主机拷贝文件出来:

mkdir tools
docker cp foobar:/yolotools/vision-0.9.0.tar.gz tools
docker cp foobar:/yolotools/yolo.tar.bz2 tools
docker cp foobar:/yolotools/Archiconda3-0.2.3-Linux-aarch64.sh tools

再附

一段时间来,github 和 gitlab 官方经常打不开,在访问网站上较耗时。不知何故。

李迟 2021.3.12 周五

nvidia TX2 CUDA yolov5环境搭建相关推荐

  1. ubuntu 从刷机到yolov5环境搭建训练记录

    ubuntu 从刷机到yolov5环境搭建训练记录 这两天需要一个模型检测一些摄像头内容,使用yolov5训练了一个模型,记录一下. 1. 刷机 具体步骤不描述,网上很多. 刷机时遇到一个问题,原有系 ...

  2. PyTorch+YOLOv5环境搭建(未完待续)

    PyTorch+YOLOv5环境搭建 软硬件要求 1. PyTorch Requirements NVIDIA CUDA 9.2 or above NVIDIA cuDNN v7 or above h ...

  3. CUDA+VS2017+win环境下 cuda工程环境搭建(解决标识符未定义或申明)

    CUDA+VS2017+win环境下 cuda工程环境搭建 引言 前提准备(CUDA和VS的安装) Visual Studio 配置 测试 Reference 引言 在学习CUDA并行计算原理时,在V ...

  4. YOLOv5环境搭建、训练流程及tensorrt转换生成plan文件

    一.背景 github官网yolov5,代码什么的从这个网站下 二.环境搭建 有两种环境搭建方式,一是用conda搭个虚拟环境,然后安装所有需要的库跟依赖等:二是用docker容器,下载英伟达的pyt ...

  5. 【玩转Jetson TX2 NX】(七)TX2 NX YoLoV4环境搭建+板载摄像头实时目标检测(详细教程+错误解决)

    1 YoLoV4环境搭建 直接下载,然后解压,最后移动到Jetson TX2 NX,如图所示,darknet下载链接: https://github.com/AlexeyAB/darknet 将解压的 ...

  6. cuda编程环境搭建

    官方安装教程: http://docs.nvidia.com/cuda/cuda-getting-started-guide-for-linux/index.html 我的安装环境:ubuntu12. ...

  7. Ubuntu14.04 + Matlab2014a + caffe + cuda + cudnn环境搭建

    为什么80%的码农都做不了架构师?>>>    安装Caffe环境前,请查好各个软件版本的相互匹配资料,确定好所有软件版本后,再开始安装. 一.安装gcc4.6 Ubuntu14.0 ...

  8. nvidia nx深度学习环境搭建

    pytorch 官方并未提供 arm平台的安装包,可采用以下三种方式安装 方法一: 请参考https://github.com/KumaTea/pytorch-aarch64 使用方法:到pytorc ...

  9. YOLOv5 环境搭建、 coco128 训练示例 、 详细记录【一文读懂】

最新文章

  1. RPC 笔记(06)— socket 通信(多线程服务器)
  2. Android安全研究经验谈
  3. UrlEncode编码算法
  4. 【渝粤教育】国家开放大学2018年秋季 0727-21T思想道德修养与法律基础 参考试题
  5. nodejs 设置网络代理
  6. 国内三巨头为什么那么成功
  7. @程序员,欠下的技术债怎么还?
  8. C和指针 第十六章 标准函数库 本地跳转setjmp.h
  9. r语言算巢式设计方差分析_R语言入门之效力分析(Power Analysis)
  10. 服务器主板电源适配器维修,自己修理笔记本电脑电源适配器
  11. 数据分析--数据的分组和聚合
  12. Linux定时任务的基础操作
  13. glibc 知:手册05:字符串和数组
  14. 君士坦丁堡升级要点详解
  15. arduino 步进电机驱动库_Arduino驱动 步进电机
  16. JavaScript - this指向以及强行改变this指向
  17. 3D数学——法线变换
  18. 使用echarts在地图中使用dispatchAction
  19. snowboy嵌入式_jetson nano 安装 snowboy 遇到的问题及处理
  20. 英文名字大全(女篇)

热门文章

  1. 通用汽车CES官宣电动皮卡 追赶福特、Rivian
  2. 英伟达正寻求欧盟批准其收购Arm
  3. 特斯拉在华第900座超级充电站落户深圳
  4. 最便宜iPad曝光 苹果给力了!
  5. 消息称快手已通过港交所聆讯 计划2月第一周上市
  6. 谷歌将推出新版Pixel 4a 5G:搭载骁龙765G处理器 售价下降至3200元
  7. 马云再谈教育:未来的学校学的不仅仅是知识 更重要的是学习的能力
  8. 索尼收购挪威公司Nevion 进一步增强其业务组合
  9. 腾讯云游戏新进展:WeGame云游戏功能已落地全国9省市
  10. 腾讯再回应被骗,悬赏1000瓶老干妈求线索!老干妈:腾讯从来没有催收过