YOLO系统——yolov1工作原理
1. YOLOv1 的核心定位与输入输出逻辑
YOLOv1 是首个成功的一阶段目标检测模型,与 R-CNN 等两阶段模型的核心区别在于:它无需先通过区域提议(Region Proposal)生成候选框,而是直接对整幅图像进行一次推理即可完成目标检测。具体而言,YOLOv1 将输入图像均匀划分为 S×S
个网格(如 7×7),每个网格负责检测 “中心落在该网格内” 的目标。训练前,需对标注数据进行预处理,将每个目标的坐标转换为相对于所在网格的归一化值(范围 [0,1]),最终每个目标的真实标签包含:
- 目标中心相对于网格的偏移量(x,y)
- 目标宽高相对于整幅图像的比例(w,h)
- 置信度(confidence,反映目标存在的概率及预测框的准确性)
- 类别概率(对应数据集中的类别,如 VOC 的 20 类)
模型的输出是一个 S×S×(B×5 + C)
的张量(B 为每个网格预测的边界框数量,YOLOv1 中 B=2;C 为类别数),包含每个网格的 B 个边界框参数(每个框 5 个值:x,y,w,h,confidence)和 C 个类别概率。
2. 模型的网络结构设计
YOLOv1 的网络结构由 24 个卷积层和 2 个全连接层组成,卷积层的核心参数包括:
- 输入 / 输出通道数:输入通道数与上一层输出匹配(如 RGB 图像初始为 3 通道),输出通道数由人工设定(通常随网络加深递增,如 16→32→64),通道数越多可学习的特征越丰富,但计算量也越大。
- 卷积核大小、步长、padding:卷积核常用 3×3,通过步长(stride)和填充(padding)控制输出特征图尺寸,计算公式为:
out_size = floor((in_size - kernel_size + 2×padding) / stride) + 1
- 池化层:通过 2×2 最大池化(步长 2)降低特征图尺寸(如 448→224→112...),既减少计算量,又扩大感受野(单个像素对应原始图像的区域)。
最终通过全连接层将特征映射为 7×7×30
的输出张量(B=2、C=20 时,2×5+20=30)。
3. 模型训练过程
训练过程通过多轮迭代(epochs)优化模型参数,核心步骤包括:
- 数据加载:使用 DataLoader 按批次读取图像和标注信息,每个批次包含多张图像及对应的真实标签。
- 前向传播:将图像输入模型,得到预测输出(
7×7×30
张量)。 - 损失计算:通过 YOLO 特有的损失函数计算预测值与真实值的差异,包含三部分:
- 边界框坐标损失(x,y,w,h 的误差)
- 置信度损失(目标存在 / 不存在的误差)
- 类别概率损失(分类误差)
- 反向传播与参数更新:通过梯度下降(如 SGD)反向传播损失,更新网络权重,最小化损失值。
训练终止条件通常是固定迭代次数(epochs),或损失值在验证集上连续多轮不再下降(早停策略)。“损失值大于平均损失值时停止” 的表述不准确,因为损失波动是正常的,需结合验证集性能判断。
4. 模型权重的保存
训练结束后,可保存模型的权重参数供后续预测使用。在 PyTorch 中,标准做法是通过 torch.save()
保存状态字典:torch.save(model.state_dict(), 'best.pt')
5. 预测与后处理
使用训练好的模型进行预测时,需对输出张量做后处理,步骤包括:
- 解析输出:将
7×7×30
张量转换为每个边界框的绝对坐标(反归一化)、置信度和类别概率。 - 置信度过滤:设置置信度阈值(如 0.5),过滤掉低置信度的预测框,减少冗余。
- 非极大值抑制(NMS):对同一类别的预测框,计算交并比(IOU),当 IOU 大于阈值(如 0.5)时,保留置信度最高的框,移除重叠的冗余框。
- 可视化:在图像上绘制筛选后的边界框,并标注类别和置信度。