本文依旧属于目标检测入门系列,是学习DataWhale的动手学CV-PyTorch版的总结与感悟。
咱也目标检测刚入门,咱也没研究过其他网络,这里就拿Datawhale教程中的SSD网络改动版Tiny-Detector来举例,其他网络应该也是差不多的。
与其他的深度神经网络算法类似,目标检测网络中也需要用CNN提取特征,提取特征可以用各种在分类任务上效果出众的网络作为backbone,比如用VGG16作为Backbone,去除后面的全连接层的分类部分,输入一张大小为224x224的图像,经过特征提取后得到一个7x7的特征图,如下图:
无论搞没搞过目标检测,只要是CV领域的,大家对anchor都应该有所耳闻,因为很多公众号文章都会提到这个词。那么anchor到底是什么?
所谓anchor即先验框,这是人为给定的一组具有不同形状、不同大小的框。因为它形状多样,所以可以基本满足很多目标的boundingbox(边界框)的形状;因为它大小多样,所以可以满足多尺度的检测需求。下图中就展示了一组以狗为中心的anchor。
再回到刚才的问题,如何从7x7的特征图上得到图像上目标的位置呢?我们事先会定义一组anchor,然后在每个位置上全部用一遍这组anchor,每个anchor在一个位置上都会根据事先定义的框的大小生成一组图,这组图反映了以当前位置为中心的一组anchor所框区域。我们就是要利用anchor生成的这组位置,来计算里面包含的目标信息,以及通过回归的方式调整边界框,让其能与实际目标的边界框尽可能重合。
回归的方式主要就到目标检测入门记1中边界框坐标的两种表示的第二种啦,具体为何要这样计算,我认为更多的可能是在数值计算上更容易回归吧。
用特征提取网络获得特征图之后,需要再通过两个卷积层,分别输出分类头和回归头,分类头对应图中目标的类别信息,回归头对应目标的边界框。
它的作用是预测anchor框和bbox_gt之间的偏移量
用backbone进行特征提取之后,再用3x3的卷积进行计算,得到的特征图大小不变,但通道数变了,比如原来backbone输出特征图上每个点处生成9个候选框,每个候选框输出偏移量gcx,gcy,gx,ghg_{cx},g_{cy},g_{x},g_{h}gcx,gcy,gx,gh,那么输出特征图的通道数就为36,每4个为一组代表一个候选框的输出偏移量回归值。
分类头也是用backbone提取特征,然后再用3x3的卷积进行运算,输入和输出特征图的尺寸相同。如果总共有21类,则输出特征图的通道数为21*9,每21个元素代表一个候选框输出的类别的one-hot编码
实际使用中,分类头和会国土的输出并非上面这样。采用7x7x(anchor_num*elem_num)的方式比较直观,但希望每个anchor的输出独自成为一个维度,因此通常将7x7xanchor_num展平成一个元素,再接一个elem_num的维度作为这个anchor的输出。