4. 开发环境搭建(下):Python虚拟环境配置、ONNX Runtime与TensorRT安装、OpenCV编译与优化

好,咱们接着上一章聊。环境搭建的上半场我们把系统、驱动和CUDA搞定了,下半场就是真正让YOLO跑起来的“临门一脚”。

说实话,这部分坑不少。我当年第一次在Jetson上配环境,光一个OpenCV就折腾了一整天。后来总结出经验:顺序对了,事半功倍;顺序乱了,重装系统。今天我就把这几年的血泪史浓缩一下,带你走一遍最稳的流程。

4.1 Python虚拟环境:别让依赖打架

为什么一定要用虚拟环境?你想想看,一个项目要TensorRT 8.5,另一个要8.6,直接装系统里,早晚得崩。我习惯用conda,但嵌入式平台资源有限,venv更轻量。

核心原则:每个项目一个独立环境,互不干扰。

4.1.1 创建专属环境

我个人习惯把YOLO相关的环境统一命名,方便管理。

# 创建Python 3.8环境(YOLOv8官方推荐)
python3 -m venv yolo_env

# 激活环境
source yolo_env/bin/activate

# 检查Python版本
python --version

小技巧:激活后,终端前面会出现 (yolo_env) 字样,看到它就知道你在虚拟环境里了。

4.1.2 安装基础依赖

别急着装torch,先把基础库装上。我在项目中遇到过因为numpy版本不对,导致ONNX推理结果全错的情况。

pip install --upgrade pip
pip install numpy==1.24.3
pip install opencv-python-headless==4.8.1.78
pip install matplotlib pillow tqdm

注意:嵌入式平台别装 opencv-python(带GUI的),用 opencv-python-headless 更省空间。

4.2 ONNX Runtime:跨平台的推理引擎

ONNX Runtime是个好东西。它能把训练好的模型转成ONNX格式,然后在不同硬件上跑。说白了,就是一套代码,到处运行。

4.2.1 安装ONNX Runtime

这里要区分CPU和GPU版本。嵌入式平台一般用GPU加速,但如果你在调试阶段,CPU版本也够用。

平台 安装命令 适用场景
CPU pip install onnxruntime 调试、验证
GPU (CUDA) pip install onnxruntime-gpu 生产部署
Jetson (TensorRT) pip install onnxruntime-trt NVIDIA嵌入式设备

我的建议:先装CPU版本做功能验证,确认模型转换没问题后,再换GPU版本。这样排查问题快很多。

4.2.2 验证安装

python -c "import onnxruntime; print(onnxruntime.__version__)"

如果能打印出版本号,说明安装成功。我曾经遇到一个坑:在Jetson上装了GPU版本,但运行时一直报CUDA not available。后来发现是系统CUDA版本和ONNX Runtime要求的版本不匹配。嗯,这里要注意,版本对齐是门玄学

4.3 TensorRT:NVIDIA的加速神器

TensorRT是NVIDIA官方推出的推理优化库。它能把模型做量化、层融合、内存优化,推理速度能提升2-5倍。说白了,就是让GPU跑得更快。

4.3.1 安装TensorRT

安装方式有两种:deb包和tar包。我推荐用deb包,省心。

# 下载TensorRT 8.6.1(根据你的CUDA版本选择)
wget https://developer.nvidia.com/downloads/compute/machine-learning/tensorrt/8.6.1/tensorrt-8.6.1.6.ubuntu2004.x86_64-gnu.cuda-11.8.tar.gz

# 解压
tar -xzvf tensorrt-8.6.1.6.ubuntu2004.x86_64-gnu.cuda-11.8.tar.gz

# 安装Python包
cd TensorRT-8.6.1.6/python
pip install tensorrt-8.6.1.6-cp38-none-linux_x86_64.whl

# 验证
python -c "import tensorrt; print(tensorrt.__version__)"

避坑指南:我曾经在Jetson Nano上装TensorRT,直接用了x86_64的包,结果报错。记住:Jetson是ARM架构,要下载对应版本的包

4.3.2 配置环境变量

为了让系统能找到TensorRT的库文件,需要配置环境变量。

# 编辑 ~/.bashrc
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/TensorRT-8.6.1.6/lib
export PATH=$PATH:/path/to/TensorRT-8.6.1.6/bin

# 生效
source ~/.bashrc

4.4 OpenCV编译与优化:从源码到极致性能

OpenCV是计算机视觉的基石。但嵌入式平台上的OpenCV,直接apt install往往不够用。为什么?因为官方包没有开启GPU加速、没有集成GStreamer、没有优化NEON指令集。

我建议自己编译。虽然过程繁琐,但性能提升是实打实的。

4.4.1 下载源码

# 下载OpenCV 4.8.1
wget -O opencv-4.8.1.zip https://github.com/opencv/opencv/archive/4.8.1.zip
unzip opencv-4.8.1.zip

# 下载contrib模块(可选,用于SIFT等算法)
wget -O opencv_contrib-4.8.1.zip https://github.com/opencv/opencv_contrib/archive/4.8.1.zip
unzip opencv_contrib-4.8.1.zip

4.4.2 CMake配置

这是最关键的一步。配置不对,编译出来可能还不如官方包。

cd opencv-4.8.1
mkdir build && cd build

cmake -D CMAKE_BUILD_TYPE=RELEASE \
      -D CMAKE_INSTALL_PREFIX=/usr/local \
      -D WITH_CUDA=ON \
      -D WITH_CUDNN=ON \
      -D OPENCV_DNN_CUDA=ON \
      -D ENABLE_FAST_MATH=1 \
      -D CUDA_FAST_MATH=1 \
      -D WITH_CUBLAS=1 \
      -D WITH_GSTREAMER=ON \
      -D WITH_V4L=ON \
      -D BUILD_opencv_python3=ON \
      -D BUILD_opencv_python2=OFF \
      -D BUILD_TESTS=OFF \
      -D BUILD_PERF_TESTS=OFF \
      -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.8.1/modules \
      ..

关键参数说明:

  • WITH_CUDA=ON:开启CUDA加速,推理速度提升明显
  • OPENCV_DNN_CUDA=ON:让OpenCV的DNN模块使用CUDA后端
  • WITH_GSTREAMER=ON:支持摄像头视频流,嵌入式必备
  • ENABLE_FAST_MATH=1:启用快速数学运算,牺牲一点精度换速度

4.4.3 编译与安装

# 使用多核编译,加快速度
make -j$(nproc)

# 安装
sudo make install

# 更新动态链接库
sudo ldconfig

小技巧:编译时可以用 make -j4 指定核心数。Jetson Nano是4核,用 -j4 刚好。别用 -j$(nproc),有时候它会检测到虚拟核心,导致编译进程过多而卡死。

4.4.4 验证OpenCV

python -c "import cv2; print(cv2.getBuildInformation())"

查看输出中是否有 CUDA: YESGStreamer: YES 等字样。如果有,说明编译成功了。

避坑指南:我曾经编译完OpenCV后,发现Python里import报错。排查了半天,发现是Python路径问题。解决办法:在虚拟环境里重新安装编译好的包。

# 在虚拟环境里安装
cd opencv-4.8.1/build
pip install python/cv2/python-3.8/cv2.cpython-38-x86_64-linux-gnu.so

4.5 环境验证:跑一个YOLO测试

所有东西装完后,我们来验证一下环境是否正常。写一个简单的YOLO推理脚本:

import cv2
import numpy as np
import onnxruntime as ort
import tensorrt as trt

# 检查ONNX Runtime
print(f"ONNX Runtime: {ort.__version__}")
print(f"Available providers: {ort.get_available_providers()}")

# 检查TensorRT
print(f"TensorRT: {trt.__version__}")

# 检查OpenCV
img = np.zeros((640, 640, 3), dtype=np.uint8)
print(f"OpenCV: {cv2.__version__}")
print(f"CUDA enabled: {cv2.cuda.getCudaEnabledDeviceCount() > 0}")

print("环境搭建完成!")

如果所有输出都正常,恭喜你,开发环境搭建成功了!

总结一下:

  • 虚拟环境是隔离依赖的利器,每个项目一个环境
  • ONNX Runtime负责跨平台推理,TensorRT负责极致加速
  • OpenCV一定要自己编译,开启CUDA和GStreamer
  • 版本对齐是关键,别小看这一步

下一章,我们会正式开始YOLO模型的转换与优化。到时候,这些环境配置就会派上大用场了。


公众号:蓝海资料掘金营,微信deep3321