Jetson nano部署过程记录:yolov5s+TensorRT+Deepstream检测usb摄像头

部署运行你感兴趣的模型镜像

目录

0 准备:

1 烧录系统镜像

1)下载系统镜像

2)格式化SD卡

3)使用 Etcher 写入镜像

4)使用SD卡开机

2、增加swap内存

3、查看cuda版本

4、clone darknet源码并编译

 5、torch、torchvision安装

6、Yolov5环境搭建

7、TensorRT make & 推理测试

​ 8、安装和测试DeepStream

9、Yolov5检测

10、说明


0 准备:

(1)Jetson nano硬件【B01开发套件+USB摄像头+显示屏+网线】

(2)USB读卡器,64GB内存卡

1 烧录系统镜像

1)下载系统镜像

英伟达官方下载地址:Jetson Download Center | NVIDIA Developer

下载系统镜像JetPack 4.5.1(4GB版本)

2)格式化SD卡

下载SD Card Formatter软件并安装:https://www.sdcard.org/downloads/formatter/sd-memory-card-formatter-for-windows-downloa 

使用SD Card Formatter格式化SD卡

3)使用 Etcher 写入镜像

Etcher下载地址:balenaEtcher - Flash OS images to SD cards & USB drives 

烧录镜像,大概30分钟

4)使用SD卡开机

烧写完成后,将SD卡插入Jetson Nano,开机,完成一些设置,如时区、语言、输入法等 。 

2、增加swap内存

由于Jetson nano的内存只有4GB,且与显存共用,后期编译torchvision,生成TensorRT推理引擎文件不够用,这里提前增加swap内存。

打开终端输入:

sudo vim /etc/systemd/nvzramconfig.sh

 通过vim打开nvzramconfig.sh,按"i"进入"insert"模式,修改mem=$((("${totalmem}" / 2 / "${NRDEVICES}") * 1024))为mem=$((("${totalmem}" * 2 / "${NRDEVICES}") * 1024)),按"ESC"退出"insert"模式,输入":wq"保存并退出,输入"reboot"重启开发板。

打开终端输入:gnome-system-monitor

gnome-system-monitor

即可在监视管理器中看到内存增加。

3、查看cuda版本

Jetson nano烧录镜像时系统已经自带有cuda(本机cuda为10.2)和cudnn,所以不再需要自己安装。

1)vim .bashrc

2)在"insert"模式下,在末尾处加上

export PATH=/usr/local/cuda-10.2/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.2/lib64\                         
${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

3)"ESC"退出"insert"模式,":wq"保存退出

4)输入nvcc -V可查看到cuda版本为10.2.89

4、clone darknet源码并编译

1)下载darknet源码:

git clone https://github.com/AlexeyAB/darknet.git

2)修改Makefile文件

 GPU=1

CUDNN=1

OPENCV=1

LIBSO=1

3)"ESC"退出"insert"模式,":wq"保存退出,make -j 编译

 4)编译结束,输入./darknet进入子目录,输入:

wget https://github.com/AlexeyAB/darknet/releases/download

下载yolov3-tiny.weights和yolov4-tiny.weights权重。

输入:

./darknet detector demo cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights exp-output test0.mp4

即可使用darknet框架的yolov4-tiny推理视频。

也可测试图片/摄像头:

./darknet detector test cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights data/dog.jpg	# 图片测试
./darknet detector demo cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights -ext_output test.mp4		# 视频测试
./darknet detector demo cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights -c 0		# 摄像头测试

USB摄像头推理:1920x1080分辨率

 5、torch、torchvision安装

1)下载官方提供的torch-1.8.0-cp36-cp36m-linux_aarch64.whl包

https://nvidia.box.com/shared/static/p57jwntv436lfrd78inwl7iml6p13fzh.whl

 2)按照官方教程输入以下命令

sudo apt-get install python3-pip libopenblas-base libopenmpi-dev
pip3 install Cython
pip3 install numpy torch-1.8.0-cp36-cp36m-linux_aarch64.whl # (按照自己torch1.8.0包的下载路径修改)
sudo apt-get install libjpeg-dev zlib1g-dev libpython3-dev libavcodec-dev libavformat-dev libswscale-dev
git clone --branch v0.9.0 https://github.com/pytorch/vision torchvision
cd torchvision
export BUILD_VERSION=0.9.0
python3 setup.py install --user

6、Yolov5环境搭建

1)下载yolov5 5.0版本(我用6.0版本出现了numpy和tensorflow的兼容冲突问题,所以后来用5.0版本)

 GitHub - ultralytics/yolov5 at v5.0

 2)更新pip

python3 -m pip install --upgrade pip

 3)在yolov5项目下,右键打开终端输入pip3 install -r requirements.txt

4)可以提前下载好yolov5s.pt权重

5)python3 detect.py 推理结果如下

7、TensorRT make & 推理测试

1)glone TensorRT

 注意tensorrtx版本要和yolov5 5.0版本对应上。

2)将yolov5文件夹和tensorrtx文件夹拷贝至home目录下。

cd tensorrtx
cp yolov5/gen_wts.py ~/yolov5
cd ~/yolov5
python3 gen_wts.py yolov5s.pt

该部分代码实现将tensorrtx/yolov5/gen_wts.py复制到yolov5目录下运行,由yolov5s.pt生成yolov5s.wts。

cd ~/tensorrtx/yolov5
mkdir build && cd build
mv ~/yolov5/yolov5s.wts ./
cmake ..
make -j

该部分代码实现将tensorrtx/yolov5/gen_wts.py复制到yolov5目录下运行,由yolov5s.pt生成yolov5s.wts。

./yolov5 -s yolov5s.wts yolov5s.engine s #生成engine文件

./yolov5 -d yolov5s.engine ../samples   #推理samples文件夹下的2张图片

 8、安装和测试DeepStream

1) Install Dependencies

执行以下命令以安装需要的软件包:

sudo apt install \
libssl1.0.0 \
libgstreamer1.0-0 \
gstreamer1.0-tools \
gstreamer1.0-plugins-good \
gstreamer1.0-plugins-bad \
gstreamer1.0-plugins-ugly \
gstreamer1.0-libav \
libgstrtspserver-1.0-0 \
libjansson4=2.11-1

 2)Install the DeepStream SDK

a. 下载 DeepStream 5.1 Jetson tar package deepstream_sdk_v5.1.0_jetson.tbz2

https://developer.nvidia.com/deepstream-sdk-v510-jetsontbz2

b. 输入以下命令以提取并安装DeepStream SDK:

sudo tar -xvf deepstream_sdk_v5.1.0_jetson.tbz2 -C /
cd /opt/nvidia/deepstream/deepstream-5.1
sudo ./install.sh
sudo ldconfig

3)安装完成进入官方例程文件夹

cd /opt/nvidia/deepstream/deepstream-5.1/samples/configs/deepstream-app/

 测试:

deepstream-app -c source8_1080p_dec_infer-resnet_tracker_tiled_display_fp16_nano.txt

9、Yolov5检测

1)git clone GitHub - DanaHan/Yolov5-in-Deepstream-5.0: Describe how to use yolov5 in Deepstream 5.0

git clone https://github.com/DanaHan/Yolov5-in-Deepstream-5.0.git

2)

cd Yolov5-in-Deepstream-5.0/Deepstream 5.0
cp ~/darknet/data/coco.names ./labels.txt

3)

vim config_infer_primary_yolovV5.txt   #修改第59行
vim deepstream_app_config_yoloV5.txt #修改第24行

4)cp ~/tensorrtx/yolov5/build/yolov5s.engine ./ #复制之前生成的引擎文件到当前目录

cp ~/tensorrtx/yolov5/build/yolov5s.engine ./ #复制之前生成的引擎文件到当前目录

 5)cd nvdsinfer_custom_impl_Yolo

6)make -j # 生成libnvdsinfer_custom_impl_Yolo.so文件

7) cd .. #返回到DeepStream5.0/下

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

8)修改deepstream_app_config_yoloV5.txt文件,切换为usb摄像头测试:

10、说明

本教程主要参考b站文章内容在自己的jetson nano测试:Jetson nano从烧录系统到DeepStream+TensorRT+yolov5检测CSI摄像头视频 - 哔哩哔哩

其他参考:

​​​​​​Ubuntu使用darknet实现YOLOv4-tiny预训练模型测试+训练自己的数据集+评估自己的模型_Xavier的博客-优快云博客

Jetson Nano 学习笔记_GeekPlusA的博客-优快云博客_jetson nano学习 

感谢其他博主分享的知识。

您可能感兴趣的与本文相关的镜像

PyTorch 2.8

PyTorch 2.8

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

### Jeston Orin Nano 部署 YOLOv8 TensorRT 的方法 #### 1. 环境准备 为了成功在 Jetson Orin Nano部署 YOLOv8 并利用 TensorRT 进行加速,首先需要完成环境的搭建。这包括安装必要的依赖库以及配置开发工具链。 - **操作系统**: 建议使用 NVIDIA 提供的官方 Linux 发行版 (L4T),版本需支持 TensorRT 和 CUDA[^2]。 - **CUDA 工具包**: 安装最新版本的 CUDA Toolkit,确保其兼容性与 Jetson 设备硬件架构相符[^3]。 - **cuDNN 库**: 下载并安装适配当前 CUDA 版本的 cuDNN 库文件[^1]。 - **TensorRT SDK**: 获取 NVIDIA TensorRT 软件开发套件,并按照文档说明完成初始化设置[^4]。 #### 2. 模型导出 YOLOv8 默认训练得到的是 PyTorch 格式的权重文件 (.pt),而 TensorRT 支持 ONNX 或者自定义引擎格式作为输入源。因此,在实际应用前还需要经历模型转换过程: ```bash pip install ultralytics # 如果尚未安装 Ultralytics 库,则先执行此命令 python export.py --model yolov8n.pt --include onnx --opset 12 ``` 上述脚本会基于指定参数生成对应的 `.onnx` 文件用于后续处理。 #### 3. 使用 `trtexec` 构建推理引擎 通过 NVIDIA 提供的命令行工具可以快速实现从 ONNX 到 TRT Engine 的转变操作: ```bash trtexec --onnx=yolov8n.onnx --saveEngine=yolov8n.engine --workspace=4096 --fp16 ``` 这里设置了工作空间大小为 4GB (`--workspace`) 同时启用了半精度浮点运算模式(`--fp16`) 来提升性能表现。 #### 4. 编写加载逻辑代码样例 最后一步就是编写 Python/C++ 等编程语言编写的程序来调用已经创建好的 engine 文件来进行目标检测任务了。下面给出一段简单的 python 实现片段展示基本流程: ```python import tensorrt as trt from PIL import Image import numpy as np import pycuda.driver as cuda import pycuda.autoinit def load_engine(engine_file_path): with open(engine_file_path, 'rb') as f, trt.Runtime(trt.Logger()) as runtime: return runtime.deserialize_cuda_engine(f.read()) class HostDeviceMem(object): def __init__(self, host_mem, device_mem): self.host = host_mem self.device = device_mem def __str__(self): return "Host:\n" + str(self.host) + "\nDevice:\n" + str(self.device) def __repr__(self): return self.__str__() def allocate_buffers(engine): inputs = [] outputs = [] bindings = [] stream = cuda.Stream() for binding in engine: size = trt.volume(engine.get_binding_shape(binding)) * engine.max_batch_size dtype = trt.nptype(engine.get_binding_dtype(binding)) # Allocate host and device buffers host_mem = cuda.pagelocked_empty(size, dtype) device_mem = cuda.mem_alloc(host_mem.nbytes) # Append the device buffer to device bindings. bindings.append(int(device_mem)) # Append to input/output lists if engine.binding_is_input(binding): inputs.append(HostDeviceMem(host_mem, device_mem)) else: outputs.append(HostDeviceMem(host_mem, device_mem)) return inputs, outputs, bindings, stream if __name__ == '__main__': ENGINE_PATH = './yolov8n.engine' IMAGE_PATH = './test.jpg' image = Image.open(IMAGE_PATH).convert('RGB') img_array = np.array(image.resize((640, 640)), dtype=np.float32)/255. engine = load_engine(ENGINE_PATH) context = engine.create_execution_context() inputs, outputs, bindings, stream = allocate_buffers(engine) # Transfer data from CPU to GPU memory cuda.memcpy_htod_async(inputs[0].device, img_array.ravel(), stream) # Run inference context.execute_async_v2(bindings=bindings, stream_handle=stream.handle) # Transfer predictions back from GPU to CPU [cuda.memcpy_dtoh_async(out.host, out.device, stream) for out in outputs] # Synchronize threads after execution is done stream.synchronize() print([o.host.reshape(-1)[:10] for o in outputs]) # Print first ten elements of each output layer ``` 以上展示了如何加载预构建的 TensorRT 引擎实例化上下文对象并通过分配缓冲区传递数据给 GPU 执行推断计算最终获取结果的过程。 ---
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值