YOLO中或者说one-stage的目标检测中的第一步就是产生候选区域,如何产生候选区域是目标检测领域的核心问题,而产生候选区域可以:分为以下两步
- 按一定的规则在图片上生成一系列位置固定的锚框,将这些锚框看作是可能的候选区域。
- 对锚框是否包含目标物体进行预测,如果包含目标物体,还需要预测所包含物体的类别,以及预测框相对于锚框位置需要调整的幅度。
1、边界框(bounding box)
在目标检测中,用边界框来表示物体的位置,边界框为能正好包含物体的矩形框。如下图中包含人脸位置的矩形框即为边界框。
2、锚框(anchor box)
锚框与物体边界框不同,是由人们假想出来的一种框。先设定好锚框的大小和形状,再以图像上某一个点为中心画出矩形框。
而在YOLO中,生成规则是将图片分割成mxn个区域,然后在每个格子的中心,按照设定的长宽比等,生成一系列的锚框。
这里说一下,设定的长宽,在YOLO中是采用聚类的方法产生的,而在YOLOV5中具体为采用k-means聚类+遗传算法计算得到。具体看下面这篇文章
3、预测框(prediction box)
预测框即是锚框的微调结果,其结果是更加的贴近真实框,问题就在于如何微调锚框,才能得到较好的结果。在YOLO中,主要采用下面的方法对锚框进行微调。
中心目标生成
由锚框的生成方法可知,它是以某个划分格子的中心坐标,以一定长宽比生成的,但在YOLO中预测框,则是以某个格子的左上角坐标为原点进行偏移的。
图中格子的坐的左上角坐标为(cx,cy) ,则预测框中的中心坐标为(bx,by),其中
由sigmoid函数可知,其函数值在(0,1)之间,bx,by的中心坐标一定在这个划分的格子中。
长宽生成
而对于预测框的长宽生成,则是基于锚框的初始长宽(pw,ph),以下面公式生成(bw,bh)
由上面的公式可以知道,我们的网络其实就是在预测tx,ty,th,tw的值。
由于我们是知道真实框的bx,by,bh,bw,由反函数,容易知道真实框tx*,ty*,th*,tw*,则我们网络其中一个边界框loss,为tx,ty,th,tw和tx*,ty*,th*,tw*计算得出。
4、对候选区域进行标注
这里有很多关于锚框(anchor box)和预测框(prediction box)的概念,请注意区分!
每个锚框都可能是候选区域,但我们根据上面的内容可知,一张图片会生成很多锚框,那我们如何确定哪个是我们需要的,如果这个是需要的,我们需要得到它的扫描信息,主要考虑以下三个方面。
-
objectness标签:锚框是否包含物体,这可以看成是一个二分类问题。当锚框包含了物体时,objectness=1,表示预测框属于正类(正样本);当锚框不包含物体时,设置objectness=0,表示锚框属于负类。
-
location标签:如果锚框包含了物体,那么它对应的预测框的中心位置和大小应该是多少,或者说上面计算式中的tx,ty,tw,th应该是多少。
-
label标签:如果锚框包含了物体,那么具体类别是什么。
objectness标签
锚框是否包含物体,我们主要采用IOU或者GIOU等指标来判别,关于IOU,GIOU等
我们可以算出所有我们的锚框与真实框之间的IOU,然后根据IOU这个评价指标,选出n个锚框(n是真实框的个数)
我们将这n个锚框的objectness标签都标记为1,其他都标注为0
但在YOLO中,对于一些IOU也挺大的锚框,是这么处理的,设定一个阈值,若其IOU大于这个阈值,则将objectness标签标注为-1,而不是0.
我们在预测中,也只需要根据objectness标签是1的锚框,进行预测location标签和label标签!!
location标签
对于location标签,即是对于objectness标签为1,标注其真实框tx*,ty*,th*,tw* 四个值注意这里标注的是真实框的tx,ty*,th*,tw*
label标签
对于label标签,我们采用one-hot编码,比如有4个类别,则标注为[0, 0, 0, 1](假设其为第4个类别)
由此可知,我们对于候选框的标注,一共需要标注,1(objectness标签)+ 4(location标签)+ n(类别数——label标签)个参数。
而我们的网络对于每个预测框也是这么多个参数!!这对于后面理解网络输出很关键!!
SIM ota工作流程
1、确定正样本候选区域。
2、计算anchor与gt的iou。
3、在候选区域内计算cost。
4、使用iou确定每个gt的dynamic_k。
5、为每个gt取cost排名最小的前dynamic_k个anchor作为正样本,其余为负样本
6、使用正负样本计算loss。
1、simOTA能够做到自动的分析每个gt要拥有多少个正样本。
2、能自动决定每个gt要从哪个特征图来检测。
3、相比较OTA,simOTA运算速度更快。
4、相比较OTA,避免额外超参数。
疑问
1、使用OTA和simOTA具体会带来多少mAP上的差距?论文作者并没有说明,期待可以有相关实验。
2、很多其他策略会重点关注预测不准的类别或者数据,为这些类别或数据增加权重,且这些策略往往被证明有效。而simOTA却针对已经预测更准的数据增加更多正样本,会不会带来一些问题?
3、前期dynamic_k大多数情况为1,会不会导致训练速度变缓?是否可以在前期做一定改善?