论文:https://arxiv.org/abs/1506.02640
GitHub源码地址:https://github.com/pjreddie/darknet
理解参考:
https://zhuanlan.zhihu.com/p/25236464
核心技术:
YOLO将输入的图像分割为SxS个格子,如果一个检测目标的中心落入一个单元格中,则该网格负责检测该目标.
例如下图中的狗就由第五行,第二格的格子负责预测狗的boundingbox.
每个网格单元预测这些盒子的B个边界框和置信度分数。这些置信度分数反映了该模型对盒子是否包含目标的信心,以及它预测盒子的准确程度。在形式上,我们将置信度定义为
.如果该单元格中不存在目标,则置信度分数应为零。否则,我们希望置信度分数等于预测框与真实值之间联合部分的交集(IOU).
每个边界框包含五个预测: 和置信度, 坐标表示边界框相对于网格单元边界框的中心坐标,宽度和高度是相对于整个图片进行预测的.最后置信度预测表示预测框和实际边界框之间的IOU.
每个网格单元还预测 个条件类别概率 .这些概率以包含目标的网格单元为条件,每个网格单元我们只预测一组类别概率,不管边界框的数量B是多少(每个网格单元只对一个目标负责).
例如在Pascal VOC上进行训练测试的时候,使用 , .Pascal VOC有20个标注类,所以 ,最终得到的就是一个 的张量.
网络结构如下:
Loss Function定义:
YOLO使用均方和误差作为loss函数来优化模型参数,即网络输出的S*S*(B*5+C)维向量与真实图像的对应S*S*(B*5+C)维向量的均方和误差.其中
分别代表预测数据与标定数据之间的坐标误差,IOU误差和分类误差.
YOLO对上面这个loss function进行了一些修正.
1)位置相关误差(坐标,IOU)与分类误差对网络loss的共享值是不同的,因此YOLO在计算loss时,使用 修正
2)在计算IOU的时候,包含物体的格子与不包含物体的格子,二者的IOU误差对loss的共享是不同的,若采用相同权重,那么不包含物体的格子的confidence值近似为0,变相放大了包含物体的格子的confidence误差在计算网络参数梯度时的影响。为解决这个问题,YOLO 使用 修正 (注此处的‘包含’是指存在一个物体,它的中心坐标落入到格子内).
3)对于相等的误差值,大物体误差对检测的影响应小于小物体误差对检测的影响。这是因为,相同的位置偏差占大物体的比例远小于同等偏差占小物体的比例。YOLO将物体大小的信息项(w和h)进行求平方根来改进这个问题。( 注:这个方法并不能完全解决这个问题)
(注:此部分转载自知乎用户”赵丽丽”的专栏文章)
下面是YOLO中优化的多部分损失函数.
其中 表示目标是否出现在网格单元 中, 表示网格单元 中的第 个边界框预测器负责该预测.
注意,如果目标存在于该网格单元中(前面讨论的条件类别概率),则损失函数仅惩罚分类错误。如果预测器“负责”实际边界框(即该网格单元中具有最高IOU的预测器),则它也仅惩罚边界框坐标错误。
突出贡献:
YOLO将物体检测作为回归问题求解。基于一个单独的end-to-end网络,完成从原始图像的输入到物体位置和类别的输出
.同时达到速度快效果好的目标.
缺陷:
虽然每个格子可以预测B个bounding box,但是最终只选择只选择IOU最高的bounding box作为物体检测输出,即每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。这是YOLO方法的一个缺陷。
1)对小物体的检测效果不够好.
2)对boundingBox的预测不够精确.