目标检测是深度学习任务中非常火热的一个领域,从深度学习发展之初就迸发出巨大的商业潜力,如何更好的用深度学习算法来提高目标检测的精度和速度是其关键!本文根据
百度AI studio免费课程目标检测课程学习所做记录。
背景
在Faster RCNN之前,有RCNN和Fast RCNN两种初级版本,均是属于两阶段目标检测算法。但RCNN和Fast RCNN均是使用selective search算法来预先选择anchor,其计算量大且效率低下,相比RCNN,Fast RCNN使用一个共同的特征层来提取anchor学习,在速度上有了进一步的提升。
原理
Faster RCNN相比前两代,提出了RPN网络,通过预训练生成的anchor既准确又高效,同时使用ROI pooling层定位anchor特征,最后输入header进行分类和回归。 Faster RCNN整体结构比较清晰,主干网络上先使用backbone提取特征层,对特征层进行池化,之后进入全连接进行分类和回归训练;其中在主干网络提取的特征层输入RPN网络,生成anchor并进行训练和筛选之后再输入池化层。
RPN
RPN网络的目的:生成anchor并输出高质量的anchor坐标
生成anchor
通过backbone提取图片特征为1x512x60x40,再使用1x1 conv降维为1x256x60x40, 对于此特征图上的每一个点,都以1:1、1:2、2:1的长宽比和三个尺寸的框作为生成的anchor, 此时生成的anchor有:60x40x3x3个 对于分类任务,是确定anchor是否有物体,只存在两维向量(2x60x40x3x3); 对于回归任务,是确定anchor坐标和真实物体坐标差距,坐标用中心点和长宽长度表示,需要四维向量(4x60x40x3x3);
设定标签
对于分类,只需确定是否有物体,用0和1表示; 对于回归,需给适量正负样本进行训练,选择正负样本方式: 对于正样本选择条件:(关键) 1.任一anchor与真实框的IoU>0.7 2.某一类的anchor与真实值IoU最大值 对于负样本选择条件: 1.任一anchor与真实值IoU<0.3 通过这两类条件筛选正负样本,组成集合,并随机从正负样本中分别挑选128个框,得到最终结果;
监督信息
? 分类: 正样本标签为1,负样本标签为0 ? 回归: 计算真实框和预测anchor的偏移量
loss训练
对于loss计算,由上式得到分类和回归产生的损失函数,其中分类使用交叉熵、回归使用smoth loss函数 回归分支loss
使用smooth L1的好处:在损失较大时(梯度大于1)得到值为正负1,当损失较小时(梯度值小于1)得到值为其本身;
RoI Pooling 和 RoI Align
当RPN训练得到的anchor坐标通过feature得到局部proposal,需要将其转化为固定的 feature size,但预测的anchor坐标存在小数,通过池化可能会产生误差,而使用RoI Align是保存了特征小数,在此基础上划分特征后通过线性插值的方式将区域范围内所有值通过此方式来计算从而提高精度。
BBOX header
通过RoI Pooling得到的特征层,利用head feature将特征最终转化为1*1,最终利用fc进行分类和回归。
预测
类似于RPN输出anchor,测试图片提取特征后利用RPN输出anchor,解码特征并利用fc回归和分类,通过NMS筛选后得到预测结果。
总结
- 理解RPN网络——如何快速生成高质量的anchor
生成大量anchor;合理采样;分类和回归训练; - Pooling——特征降维且准确
使用RoI Pooling进行特征降维;针对数值近似问题使用更加精确的线性插值来计算; - BBOX header训练——采样训练
使用RPN生成anchor,采样后训练,快速高效精确
问题
- RPN如何实现?
生成、标签、采样 - RoI Pooling和RoI Align如何实现?
特征层的anchor坐标解码、特征降维 - RPN和BBOX header训练
RPN和BBOX使用相同的loss对于分类和回归进行训练;如何并行训练,代码如何实现? - loss计算
分类——交叉熵表达式 回归——Smooth loss表达式
|