mask rcnn解读

2024-08-24 18:08
文章标签 mask 解读 rcnn

本文主要是介绍mask rcnn解读,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上一篇中介绍faster rcnn,这次mask 基本在上次的基础上加了点代码,参考和引用1. mask rcnn slides 2. kaiming he maskrcnn 3. Ardian Umam mask rcnn,欢迎fork简版mask rcnn

整体框架

这里写图片描述

RoIAlign

问题

  1. 做segment是pixel级别的,但是faster rcnn中roi pooling有2次量化操作导致了没有对齐
    这里写图片描述

  2. 两次量化,第一次roi映射feature时,第二次roi pooling时(这个图参考了youtube的视频,但是感觉第二次量化它画错了,根据上一讲ross的源码,不是缩小了,而是部分bin大小和步长发生变化)
    这里写图片描述

  3. RoIWarp,第一次量化了,第二次没有,RoIAlign两次都没有量化
    这里写图片描述

解决方案

和上一讲faster rcnn举的例子一样,输出7*7

  1. 划分7*7的bin(我们可以直接精确的映射到feature map来划分bin,不用第一次量化)
    这里写图片描述

  2. 每个bin中采样4个点,双线性插值
    这里写图片描述

  3. 对每个bin4个点做max或average pool

# pytorch
# 这是pytorch做法先采样到14*14,然后max pooling到7*7
pre_pool_size = cfg.POOLING_SIZE * 2
grid = F.affine_grid(theta, torch.Size((rois.size(0), 1, pre_pool_size, pre_pool_size)))
crops = F.grid_sample(bottom.expand(rois.size(0), bottom.size(1), bottom.size(2), bottom.size(3)), grid, mode=mode)
crops = F.max_pool2d(crops, 2, 2)
# tensorflow
pooled.append(tf.image.crop_and_resize(feature_maps[i], level_boxes, box_indices, self.pool_shape,method="bilinear"))

sigmoid代替softmax

利用分类的结果,在mask之路,只取对应类别的channel然后做sigmoid,减少类间竞争,避免出现一些洞之类(个人理解)

FPN

详见我的另一篇博客FPN解读

更多

前面我们介绍RoI Align是在每个bin中采样4个点,双线性插值,但也是一定程度上解读了mismatch问题,而旷视科技PLACES instance segmentation比赛中所用的是更精确的解决这个问题,对于每个bin,RoIAlign只用了4个值求平均,而旷视则直接利用积分(把bin中所有位置都插值出来)求和出这一块的像素值和然后求平均,这样更精确了但是很费时。

这里写图片描述

这里写图片描述

来源旷视科技peng chao分享的video和slides

Detectron部分代码细节点

  1. 无bn,因为batch太小了,使用affine channel
  2. mask分支,只使用fg_rois,只用前景的rois
  3. faster rcnn的rpn部分,是生成9*2=18个channel,然后每个格子对应9个anchor,2是前景和背景,使用softmax loss而Detectron中rpn是9个channel,使用sigmoid loss
  4. 所有的gt box都默认送到后面的fast rcnn和mask等分支中
  5. 准备gt_masks时,不是用gt_boxes去全图mask上扣,然后resize到28*28,而是用预测出来的fg_rois去全图的mask上扣然后resize到28*28,这样才能正常训练的mask分支,不然gt_masks的位置根本不对。这和我们采用gt_classes去抽取对应channel的score map做sigmoid一样,目的都是为了能让mask分支受到正常的监督,因为我们自己预测的类别可能是错的,这样抽取错误的channel去做sigmoid然后与gt_masks做loss,是错误的监督。

这篇关于mask rcnn解读的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1103213

相关文章

Nacos注册中心和配置中心的底层原理全面解读

《Nacos注册中心和配置中心的底层原理全面解读》:本文主要介绍Nacos注册中心和配置中心的底层原理的全面解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录临时实例和永久实例为什么 Nacos 要将服务实例分为临时实例和永久实例?1.x 版本和2.x版本的区别

C++类和对象之默认成员函数的使用解读

《C++类和对象之默认成员函数的使用解读》:本文主要介绍C++类和对象之默认成员函数的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、默认成员函数有哪些二、各默认成员函数详解默认构造函数析构函数拷贝构造函数拷贝赋值运算符三、默认成员函数的注意事项总结一

MySQL的ALTER TABLE命令的使用解读

《MySQL的ALTERTABLE命令的使用解读》:本文主要介绍MySQL的ALTERTABLE命令的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、查看所建表的编China编程码格式2、修改表的编码格式3、修改列队数据类型4、添加列5、修改列的位置5.1、把列

Linux CPU飙升排查五步法解读

《LinuxCPU飙升排查五步法解读》:本文主要介绍LinuxCPU飙升排查五步法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录排查思路-五步法1. top命令定位应用进程pid2.php top-Hp[pid]定位应用进程对应的线程tid3. printf"%

解读@ConfigurationProperties和@value的区别

《解读@ConfigurationProperties和@value的区别》:本文主要介绍@ConfigurationProperties和@value的区别及说明,具有很好的参考价值,希望对大家... 目录1. 功能对比2. 使用场景对比@ConfigurationProperties@Value3. 核

Jupyter notebook安装步骤解读

《Jupyternotebook安装步骤解读》:本文主要介绍Jupyternotebook安装步骤,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、开始安装二、更改打开文件位置和快捷启动方式总结在安装Jupyter notebook 之前,确认您已安装pytho

Java中的StringUtils.isBlank()方法解读

《Java中的StringUtils.isBlank()方法解读》:本文主要介绍Java中的StringUtils.isBlank()方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录所在库及依赖引入方法签名方法功能示例代码代码解释与其他方法的对比总结StringUtils.isBl

对Django中时区的解读

《对Django中时区的解读》:本文主要介绍对Django中时区的解读方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景前端数据库中存储接口返回AI的解释问题:这样设置的作用答案获取当前时间(自动带时区)转换为北京时间显示总结背景设置时区为北京时间 TIM

Java中的内部类和常用类用法解读

《Java中的内部类和常用类用法解读》:本文主要介绍Java中的内部类和常用类用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录内部类和常用类内部类成员内部类静态内部类局部内部类匿名内部类常用类Object类包装类String类StringBuffer和Stri

JVM垃圾回收机制之GC解读

《JVM垃圾回收机制之GC解读》:本文主要介绍JVM垃圾回收机制之GC,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、死亡对象的判断算法1.1 引用计数算法1.2 可达性分析算法二、垃圾回收算法2.1 标记-清除算法2.2 复制算法2.3 标记-整理算法2.4