关于R-CNN的个人理解
背景
此作可说是真正意义上的目标检测的开篇之作,为后续的目标检测的文章提供了强大的理论指导性。
思想
该算法属于多阶段网络,即在训练该模型的时候,并不能以端到端的形式直接优化参数,并且操作起来十分复杂,计算量也很大,但在这之前却并没有很好的目标检测算法。首先作者利用SS搜索算法在图像上选取出大约2000个区域(每个区域的尺寸都是随机的,并不相同),之后将每个区域缩放到相同的尺寸(默认为227 * 227),以便更好的缩入预先训练好的分类模型中(默认为AlexNet)得到每一个区域的特征向量;其次再将得到的特征向量用于类别预测与box预测。
模型结构
该模型为VGG16+SVM分类器+box修正回归器,VGG16的输入尺寸要求227 * 277 ,输出为一个4096长度的向量,而SVM分类器则是一个输出尺寸为20特征向量(所要预测的总类别数)的全连接层,box修正回归器也是一个全连接层,只不过它的输出尺寸为4(为相对于原区域框的缩放比值)。
训练阶段
训练过程中所用的损失函数包含两个方面:box类别损失以及有目标的box边框修正损失。既然是训练,就需要标定正负样本,在该论文中的规则为:计算每一个区域与GT之间的IOU,如果IOU大于设定的阈值(默认为0.3),则为正样本(参与所有损失计算),其余为负样本(仅参与类别损失)。
-
box类别损失
包含正负样本都计算类别损失,采用的损失为二值交叉熵,另外需要注意的是最后预测出的每一个box的类别概率并不是经过Softmax生成的,而是经过Sigmoid函数。因为作者发现由于模型每一次的输入并不是整张图像,而Softmax对随机的完整样本感兴趣,因此采用Softmax反而会降低模型的预测效果。 -
box边界框修正损失
通过全连接层预测每一个最终box相对于区域框的缩放比例,来得到最终的预测框。以下为计算的相关公式:
d x d_x dx、 d y d_y dy、 d w d_w dw、 d h d_h dh:分别为预测值。
p x p_x px、 p y p_y py、 p w p_w pw、 p h p_h ph:分别为原区域框的中心点坐标、宽高。
而在计算损失的时候,采用的是计算预测值 d x d_x dx、 d y d_y dy、 d w d_w dw、 d h d_h dh与真实GT对应原区域框的比值的平方差。以下为计算采用的损失公式,最小二乘法。
此公式中 t ∗ i t_*^i t∗i代表的即是真实GT对应的真实期望值。只需要按照上述公式反着算即可,下图为计算公式。
测试阶段
在得到每个区域相对于每个类别概率值以及最终的box坐标信息后,我们需要使用非极大值抑制算法,去除冗余的box。具体做法就是:先在每一个类别上选取得分最高的box,然后将其与其余所有的box计算IOU,如果IOU超过设定的阈值(默认为0.5)则舍弃,后再在剩余的框中继续重复上述的操作。紧接着对每一列(即每一类),都重复上述两个步骤,得到每一类的剩余框,最后再去除每一类中得分低于阈值的框,得到最终的预测框。但其实我觉得这样会存在一个问题,一直困扰着我,那就是如果有多类怎么办,按照此种方式每一个类别都把所有2000个区域计算一遍,就有可能导致最后一个框在多个不同类别中多次保留下来,那么我们怎么区分呢。下面给出我的猜想,我认为我们只需要对剩余的被多次保留的框,只选取得分最高的类别概率,作为最终的类别得分,这样就不会重复了,后续再利用修正器对剩余框进行box修正。
总结
如理解存在纰漏,敬请指正,谢谢!