用通俗易懂的文字带你了解Faster RCNN

第一次写博客,编辑器不太会用,格式有点乱。
faster rcnn接触了一年多了,接触过好几个版本的代码,也魔改过好多次,总算对他的原理有了足够的理解。本文尝试用通熟易懂的解释来说明faster rcnn的原理。有哪些是写错的请各位大佬指教。

参考代码地址:https://github.com/endernewton/tf-faster-rcnn
论文地址:https://arxiv.org/pdf/1506.01497.pdf

    1. 输入图片 A \color{blue}{A} A
    1. 经过backbone特征提取得到特征 F \color{blue}{F} F。本步骤输入A,输出F,训练和测试都一样。
    1. 对特征图F进行取anchor的操作,共取出hw9个anchor备用(特征图每一点都作为anchor的中心,共9个尺寸),暂且记为 a n c h o r − s e t \color{blue}{anchor-set} anchorset, 这 一 步 不 需 要 神 经 网 络 \color{red}{这一步不需要神经网络} 。anchor_set的数据结构是原图里的左上角和右下角的坐标值。本步骤输入F,输出anchor_set,训练和测试都一样。
    1. 根据anchor_set的坐标信息来制作RPN数据集。 这 一 步 不 需 要 神 经 网 络 。 在 目 前 的 代 码 实 现 的 顺 序 里 面 , 这 一 步 是 接 在 5.2 之 后 的 , 但 从 整 篇 论 文 的 \color{red}{这一步不需要神经网络。在目前的代码实现的顺序里面,这一步是接在5.2之后的,但从整篇论文的} 5.2 逻 辑 顺 序 上 来 看 , 将 这 个 步 骤 放 在 这 里 好 像 更 容 易 理 解 。 \color{red}{逻辑顺序上来看,将这个步骤放在这里好像更容易理解。} 本步骤输入anchor_set,输出rpn_cls_true和rpn_bbox_true。 这 一 步 骤 只 在 训 练 过 程 中 存 在 , 测 试 中 没 有 \color{green}{这一步骤只在训练过程中存在,测试中没有}
      1. 1首先,将去除anchor_set中超出图片边界的那部分anchor。导入原始数据的标注信息 g t − b o x e s \color{blue}{gt-boxes} gtboxes,即目标的真实框。设剩余有N个anchor,M个gt-boxes。计算每个anchor和每个gt-boxes之间的IOU,那么将会得到N*M个IOU值。通过以下步骤来对anchor进行打标签,标签分为前景,背景,不关注。
        1. 1.1对于每个gt-boxes,挑选出与其具有最大IOU的那个anchor,那么就会得到M个这样的anchor,将这M个anchor的标签打为“1”,即该anchor属于前景。
        1. 1.2 对于每个anchor,挑选出与其具有最大IOU的那个gt-boxes,将最大IOU与阈值比较,当最大IOU大于0.7时,该anchor的标签打为“1”,即该anchor属于前景;当最大IOU小于0.3时,该anchor的标签打为“0” ,即该anchor属于背景。
        1. 1.3 经过上述两个步骤后将会得到一些属于前景和背景的anchor。进一步从中挑选出256(也可以设置为512)个anchor,前景和背景各有128个。这个256我们称它为RPN_batchsize,意味着RPN网络的两个损失函数在计算时,只考虑这256个anchor的信息。
        1. 1.4 除去上述256个anchor以外的所有anchor都标记为“-1”,即这些anchor属于不关注的样别,在训练过程中不会被用到。
      1. 2 另外,对于上述步骤中被标记为前景的anchor,要记录其对应的gt-boxes是哪一个,并且计算出anchor与对应gt-boxes之间的偏移量。所以这一部最终的输出是所有anchor的类别 r p n − c l s − t r u e \color{blue}{rpn-cls-true} rpnclstrue,以及所有前景类的anchor与对应gt-boxes的偏移量 r p n − b b o x − t r u e \color{blue}{rpn-bbox-true} rpnbboxtrue
    1. 特征图F输入RPN网络。 本 步 骤 在 训 练 时 , 输 入 F , a n c h o r s e t , r p n c l s t r u e 和 r p n b b o x t r u e , 输 出 2000 个 r o i 。 \color{green}{本步骤在训练时,输入F,anchor_set,rpn_cls_true和rpn_bbox_true,输出2000个roi。} Fanchorsetrpnclstruerpnbboxtrue2000roi 测 试 时 , 输 入 F , a n c h o r s e t , 输 出 300 个 r o i 。 \color{green}{测试时,输入F,anchor_set,输出300个roi。} Fanchorset300roi
      1. 1 第一层为特征提取层,论文称之为滑动窗口,其实就是一个33的卷积,通道数视backbone而定,当backbone使用VGG16时,该层通道数为512。经过这一层后,得到特征图 R P N − F \color{blue}{RPN-F} RPNF,二维大小与F相等。实际意义为,把F中每个位置(hw)的9个anchor的信息用一个512维向量表示。
        1. 1 .1 特征图RPN_F输入到11的卷积层,通道数为92,输出 r p n − c l s − p r e d \color{blue}{rpn-cls-pred} rpnclspred。它是每个位置的9个anchor的二分类的预测结果(前景或者背景)。 该 设 计 非 常 巧 妙 , 运 用 1 ∗ 1 ∗ 18 的 卷 积 , 对 特 征 图 R P N F 中 的 每 一 个 512 维 特 征 进 行 处 理 , \color{red}{该设计非常巧妙,运用1*1*18的卷积,对特征图RPN_F中的每一个512维特征进行处理,} 1118RPNF512 实 际 上 是 对 每 一 个 512 维 特 征 ( 可 看 为 样 本 , b a t c h s i z e = h ∗ w ) 进 行 全 连 接 层 的 分 类 处 理 , \color{red}{实际上是对每一个512维特征(可看为样本,batchsize=h*w)进行全连接层的分类处理,} 512batchsize=hw 避 免 了 繁 琐 的 全 连 接 层 操 作 。 \color{red}{避免了繁琐的全连接层操作。}
        1. 1 .2 特征图RPN_输入到11的卷积层,通道数为94,输出 r p n − b b o x − p r e d \color{blue}{rpn-bbox-pred} rpnbboxpred。它是每个位置的9个anchor相对于真实框的偏移量的预测结果。论文中的box回归并不是直接回归真实框坐标,而是偏移量。
      1. 2 计算RPN阶段的两个损失函数,根据5.1.1和5.1.2中的输出rpn_cls_pred和rpn_bbox_pred以及步骤4的输出rpn_cls_true和rpn_bbox_true计算loss值。本步骤中计算loss值所用的anchor数量为256,因为在步骤4中RPN_batchsize设置为256。 这 一 步 骤 只 在 训 练 过 程 中 存 在 , 测 试 中 没 有 i 。 \color{green}{这一步骤只在训练过程中存在,测试中没有i。} i
      1. 3 调用步骤3中的anchor_set,结合每个anchor的二分类预测结果rpn_cls_pred和每个anchor相对真值的偏移量的预测结果rpn_bbox_pred,得到hw9个预测框的坐标以及每个预测框属于前景的概率。通过NMS选取出最有可能是前景的预测框的坐标,称为roi,训练是取2000个,测试时取300个。 这 一 步 不 需 要 神 经 网 络 \color{red}{这一步不需要神经网络} 。此时是根据每个anchor的偏移量和其属于前景的概率来进行NMS操作的,这一步还不需要计算IOU!! 这 一 个 N M S 也 是 整 个 训 练 过 程 中 唯 一 一 次 的 N M S 操 作 , \color{red}{这一个NMS也是整个训练过程中唯一一次的NMS操作,} NMSNMS但如果对于测试过程来说后续还将会有一次NMS操作。
    1. 对RPN输出的2000个roi进行随机采样,采样后的数量为256(这个称为分类网络的batchsize,可设置其他值),在这256个roi中,前景和背景的比例为1:3,也就是前景64,背景192(也可设置成其他比例),若2000个roi中前景的数量不足64个,则用背景来填补。本步骤输入2000个roi,输出256个roi。 这 一 步 骤 只 在 训 练 过 程 中 存 在 , 测 试 中 没 有 i 。 \color{green}{这一步骤只在训练过程中存在,测试中没有i。} i
    1. 筛选后的roi输出分类回归网络,对每一个roi进行目标分类和候选框的再次修正。本步骤在训练时,输入图像的标注信息gt-boxes,256个roi和特征图F,输出每个roi的类别和候选框偏移量。测试时,输入步骤6中的300个roi和特征图F,输出每个roi的类别和候选框偏移量。
      1. 1 根据每个roi的坐标信息在特征图F上截取对应的部分特征ROI_F。
      1. 2 将每个roi的特征图ROI_F输入到ROIpooling层,经过一层后,其特征图的尺寸都变成了77512的大小(特征图F的通道是512),将其展开成为列向量。
        1. 2.1 将列向量输入到3层全连接层,输出神经元数量为(类别数*4),该输出即为当前roi与gt-boxes的偏移量。
        1. 2.2 将列向量输入到3层全连接层,输出神经元数量为(类别数*1),该输出即为当前roi的所属物体的类别。 7.21 和 7.2.2 中 前 2 层 全 连 接 层 是 共 享 的 。 \color{red}{7.21和7.2.2中前2层全连接层是共享的。} 7.217.2.22
      1. 3计算分类回归阶段的两个损失函数。根据7.2.1和7.2.2输出的预测值和真实值计算loss值。 这 一 步 骤 只 在 训 练 过 程 中 存 在 , 测 试 中 没 有 i 。 \color{green}{这一步骤只在训练过程中存在,测试中没有i。} i
    1. 若 是 处 于 测 试 的 阶 段 , 则 还 需 多 加 本 步 骤 , 对 7.2.1 和 7.2.2 的 输 出 做 一 次 N M S 筛 选 , \color{green}{若是处于测试的阶段,则还需多加本步骤,对7.2.1和7.2.2的输出做一次NMS筛选,} 7.2.17.2.2NMS 将 300 个 r o i 的 重 叠 部 分 给 过 滤 掉 \color{green}{将300个roi的重叠部分给过滤掉} 300roi

参考资料:
资料一
资料二

你可能感兴趣的:(用通俗易懂的文字带你了解Faster RCNN)