YOLO 目标检测:YOLOv1 原理详解 、 YOLOv5 数据集配置、训练全流程

发布于:2025-08-30 ⋅ 阅读:(21) ⋅ 点赞:(0)

目录

YOLOv1

1. YOLOv1 的网络结构

主干网络(Backbone)

输入与输出

2. 输出张量解释(7×7×30)

3. 损失函数

4. YOLOv1 的优点

5. YOLOv1 的局限性

认识YOLOV5开源项目

1.下载YOLOV5开源项目

2.认识yolov5

3. 模型训练

3.1数据集准备

3.2 为数据集配置 yaml 文件

3.3 结果查看


YOLOv1

YOLOv1 是由 Joseph Redmon 等人在 2016 年 CVPR 上提出的实时目标检测算法,它的网络结构设计灵感来源自 GoogleNet,其核心思想是将目标检测任务转化为一个单次回归问题(single regression),实现了速度与精度的平衡。它标志着目标检测从“两阶段”(如 R-CNN 系列)向“一阶段”(one-stage)的重大转变。整个图像只看一次,通过一个神经网络直接预测所有边界框和类别概率。

  • 不再使用区域提议(如 R-CNN 的 Selective Search)。

  • 将检测视为全局回归问题,端到端训练。

  • 速度快(实时检测,可达 45 FPS,快速版 155 FPS)。

  • 能够捕捉上下文信息,减少背景误检。

整个过程图示如下:

  • Resize image:将输入图像调整满足神经网络的尺寸(448 x 448)

  • Run convolutional network:在图像上运行单个卷积网络

  • Non-max suppression:根据模型设置的置信度阈值对检测得到的边界框进行 NMS 处理

1. YOLOv1 的网络结构

主干网络(Backbone)
  • 使用自定义的卷积神经网络(类似 GoogLeNet,但更简单)。

  • 包含 24 个卷积层 + 2 个全连接层。

  • 前 20 层用于特征提取,后 4 层用于检测(回归预测)。

  • 最后一层输出一个 7×7×30 的张量。

  • 卷积(conv layer)之后,计算输出尺寸:向下取整

    你可以使用 LaTeX 格式来表示这个输出尺寸计算公式,规范的公式写法如下:


    \text{Output Size} = \left\lfloor \frac{\text{Input Size} + 2 \times \text{Padding} - \text{Filter Size}}{\text{Stride}} \right\rfloor + 1
  • 最大池化(Max Pooling)之后,,计算输出尺寸:向下取整

        \text{Output Size} = \left\lfloor \frac{\text{Input Size} + 2 \times \text{Padding} - \text{Filter Size}}{\text{Stride}} \right\rfloor + 1

  • 结构:24 个卷积层、4 个池化层、2 个全连接层

  • 根据论文中的网络结构(上图),复原网络结构参数:

LAYER OUTPUT SIZE MODULE
448x448x3
1 224x224x64 Conv 7x7x64, s-2, p-3
112x112x64 Maxpool 2x2, s-2, p-0
2 112x112x192 Conv 3x3x192, s-1, p-1
56x56x192 Maxpool 2x2, s-2, p-0
3 56x56x128 Conv 1x1x128, s-1, p-0
4 56x56x256 Conv 3x3x256, s-1, p-1
5 56x56x256 Conv 1x1x256, s-1, p-0
6 56x56x512 Conv 3x3x512, s-1, p-1
28x28x512 Maxpool 2x2, s-2, p-0
7,9,11,13 28x28x256 Conv 1x1x256, s-1, p-0
8,10,12,14 28x28x512 Conv 3x3x512, s-1, p-1
15 28x28x512 Conv 1x1x512, s-1, p-0
16 28x28x1024 Conv 3x3x1024, s-1, p-1
14x14x1024 Maxpool 2x2, s-2, p-0
17,19 14x14x512 Conv 1x1x512, s-1, p-0
18,20 14x14x1024 Conv 3x3x1024, s-1, p-1
21 14x14x1024 Conv 3x3x1024, s-1, p-1
22 7x7x1024 Conv 3x3x1024, s-2, p-1
23 7x7x1024 Conv 3x3x1024, s-1, p-1
24 7x7x1024 Conv 3x3x1024, s-1, p-1
25 4096x1 FC1
26 1470x1 FC2
7x7x30 reshape

输入与输出
  • 输入:图像被调整为 448×448 像素。

  • 输出:一个 7×7×30 的预测张量。


2. 输出张量解释(7×7×30)

YOLOv1 将输入图像划分为 S×S 的网格(默认 S=7),每个网格单元(grid cell)负责预测中心点落在该网格内的目标【只有当目标的中心点坐标落在某个网格中时,该网格才负责预测该目标】:

  • B 个边界框(bounding boxes)

  • C 个类别概率

输出维度分解:7×7×30

  • 7×7:图像被划分为 7×7 = 49 个网格单元。

  • 然后每个网格预测 B 个边框(论文中的设置是 2 个边框),即预测出 7 x 7 x 2 个边框,每个边框都要预测(x,y,w,h)+ confidence

项目 含义
x, y 边界框中心点相对于该网格左上角的偏移量(归一化到 [0, 1])
w, h 边界框的宽和高,相对于整张图像的宽高进行归一化
confidence 该边界框的置信度,表示框中存在目标的可能性(confidence = Pr(Object) × IoU)
  • 除了边界框信息,每个网格还会预测 C 个类别概率(C 是类别数量,如 VOC 数据集为 20 类),这些概率是基于网格的,也就是说:不管预测几个边界框,每个网格只预测一套类别概率

  • 所以:输出的维度是 S x S x (5 x B + C),对于 VOC 数据集来说,最后输出就是 7 x 7 x (5 x 2 + 20),即 7 x 7 x 30


3. 损失函数

YOLOv1 使用均方误差(MSE)联合优化定位、置信度和分类损失:

\mathcal{L} = \lambda_{\text{coord}} \cdot \text{location loss} + \text{confidence loss} + \lambda_{\text{noobj}} \cdot \text{no-object confidence loss} + \text{classification loss}


公式图示:

  • 公式解释:

    • \lambda_{coord}是一个权重系数,用于平衡坐标损失与其他损失项,论文中设置的值为 5

    • S^2 表示有多少个 grid,

    • B 表示框的个数,在 YOLOv1 中是 2 种,即 B 为 2

    • obj 表示有物体时的情况

    • noobj 表示没有物体时的情况

    • i j 表示第 i 个 的第 j 个框

    • 1_{ij}^{obj} 是一个指示函数,当某个边界框负责某个对象时为 1,否则为 0

    • x_i 和 y_i 表示实际的坐标,\hat{x_i} 和 \hat{y_i} 表示预测的坐标

    • w_i 和 h_i 表示实际的宽高,\hat{w_i} 和 \hat{h_i} 表示预测的宽高

    • C_i 表示实际的置信度分数 C_i=Pr(obj)*IoU\hat{C_i} 表示预测的置信度分数

    • \lambda_{noobj} 一个较小的权重系数,用来减少无对象区域的置信度损失的影响,论文中设置的值为 0.5

    • 1_{ij}^{noobj} 是一个指示函数,当某个边界框负责某个对象时为 0,否则为 1

    • p_i(c) 是第 i 个网格单元格中对象的真实类别分布,\hat{p_i}(c) 是预测的类别概率分布

各部分损失

  1. 位置损失(有物体的网格):

    • 对中心坐标 (x,y) 和宽高 (w,h) 使用 MSE。

    • 宽高开根号(缓解大小框误差差异)。

  2. 置信度损失

    • 有物体时:confidence = IoU

    • 无物体时:confidence = 0

  3. 分类损失

    • 只在包含物体的网格上计算类别概率的 MSE。

使用超参数 λ_coord=5λ_noobj=0.5 平衡各损失项。


4. YOLOv1 的优点

优点 说明
速度快 单次前向传播完成检测,实现实时性能(45 FPS)
全局推理 整图输入,能利用上下文信息,减少背景误检
泛化能力强 学习到物体的一般表示,可迁移到艺术作品等非常规图像
端到端训练 统一网络结构,无需多阶段流水线

5. YOLOv1 的局限性

缺陷 原因与影响
定位精度低 使用 MSE 损失,大小框误差权重相同,小目标定位差
每个网格只预测 2 个框 难以处理密集小目标(如鸟群)
只能预测 98 个框 覆盖能力有限,漏检率高
对新长宽比敏感 固定尺寸输出,泛化性受限
无法处理大物体跨网格 一个物体被多个网格预测,易产生重复检测

认识YOLOV5开源项目

要在 YOLOv5 开源项目中运行自己的数据集,需要按照「数据准备→项目配置→训练→验证→推理」的流程操作,核心是让数据集符合 YOLOv5 的格式要求,并正确配置训练参数。

1.下载YOLOV5开源项目

直接通过 GitHub 仓库下载

官方仓库地址https://github.com/ultralytics/yolov5(这是由 Ultralytics 团队维护的官方版本,更新最及时)

2.认识yolov5

  • classify:使用 yolov5 实现分类模型的文件

  • segment:使用 yolov5 实现分割模型的文件

  • data:

  • 如果说直接使用 yolov5s.pt 作为预训练模型,那么可以不指定网络结构配置的 yaml,它会自动的加载 yolov5s.pt 里面的网络结构进行训练

  • 如果说你想从零开始训练,就需要指定网络结构文件 yaml

  • 如果说直接使用 yolov5s.pt 作为预训练模型且你需要修改网络结构,那么就需要指定你修改网络结构后的 yaml 文件,否则就只会加载 yolov5s.pt 训练的网络结构

3. 模型训练

3.1数据集准备

建议按以下结构存放(与 YOLOv5 项目目录对应):

yolov5/
├─ datasets/               # 数据集根目录
│  └─ my_dataset/          # 你的数据集名称
│     ├─ images/           # 存放所有图像
│     │  ├─ train/         # 训练集图像
│     │  ├─ val/           # 验证集图像
│     │  └─ test/          # 测试集图像(可选)
│     └─ labels/           # 存放所有标注文件(与 images 对应)
│        ├─ train/         # 训练集标注(与 train 图像一一对应)
│        ├─ val/           # 验证集标注(与 val 图像一一对应)
│        └─ test/          # 测试集标注(可选)

3.2 为数据集配置 yaml 文件

建议复制官方的,然后自己修改路径和类名,以免出现格式问题报错

例如我要做一个车牌检测

3.3 训练命令

python train.py \
  --data data/my_dataset.yaml \  # 你的数据集配置文件
  --cfg models/yolov5s.yaml \    # 模型配置文件
  --weights yolov5s.pt \         # 预训练权重(加速收敛,可选)
  --epochs 100 \                 # 训练轮次
  --batch-size 16 \              # 批次大小(根据显存调整)
  --img 640 \                    # 输入图像尺寸(统一缩放为 640x640)
  --device 0 \                   # 训练设备(0 为 GPU,cpu 为 CPU)
  --name my_train                # 训练结果保存文件夹名称(在 runs/train/ 下)
python train.py --data coco.yaml --epochs 300 --weights '' --batch-size 128 --device 0

此时就可以开始训练

3.3 结果查看

训练完成后,在 runs/train/my_train/ 目录下生成结果,包括:

  • weights/best.pt:验证集性能最好的模型权重;

  • results.png:训练过程中的损失曲线、精度曲线;

  • val_batch0_pred.jpg:验证集预测可视化结果。


网站公告

今日签到

点亮在社区的每一天
去签到