Faster RCNN

目录

    Girshick R., Donahue J., Darrel T. and Malik J. Rich feature hierarchies for accurate object detection and semantic segmentation Tech report. In IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2014

    Girshick R. Fast R-CNN. In IEEE International Conference on Computer Vision (ICCV), 2015.

    Ren S., He K., Girshick R. and Sun J. Faster R-CNN: Towards real-time object detection with region proposal networks. In Advances in Neural Information Processing Systems (NIPS), 2015.

    Lin T., Doll'{a}r, Girshick R., He K., Hariharan B. and Belongie S. Feature pyramid networks for object detection. In IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2017.

    最近看了看目标检测的论文和Pytorch的官方代码, 其中所用到的技巧和代码量实在是过于庞大了, 我严重怀疑我之后能否顺利回忆起这部分的流程, 故而做下面一个简单的梳理.

    1. 输入: 列表形式的图片x和目标y(boxes, labels, area, image_id, iscrowd);
    2. 经过transform转换:
      1. normalize: xμσ;
      2. resize: 使得图片具有相近的宽高比, 同时将boxes也作相应的放缩;
      3. pad: 将图片嵌入到同样大小的'图片'中;
      4. 于是得到xRN×3×H×W;
    3. 经过普通的encoder, 如resnet50得到其不同的stage的特征:

    [z1,z2,z3,z4],ziRN×Di×Hi×Wi;

    1. 经过FPN处理:
      1. 首先通过1×1的卷积核将不同的Di变成同样的D(如256);
      2. z4通过插值扩大为其两倍得到z4:

      z3=z3+z4,

      类似地

      z2=z2+z3,z1=z1+z2,

      1. 均经过3×3的卷积核得到新的特征z1,z2,z3,z4;
      2. 通过一个extra block (通常是池化层)作用于z4得到z5;
      3. 最终的features:

      [z1,z2,z3,z4,z5];

    2. 通过Anchor生成器生成proposal boxes:
      1. 对于z1,z2,z3,z4,z5分别生成area为322,642,1282,2562,5122, 以及宽高比为0.5,1.,2的三类初始anchors, 即每个level的特征有K=3种不同比例的anchors(其各自的初始面积是不同的);
      2. 将上述的初始anchors扩展至每个location, 即变换中心, 则每个level共有Hl×Wl×K个anchors(单个图片);
    3. 通过RPN head 计算特征为目标的概率(二分类)以及每个anchors的偏移量δ:
      1. 通过[3, 1, 1]的卷积核对z进行预处理;
      2. 通过[1, 1, 0]的卷积核得到形为N×K×Hl×Wl的logits;
      3. 通过[1, 1, 0]的卷积核得到形为N×4K×Hl×Wlδ^;
    4. RPN:
      1. 通过

      P^x=Ax+δ^xAwP^y=Ay+δ^yAhP^w=Aw×exp(δ^w)P^h=Ah×exp(δ^h)

      得到proposals (注意这里(x,y)表示中心, 且proposals与下面的损失无关, 用于后续的部分);
      2. 对生成的proposals进行删选: 保留高置信度的, 删除过小的proposals, 进行非极大值抑制等;
      3. 为每个Anchors匹配合适的ground truth boxes, 并通过下式计算真实的δ:

      δx=(GxAx)/Awδy=(GyAy)/Ahδw=log(Gw/Aw)δh=log(Gh/Ah);

      1. 采样一批δ,δ (保证正例和负例有合适的比例);
      2. 计算与logits有关的二分类损失和δ,δ之间的回归损失(smmoth_l1_loss);
    5. 为上一步提取的proposals进行打上类别标签{0,1,2,}(0表示背景), 采样一批样本, 即:
      • proposals: List[Tensor], NB×4;
      • labels: List[Tensor], NB;
      • regression_deltas: List[Tensor], NB×4;
    6. 将proposal所对应的区域的特征提炼为h×w的特征(比如常见的7×7), 这是roi pooling (或者更精准的roi align的工作), 故共(N×B)×C×h×w的特征;
    7. 这些特征经过双层的MLP提炼, 在经过预测器进行分类得到:
      • logits: Tensor, (N×B)×classes;
      • δ^: (N×B)×4classes;
    8. 如果是训练, 则和RPN类似可以得到两个损失(分类损失和回归损失);
    9. 如果是推理, 则:
      1. P,δ^得到预测的bounding boxes;
      2. 得到相应的置信度;
      3. 对bounding boxes进行一些处理(舍去背景, 低置信度等);
      4. 非极大值抑制处理
    posted @   馒头and花卷  阅读(48)  评论(0编辑  收藏  举报
    编辑推荐:
    · 开发者必知的日志记录最佳实践
    · SQL Server 2025 AI相关能力初探
    · Linux系列:如何用 C#调用 C方法造成内存泄露
    · AI与.NET技术实操系列(二):开始使用ML.NET
    · 记一次.NET内存居高不下排查解决与启示
    阅读排行:
    · Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
    · 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
    · 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
    · 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
    · 【自荐】一款简洁、开源的在线白板工具 Drawnix
    点击右上角即可分享
    微信分享提示