笔者言:
学习目标检测框架过程中记录自己的理解过程,个人认为理论知识足够完备前不急动手,单纯学习理论又过于无聊,写博客复述自己的理解是个不错的选择,当做笔记。
背景:
发源于RCNN、fast-rcnn,最大创新点,提出RPN网络和Anchor机制(锚框机制),物体检测分两步实现,第一步找到前景物体,给出先验框;第二步对先验框内物体分类并修正目标位置。
主要环节:
(1)特征提取网络:一般选用VGG16或Resnet
(2)RPN模块:区域生成模块,用于生成默认256个建议框
(3)RoI Pooling:承上启下,接收RPN输出的不同大小特征图,输出固定维度特征图到RCNN
(4)RCNN模块:接收ROI Pooling输出的特征图,预测出物体类别及位置偏移量
算法过程示意图(书籍):
算法过程示意图(自己总结~貌似看的更清晰):
关键词理解:
速记:真值是根据标签得出来的,是绝对真实准确的,预测量是RPN网络预测出来的
RPN的真值: 类别真值:根据IoU判断Anchor属于前景或背景
偏移真值:根据标签判断Anchor的位置偏移量
RPN的预测量:类别预测值:RPN网络预测出的类别,前景or背景
偏移预测值:RPN网络预测出的偏移量,四个变量的偏移
一、特征提取网络
一般使用VGG16或Resnet作为特征提取网络,当然可以换成其他,但注意调整好输入输出。训练的时候一般用别人训练好的这部分,锁定该部分参数不进行训练,因此训练1-2个epoch就会收敛的很厉害。锁定部分参数便于缩减训练时间。
该部分无多少新意,沿用现成的网络。
二、RPN模块
简介:该部分为fasterrcnn的新颖之处,目标检测的第一步
子模块:(1)生成Anchors
(2)RPN卷积网络
(3)计算RPN loss
(4)生成proposal
(5)筛选proposal,得到RoI
(1)生成Anchors
在原图上生成一些固定 的先验框,为适应不同物体的大小与宽高, 在作者的论文中, 默认在每一个点上抽取了9种Anchors, 具体Scale为{8,16,32}, Ratio为{0.5,1,2}, 将这9种Anchors的大小反算到原图上, 即得到不同的原始Proposal。
(2)RPN卷积网络
RPN卷积网络计算流程
VGG特征提取后的feature map输入到RPN网络,左侧为分类网络分支,右侧为回归网络分支。特征图输进来之后,最终输出的是对该点处的9个Anchor的类别的预测(前景、背景,9x2=18,分别为前景的概率,背景的概率)和对该9个Anchor的4个偏移量预测(9x4=36)
(3)计算RPN loss
首先计算真值和预测值,真值可由公式直接计算出,预测值可通过RPN网络得到,因此可进行下一步,损失函数设计,RPN使用交叉熵损失,整体包含两部分,分类损失和回归损失,并对两部分进行平衡。有了损失函数便可以对网络进行优化了
计算损失函数需注意anchor的选取,不能全部参与计算,为了样本均衡,如何选取呢,简单讲在IOU<0.3和IOU>0.7的IOU中,各选128个分别作为负样本和正样本参与计算,正样本多于128个的话选取是随机选取。
(4) 生成proposal
此处不好理解的是损失计算和生成proposal有什么关系,确实没有直接关系~,损失可以理解为训练过程中用到的概念,生成proposal可以理解为验证识别的过程中用到的概念。经过RPN网络的识别调整后会有很多(大于12000个)anchors,这时候进行修剪超尺寸的、按得分排序选12000个,再经NMS筛选,再排序选2000个,排序都是根据RPN网络中的分类网络的预测得分选择。
注意此处的筛选和计算loss的筛选没有关系。
简单讲该部分就是将RPN网络输出的 anchors数目降到了2000个
(5)筛选proposal,得到RoI
该环节目的,将上一步得到的2000个proposal进一步筛选,得到总共256个roi,同时要求其中正样本不超过64个,多了就随机选取,其他为负样本,即比例基本满足1:3。
实现:再次计算IOU,因为RPN调整了anchors了,不是最初的了,所以计算有意义和之前的值不同,此时IOU选择,大于等于0.5---正样本,小于0.5---负样本,不同于loss计算的规则(总共这两个地方用到IOU限制,容易搞混)。根据IOU值确定正样本负样本,再进行选取。
训练时:经上述过程,根据IOU值排序和比例控制,得出来256个ROI,并且每一个带有正负样本的标签及偏移量。
测试时:默认根据分类得分选取前300个作为RoI,另外根据个人理解,这个300个RoI数目的选择各种材料介绍比较少,不知道是不是自己查的不充分,应该这样,测试时这里选多少个RoI,训练时就应该选多少个RoI,然后满足1:3的比例即可;如果这个数目在训练和测试时不同,那样训练时和测试时RCNN网络的维度就应不同,如训练时按256个RoI训练,rcnn的输入维度就是256x512x7x7,若此时测试时选择300个RoI,那此时RCNN网络应该是300x512x7x7,与训练的网络不一样,个人理解技术上可以手动实现维度统一,训练时RCNN是256x512x7x7维度,测试时手动加上44x512x7x7个,至于这44个怎么选择和是不是这样等看懂论文和源码后回来修改。顺带一句,这里256个RoI没有实现参数共享,每个都是独立的,独立训练,因此44个是不是可以随机选取,或者可以优化下这里实现参数共享,应该会大量减少参数。
三、RoI Pooling
简介:
上述过程最终生成了256个ROI,但是各个roi大小不一,特征大小不同,所以需要修正为同一维度,所以该部分承上启下主要负责维度转换。
流程介绍:
目标是输出7x7的方格,但是ROI的特征图区域大小为20x20,20/7=2,所以定义个卷积核2x2的,步长为2,类似于最大池化,选取最大值,选取出7x7的区域。
缺点,精度不高,忽略了小数,取整损失精度。
更好的办法:RoI Align
定义一个2x2的方格,每个方格内部再定义四个小方格,每个方格的中心作为黑点位置,可以理解为取值位置,用该框遍历特征图,选取四个点处的值最大的为池化后的值。
四、全连接模块-RCNN
上面流程得出来的是256个ROI,输入RCNN,最终输出的是分类结果和回归结果,即分类和偏移预测,21个类别,84个位置偏移(每个类别4个)。