目录
- 卷积层 (Concolutional Layer, Conv Layer)
- 区域候选网络 (Region Proposal Network, RPN)
- 感兴趣区域池化 (Region of Interest Pooling, ROI Pooling)
- 分类层 (Classification Layer)
- Faster R-CNN 训练
卷积层 (Concolutional Layer, Conv Layer)
Conv Layer 包含三层: 卷积层 (Conv), 激活函数层(Rectified Linear Unit, ReLU), 池化层 (Pooling)
- 卷积层 (Conv)
卷积层的关键是卷积核, 卷积核是一个矩阵, 尺度通常为 3 * 3, 5 * 5 等等, 可以用于与输入数据相乘, 得到输出数据, 可以用于提取轮廓, 检测竖边, 模糊图像等等。
- 激活函数层(Rectified Linear Unit, ReLU)
激活函数层可以用于去除数据中小于 0 的部分并全部归为 0, 大于 0 的部分可以呈比例变化或不变, 传统 sigmoid 需要计算指数, 与激活函数层比起来计算量较大, 且激活函数层避免了 sigmoid 函数反向传播时梯度消失的情况, 同时避免了过拟合问题的发生。
- 池化层 (Pooling)
池化层用于压缩数据和参数的量, 减少过拟合, 常用方法有最大值池化与均值池化, 例如, 最大值池化指的是: 2 * 2 的像素中, 取 1 个最大值代表这 4 个像素; 均值池化指的是: 取 2 * 2 的像素平均值代表这 4 个像素。
- 神经网络优势
-
平移不变性: 同一个图像, 在不同位置, 对同一个卷积核, 特征结果相同, 但是特征结果处于不同位置, 特征近距离的可以通过池化层处理, 远距离的借助后续的全连接层权重调整处理。
-
旋转不变性: 卷积层会得到旋转的特征, 小角度的旋转通过两层池化可以基本重合, 对于角度较大的旋转, 需要数据增强来增加训练样本。
-
尺度不变性: 对于大小缩放的图像, 采用 Inception 的思想, 用不同尺寸的卷积核同时去寻找图片上的特征可以处理。
-
- 在 Faster R-CNN 中, 以 VGG16 模型中的 faster_rcnn_test.pt 网络结构为例, 有以下细节需要了解:
- Conv Layers 共有: 13 个 conv 层, 13个 relu 层, 4个 pooling 层
- kernel_size: 矩阵的边长尺寸
- pad: 图像外层填充一圈 0
- stride: 跳跃格数, 可以理解为压缩的倍数
- 所有的 conv 层:kernel_size = 3, pad = 1, stride = 1
- 所有的 pooling 层:kernel_size = 2, pad = 0, stride = 2
所以每次经过 conv 层, 图像尺度不变, 只进行卷积提取特征; 每次经过 relu 层, 图像尺度不变, 只对图像中数值小于 0 的像素点设置为 0; 每次经过 pooling 层, 图像被压缩, 尺度都变为原来 1 / 2; 通过 4 个 pooling 层, 图像的长和宽被压缩至原始尺寸的 1 / 16, 有效地将所有的输出特征 feature map 和原图对应起来。
区域候选网络 (Region Proposal Network, RPN)
经典检测方法中, 检测框的生成都非常耗时, 例如, OpenCV adaboost 采用滑动窗口和图像金字塔生成检测框, R-CNN 采用 选择性搜索 (Selective Search) 方法生成检测框, 而 Faster R-CNN 采用 区域候选网络 (Region Proposal Network, RPN) 生成检测框, 极大地提升了检测速度。
图中可以看到, 在 RPN 的过程中, 图像分为两条线进行处理, 第一部分通过 Softmax 逻辑回归对矩形框 (Anchors) 进行正负分类, 另一条计算 Anchors 对于边界回归 (Bounding Box Regression) 的偏移量, 用于获取精确的候选框 (Proposal), 最后两条线合二为一, Proposal 负责结合正矩形框 (Positive Anchor) 和边界回归偏移量进一步筛选边框, 同时剔除尺度过小和超出边界的结果, 从而实现了目标定位。
-
多通道图像 + 多卷积核 卷积计算
例如: 通道数: 3; 卷积核数: 2; 每个卷积核: 3 * 2 * 2;
则流程为: 每一个卷积核, 对 3 个通道分别进行卷积计算, 再将三个通道的计算结果加在一起, 得到卷积输出, 输出的 feature map 中特征数目与卷积核数目相同, 这里是 2 个。对多通道图像做 1 * 1 卷积, 则相当于将每个通道乘以卷积系数后加在一起, 可以理解为将图像各个通道联通。
-
矩形框 (Anchor)
矩形框用数组表示, 每行四个数(x1, y1, x2, y2)
表示矩形框左上角和右下角坐标, 例如:[[ -84. -40. 99. 55.] [-176. -88. 191. 103.] [-360. -184. 375. 199.] [ -56. -56. 71. 71.] [-120. -120. 135. 135.] [-248. -248. 263. 263.] [ -36. -80. 51. 95.] [ -80. -168. 95. 183.] [-168. -344. 183. 359.]]
9个矩形共有3种形状,长宽比为: 1 : 1, 1 : 2, 2: 1。
Anchor 的作用在于, 遍历 Conv Layer 计算得到的 feature maps, 为每一个点都匹配 9 个 anchors 作为初始检测框, 当前的不准确可以借助之后的边框回归 (Bounding Box Regression) 修正检测框位置。
总而言之, RPN 在原图中设置了密密麻麻候选的矩形框 Anchor, 利用 cnn 判断哪些里有目标, 设置为正样本矩形框 (Positive anchor), 相反设置为负样本矩形框 (Negative anchor)。
对于一个尺度为 1250 * 1560 的图像, VGG 下图像边长压缩至 1 / 16, feature map 每个点设置 9 个 Anchor, 总数为:ceil(1250 / 16) * ceil(1560 / 16) * 9 = 79 * 98 * 9 = 69678
- Softmax 判定矩形框正负性
进入尺度变化 (Reshape) 和 Softmax 之前, 已经边长压缩至 1 / 16 的图像先做了 1 * 1 的卷积, 此时结果大小是width * height * 18
, 即 feature map 的每个点都有 9 个 anchors, 每个 anchor 都有可能为正也可能为负, 因此先将信息预留空间保存下来。
Reshape Layer 的意义在于便于 Softmax 进行分类, 原本在上一步的矩阵尺度为:[1, 2 * 9, height, width]
, 为了便于计算, 尺度变为:[1, 2, 9 * height, width]
, 单独留出一个长度为 2 的维度便于分类, 之后再次 Reshape 恢复原状
- 边界回归 (Bounding Box Regression)
需要通过平移和缩放, 将正的矩形框演变为合适的矩形框, 这里定义了一个损失函数, 平移和缩放的参数通过优化损失函数来训练, 获得的结果叫做尺度因子。
-
对候选框 (Proposal) 进行边界回归 (Bounding Box Regression)
这里经过卷积后输出图像的尺度变为:[1, 4 * 9, height, width]
, 这里的 4 表示每个 Anchor 都有 4 个用于回归的尺度变换量, 此时矩阵和尺度为:VGG 输出特征: 79 * 98 *512 矩形框 (Anchors) 数目: 79 * 98 * k 分类特征矩阵(Positive / Negative Softmax): 79 * 98 * 2k 坐标回归特征矩阵(Regression): 79 * 98 * 4k
-
候选框层 (Proposal Layer)
该层用于综合所有的尺度因子和候选框正负性, 计算出精准的候选框范围, 送入后续的感兴趣区域池化层 (Region of Interest Pooling, ROI Pooling)。
该层输入有 3 个: 正负边框分类器结果, 边界回归的尺度因子, 以及保存的缩放信息。
处理流程如下:- 对所有边框做边界回归
- 按照分数从大到小将边框排序, 提取前 N 个边框
- 限制超出图像边界的边框
- 剔除尺度非常小的边框
- 输出边框结果
以上为检测部分, 接下来属于识别部分。
感兴趣区域池化 (Region of Interest Pooling, ROI Pooling)
该层用于收集候选边框, 并计算出后续边框的特征 (Proposal feature maps), 送至后续网络, 该层有两个输入: 原始的 feature maps, RPN 输出的 proposal boxes。
ROI Pooling 的优点在于保护图像完整性: 不需要通过截取部分图像和拉伸图像来获得指定尺寸的图像。
ROI 原理
- 将所有 proposal 的尺度从 M * N 映射回 (M / 16) * ( N / 16)
- 对每一个 proposal 的对应的 feature map 区域水平划分为 pooled_w * pooled_h 的网格
- 对每一个网格进行 max pooling 处理
通过以上操作, 所有输出的特征维度是相同的。
分类层 (Classification Layer)
对于获得的 proposal feature maps, 通过全连接层 (Full connect layer) 和 Softmax 进行类别判定, 输出属于某一类的概率向量, 同时再次用边界回归获取对于每个候选框更为精准的位置偏移量, 获得更为精准的目标检测框。
Faster R-CNN 训练
Faster R-CNN 的训练,是在已经训练好的模型 (如VGG_CNN_M_1024, VGG, ZF) 的基础上继续进行训练。实际中训练过程分为6个步骤:
- 在已经训练好的model上,训练RPN网络,对应stage1_rpn_train.pt
- 利用步骤1中训练好的RPN网络,收集proposals,对应rpn_test.pt
- 第一次训练Fast RCNN网络,对应stage1_fast_rcnn_train.pt
- 第二训练RPN网络,对应stage2_rpn_train.pt
- 再次利用步骤4中训练好的RPN网络,收集proposals,对应rpn_test.pt
- 第二次训练Fast RCNN网络,对应stage2_fast_rcnn_train.pt
下面是一张训练过程流程图,应该更加清晰:
具体每一步训练过程参考:
本文参考链接