1. 课程导学与环境准备:YOLO发展史、ONNX与OpenCV简介、环境搭建
各位同学,欢迎来到《YOLO模型导出与OpenCV部署全流程》的第一章。
我是这门课的主讲。在AI部署这个领域摸爬滚打了六七年,踩过的坑比写过的代码还多。今天咱们不急着敲命令,先把地基打牢。
这一章,我会带你理清YOLO的进化路线,搞懂ONNX和OpenCV到底扮演什么角色,最后手把手把开发环境搭起来。嗯,这部分做好了,后面三十章你会走得很顺。
1.1 YOLO发展史:从v3到v10,我们经历了什么?
YOLO(You Only Look Once)系列,说白了就是目标检测领域的「闪电侠」。它把检测任务当成一个回归问题,一次前向推理就能输出目标位置和类别。我最早接触YOLOv3是在2018年,那时候它刚出来,速度和精度吊打当时的Faster R-CNN。
下面这张图是我整理的YOLO核心版本演进脉络,你可以先有个整体印象:
几个关键版本,我挑重点说:
- YOLOv3:里程碑式作品。引入Darknet-53骨干和FPN多尺度预测。我记得当时在工业质检项目里用它,一张1080p图片在1080Ti上能跑到30ms,精度还过得去。但它的Anchor设置比较死板,小目标容易漏。
- YOLOv5:把YOLO带入了PyTorch时代。CSPNet结构让模型更轻量,Mosaic数据增强是神来之笔。我个人习惯用v5s做边缘端部署,模型才7MB,树莓派4B上能跑到15FPS。
- YOLOv8:Ultralytics官方出品,Anchor-Free设计,解耦头,Task-Aligned分配策略。我在2023年把一个安防项目从v5迁移到v8,mAP涨了3个点,但导出ONNX时遇到C2f算子的兼容问题——这个坑后面我会专门讲。
- YOLOv10:2024年新秀。最大的亮点是NMS-Free,靠双重标签分配和一致匹配损失去掉了NMS后处理。部署时少写几十行C++代码,推理速度还能再提10%。
1.2 ONNX与OpenCV:部署的两把瑞士军刀
模型训练好只是第一步。怎么把它搬到生产环境里跑起来?这就轮到ONNX和OpenCV登场了。
ONNX:模型界的通用语言
ONNX(Open Neural Network Exchange)说白了就是一个模型中间表示格式。你拿PyTorch训练出来的.pt文件,除了PyTorch自己,别的框架读不懂。但转成ONNX之后,TensorRT、OpenVINO、ONNX Runtime都能认。
我举个例子:之前有个项目需要在NVIDIA Jetson上跑,训练用的PyTorch,推理用TensorRT。中间桥梁就是ONNX。没有它,你得手写网络结构再加载权重——想想就头疼。
| 特性 | PyTorch模型 (.pt) | ONNX模型 (.onnx) |
|---|---|---|
| 依赖环境 | 必须安装PyTorch + CUDA | 仅需ONNX Runtime或推理后端 |
| 跨平台 | 差,Python独占 | 好,C++/Python/Java/C#均可 |
| 推理优化 | 依赖PyTorch JIT | 可做图优化、量化、算子融合 |
| 部署场景 | 研究、快速验证 | 生产环境、边缘设备、移动端 |
OpenCV:计算机视觉的「万能工具箱」
OpenCV在部署里的角色,我总结为三点:
- 图像预处理:读图、resize、归一化、颜色空间转换。这些操作在OpenCV里一行代码搞定,比用PyTorch的transforms快得多。
- 后处理辅助:画框、计算IOU、NMS(如果你不用v10的话)。OpenCV的
dnn::NMSBoxes函数我用了无数次。 - 推理引擎:OpenCV 4.x以上集成了DNN模块,可以直接加载ONNX模型做推理。虽然性能不如专用引擎,但胜在零依赖——一个
opencv_world.dll全搞定。
torch.chunk,导出ONNX后OpenCV死活不认。解决办法是修改模型结构,用Slice算子替代。这个坑在第五章我会详细演示。
1.3 Python虚拟环境搭建:别让依赖变成噩梦
做AI部署,最怕什么?最怕「在我电脑上能跑」。不同项目依赖的PyTorch版本、CUDA版本、OpenCV版本可能互相冲突。虚拟环境就是解决这个问题的。
我个人习惯用conda,因为它连CUDA Toolkit都能一起管理。当然venv也行,看个人喜好。
步骤一:安装Miniconda
去官网下载Miniconda(Python 3.10+版本)。安装时记得勾选「Add to PATH」。
步骤二:创建虚拟环境
# 创建环境,指定Python版本
conda create -n yolo_deploy python=3.10 -y
# 激活环境
conda activate yolo_deploy
# 验证Python版本
python --version
步骤三:安装核心依赖
# PyTorch(根据你的CUDA版本选择命令)
# CUDA 11.8
pip install torch==2.1.0 torchvision==0.16.0 --index-url https://download.pytorch.org/whl/cu118
# CUDA 12.1
pip install torch==2.1.0 torchvision==0.16.0 --index-url https://download.pytorch.org/whl/cu121
# CPU版本(没有NVIDIA显卡用这个)
pip install torch==2.1.0 torchvision==0.16.0
# Ultralytics(YOLOv8/v10官方库)
pip install ultralytics
# ONNX相关
pip install onnx onnxruntime-gpu # GPU版本
# pip install onnx onnxruntime # CPU版本
# OpenCV
pip install opencv-python opencv-contrib-python
onnxruntime-gpu,结果它自动装了CUDA 11.8版本,而我系统里是CUDA 12.1,导致运行时崩溃。解决方案:先查onnxruntime-gpu支持的CUDA版本,再匹配安装。
1.4 CUDA与cuDNN安装验证:让GPU真正跑起来
很多同学装完CUDA,跑nvidia-smi能看到显卡,就以为万事大吉了。其实不然。nvidia-smi显示的是驱动版本,不代表CUDA Toolkit已经装好。PyTorch用的是Toolkit里的东西。
验证方法一:检查驱动与CUDA版本
nvidia-smi
看右上角的「CUDA Version」,比如显示12.1,说明驱动支持CUDA 12.1及以下版本。
验证方法二:检查CUDA Toolkit是否安装
nvcc --version
如果提示nvcc not found,说明没装CUDA Toolkit。去NVIDIA官网下载对应版本安装。
验证方法三:PyTorch能否调用GPU
python -c "import torch; print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))"
输出True和你的显卡型号(比如NVIDIA GeForce RTX 3090),才算真正配好了。
验证方法四:cuDNN是否生效
python -c "import torch; print(torch.backends.cudnn.version())"
输出类似8700的数字,表示cuDNN 8.7.0在工作。
torch.cuda.is_available()返回True,但跑YOLOv8训练时速度奇慢。排查半天发现cuDNN没装,PyTorch回退到纯CUDA实现,卷积运算慢了5倍。所以cuDNN一定要装,别偷懒。
本章小结
这一章我们走完了YOLO的进化路线,搞懂了ONNX和OpenCV在部署中的角色,也把开发环境搭好了。你想想看,现在你手上有一个干净的虚拟环境,PyTorch、ONNX、OpenCV都装好了,GPU也能正常调用——这就是后面所有实战的基础。