目录
YOLOv1
YOLOV1 论文中文翻译参考地址:【深度学习论文阅读目标检测篇(四)中英文对照版:YOLOv1《 You Only Look Once: Unified, Real-Time Object Detection》_yolo英语文章-CSDN博客】
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 格式来表示这个输出尺寸计算公式,规范的公式写法如下:
最大池化(Max Pooling)之后,,计算输出尺寸:向下取整
结构: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)联合优化定位、置信度和分类损失:
公式图示:
公式解释:
是一个权重系数,用于平衡坐标损失与其他损失项,论文中设置的值为 5
表示有多少个 grid,
B 表示框的个数,在 YOLOv1 中是 2 种,即 B 为 2
obj 表示有物体时的情况
noobj 表示没有物体时的情况
i j 表示第 i 个 的第 j 个框
是一个指示函数,当某个边界框负责某个对象时为 1,否则为 0
和
表示实际的坐标,
和
表示预测的坐标
和
表示实际的宽高,
和
表示预测的宽高
表示实际的置信度分数
,
表示预测的置信度分数
一个较小的权重系数,用来减少无对象区域的置信度损失的影响,论文中设置的值为 0.5
是一个指示函数,当某个边界框负责某个对象时为 0,否则为 1
是第 i 个网格单元格中对象的真实类别分布,
是预测的类别概率分布
各部分损失:
位置损失(有物体的网格):
对中心坐标
(x,y)
和宽高(w,h)
使用 MSE。宽高开根号(缓解大小框误差差异)。
置信度损失:
有物体时:
confidence = IoU
无物体时:
confidence = 0
分类损失:
只在包含物体的网格上计算类别概率的 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
:验证集预测可视化结果。