在Jetson Nano上编译librealsense并搭建yolov5环境

前言

某比赛要求在Jetson Nano上使用SR300摄像头采集图像和深度图, 然后运行目标识别算法进行识别. 本来以为Jetson Nano嘛, 有CUDA加速用起来应该很爽, 结果拿到手一看, 不仅慢的一批, 而且光配环境就配了两天, 踩了不少坑, 在这里记录一下吧(虽然我觉得以后再也不会碰这种东西了, 不过万一有学弟也要打这比赛呢, 希望以后比赛方能更新一下设备, Jetson Nano和SR300都已经deprecated了

yolov5模型训练

工程
├── datasets 数据集
│ ├── images <- 训练集图片
│ ├── labels <- 训练集标注
│ └── test <- 测试集
└── yolov5 yolov5-6.2(df80e7c)

1. 将`数据集`和`工程`文件夹复制到训练服务器上
2. 进入`工程/yolov5`目录
3. 执行以下命令安装依赖

pip install -r requirements.txt -i https://pypi.mirrors.ustc.edu.cn/simple

注意: 若使用GPU加速, 则需到官网https://pytorch.org/get-started/locally/下载pytorch

4. 执行以下命令开始训练模型

python train.py --data 3d.yaml --weights yolov5m.pt --device 0 --cache ram --workers 24 --batch-size 16 --epochs 300
# 参数 --device 为使用的显卡或cpu编号, cpu为使用CPU, 编号为显卡(从第一张支持CUDA的N卡开始算起), 可在任务管理器中查看
# 参数 --workers 数据装载时CPU所使用的线程数, 默认为 8
# 参数 --batch-size 一次往GPU里塞多少张图片, 需要为GPU数量的倍数, 默认为 16
# 参数 --epochs 训练代数, 默认为 300
# 添加参数 --cache ram 或者 --cache disk 能够加速训练, 但是会占用大量内存或磁盘空间

如果有多张显卡则可使用以下命令并行训练

python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data 3d.yaml --weights yolov5m.pt --device 0,1

5. 训练完成后可在runs/train目录中找到训练结果, 然后用以下命令可以测试

python detect.py --weights <模型权重> --source <要识别的图片> --imgsz <图片尺寸>

识别结果保存在runs/detect目录中

烧录系统

我们的开发板是TF卡版本的, 所以在Jetson官网下载镜像, 然后烧录到TF卡中即可; 如果你的开发板是EMMC版本的则需要用一台安装了Ubuntu的电脑或虚拟机, 然后电脑连接板子, 用NVIDIA SDK Manager烧录系统

挂载exfat格式的分区

sudo apt-get install exfat-utils

安装Jetson资源状态查看器jtop:

pip3 install jetson-stats

如果看jtop发现有两个CPU核心是off, 首先检查是不是处于5W模式, 切换为NMAX, 如果还不行就输入以下命令开启核心:

sudo su
echo 1 > /sys/devices/system/cpu/cpu2/online
echo 1 > /sys/devices/system/cpu/cpu3/online

如果想运行一些CUDA的程序需要添加以下环境变量:

export CUDA_HOME=/usr/local/cuda-10.2
export LD_LIBRARY_PATH=/usr/local/cuda-10.2/lib64:$LD_LIBRARY_PATH
export PATH=/usr/local/cuda-10.2/bin:$PATH

安装虚拟环境

需要安装miniforge3, 注意是aarch64架构的, 实测(mini)conda在板子上跑不起来

编译librealsense

realsense需要从源码编译, 且建议不要选择太新的版本, 因为新版对SR300的支持已经不是active了, 我用的是2.50.0

# 安装依赖
sudo apt-get install git libssl-dev libusb-1.0-0-dev libudev-dev pkg-config libgtk-3-dev
sudo apt-get install libglfw3-dev libgl1-mesa-dev libglu1-mesa-dev
# 不插摄像头, 进入源码目录
./scripts/setup_udev_rules.sh
# 开始构建
mkdir build && cd build
cmake ../ -DCMAKE_BUILD_TYPE=release -DBUILD_WITH_CUDA:bool=true -DBUILD_PYTHON_BINDINGS:bool=true -DPYTHON_EXECUTABLE=/usr/bin/python3.6
make -j4
sudo make install
# 安装pyrealsense2
cd wrappers/python
echo "export PYTHONPATH=$PYTHONPATH:/usr/local/lib" >> ~/.bashrc
python setup.py install
# 要是这步之后库还装不上需要把.so文件拷过去

输入realsense-viewer可以打开摄像头预览软件

安装其它依赖

Pillow, numpy, opencv-python和pyqt的安装需要注意:
Pillow需要安装8.X.X版本的, 不能装9.0.0以上版本(如果这里不装之后装pytorch会自动装9.0.0以上版本, 所以得先装)
numpy需要装1.19.3版本的, 高版本在nano上会崩溃, opencv4.6最低只支持该版本
pyqt安装之前需要先安装qt

sudo apt-get install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools

然后pip install -r requirements.txt即可

安装pytorch

pytorch需要安装英伟达提供的版本, 否则无法使用CUDA, 在Jetson下载中心可以找到, 我装的是1.10.0, 同时还需要到github下载torchvision-0.11.1

具体步骤可以参考https://pytorch.org/blog/running-pytorch-models-on-jetson-nano/, 以下是TL; DR版的命令

# 安装pytorch
pip install torch-1.10.0-cp36-cp36m-linux_aarch64.whl
python
> import torch
# 如果提示缺少libomp.so则安装libomp
sudo apt-get install libomp5 libomp-dev
# 安装numpy时注意新版本会报非法指令(核心已转储)的错误, 需要装旧版本:
pip install numpy==1.19.3
# 然后安装torchvision
cd vision-0.11.1
python setup.py install

最后的最后

一切完成后就可以跑yolov5的识别试试了, 虽然yolov5提示需要python3.7以上版本, 但实际上3.6也是能跑的, 本来想下新版的系统, 是Ubuntu20.04+Python3.8的, 可惜已经不支持Nano了…

如果你还是搞不明白环境怎么配, 我把我配好的环境以及整个系统都写到一个IMG镜像里了, 直接烧录即可, 在OurEDA的NAS中可以找到

参考

  • https://forums.developer.nvidia.com/t/pytorch-for-jetson-version-1-9-0-now-available/72048
  • https://developer.aliyun.com/article/879285
  • https://blog.csdn.net/weixin_44312422/article/details/122256752
  • https://blog.csdn.net/tao_292/article/details/126761343
标题: 在Jetson Nano上编译librealsense并搭建yolov5环境
作者: QingChenW
链接: https://dawncraft.cc/2022/11/439/
本文遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 许可
禁止商用, 非商业转载请注明作者及来源!
上一篇
下一篇
隐藏