YOLO系列之YOLOv1
YOLO系列之YOLOv1
创新点
- 将目标检测当成回归问题
- 输入一张图像经过一次推理可以得到图像中所有目标的检测框和类别。可以端到端的训练和优化网络
优点
- 速度快
- YOLO使用全图信息,背景错误少
- 泛化能力好
缺点
- 每个网格只能预测两个边界框和一个类别,限制了对相近目标的检测数量,尤其是密集的小目标
- 对于常规的数据能够较好泛化,但难以推广到一些不寻常的长宽比或配置
- 损失函数设计还不够合理,主要是其中定位误差的影响、尤其是对大小物体的处理上
检测基本流程
- 将输入图片resize成448*448
- 经过单个CNN网络提取特征和预测
- 通过设定阈值筛选检测框
目标检测逻辑
先将图片分成s*s个网格:
-
每个网格预测B个Bbox(边界框),以及每个Bbox的confidence(置信度)。置信度表示边框内存在物体的把握,以及准确度。每个Bbox包含5个参数:x,y,w,h,confidence
-
(x,y)表示边界框中心相对于网格的坐标
-
w,h表示边界框相对于整张图像的宽和高
-
confidence:当框内不存在目标时,confidence为0;当框内存在目标时,confidence等于边界框与真实框的IoU。与真实框IoU最大的边界框就负责预测这个物体(目标的中心位置在边界框内才能称为边界框中存在目标。)
-
-
每个网格预测C个类别概率值
模型输出
模型最终输出s* s * (B * 5 +20)的tensor。在yolov1中采用VOC数据集,所以输出为7 * 7 * 30的tensor。
s* s * (B * 5 +20)表示一张图片分成S* S个网格,每个网格预测B个边界框和C个类别概率,每个边界框包含5个参数。
网络结构

训练
- 预训练:模型首先在ImageNet数据集上预训练。预训练的模型只包含前20个卷积层+1个平均池化层+1个全连接层。预训练的输入是244*244。
- 模型微调:预训练完成后,添加4个卷积层和2个全连接层。新添加的层采用随机初始化参数。输入图片尺寸为448*448。
- 归一化:将输出中的w,h除以图像的宽高,归一化到[0,1];将(x,y)限制为边界框中心相对于网格的坐标,归一化到[0,1]。
- 激活函数:最终的全连接层采用线性激活函数;其他的层采用Leaky Relu激活函数。
- 损失函数:
- 训练超参数
- num_epochs(训练周期数)大约为135
- batch_size = 64
- 优化器:momentum=0.9,decay=0.0005
- 学习率前期采用了warm up,之后随着训练的进行再逐渐衰减
- 正则化
- dropout(rate=0.5)
- 采用随机缩放和平移的方式进行数据增强
损失函数
YOLO将目标检测问题转化成回归问题。损失函数由多个部分组成。
-
lamda-coord=5:位置误差和分类误差对loss的贡献是不同的,引入lamda-coord=5修正坐标损失
-
lamda-coord=0.5:有大部分网格是不包含目标的,放大了confidence在计算梯度时的影响,引入lamda-coord=0.5修正这一影响。
-
相同的位置偏差对大物体的IoU error的影响要远小于对小物体的影响,因此通过将物体大小的信息项(w,h)开平方来修正平衡二者的影响。
1.负责检测物体的bbox中心点定位误差
遍历所有单元格的所有bounding box,挑选出负责检测物体的bounding box
2.负责检测物体的bounding box宽高定位误差
遍历所有的单元格的所有bounding box,挑选出负责检测物体的bounding box
3.负责检测物体的bounding box的confidence误差
预测值:从模型正向推断结果为 s x s x ( B x 5 + c )维向量中找到这个bounding box的confidence score
标签值:计算这个bounding box与ground truth的IoU
4.不负责检测物体的bounding box的confidence误差
遍历所有的单元格的所有bounding box,挑选出不负责检测物体的bounding box
5.负责检测物体的单元格分类误差
遍历所有单元格,挑选出包含物体的单元格,遍历所有类别
模型推理
输入一张图片后得到一个s* s * (B * 5 +20)的张量。再经过下列步骤进行滤除和筛选,得到我们想要的输出。
1、计算所有检测框的class-specific confidence score得分
将检测框的置信度与20个类别的条件概率(20x1)相乘,得到一个20x1的向量,这就是这个边界框的权概率。由于一个单元格有两个边界框,每个边界框有一个20x1的权概率,所以总共有S * S * 2个权概率。
2、设置阈值,滤掉得分低的边界框
对于每一类:
- 先把得分低于阈值的边界框的得分设为0;
- 再将所有的边界框按照得分由大到小排序,选中最高分及其边界框;
- 遍历其余的边界框。如果和当前边界框的IoU大于一定的阈值,便该边界框删除(即得分置0),否则就保留;
- 从未处理的边界框中重新选择最高分的边界框,重复上一步操作,直至找到所有保留的边界框;
- 进行下一个类别的处理
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~