R-CNN
R-CNN可以说是利用深度学习进行目标检测的开山之作
RCNN算法流程可分为4个步骤
- 一张图像生成1K~2K个候选区域(使用Selective Search方法)
- 对每个候选区域,使用深度网络提取特征
- 特征送入每一类的SVM 分类器,判别是否属于该类
- 使用回归器精细修正候选框位置
1.候选区域的生成
利用Selective Search算法通过图像 分割的方法得到一些原始区域,然后 使用一些合并策略将这些区域合并, 得到一个层次化的区域结构,而这些 结构就包含着可能需要的物体。
2.对每个候选区域,使用深度网络提取特征
将2000候选区域缩放到227x227pixel,接着 将候选区域输入事先训练好的AlexNet CNN网络 获取4096维的特征得到2000×4096维矩阵。
3.特征送入每一类的SVM分类器,判定类别
将2000×4096维特征与20个SVM组成的权值矩阵4096×20相乘, 获得2000×20维矩阵表示每个建议框是某个目标类别的得分。分别 对上述2000×20维矩阵中每一列即每一类进行非极大值抑制剔除重 叠建议框,得到该列即该类中得分最高的一些建议框。
将2000×4096的特征矩阵与20个SVM组成的权值矩阵4096×20 相乘,获得2000×20的概率矩阵,每一行代表一个建议框归于每个 目标类别的概率。分别对上述2000×20维矩阵中每一列即每一类进 行非极大值抑制剔除重叠建议框,得到该列即该类中得分最高的一 些建议框。
此处的删去大于给定阈值的目标是删去那些跟最高得分重叠多的部分,IOU虽大,但是分数不是最高的,分数最高的留一个就够了
IIOU的值越高说明这两个候选框预测的是同一个物体的概率越大,一个物体只需要一个框就够了
IoU
IOU的值越高说明这两个候选框预测的是同一个物体的概率越大,一个物体只需要一个框就够了
此处的删去大于给定阈值的目标是删去那些跟最高得分重叠多的部分,IOU虽大,但是分数不是最高的,分数最高的留一个就够了
4.使用回归器精细修正候选框位置
依旧针对CNN 输出的特征向 量进行预测
对NMS处理后剩余的建议框进一步筛选。接着分别 用20个回归器对上述20个类别中剩余的建议框进行回 归操作,最终得到每个类别的修正后的得分最高的 bounding box。 如图,黄色框口P表示建议框Region Proposal, 绿色窗口G表示实际框Ground Truth,红色窗口 表示Region Proposal进行回归后的预测窗口,可以用 最小二乘法解决的线性回归问题。
R-CNN框架
首先通过ss算法生成一系列候选框,通过CNN将我们候选框等到一系列特征向量,再将一系列特征向量分别通过SVM进行目标的分类再通过回归器去调节我们候选框的坐标
R-CNN存在的问题:
1.测试速度慢: 测试一张图片约53s(CPU)。用Selective Search算法 提取候选框用时约2秒,一张图像内候选框之间存在大 量重叠,提取特征操作冗余。
2.训练速度慢: 过程及其繁琐
3.训练所需空间大: 对于SVM和bbox回归训练,需要从每个图像中的每个目标候选框 提取特征,并写入磁盘。对于非常深的网络,如VGG16,从VOC07 训练集上的5k图像上提取的特征需要数百GB的存储空间。
Fast R-CNN
同样使用VGG16作为网络 的backbone,与R-CNN相比训练时间快9倍,测试推理时间快213倍,准确率从 62%提升至66%(再Pascal VOC数据集上)。
Fast R-CNN算法流程可分为3个步骤
- 一张图像生成1K~2K个候选区域(使用Selective Search方法)
- 将图像输入网络得到相应的特征图,将SS算法生成的候选框投影到 特征图上获得相应的特征矩阵
- 将每个特征矩阵通过ROI(Region of Interest) pooling层缩放到7x7大小的特征图,接着将 特征图展平通过一系列全连接层得到预测结果
将每个候选区域分别输入网络,将整个图像输入到我们网络中
把整个图放进网络训练然后SS得到的数据会映射到训练过的图上
Fast R-CNN是先对整张图片提取特征,然后对提取出的特征图生成候选框,再去crop
映射的对象变了,RCNN是图像,FastRCNN是直接映射特征图
将每个特征矩阵划分成7*7的区域,每个区相当于有4个值,利用最大池化下采样就只有一个数据了,所以无论输入图片多大,最后都是7*7的矩阵
一次性计算整张图像特征
训练数据的采样 (正样本,负样本)
正样本:候选框中确实存在我们需要检测目标的样本,负样本:背景
卷积后特征图具有相对位置不变性,所以存在某种映射关系使其映射到特征图
这里如果有两个类别一个类别的特征矩阵大另一个特征矩阵小,网络通过特征矩阵去训练模型的数据越多训练效果越好,所以猫的特征矩阵大训练效果也就偏向它
这里面阈值下界设置为0.1很有意思,其目的是为了获取和真实bounding box交并比至少为0.1的ROI作为负样本,即和真实目标有一定重叠,可以让模型学习较难的负样本。
在ROI feature vector上并联两个全连接层,一个FC用于目标概率的检测,一个fc用来我们边界框回归参数的预测
RoI Pooling Layer(RoI 池化层)
不限制输入 图像的尺寸
分类器
边界框回归器
绿色的是我们真实的目标边界框,黄色的是我们通过ss算法得到的候选框,红色:预测的
真实边框值根据这个公式去反推回归参数,然后再与网络生成的回归参数做差值
这里的dx之类的应该是不确定的参数,是学习出来的,G和P都是已知的
Multi-task loss(多任务损失)
损失函数分成两块,分类损失衡量实际类别概率与预测类别概率的“误差”,回归损失衡量实际框位置和预测框位置的“误差”
Cross Entropy Loss 交叉熵损失
Fast R-CNN框架
通过ss算法获取我们的候选框,特征提取分类和边界框回归
这里的融合我是这么理解的:将经过CNN的输出分两路,一路用于计算分类概率,一路用于候选框相对偏移的计算
Faster R-CNN
同样使用VGG16作 为网络的backbone,推理速度在GPU上达到5fps(包括候选区域的生成),准确率 也有进一步的提升。
Fast R-CNN算法流程可分为3个步骤
RPN + Fast R-CNN
- 一张图像生成1K~2K个候选区域(使用Selective Search方法)
- 将图像输入网络得到相应的特征图,将SS算法生成的候选框投影到 特征图上获得相应的特征矩阵
- 将每个特征矩阵通过ROI pooling层缩放到7x7大小的特征图,接着将 特征图展平通过一系列全连接层得到预测结果
不是一个图片4096维特征,是一个region4096维。一个图片2000个region。
产生的候选框大小它是随机的,而我们要缩放的是,这些候选框框出的不同大小的图片。而不是把这样候选框缩放到同样大小。选出候选框-拿出候选框中的图片-对这个图片进行缩放(✓)。选出候选框-把所有候选框缩放成同样大小-拿出缩放后候选框内的图片(×)
投影方法:找到候选框ROI在原始图像上的位置,然后等比例缩放到特征图的相同位置上
这里不是卷积操作,而是把3x3的特征图展品,形成一个256维的小区域向量,卷积操作只会形成一个256个数进行相加
一个通道此位置计算出一个数,有多少通道在相同位置计算出通道数量个数的数,就得到一个256的一维向量
然后再去单独训练rpn网络第二部固定参数重新训练初始化再去利用生成的目标建议狂训练fastrcnn
anchor经过RPN的回归参数调整后,才生成候选框
因为ss算法得单独花费时间生成候选框,而rpn是端到端的
全连接要把张量拉直成向量,这里多消耗时间。而全卷积和全连接作用一样但不要拉直,可以并行计算
这里是训练rpn,训练rpn是256,2k是训练预测物体类别和边界
三种尺度(面积){ } 2 2 2 128 ,256 ,512
三种比例{ 1:1, 1:2, 2:1 }
每个位置(每个滑动窗口)在原图上都对应有3x3=9 anchor
我的理解:RPN通过预设的Anchors在原始图像上进行扫描,并对每个Anchor进行分类和边框回归任务。通过分类任务,RPN可以判断每个Anchor是否为前景;通过边框回归任务,RPN可以调整前景Anchor的位置和大小,使其更准确地匹配目标物体。最后,通过非极大值抑制(NMS)来减少候选框的数量,提高检测效率和准确性。
对于ZF感受野: 171
对于VGG感受野: 228
CNN感受野
训练数据的采样 (正样本,负样本)
刚刚讲的>0.7为正样本,<0.3为负样本,最大iou为正样本就是在为anchor分配标签GT
应该是nms采样2000多个做边框回归,随机采样256个做类别预测,两个独立的
应该是从所有正样本中随机采样128,从所有负样本采样128,正样本不够的话,从负样本中多采样,来达到总数256
RPN Multi-task loss
- RPN负责生成推荐框(Proposals),并对每个Anchor预测其为目标(前景)的概率。
- RPN的分类损失是针对前景和背景的识别损失,使用二分类交叉熵损失来计算。
- Anchor的数量通过特征图位置和预设的Anchors数量来确定,最终通过筛选和NMS得到数量较少的候选框。
- 正负样本的标注是通过计算Anchors与真实标签的IOU来实现的。
- RPN生成的候选框作为后续检测网络的输入,而RPN的训练样本是在所有Anchor的基础上进行筛选的。
- anchors历险记:20k->6k->2k->256
- 在rpn网络生成的2000个候选框之后选取的正负样本应该是fast-rcnn训练的,而rpn网络用于训练的样本应该是在所有的anchor的基础上进行筛选的
分类损失
使用ce loss时,pi是预测第i个anchor属于真实标签概率,前景框就是预测前景框概率,背景框就是预测背景框概率
由于这里是预测为前景的概率,为了跟上一页PPT保持一致,这里第二个anchor的概率不是0.2,而是0.8,这样损失函数跟上一页多分类交叉熵就一样了
使用bce loss时,pi是预测第i个anchor属于前景框的概率
因为我们的负样本是背景,不是目标概率,损失是计算目标预测值和真实值的差距 这里的0.2不是我们的目标概率值 应该是0.8 标签为1 这里就是 -[1*log(0.8)+0*log(1-0.8)]
不是这个本质没区别,二值的是个特例,因为概率加起来等于1,所以算一个就行,但是直接把二分类当成多分类计算也行这里的多分类交叉熵正好就是两类
注意:使用二值交叉熵损失,cls layer只预测k scores
softmax Cross EntropyLoss(sCE)=-log(pi) ---->Loss=-target* log(pred)
target: 正样本为1,负样本为0
pred : 预测为target的概率 (注意这个与下面的BCE LOSS 的不同)
① target=1 pred=0.9 Loss=-log(0.9)
② target=0 pred=0.2 Loss=-log(0.2)
***其实这里target用热编码更好理解
① target=1--->(0,1) pred=0.9 Loss=-log(0.9)
② target=0--->(1,0) pred=0.2 Loss=-log(0.2)
Binary Cross EntropyLoss(BCE)=-【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)
解释:
1中②的loss和2中②的Loss为什么不一样?
因为各自Loss中pred对应的含义不同
1中,
pred :预测为target的概率2中,
pred: 预测为正样本的概率
sCE中,
②中pred=0.2 代表的是 target=0的概率
BCE中,
②中pred=0.2 代表的是 正样本(target=1)的概率
如果sCE中上述(我的上面的笔记)写的是:
target:正样本为1,负样本为0②的概率是 0.8(负样本概率),0.2(正样本概率) ,target=0 。
那么前后两个ppt所算的loss就是一样的
边界框回归损失
对于前景anchor,其和gt的交并比是大于0.5或0.7的,那么这几个gt回归参数取值范围都在-1到+1之间
Fast R-CNN Multi-task loss
Faster R-CNN训练
直接采用RPN Loss+ Fast R-CNN Loss的联合训练方法
原论文中采用分别训练RPN以及Fast R-CNN的方法
rpn生成的是候选框,并不是最后的预测框,fast对框回归训练是生成预测框
GT Box是人工标注的。
rpn已经把框计算出来了,后面为啥还要计算因为RPN的分类只有背景和前景两种,RCNN里是多类别
(1)利用ImageNet预训练分类模型初始化前置卷积网络层参数,并 开始单独训练RPN网络参数; (2)固定RPN网络独有的卷积层以及全连接层参数,再利用 ImageNet预训练分类模型初始化前置卷积网络参数,并利用RPN 网络生成的目标建议框去训练Fast RCNN网络参数。
(3)固定利用Fast RCNN训练好的前置卷积网络层参数,去微调RPN 网络独有的卷积层以及全连接层参数。
(4)同样保持固定前置卷积网络层参数,去微调Fast RCNN网络的全 连接层参数。最后RPN网络与Fast RCNN网络共享前置卷积网络层 参数,构成一个统一网络。
(3)(4)步是换成了自己的数据集进行微调,而不是再用imageNet
Faster R-CNN模型
四个部分全部融合在我们cnn网络中