R-CNN
首先就是在一张图像当中先生成1K~2K个候选区域(使用SS算法获得),之后对我们获得的候选框使用深度网络进行特征提取(分类网络Resnet,VGG)得到特征向量,将他们送入每一个类别的SVM分类器,判别是否属于该类,最后对我们的候选框进行一个位置调整(回归器)
通过SS算法生成候选框
注意: 我们将分类网络的最后全连接层去掉,在卷积 池化一系列操作后,进行展平处理,之后将4096维的特征向量提取出来,由于是2000个候选区域,我们再进行将他们合并组成 2000*4096的矩阵
我们思考一定有某几个框进行裁剪之后的所得到的部分图像通过分类器后,被认为时某一类别的.
SVM分类器是一个二分类的分类器, 我们将之前得到的特征矩阵[2000*4096]与20个SVM(PASCAL 数据集)组成的权值矩阵[4096*20]相乘,得到一个得分矩阵,代表着每一个框是某个目标的得分, 所得到的矩阵是[2000*20]代表着每一个预选框,在这20个类别的得分情况,从每一列通过非极大值抑制算法去剔除重叠建议框(多余的框),也可以得到该列中得分最高的一些建议框
浅显的理解 每一个类别,应该是由4096个特征共同决定 但不同的类别,给这4096个特征赋权不同,也就导致了这4096个特征可以判断这20个类别
这里是与最高得分的目标判断IoU
对剩余的建议框进行进一步筛选,保留那些与grand truth有相交,并且IoU大于某一阈值,不满足条件的就舍弃.之后使用20个回归器对剩余的建议框进行回归操作,最终得到每个类别修正后得分最高的bounding box,这里可以看到 P 通过 回归器回归操作之后 从P 到 G^,使用回归器精细修正候选框的位置
Fast R-CNN
首先还是利用SS算法在一张图像上生成1K~2K个候选区域,(后面的步骤与R-CNN不同)
之后 将这个图像输入到CNN网络得到相应的特征图,将SS算法得到的候选框投影(映射)到特征图上获得特征矩阵,将每一个特征矩阵通过ROI pooling层(感兴趣区域)缩放到7*7大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果,也就是预测我们的目标所属的分类,以及bbox 的回归参数
那么 Fast R-CNN如何生成候选框的特征的呢
R-CNN 将2000个候选区域进行缩放输入到网络得到对应的特征也就进行2000次正向传递,这种做法存在大量的冗余,很多重叠的部分只需要计算一次就可以了不需要重复计算
Fast R-CNN 直接将整张图像传进CNN网络,得到特征图 (参考SPP net)紧接着通过每个候选区域的原图与我们特征图的映射关系,就可以直接在我们特征图当中直接去获取他的特征矩阵,这些候选区域的特征就不需要重复的计算了,之后通过RoIPooling层缩放到统一尺寸(7*7大小的特征图),之后将特征图展平处理,通过一系列全连接层得到预测结果
正样本和负样本选择策略
在训练过程中,我们通过SS算法得到的2000个候选框,我们只需要使用其中的一小部分,采样的数据分为正样本(候选框中确实存在我们所需检测目标的样本),负样本(背景,里面没有我们检测的目标)正样本和负样本的理解:如果我们想训练一个猫狗分类器,猫的目标数量远多于狗的目标数量,数据不平衡的情况,也就会造成在预测过程中更偏向于猫的情形,极端的情况所有的数据都是猫,这种情况预测肯定是有问题的,如果全部都是正样本的话,网络就会以很大的概率认为候选区域是正样本,(可能他框的完全是一个背景)
原论文提出从2K个候选框中采集64个候选区域,其中一部分是正样本一部分是负样本,
正样本就是与grand truth IoU > 0.5的,随机采样一部分候选区域,
负样本是与 grand truth 0.1<IoU<0.5 并且与grand truth IoU 最大
这里阈值设置为0.1,网络给的解答是 目的是为了获取和真实 bounding box IoU 至少为0.1的 RoI作为负样本,和真实目标有一定重叠,可以让模型学习较难的负样本
RoIPooling层是如何实现的
将候选区域通过CNN得到特征矩阵,划分为7*7 = 49 等份,对他的每一个区域执行MaxPolling操作,无论你的候选区域他的特征矩阵是什么样的尺寸,都给你统一缩放到 7*7,就可以不用限制输入图像的尺寸了
分类器(输出N+1个类别概率) 第一个概率为背景概率
边界框 回归器
这里是默认一个候选框只能框出一个目标,也即是一个框一个类别四个参数
IU: 回归器做的工作是微调,也就是grand truth 为小框的情况下, 候选框也为小的前提下进行微调, 回归器的参数, dx , dy 很明显是根据当前候选框的宽高乘以一个比例系数,并不是说根据之前预测的框的尺寸大小去预测后面的框尺寸,这种想法肯定会影响有些大号的目标图片去预测小号目标的图片.而是影响他们的比例系数,小框的前提下 变化的也会很小,大框的前提下 变化也会很大!
Fast R-CNN的损失计算
u 代表的 目标真实标签
u >= 1 时 [u>=1] = 1 ; u < 1 时 [u>=1] = 0
当 u < 1 也就是 u = 0 时候 这个类别时背景 也就是负样本 就没有边界框回归损失这一项了
当 u >= 1 也就是 [u >=1] = 1 的时候 就是候选区域确实属于我们所需检测某一个类别当中,也就是对应我们的正样本,这时候才有 边界回归损失,
Faster R-CNN
首先将我们的图像输入到网络中得到相应的特征图,之后使用RPN(Region Proposal Network)结构生成候选框(不使用SS算法了),将RPN生成的候选框投影到特征图获得相应的特征矩阵,之后将特征矩阵通过RoI pooling层 缩放到7*7大小的特征图,接着就是将特征图展平通过一系列全连接层得到预测结果
RPN网络结构
首先在特征图上使用滑动窗口,在feature map上进行滑动,每滑动一个位置上,就生成一个1维的向量,在这个向量的基础上再通过两个全连接层输出我们的目标概率,以及边界框回归参数,这里的2K是针对我们K个anchor boxs, 也就是每一个anchor 生成的两个概率,一个是为背景的概率,一个是为全景的概率,每个anchor 又会生成4个边界框回归参数
在使用ZF网络的时候,它所生成的特征图的深度是256,如果使用的是VGG16那么生成的特征图channel就是512
anchor: 首先 在特征图上每一个3*3的滑动窗口 计算它的中心点在我们原图上所对应的位置,
x,y都是按比例缩放的(stride) 因为通过卷积计算之后的求stride,padding,outputsize的公式就可以了解到
从下图来开,我们将cls 每两个分一组,因为每两个对应一个anchor,reg每4个分一组,其中第一组cls,当前的anchors对应的黄色方框,0.1代表它为背景的概率.0.9代表它为我们检测的目标的概率,注意到我们此时只关注它为前景还是背景,不关注他是前景中的具体哪一个分类.对于回归参数dx,dy,dw,dh,是对于anchor 中心坐标的预测偏移量,以及调整边界框的宽度和高度,通过边界框回归参数的调整我们希望尽可能的准确的框选出目标
配置:
三个尺度:[anchor的面积] 128*128,256*256,512*512
三个比例:[1:1,1:2,2:1]
也就是我们会生成9个anchor boxes 和 18个类别分数 36个边界框回归参数
ZF 网络感受野 171
VGG 网络感受野 228
感受野是228*228的大小为什么还能预测比他大的目标的边界框呢
作者认为:通过一个小的感受野去预测比它大的目标的边界框是有可能的,看到一个物体的一部分也能大概的猜出这个目标的完整的一个位置的区域
ZF网络
这里的感受野算错了 应该是 139或者少写了一次卷积操作
对于一张1000*600*3的图像经过CNN网络得到特征图,在经过RPN结构(先用3*3的卷积是他的inputsize = outsize 卷积核个数 等于 input Channel这样得到的Output的shape与Input完全一样,之后再并联两个1*1的卷积层来实现我们对于类别和边界框回归参数的预测)得到大约有(60*40)*9个anchor,其中60*40是特征矩阵大小,忽略跨越边界的anchor后剩下大约6000个anchor,由每个anchor在特征矩阵的位置可以推断出在原图的位置(中心点坐标),一个anchor对应4个回归参数,利用这四个回归参数,将anchor调整到候选框,对于RPN生成的候选框直接存在大量重叠,基于cls得分和非极大值抑制策略,IoU设为0.7,这样每张图片只剩2000个候选框
对于每一个图片上万个anchor中,采样256个anchor,这256个anchor由睁正样本和负样本两部分组成,比例大概在1:1,如果正样本不足,剩余的用负样本进行填充,每张图片只有256个anchor用来训练
定义正样本的方式:与grand truth box 的IoU高于 0.7或者anchor与grand truth 有最大的IoU
定义负样本的方式:与所有的grand truth box 的IoU都小于0.3
损失函数计算
Pi原文是predicted probablity of anchor i being an object 说明只是预测为目标的概率,和真实标签无关
多分类,第一个框里第一个值为背景的概率,第二个值为前景的概率,
第一个框的损失为target = 1 (0,1) predict = 0.9 Loss = -log(0.9)
第二个框的损失为target = 0 (1,0) predict = 0.2 Loss = -log(0.2)
由sigmod函数得到的概率趋近与1 就代表前景的,如果去趋近于0 就代表背景
二值交叉熵损失,对每一个anchor只预测一个值,也就是只预测k scores,
如果真实标签是1,代表的就是为前景的概率,当然也能推出背景的概率,反之如果真实标签是0
Loss= -[target * log(pred) +(1- target) * log(1-pred)]
target:正样本为1,负样本为0
pred: 预测为正样本的概率**** (注意这里与上面Cross Entropy的不同)
① target=1 pred=0.9 Loss=- [1 * log(0.9) + 0* log(0.1)]==>-log(0.9)
② target=0 pred=0.2(预测为正样本(target=1)的概率 ) Loss=-【0+ log(1-0.2)】==>-log(0.8)
边界框回归损失 与 Fast R-CNN 相同