前言
某比赛要求在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
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