目录
一、 R-CNN
1. R-CNN流程(4个步骤 )
2. RP的确定
3. 预训练模型+微调(backbone)
4. SVM的分类
5. bbox regression的训练
6. NMS
二、 Fast R-CNN
1. Fast R-CNN算法流程
2. 候选区域生成
3. 预训练模型微调(VGG-16为例)
4. ROI Pooling
5. 损失计算
三、 Faster R-CNN
1. Faster R-CNN算法流程
2. backbone
3. RPN
3.1 anchors(在特征图上画框)
3.2 对特征图上的anchor进行分类
3.3 bounding box regression框回归
3.4 生成Proposal
4. ROI pooling
5. Classification
6. Loss计算
7. 正负样本
个人笔记
一、 R-CNN
用CNN提取出Region Proposals
中的featues
,然后进行SVM分类与bbox的回归。
参考博文
R-CNNhttps://blog.csdn.net/weixin_43702653/article/details/123973629?spm=1001.2014.3001.5501
1. R-CNN流程(4个步骤 )
- 一张图像生成1K~2K个候选区域(使用Selective Search方法)
- 对每个候选区域,使用深度网络提取特征
- 特征送入每一类的SVM 分类器,判别是否属于该类
- 使用回归器精细修正候选框位置
2. RP的确定
区域候选框Region Proposal(RP)--------------使用Selective Search
算法确定,如下:
- 使用一种过分割手段,将图像分割成小区域 (1k~2k 个)
- 计算所有邻近区域之间的相似性,包括颜色、纹理、尺度等
- 将相似度比较高的区域合并到一起
- 计算合并区域和临近区域的相似度
重复3、4过程,直到整个图片变成一个区域
在每次迭代中,形成更大的区域并将其添加到区域候选框中;
自下而上的方式可以创建从小到大的不同scale的Region Proposal
3. 预训练模型+微调(backbone)
模型需要通过CNN提取出RP中的特征,用于后面的分类与回归。
- RP大小都不相同,所以需要对RP进行resize操作,变形为backbone要求的输入大小
- 变形之前,先在候选框周围加上16的padding,再进行各向异性缩放====不保持横纵比。
- 模型微调fine-tuning。将预训练模型最后的1000分类层,换成21分类层(20类物体+背景)
正负样本:
计算每个RP和GT的IoU,对于IoU>0.5的RP视为正样本,否则为负样本(即背景)
每个mini-batch随机选取32个正样本和96个负样本组成(128,正负比:1:3)
4. SVM的分类
分类之前的网络都是特征提取部分;eg: 2000个框-----------》(2000,4096)
特征提取冻结参数,开始分类 (2000,4096)-----------》(2000,21)20类物体+背景
过程如下:
SVM分类中,IOU<0.3负例,IOU>0.7正例,其余的全部丢弃;
负样本远远远多于正样本,使用hard negative mining方法(如下):
初始时用所有样本训练,经过一轮训练后将score最高即最容易被误判为正样本 的负样本加入新的样本训练集,进行训练,重复以上步骤至达到停止条件。比如分类器性能不再提升
为何hard negative mining?
正样本数目占的比例特别低,负样本太多,直接导致优化过程很慢,
很多负样本远离分界面对于优化几乎没有帮助;选取容易被误判为正样本的 负样本继续训练
5. bbox regression的训练
与GT的IOU>0.6的RP作为正样本,做回归训练.
在目标检测中,窗口一般用四维向量(x, y, w, h)来表示,分别表示窗口的中心点坐标和宽高。在下图中,窗口 P为region proposal,窗口 G为ground truth,那bounding box regression的目标呢就是:找到一种映射关系,使得 P 经过映射后会得到一个和G 比较接近的G′
6. NMS
Non-maximum suppression,即非极大值抑制。对于同一个物体,会预测出多个bounding box,NMS所做的就是去除掉多余的bounding box,只保留和ground truth重叠度最高的bounding box
二、 Fast R-CNN
R-CNN太慢、太占内存。
Fast R-CNNhttps://blog.csdn.net/weixin_43702653/article/details/124002054?spm=1001.2014.3001.5501改进之处:
1、卷积不再是对每个region proposal进行,而是直接对整张图像,这样减少了很多重复计算。原来RCNN是对每个region proposal分别做卷积,因为一张图像中有2000左右的region proposal,肯定相互之间的重叠率很高,因此产生重复计算。
2、用ROI pooling进行特征的尺寸变换,因为全连接层的输入要求尺寸大小一样,因此不能直接把region proposal作为输入。
3、regressor放进网络一起训练,每个类别对应一个regressor,用softmax代替SVM分类器。
1. Fast R-CNN算法流程
2. 候选区域生成
同R-CNN一样,利用Selective Search算法通过图像分割的方法得到一些原始区域。
Fast R-CNN与R-CNN不同的是,这些生成出来的候选区域不需要每一个都丢到卷积神经网络里面提取特征,而且只需要在特征图上映射便可
如何映射?如下图:
候选区域及正负样本问题:
Fast R-CNN中,并不适用SS算法提供的所有的候选区域,SS算法会得到2000个候选框,但是训练的过程中其实只需要使用其中的一部分
每张图像有64个region proposal(或者叫ROI)。这些ROI中约25%的作为正样本,
正样本和IOU值都大于0.5。剩下的ROI作为负样本,IOU都小于0.5。
3. 预训练模型微调(VGG-16为例)
- RoI池化层取代有监督预训练后的VGG-16网络最后一层池化层;
- 两个并行层取代VGG-16网络的最后一层全连接层和softmax层
并行层之一是新全连接层1+原softmax层1000个分类输出修改为21个分类输出【20种类+背景】,输出21个类别的概率,共21个节点
并行层之二是新全连接层2+候选区域窗口回归层,输出对应21个类别的候选边界框回归参数(dx , dy , dw, dh ),共21x4个节点。
4. ROI Pooling
RoI池化层将每个候选区域均匀分成M×N块,对每个块进行max pooling。从而将特征图上大小不一的候选区域转变为大小统一的特征向量,送入下一层。
5. 损失计算
总损失:
分类损失:
边界框损失:
三、 Faster R-CNN
Faster R-CNNhttps://blog.csdn.net/weixin_42310154/article/details/119889682?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168379218216800197076041%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168379218216800197076041&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-119889682-null-null.142%5Ev87%5Econtrol,239%5Ev2%5Einsert_chatgpt&utm_term=Faster%20R-CNN&spm=1018.2226.3001.4187Fast R-CNN很好地解决了传统R-CNN中将Region Proposal区域分别输入CNN网络中的弊端。但是!!!始终都是用的传统Selective Search搜索方式确定Region Proposal,训练和测试时消耗了大量时间在RP搜索上。Faster R-CNN突破性地使用了RPN网络直接提取出RP,并将其融入进整体网络中,使得综合性能有较大提高,在检测速度方面尤为明显
1. Faster R-CNN算法流程
如上图,Faster RCNN主要可以分为四个模块:
- 特征提取网络,用于提取图像的feature maps,用于后续的RPN层和取proposal
- RPN(Region Proposal Network)区域候选网络
替代了之前的Selective Search,用于生成候选框。这里任务有两部分,一个是分类:判断所有预设anchor是属于positive还是negative(即anchor内是否有目标,二分类);还有一个bounding box regression:修正anchors得到较为准确的proposals。RPN网络相当于提前做了一部分检测,即判断是否有目标(具体什么类别这里不判),以及修正anchor使框的更准一些。
- RoI Pooling
RPN生成的proposals,并从(1)中的feature maps中提取出来,生成proposals feature maps送入后续全连接层继续做分类(具体是哪一类别)和回归。
- Classification and Regression
用proposals feature maps计算出具体类别,再做一次bounding box regression获得检测框最终的精确位置。
网络架构:
2. backbone
经过conv层后,feature map不变;经过pooling,feature map的宽高变为之前的一半
通常下采样16倍
一个MxN大小的图片经过backbone之后生成的feature map大小为(M/16)x(N/16)
3. RPN
- 上面一条获得positive和negative分类(判断是否有目标)
- 下面一条用于计算bounding box regression偏移量(调整框)
- 最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取修正后的proposals,同时剔除太小和超出边界的proposals。
3.1 anchors(在特征图上画框)
原图MxN,则RPN的输入feature map大小为(M/16)x(N/16)。在这个feature map上,对于每一个像素点,作者设置9个预设anchor(3种面积,3个比例)。原图anchor数量也是(M/16) x (N/16) x 9。
3.2 对特征图上的anchor进行分类
通过RPN网络的上分支
(M/16)x(N/16)xC 的特征通过1x1卷积得到(M/16)x(N/16)x2k的输出(C是通道数,K是anchor数)
(M/16)x(N/16)x2k代表该feature map上每个点的每个anchor表示目标和背景的概率
3.3 bounding box regression框回归
通过RPN网络的下分支,得到(M/16)x(N/16)x4k的输出
(M/16)x(N/16)x4k代表该feature map上每个点的每个anchor 的4个偏移系数
3.4 生成Proposal
通过RPN网络种的Proposal部分
三个输入:
cls层的(M/16)x(N/16)x2k向量;reg层的(M/16)x(N/16)x4k向量;im_info=[M, N,scale_factor]
- reg层的偏移量。修正所有的原始anchor
- cls层的scores。按positive socres由大到小排列,取前topN(比如6000个)个anchors
- 边界处理。把超出图像边界的positive anchor超出的部分收拢到图像边界处
- 剔除尺寸非常小的positive anchor
- 对剩余的positive anchors进行NMS(非极大抑制)
- 最后输出一堆proposals左上角和右下角坐标值([x1,y1,x2,y2]对应原图MxN尺度)
特征图映射到原图如下:
4. ROI pooling
5. Classification
该分类要识别其具体属于哪一类。 RPN分类只是二分类,区分有没有目标。
具体做如下两件事:
- 对输入所有proposals进行具体类别的分类(多分类)
假设一共输入了300个proposals,输出维度应该是[300, 类别数]
- 再次对proposals进行bounding box regression,获取更高精度的最终的predicted box
假设一共输入300个proposals,输出维度应该是[300, 4],4还是代表偏移量。最终用proposal原始坐标加上偏移量,修正得到最终的predicted box结果。
6. Loss计算
【Faster RCNN】损失函数理解https://blog.csdn.net/Mr_health/article/details/84970776?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168379588616800215088994%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168379588616800215088994&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-84970776-null-null.142%5Ev87%5Econtrol,239%5Ev2%5Einsert_chatgpt&utm_term=faster%20rcnn%E6%8D%9F%E5%A4%B1%E5%87%BD%E6%95%B0&spm=1018.2226.3001.4187
7. 正负样本
faster rcnn有两次选择正负样本的操作;
RPN的正负样本选择:
RPN将20000多个候选的anchor选出256个anchor进行分类和回归位置。选择过程如下:
- 对于每一个(gt_bbox),选择和它重叠度(IoU)最高的一个anchor作为正样本。
- 从剩下的anchor中选择任意一个IoU超过0.7的作为正样本,数目不超过128个。
- 随机选择IoU小于0.3的anchor作为负样本。负样本和正样本的总数为256。
四、 MaskRcnn
1. 结构图
红色圈就是faster_rcnn
将faster_rcnn中ROI pooling换成RoiAlign(更准确地定位)
MaskRcnn就是比faster_rcnn多一个并行分支——绿色线
带有FPN的结构如下右图,不共用RoiAlign; 不带FPN如下左图,共用RoiAlign
2. RoiAlign