🎯 YOLOv8目标检测实战详解
📋 目录
一、YOLOv8简介
1.1 学习目的
人工智能、深度学习是当前技术发展的重要趋势。在深度学习工程实践流程中,模型部署是关键的第三个环节:
数据准备 → 模型构建 → 模型部署
💡 定位建议:模型部署环节的主要工作包括推理前处理、推理后处理、平台适配与加速,要求我们:
- 了解模型的输入与输出
- 能够使用各种推理框架进行模型转换与推理
- 具备快速适配各硬件平台的能力
- 掌握流媒体、视频编解码、图像处理等技术
- 能够快速写出稳定、高性能的C++代码
1.2 为什么选择YOLOv8
YOLOv8是YOLO系列的最新版本,具有以下优势:
- 速度快:实时检测,适合部署
- 精度高:在多个数据集上达到SOTA
- 易部署:支持多种推理框架
- 功能全:支持目标检测、姿态估计、实例分割等任务
二、YOLOv8输入与输出
2.1 输入格式(NCHW)
YOLOv8的输入是一个张量,通常采用NCHW格式:
| 维度 | 含义 | 说明 |
|---|---|---|
| N | Batch Size | 批次大小,通常为1 |
| C | Channels | 通道数,RGB图像为3 |
| H | Height | 图像高度,通常为640 |
| W | Width | 图像宽度,通常为640 |
输入张量形状: [1, 3, 640, 640]
2.2 输出格式详解
YOLOv8的输出张量形状为 [1, 84, 8400]:
[1, 84, 8400]
│ │ │
│ │ └─ 8400个预测点
│ └─ 4 + 80(边界框 + 类别数)
└─ 批次数
维度解析:
| 参数 | 值 | 说明 |
|---|---|---|
| 批次数 | 1 | 单张图片推理时为1 |
| 84 | 4 + 80 | 边界框坐标 + 80个类别置信度 |
| 8400 | 8400 | YOLOv8在图片上生成的预测框数量 |
📝 通俗理解:YOLOv8在图片上会画出8400个大小不一的框,对每个框中的物体进行预测,对80个类别依次打分,找到分数最高的类别。
2.3 内存数据布局
深入理解输出数据在内存中的存储方式:
张量 [1, 84, 8400] 的内存布局:
- 第一维 :批次数,决定有多少个
84 × 8400的数据块 - 第二维 :84个元素,每个元素包含:
- 前4个:边界框坐标 (x, y, w, h)
- 后80个:各类别的置信度分数
- 第三维:8400个数据点
第二维详细结构:
[0-3]: 边界框 (left, top, right, bottom)
[4-83]: 80个类别的置信度
三、YOLOv8前处理
前处理是将原始图像转换为模型输入格式的关键步骤:
3.1 图像缩放
YOLOv8要求的输入分辨率是 640×640。
处理方式:
python
# 缩放图像到640x640
image = cv2.resize(image, (640, 640))
⚠️ 注意事项:缩放时需保持图像的长宽比,避免物体变形。通常使用letterbox方法进行填充。
3.2 颜色空间转换
YOLOv8要求输入RGB格式数据。
转换代码:
python
# BGR转RGB
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
3.3 图像归一化
YOLOv8期待输入图像像素值在 [0, 1] 范围内。
归一化处理:
python
# 将uint8(0-255)归一化为float32(0-1)
image_normalized = image.astype(np.float32) / 255.0
3.4 HWC转CHW
YOLOv8要求输入CHW格式(Channel × Height × Width)。
转置操作:
python
# HWC转CHW
image_chw = np.transpose(image_normalized, (2, 0, 1))
前处理完整流程:
原始图像 → 缩放(640×640) → BGR转RGB → 归一化(/255) → HWC转CHW
四、YOLOv8后处理
后处理是将模型原始输出转换为可读检测结果的过程:
4.1 转置操作
将模型输出 [84, 8400] 转置为 [8400, 84],便于后续处理。
python
# 转置操作
output = np.squeeze(output) # 移除批次维度
output = output.transpose() # [8400, 84]
4.2 解码与筛选
从8400个检测点中筛选出置信度高的点:
筛选流程:
- 提取边界框坐标 (x, y, w, h)
- 计算每个类别的置信度
- 筛选置信度大于阈值的检测点
数据结构:
item[0]: left (左边界)
item[1]: top (上边界)
item[2]: right (右边界)
item[3]: bottom (下边界)
item[4]: confidence (置信度)
item[5]: label (类别ID)
4.3 非极大值抑制(NMS)
YOLOv8可能会预测多个重叠的框检测同一物体,使用NMS筛选最优框。
NMS原理:
- 按置信度排序所有检测框
- 选择置信度最高的框作为保留框
- 计算其他框与保留框的IoU(交并比)
- 删除IoU大于阈值的重叠框
- 重复上述步骤直到所有框处理完毕
NMS参数:
| 参数 | 说明 |
|---|---|
conf_thres |
置信度阈值,通常为0.25 |
iou_thres |
IoU阈值,通常为0.45 |
五、YOLOv8-Pose姿态估计
5.1 基本概念
YOLOv8-Pose是YOLOv8模型中用于姿态估计的版本。
官方模型特点:
- 仅用于人体姿态评估
- 检测出人体轮廓点
- 输出17个关键点(如肩、肘、腕、膝、踝等)
5.2 输出格式
YOLOv8-Pose输出格式:
(x, y, w, h, c + points × 17) × 8400
| 参数 | 说明 |
|---|---|
| x, y, w, h | 目标框坐标和宽高 |
| c | 置信度 |
| points | 轮廓点,每个点包含3个数据(x, y, confidence) |
| 17 | 17个轮廓点 |
轮廓点数据结构:
每个关键点包含:
- x: 关键点x坐标
- y: 关键点y坐标
- confidence: 关键点置信度
5.3 交通目标检测应用
在交通目标检测场景中,YOLOv8-Pose可以检测车辆关键点(如车轮位置)。
与官方模型的差异:
| 项目 | 官方模型 | 交通目标模型 |
|---|---|---|
| 轮廓点数量 | 17个 | 4个 |
| 检测类别 | 1类(人) | 10类 |
交通目标YOLOv8-Pose输出格式:
(x, y, w, h + c × 10 + points × 4) × 8400
说明:
c × 10: 10种类别的置信度points × 4: 4个轮廓点(如车轮位置)
六、参考资料与学习路径
6.1 官方文档
6.2 详细教程
- 最细致讲解YOLOv8模型推理完整代码 - 包含前处理、后处理详细代码
- YOLO系列文章汇总 - YOLOv1论文解读
七、总结
核心要点回顾
✅ 输入格式 :NCHW格式的640×640 RGB图像
✅ 输出格式 :[1, 84, 8400] 张量,包含边界框和类别置信度
✅ 前处理 :缩放 → BGR转RGB → 归一化 → HWC转CHW
✅ 后处理 :转置 → 解码筛选 → NMS去重
✅ Pose版本:支持关键点检测,可应用于人体姿态估计和交通目标检测
实战建议
🎯 最佳实践:
- 先用Python验证前后处理逻辑
- 再用C++实现高性能推理
- 对比Python和C++结果确保一致性
- 使用TensorRT优化推理性能
常见问题
Q1: 为什么输出是8400个预测点?
A: YOLOv8在不同尺度特征图上生成预测框,三个尺度分别为80×80、40×40、20×20,总共6400+1600+400=8400个预测点。
Q2: 如何处理不同尺寸的图像?
A: 使用letterbox方法保持长宽比,缩放到640×640,推理后将坐标映射回原图。
Q3: NMS阈值如何选择?
A: 置信度阈值conf_thres通常为0.25,IoU阈值iou_thres通常为0.45,可根据实际场景调整。