Jetson Nano使用TensorRT加速yolov3-tiny目标识别

3,981 阅读3分钟

环境配置

  • 安装protobuf
sudo pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple protobuf==3.8.0
  • 安装onnx
sudo apt-get install protobuf-compiler libprotoc-dev 
  • 安装pillow
sudo pip3 install Pillow
  • 安装pycuda:如果下述脚本无法安装,请看[[Jetson Nano安装pycuda(踩坑传)]]
export PATH=/usr/local/cuda/bin:\${PATH}
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:\${LD_LIBRARY_PATH}
sudo pip3 install pycuda
  • 安装numpy
sudo pip3 install numpy

运行TRT-yolov3

📦Github: TRT-yolov3

  1. 下载配置文件和权重文件到TRT-yolov3/yolov3_onnx/

也可以使用TRT-yolov3/yolov3_onnx/download.sh进行下载 或 查看该文件有选择性的下载(你懂的,异常缓慢,记得自己找办法加速,我帮你找好了两个)

  1. 修改download.sh文件,只保留如下部分,执行该脚本sudo ./download.sh
#!/bin/bash

set -e

echo
echo "Creating YOLOv3-Tiny-288 and YOLOv3-Tiny-416 configs..."
cat yolov3-tiny.cfg | sed -e '8s/width=416/width=288/' | sed -e '9s/height=416/height=288/' > yolov3-tiny-288.cfg
echo >> yolov3-tiny-288.cfg
ln -sf yolov3-tiny.weights yolov3-tiny-288.weights
cp yolov3-tiny.cfg yolov3-tiny-416.cfg
echo >> yolov3-tiny-416.cfg
ln -sf yolov3-tiny.weights yolov3-tiny-416.weights

echo
echo "Done."

以下只以yolov3-tiny-416为例,这两个步骤都比较慢 请耐心等待

  1. .cfg转换为.onnx
python3 yolov3_to_onnx.py --model yolov3-tiny-416
  1. .onnx转换为.trt
python3 onnx_to_tensorrt.py --model yolov3-tiny-416

测试(识别)

【视频】

python3 detector.py --file --filename data/test.mp4 --model yolov3-tiny-416 --runtime

【摄像头】 将trt-yolov3-detector-camera.py脚本放到TRT-yolov3/目录下,并更换第十行的绝对路径 直接执行该脚本即可调用摄像头进行识别了


模型替换(详细)

如果TRT-yolov3已经成功跑通则理论上可以跳过着part,这part是我自己踩坑的过程中,在发现TRT-yolov3项目之前找到模型转换方法的部分分解动作,如果想更详细的一步步了解如何从.cfg转化到.trt的,可以继续阅读

核心思想是将yolo原始的.cfg配置文件转换为TensorRT要用的.trt文件

yolov3-tiny -> onnx

  1. 创建yolov3_tiny_to_onnx.py文件
  2. 准备模型配置.cfg文件和权重.weights文件在该py脚本同一目录

我采用的是直接将yolov3-tiny两个文件重新命名 两文件需同名,例如yolov3-tiny-416.cfgyolov3-tiny-416.weights

  1. 执行如下脚本生成.onnx模型配置文件
python3 yolov3_tiny_to_onnx.py --model yolov3-tiny-416

【关于这里.cfg的说明】

我将原始的py文件进行了一点修改,原始py只能读取288、416、608层的配置文件,这里删除了这个限制,但暂时不清楚会有什么问题 但是cfg文件仍然有一定的格式约束

  1. 每层之间只有一个空行
[convolutional]
batch_normalize=1

[maxpool]
size=2
  1. 第一层[net]中最后两项更改为
steps=400000
scales=.1
  1. 该cfg文件结尾有且仅有两行空行

onnx -> trt

  1. 创建onnx_to_tensorrt.py文件
  2. 执行如下脚本,生成.trt模型文件
python3 onnx_to_tensorrt.py —model yolov3-tiny-416

Resource