Faster R-CNN 学习笔记

目录
  1. 卷积层 (Concolutional Layer, Conv Layer)
  2. 区域候选网络 (Region Proposal Network, RPN)
  3. 感兴趣区域池化 (Region of Interest Pooling, ROI Pooling)
  4. 分类层 (Classification Layer)
  5. Faster R-CNN 训练
    图1. Faster R-CNN 结构图

卷积层 (Concolutional Layer, Conv Layer)

Conv Layer 包含三层: 卷积层 (Conv), 激活函数层(Rectified Linear Unit, ReLU), 池化层 (Pooling)


图2. Faster R-CNN 网络

  1. 卷积层 (Conv)
    卷积层的关键是卷积核, 卷积核是一个矩阵, 尺度通常为 3 * 3, 5 * 5 等等, 可以用于与输入数据相乘, 得到输出数据, 可以用于提取轮廓, 检测竖边, 模糊图像等等。

  1. 激活函数层(Rectified Linear Unit, ReLU)
    激活函数层可以用于去除数据中小于 0 的部分并全部归为 0, 大于 0 的部分可以呈比例变化或不变, 传统 sigmoid 需要计算指数, 与激活函数层比起来计算量较大, 且激活函数层避免了 sigmoid 函数反向传播时梯度消失的情况, 同时避免了过拟合问题的发生。

  1. 池化层 (Pooling)
    池化层用于压缩数据和参数的量, 减少过拟合, 常用方法有最大值池化与均值池化, 例如, 最大值池化指的是: 2 * 2 的像素中, 取 1 个最大值代表这 4 个像素; 均值池化指的是: 取 2 * 2 的像素平均值代表这 4 个像素。

  1. 神经网络优势
    • 平移不变性: 同一个图像, 在不同位置, 对同一个卷积核, 特征结果相同, 但是特征结果处于不同位置, 特征近距离的可以通过池化层处理, 远距离的借助后续的全连接层权重调整处理。

    • 旋转不变性: 卷积层会得到旋转的特征, 小角度的旋转通过两层池化可以基本重合, 对于角度较大的旋转, 需要数据增强来增加训练样本。

    • 尺度不变性: 对于大小缩放的图像, 采用 Inception 的思想, 用不同尺寸的卷积核同时去寻找图片上的特征可以处理。
      图3. conv 层图像操作示意图


  1. 在 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)

图4. 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) 和边界回归偏移量进一步筛选边框, 同时剔除尺度过小和超出边界的结果, 从而实现了目标定位。


图5. 多通道 + 多卷积核 卷积计算

  1. 多通道图像 + 多卷积核 卷积计算
    例如: 通道数: 3; 卷积核数: 2; 每个卷积核: 3 * 2 * 2;
    则流程为: 每一个卷积核, 对 3 个通道分别进行卷积计算, 再将三个通道的计算结果加在一起, 得到卷积输出, 输出的 feature map 中特征数目与卷积核数目相同, 这里是 2 个。

    对多通道图像做 1 * 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)。
    图6. Anchor 矩形框
    对于一个尺度为 1250 * 1560 的图像, VGG 下图像边长压缩至 1 / 16, feature map 每个点设置 9 个 Anchor, 总数为:

    ceil(1250 / 16) * ceil(1560 / 16) * 9 = 79 * 98 * 9 = 69678
    

  1. Softmax 判定矩形框正负性图7. 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 恢复原状

  1. 边界回归 (Bounding Box Regression)
    需要通过平移和缩放, 将正的矩形框演变为合适的矩形框, 这里定义了一个损失函数, 平移和缩放的参数通过优化损失函数来训练, 获得的结果叫做尺度因子。

  1. 对候选框 (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
    

  1. 候选框层 (Proposal Layer)
    该层用于综合所有的尺度因子和候选框正负性, 计算出精准的候选框范围, 送入后续的感兴趣区域池化层 (Region of Interest Pooling, ROI Pooling)。
    该层输入有 3 个: 正负边框分类器结果, 边界回归的尺度因子, 以及保存的缩放信息。
    处理流程如下:

    1. 对所有边框做边界回归
    2. 按照分数从大到小将边框排序, 提取前 N 个边框
    3. 限制超出图像边界的边框
    4. 剔除尺度非常小的边框
    5. 输出边框结果

    以上为检测部分, 接下来属于识别部分。


感兴趣区域池化 (Region of Interest Pooling, ROI Pooling)

该层用于收集候选边框, 并计算出后续边框的特征 (Proposal feature maps), 送至后续网络, 该层有两个输入: 原始的 feature maps, RPN 输出的 proposal boxes。

ROI Pooling 的优点在于保护图像完整性: 不需要通过截取部分图像和拉伸图像来获得指定尺寸的图像。


ROI 原理

  1. 将所有 proposal 的尺度从 M * N 映射回 (M / 16) * ( N / 16)
  2. 对每一个 proposal 的对应的 feature map 区域水平划分为 pooled_w * pooled_h 的网格
  3. 对每一个网格进行 max pooling 处理

通过以上操作, 所有输出的特征维度是相同的。


分类层 (Classification Layer)

对于获得的 proposal feature maps, 通过全连接层 (Full connect layer) 和 Softmax 进行类别判定, 输出属于某一类的概率向量, 同时再次用边界回归获取对于每个候选框更为精准的位置偏移量, 获得更为精准的目标检测框。


Faster R-CNN 训练

Faster R-CNN 的训练,是在已经训练好的模型 (如VGG_CNN_M_1024, VGG, ZF) 的基础上继续进行训练。实际中训练过程分为6个步骤:

  1. 在已经训练好的model上,训练RPN网络,对应stage1_rpn_train.pt
  2. 利用步骤1中训练好的RPN网络,收集proposals,对应rpn_test.pt
  3. 第一次训练Fast RCNN网络,对应stage1_fast_rcnn_train.pt
  4. 第二训练RPN网络,对应stage2_rpn_train.pt
  5. 再次利用步骤4中训练好的RPN网络,收集proposals,对应rpn_test.pt
  6. 第二次训练Fast RCNN网络,对应stage2_fast_rcnn_train.pt

下面是一张训练过程流程图,应该更加清晰:

图8. Faster R-CNN 训练图
具体每一步训练过程参考:
本文参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值