1.RCNN
1.1算法流程
- 一张图像生成1k~2k个候选区域(使用Selective Search方法)
- 对每个候选区域,使用深度网络提取特征
- 特征送入每一类的SVM分类器,判断是否属于该类
- 使用回归器精细修正候选框位置
1.候选区域的生成
利用selective Search算法通过图像分割的方法得到一些原始区域,然后使用一些合并策略将这些区域合并,得到一个层次化的区域结构,而这些结构就包含着可能需要的物体。
2.对每个候选区域,使用深度网络提取特征
将2000候选区域缩放到227x227pixel,接着将候选区域输入事先训练好的AlexNet CNN网络获取4096维的特征得到2000×4096维矩阵。
CNN:图像分类网络
3.特征送入每一类的SVM分类器,判定类别
将2000×4096维特征与20个SVM组成的权值矩阵4096×20相乘,获得2000×20维矩阵表示每个建议框是某个目标类别的得分。分别对上述2000×20维矩阵中每一列即每一类进行非极大值抑制剔除重叠建议框,得到该列即该类中得分最高的一些建议框。
SVM分类器:二分类
4.使用回归器精细修正候选框位置
对NMS处理后剩余的建议框进一步筛选。接着分别用20个回归器对上述20个类别中剩余的建议框进行回归操作,最终得到每个类别的修正后的得分最高的bounding box。
如图,黄色框口P表示建议框Region Proposal,绿色窗口G表示实际框Ground Truth,红色窗口G表示Region Proposal进行回归后的预测窗口,可以用最小二乘法解决的线性回归问题。
1.2 R-CNN存在的问题
- 测试速度慢:
测试一张图片约53s(CPU)。用Selective Search算法提取候选框用时约2秒,一张图像内候选框之间存在大量重叠,提取特征操作冗余。 - 训练速度慢:
过程及其繁琐 - 训练所需空间大:
对于SVM和bbox回归训练,需要从每个图像中的每个目标候选框提取特征,并写入磁盘。对于非常深的网络,如VGG16,从VOCO7训练集上的5k图像上提取的特征需要数百GB的存储空间。 - 尺寸归一化导致物体变形,纵横比特征丢失,强行拉伸
1.2(1)解决办法
SPP net 创新
- 提出金字塔池化操作,可适应任意大小的输入图像
- 计算整幅图像的特征图,根据相对位置进行截取
1.3 什么是深度网络提取特征?
人识别物体也是根据特别的特征辨别的,计算机也是
对于输出层之前的所有层,我们都可以将其看成是一个特征提取的过程,而且越靠后的隐含层也就意味着提取得到的特征越抽象。
深度学习的核心目的就四个字:特征提取。
深度特征提取方法_我告诉你什么是深度学习_weixin_39820588的博客-CSDN博客
1.4 什么是交叉熵
交叉熵可在神经网络(机器学习)中作为损失函数,p表示真实标记的分布,q则为训练后的模型的预测标记分布,交叉熵损失函数可以衡量p与q的相似性。交叉熵作为损失函数还有一个好处是使用sigmoid函数在梯度下降时能避免均方误差损失函数学习速率降低的问题,因为学习速率可以被输出的误差所控制。
在特征工程中,可以用来衡量两个随机变量之间的相似度。
交叉熵_百度百科 (baidu.com)
2.FastRCNN
Fast R-CNN是作者Ross Girshick继R-CNN后的又一力作。
同样使用vGG16作为网络的backbone,与R-CNN相比训练时间快9倍,测试推理时间快213倍,准确率从62%提升至66%(再Pascal voc数据集上)。
2.1Fast R-CNN算法流程可分为3个步骤
- 一张图像生成1K~2K个候选区域(使用Selective Search方法)
- 将图像输入网络得到相应的特征图,将SS算法生成的候选框投影到特征图上获得相应的特征矩阵
- 将每个特征矩阵通过ROI pooling层缩放到7x7大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果
2.2一次性计算整张图像特征
R-CNN依次将候选框区域输入卷积神经网络得到特征。(会存在大量的冗余)
Fast-RCNN将整张图像送入网络,紧接着从特征图像上提取相应的候选区域。这些候选区域的特征不需要再重复计算。(不限制输入的尺寸)
训练数据的采样:正样本(确实存在的),负样本(简单理解为背景)
分类器
输出N+1个类别的概率(N为检测目标的种类,1为背景)共N+1个节点
边界框回归器
输出对应N+1个类别的候选边界框回归参数(d. d,d., d),共(N+1)x4个节点
相关知识点连接
回归损失函数1:L1 loss, L2 loss以及Smooth L1 Loss的对比 - Brook_icv - 博客园 (cnblogs.com)
2.3 Fast RCNN框架
2.4 RoI Pooling Layer 的作用
保证输入后续全连接层的特征向量维度相同
3.Faster RCNN
Faster R-CNN是作者Ross Girshick继Fast R-CNN后的又一力作。同样使用VGG16作为网络backbone,推理速度在GPU上达到5fps(包括候选区域的生成),准确率也有进一步的提升。在2015年的ILSVRC以及COCO竞赛中获得多个项目的第一名。
3.1Faster R-CNN 算法流程可分为3个步骤
- 将图像输入网络得到相应的特征图
- 使用RPN结构生成候选框,将RPN生成的候选框投影到特征图上获得相应的特征矩阵
- 将每个特征矩阵通过ROI pooling层缩放到7x7大小的特征图接着将特征图展平通过一系列全连接层得到预测结果
3.2 RPN Multi-task loss
Faster R-CNN真正实现了端到端的训练(end-to-end training)。
Faster R-CNN最大特色是使用了RPN取代了SS算法来获取RoI
3.3 Faster R-CNN训练
直接采用RPN Loss+ Fast R-CNN Loss的联合训练方法
原论文中采用分别训练RPN以及Fast R-CNN的方法
(1)利用lmageNet预训练分类模型初始化前置卷积网络层参数,并开始单独训练RPN网络参数;
⑵固定RPN网络独有的卷积层以及全连接层参数,再利用ImageNet预训练分类模型初始化前置卷积网络参数,并利用RPN网络生成的目标建议框去训练Fast RCNN网络参数。
⑶固定利用Fast RCNN训练好的前置卷积网络层参数,去微调RPN网络独有的卷积层以及全连接层参数。
(4)同样保持固定前置卷积网络层参数,去微调Fast RCNN网络的全连接层参数。最后RPN网络与Fast RCNN网络共享前置卷积网络层参数,构成一个统一网络。
3.4Faster R-CNN框架
3.5 核心是理解RPN
参考博客链接
目标检测综述_计算机视觉life的博客-CSDN博客_目标检测
anchor:
简单地说,RPN依靠一个在共享特征图上滑动的窗口,为每个位置生成9种预先设置好长宽比与面积的目
标框(即anchor)。这9种初始anchor包含三种面积(128×128,256×256,512×512),每种面积又包含三
种长宽比(1:1,1:2,2:1)。示意图如下所示:
绿的三个anchor
红的三个anchor
蓝的三个anchor
总共九个anchor
三种尺度(面积){128x128, 256x256,512x512 }
三种比例{1:1,1:2,2:1}
每个位置在原图上都对应有3x3=9 anchor
对于一张1000x600x3的图像,大约有60x40x9(20k)个anchor,忽略跨越边界的anchor以后,剩下约6k个anchor。对于RPN生成的候选框之间存在大量重叠,基于候选框的cls得分,采用非极大值抑制,IoU设为0.7,这样每张图片只剩2k个候选框。
4.主干网络
4.1常见分类
常见的有VGG、Resnet 和 Xception 等
对于精度与效率的不同要求,人们可以选择更深且连接密集的主干网络,如 ResNet 、ResNeXt 、
AmoebaNet 。
轻量级主干网络,如 MobileNet 、ShuffleNet 、SqueezeNet 、Xception 、MobileNetV2 。
Resnet网络是一种深度残差网络,深度残差网络可以有效解决因网络深度加深而产生的学习效率下降而
准确率无法有效提升的问题
特征的好坏决定了网络性能的上限。
4.2 FPN
特征图金字塔网络FPN(Feature Pyramid Networks)
FPN主要解决的是物体检测中的多尺度问题,通过简单的网络连接改变,在基本不增加原有模型计算量的情况下,大幅度提升了小物体检测的性能。
算法大致结构如下:一个自底向上的线路,一个自顶向下的线路,横向连接
作者提出的FPN(Feature Pyramid Network)算法同时利用低层特征高分辨率和高层特征的高语义信息,通过融合这些不同层的特征达到预测的效果。并且预测是在每个融合后的特征层上单独进行的,效果甚佳。
4.3ResNet
4.4 AlexNet 深度卷积神经网络(2012)
我怎么拿到数据?拿到数据我又不知道干啥?知道干啥我又不会分析?
解决办法:先寻找数据集,例如交通标识识别,研究别人的论文,有什么地方可以替换(改进),跑出数据直接写论文。
该网络的亮点在于:
- 首次利用GPU进行网络加速训练。
- 使用了ReLU激活函数,而不是传统的Sigmoid激活函数以及Tanh激活函数。
- 使用了LRN局部响应归一化。
- 在全连接层的前两层中使用了Dropout随机失活神经元操作,以减少过拟合。
- Sigmoid激活函数以及Tanh激活函数求导比较麻烦,网络较深的时候会出现梯度消失的情况。
ReLU成功解决了这两个痛点。①求导问题②梯度消失问题
- 过拟合 :根本原因是特征维度过多,模型假设过于复杂,参数过多,训练数据过少,噪声过多,导致拟合的函数完美的预测训练集,但对新数据的测试集预测结果差。过度的拟合了训练数据,而没有考虑到泛化能力。
使用Dropout的方式在网络正向传播过程中随机失活一部分神经元
经卷积后的矩阵尺寸大小计算公式为: N= (W -F+ 2P ) /S+1
- 输入图片大小W*W
- Filter大小F×F
- 步长s
- padding的像素数P
import torch
from torch import nn
from d2l import torch as d2l
net = nn.Sequential(
# 这⾥,我们使⽤⼀个11*11的更⼤窗⼝来捕捉对象。
# 同时,步幅为4,以减少输出的⾼度和宽度。
# 另外,输出通道的数⽬远⼤于LeNet
nn.Conv2d(1, 96, kernel_size=11, stride=4, padding=1), nn.ReLU(),
nn.MaxPool2d(kernel_size=3, stride=2),
# 减⼩卷积窗⼝,使⽤填充为2来使得输⼊与输出的⾼和宽⼀致,且增⼤输出通道数
nn.Conv2d(96, 256, kernel_size=5, padding=2), nn.ReLU(),
nn.MaxPool2d(kernel_size=3, stride=2),
# 使⽤三个连续的卷积层和较⼩的卷积窗⼝。
# 除了最后的卷积层,输出通道的数量进⼀步增加。
# 在前两个卷积层之后,汇聚层不⽤于减少输⼊的⾼度和宽度
nn.Conv2d(256, 384, kernel_size=3, padding=1), nn.ReLU(),
nn.Conv2d(384, 384, kernel_size=3, padding=1), nn.ReLU(),
nn.Conv2d(384, 256, kernel_size=3, padding=1), nn.ReLU(),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Flatten(),
# 这⾥,全连接层的输出数量是LeNet中的好⼏倍。使⽤dropout层来减轻过拟合
nn.Linear(6400, 4096), nn.ReLU(),
nn.Dropout(p=0.5),
nn.Linear(4096, 4096), nn.ReLU(),
nn.Dropout(p=0.5),
# 最后是输出层。由于这⾥使⽤Fashion-MNIST,所以⽤类别数为10,⽽⾮论⽂中的1000
nn.Linear(4096, 10))
X = torch.randn(1, 1, 224, 224)
for layer in net:
X=layer(X)
print(layer.__class__.__name__,'output shape:\t',X.shape)
batch_size = 128
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224)