YOLO(v5)和mask_rcnn的简单对比

对于yolo来说

  1. 在v1版本中,首先提取特征图,例如7x7x1024的特征图.
  2. 然后设计若干个候选框,比如将原图拆分为7x7的网格,每个网格2种不同的边框,每一个网格都公用一组分类置信度. 那么每个网格需要记录 ( ( 7 × 7 ) × ( x y w h c × 2 ) + 20 ) ((7\times7)\times(xywhc \times 2)+20) ((7×7)×(xywhc×2)+20)个数据,即7x7x30的结构.
  3. 将特征图执行全连接->view 7x7x30即可构造预测head
  4. 在v5的版本中,出现了4个主要变化
    1. 特征图的提取从单一尺度,变成了多尺度,例如3尺度
      • 输入图像为 3x640x640
      • 输出特征图为: 1024x20x20 512x40x40 256x80x80
      • 三种不同尺度用以预测 大 中 小 三个不同尺寸的目标
      • 分辨率低的用以预测大目标,因为一个像素包含了更多的信息,反之
    2. 基于原图网格拆分设计的候选框,例如7x7x2个的方案被弃用,而是对每个特征图的每个像素点都设计一组候选框,例如,最小分辨率的特征图为 1024x20x20 ,则一共预测400个中心
    3. 不再对特征图执行全连接和重塑操作,直接基于目标执行卷积即可
      • 例如我们想预测大尺度的图像,每个像素点(中心),预计3组anchor,每个anchor都拥有自己独立的xywh(偏移)c以及分类信息,则每个anchor需要存储 ( 5 + n c l s ) (5+n_{cls}) (5+ncls)个信息.
      • 例如分类为20分类,则目标形状为 3x(5+20)x20x20 -> 75x20x20
      • 只需要对原特征图1024x20x20 执行一次卷积即可得到 75x20x20的结果
    4. 不再直接预测xywh了,v1中的xywh是随机的值,即初始时是无意义的信息.而在v5中,我们为每个中心预置若干个固定比例的anchor,预测时只回归与anchors的偏移

对于maskrcnn来说

  1. 第一步还是提取特征图,例如使用resnet50_with_fpn提取不同尺度的特征图
    • 例如输入为: 3x800x1066
    • 输出特征图为 256x13x17 256x25x34 256x50x68 256x100x136 256x200x272
    • 可见
      • 特征图层级比yolo设计的多,有5个层级
      • 特征图的深度是一致的,后面会提及
  2. 第二步依旧是设计anchors,思路和yolo是一致的,对每个中心点设计尺度比例不一的anchors,如每个中心点设计3个尺度,3中比例,则每个中心点存在9个anchor,5个尺度上一共存在652473个anchor
    200 × 272 × 9 = 489600 100 × 136 × 9 = 122400 50 × 68 × 9 = 30600 25 × 34 × 9 = 7650 13 × 19 × 9 = 2223 s u m ( ) = 652473 \begin{align} 200 \times272 \times9&=489600\\ 100 \times136 \times9&=122400\\ 50 \times68 \times9&=30600\\ 25 \times34 \times9&=7650\\ 13 \times19 \times9&=2223\\ sum()&=652473 \end{align}\\ 200×272×9100×136×950×68×925×34×913×19×9sum()=489600=122400=30600=7650=2223=652473
  3. 重点来了,对于maskrcnn 他此处需要计算的结果为一个是否为对象分类得分,以及一个边框回归得分
  4. 即计算特征图的每一个中心点的是是对象的概率(即类似于yolo的置信度得分),以及4个边框的偏移回归.然后执行过滤得到ROI的过程
  5. 得到ROI后,执行roi align. 是将原始特征图切分开,每个roi都可以理解为对于单张照片的一次分类回归

尺寸变化示例

原尺寸: 2x3x800x1088

计算特征图

features ->2x( 256x13x17, 256x25x34, 256x50x68, 256x100x136, 256x200x272 )

使用特征图计算rpnhead

features_objectness -> ( 2x24x13x17, 2x24x25x34, 2x24x50x68, 2x24x100x136,2x24x200x272 )
features_pred_bbox_deltas-> ( 2x96x13x17, 2x96x25x34, 2x96x50x68, 2x96x100x136,2x96x200x272 )

构造anchors

5个层级构造的anchors合并
anchors-> 2x( 1305600x4 , 326400x4,81600x4,20400x4, 5304x4 ) <=> 2x(1739304x4)

合并rpnhead数据

features_objectness ->( 2x24x13x17, 2x24x25x34, 2x24x50x68, 2x24x100x136,2x24x200x272 ) <=> 1x3478608
features_pred_bbox_deltas-> ( 2x96x13x17, 2x96x25x34, 2x96x50x68, 2x96x100x136,2x96x200x272 ) <=> 4x3478608
其中3478608是所有中心点的数据

使用features_pred_bbox_deltas和anchors解码,获取原始区域信息

proposals
= decode(anchors,features_pred_bbox_deltas)
= decode( 2x(1739304x4),4x3478608)
= decode(4x3478608,4x3478608)

拆分batch

proposals->3478608x1x4 -> 2x1739304x4

过滤proposals

裁剪:确保 boxes 在图像范围内。
去除小框:过滤掉尺寸过小的框。
去除低得分框:根据得分阈值筛选框。
NMS:对框进行非极大值抑制,去除重叠框。
2x1739304x4 -> 2x2000x4

每张图2000个proposals(roi),执行下一步,roi是绝对坐标

proposals->2x2000x4
训练过程会对proposals抽样得:2000抽512
proposals->2x512x4

使用proposal和features,执行roi align,获取每一个roi自己独立的特征图
box_features
= roi_align(features, proposals)
= roi_align(2x( 256x13x17, 256x25x34, 256x50x68, 256x100x136, 256x200x272 ), 2x512x4)
= 1024x256x7x7 <=> 2x512x256x7x7
即批次大小2,每张图512个roi区域,每个区域有是分辨率为7x7,深度256的特征图.
此时,可以看作:
有一组256x7x7的图像,需要执行分类与回归预测,批次大小为512.

总结mask_rcnn干了2种方案
1.针对整个特征图,执行一次性的回归与分类, 计算出了roi个的候选区域,类似于粗略看一遍图像,把有兴趣的区域都拿出来
2.使用候选区域的边框,裁切计算整个特征图,以获取每个候选区域的个别特征图,对每个候选区域执行单独的分类与回归,以精细化计算重点区域.类似于将重点区域再去观察计算,获取实际详细的信息

  • 13
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值