参考博文地址:https://www.jianshu.com/p/86b8208f634f
之前整理过Yolo系列的相关资料,YoloV1/YoloV2/YoloV3的简述整理在博文YoloV1/V2/V3学习笔记中,YoloV3的整体训练流程整理在博文YoloV3整体运行流程中(这篇博文把YoloV3的整个思路整理得很清楚,值得看一下),但在今天复习过程中又有一些细节模糊不清,在这里进行补充。
1.Anchors:
(1)Anchors的作用分析:
当图像中只包含一个对象并对这个对象进行bbox回归时,只需要一个bbox回归器,但当对图像中多个对象进行回归(甚至一个类别会有多个对象)时,使用多个bbox回归器预测多个对象位置时就会发生冲突,因为每个预测器都可能不受约束地预测图片中任何一个对象的位置和类别。
这时,就需要使用Anchors来对每个回归器进行约束,只让每个回归器负责一块独立区域内的对象bbox回归。以Yolo算法举例,每个网格单元的位置其实也可以看作Anchor的位置(这不同于SSD或者Faster RCNN的anchor),如果最终的输出为13x13(即有13x13个网格单元)且每个网格单元有3个Anchors,整个模型就有13x13x3个回归器,每个回归器只负责对相应网格单元附近的对象进行预测。
(2)YoloV3中的Anchors机制:
YoloV3使用k-means算法在训练集中所有样本的GroundTruth Box中聚类出具有代表性形状的宽和高作为Anchors的宽高,YoloV3的特征提取网络输出3种尺寸的特征图,每个尺寸的特征图对应3个Anchors尺寸。
一个网格单元会输出3个参数相同的bbox,第一个bbox负责预测形状与Anchor1类似的边框,其他两个bbox依次类推。YoloV3中取消了之前每个网格单元只负责预测一个对象的限制,也就是说网格单元中的3个bbox都可以预测对象,它们对应不同的GroundTruth Box。
如何在训练中确定哪个bbox负责某个GroundTruth Box呢?方法是求出每个网格单元中每个Anchor与GroundTruth Box的IOU(交并比),IOU最大的Anchor对应的bbox就负责预测该GroundTruth Box,也就是负责对应的对象。
如何实现“第一个bbox负责预测形状与Anchor1类似的边框,其他两个bbox依次类推”呢?YoloV3的做法是不让bbox直接预测实际边框的宽和高,而是将预测的宽和高分别与对应Anchor的宽和高绑定,这样不管开始时bbox输出的宽/高如何都将转换为与Anchor的宽和高相关,这样经过多次惩罚训练后每个bbox就可以负责特定形状的边框预测。
2.置信度:
置信度是每个bounding box输出的其中一个重要参数,它的定义为:
代表当前box中包含对象的概率(注意是对象而不是特定类别的对象),也就是说它用来说明当前box内只包含背景(backgroud)还是包含某个对象;
表示在当前的box中包含对象时,预测的box与真实目标边界框可能的IOU值(注意这里所说的真实目标边界框实际是不存在的,只是模型表达自己框出目标的自信程度);
这两者都表示一种自信程度,框出的box内确实有物体的自信程度和框出的box将整个物体的所有特征都包括进来的自信程度。
3.对象条件类别概率:
对象条件类别概率是一组概率的数组,数组的长度为当前模型检测的类别种类数量,它的意义是当认为当前box中包含对象时,要检测的所有类别中每种类别的概率,其实这个和分类模型最后使用softmax函数输出的一组类别概率是类似的。
二者的区别在于:
1)YoloV3的对象条件类别概率中不包含background项,因为对background的预测由置信度负责。因此对象条件类别概率在置信度表示当前box内有对象的前提下才会输出;
2)分类模型中最后输出之前使用softmax函数求出每个类别的概率,也就是说各个类别之间是互斥的,而YoloV3算法的每个类别概率由逻辑回归函数sigmoid()单独计算得出,所以每个类别不是互斥的,也就是说一个对象可以被预测出多个类别。