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: YES、GStreamer: 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