近来心血来潮,把CV领域关于目标检测的主流方法YOLOv3和Faster RCNN看了一下,对其中的先验框(anchor box)一直不太理解,在广泛地阅读了一些相关讲解后,有了一定的理解,在此记录一下。
先验框的个人理解
- 先验框最早提出于Faster RCNN,初衷是为了代替selective search算法。
- 先验框是根据特征图生成的,即,特征图上每个位置都有一定数目不同比例的先验框。而大小是相对于原图的,也就是特征图上每个点可以映射到原图中某个特定区域(感受野大小)。
- 在训练的时候往往是把先验框缩放到相对于特征图的大小,在推理时会把特征图上调整后的先验框,即预测框,放大到原图大小。
- 每个先验框为一个训练样本。在YOLOv3中,通过计算每个先验框与真实框的IOU来确定其是否为正样本,即,是否含有物体的置信度设为1。先验框含有物体置信度为0的为负样本,负样本只计算置信度损失,不做回归。
- 在推理时,通过非极大抑制方法筛选掉重合的多余的先验框,在YOLOv3中首先根据置信度阈值筛除大部分预测框,剩下的预测框按照置信度乘以类别最大分数进行排序,选排名第一的框,找到同类别的预测框,根据iou阈值来筛除重合度高的预测框,重复进行以上步骤直到所有的预测框都被对比或筛除。
Faster RCNN与YOLOv3先验框以及其他方面的区别
在Faster RCNN中,先验框的大小是人为设定的。在YOLOv3中,先验框的大小是通过kmeans聚类算法得到的,对训练样本的groundtruth box的宽高分别进行聚类。
Faster RCNN属于两阶段算法,先利用RPN(Region Proposal Network)对先验框做回归,在这里会对每个先验框进行一个其为前景或背景的二分类任务以及左上右下坐标的预测,生成感兴趣区域(初步预测框,对应于原图中的部分区域),再把生成的感兴趣区域输入到一个网络中预测类别同时再次修正框的大小位置。
YOLOv3属于一阶段算法,预测的结果同时包含框的位置大小和类别概率分布以及是否含有物体的置信度值。需要注意的是YOLOv3的类别预测损失计算是为每个类别进行二元交叉熵损失,因为作者认为同一个物体可以属于多个类别。YOLOv3输出的结果是[batch_size, feature_map_w, feature_map_h, n_anchor * (n_class+1+4)]
其他目标检测算法
其他目标检测算法,SSD与YOLOv1较像,与其区别在于YOLOv1没使用anchor box,SSD使用了。同时SSD引入了多尺度预测。
Anchor free的算法,即不需要先验框的目标检测算法,CenterNet,FCOS, DETR等待看。。。
YOLOX和YOLOF是什么鬼???
DETR为CNN提取特征,transformer作为head进行后处理,即确定目标框和类别。
NeurIPS2021一篇论文提出YOLOS,是一个完全基于transformer的目标检测算法。看到知乎上某大佬说好像没什么太大的卵用,不是sota,只是蹭transformer的热度。。。
害,感觉CenterNet和FCOS有点像,都是在特征图上进行操作,不一样的是FCOS只要物体落入特征图上某个区域,这个区域内所有点都要预测,导致多余的预测框,为此提出centerness来作为nms的一个参考。CenterNet是通过物体的中心落入特征图的位置来预测,没有多余的框,不需要nms,同时也可能存在多个物体中心落在一个位置只能预测一个,导致“漏检”。