DynaSLAM-5 DynaSLAM中Mask R-CNN部分源码解析(Ⅳ)

news2024/12/23 5:22:46

目录

1.ROIAlign层

2.Mask分支 

3.整体框架回顾


1.ROIAlign层

        在上文中,我们现在手里已经有了正负样本数据以及它们对应的标签。接下来我们就要进行预测的操作了!

        但在预测之前,还有些小问题:

        ①每个ROI大小也不一样,在哪个特征图中也不知道。

        ②应该把每个ROI中的特征都提取出来,连接一些全连接层实现预测分类功能。

        我们应该找到每个ROI所在的特征图(P?)、以及所在特征图中的区域。再接着对这个特征图连上一些全连接层得到分类结果和回归参数的预测。由于全连接层的限制(输入维度相同),因此我们必须将所有ROI转换成相同大小。

        ROIPooing和ROIAlign的区别详见我的MaskRCNN部分博客。

            # Network Heads
            # TODO: verify that this handles zero padded ROIs
            mrcnn_class_logits, mrcnn_class, mrcnn_bbox =\
                fpn_classifier_graph(rois, mrcnn_feature_maps, config.IMAGE_SHAPE,
                                     config.POOL_SIZE, config.NUM_CLASSES)

        mrcnn_feature_maps = P2 - P6特征图。

############################################################
#  Feature Pyramid Network Heads
############################################################

def fpn_classifier_graph(rois, feature_maps,
                         image_shape, pool_size, num_classes):
    """Builds the computation graph of the feature pyramid network classifier
    and regressor heads.

    rois: [batch, num_rois, (y1, x1, y2, x2)] Proposal boxes in normalized
          coordinates.
    feature_maps: List of feature maps from diffent layers of the pyramid,
                  [P2, P3, P4, P5]. Each has a different resolution.
    image_shape: [height, width, depth]
    pool_size: The width of the square feature map generated from ROI Pooling.
    num_classes: number of classes, which determines the depth of the results

    Returns:
        logits: [N, NUM_CLASSES] classifier logits (before softmax)
        probs: [N, NUM_CLASSES] classifier probabilities
        bbox_deltas: [N, (dy, dx, log(dh), log(dw))] Deltas to apply to
                     proposal boxes
    """
    # ROI Pooling
    # Shape: [batch, num_boxes, pool_height, pool_width, channels]
    x = PyramidROIAlign([pool_size, pool_size], image_shape,
                        name="roi_align_classifier")([rois] + feature_maps)
    # Two 1024 FC layers (implemented with Conv2D for consistency)
    x = KL.TimeDistributed(KL.Conv2D(1024, (pool_size, pool_size), padding="valid"),
                           name="mrcnn_class_conv1")(x)
    x = KL.TimeDistributed(BatchNorm(axis=3), name='mrcnn_class_bn1')(x)
    x = KL.Activation('relu')(x)
    x = KL.TimeDistributed(KL.Conv2D(1024, (1, 1)),
                           name="mrcnn_class_conv2")(x)
    x = KL.TimeDistributed(BatchNorm(axis=3),
                           name='mrcnn_class_bn2')(x)
    x = KL.Activation('relu')(x)

    shared = KL.Lambda(lambda x: K.squeeze(K.squeeze(x, 3), 2),
                       name="pool_squeeze")(x)

    # Classifier head
    mrcnn_class_logits = KL.TimeDistributed(KL.Dense(num_classes),
                                            name='mrcnn_class_logits')(shared)
    mrcnn_probs = KL.TimeDistributed(KL.Activation("softmax"),
                                     name="mrcnn_class")(mrcnn_class_logits)

    # BBox head
    # [batch, boxes, num_classes * (dy, dx, log(dh), log(dw))]
    x = KL.TimeDistributed(KL.Dense(num_classes * 4, activation='linear'),
                           name='mrcnn_bbox_fc')(shared)
    # Reshape to [batch, boxes, num_classes, (dy, dx, log(dh), log(dw))]
    s = K.int_shape(x)
    mrcnn_bbox = KL.Reshape((s[1], num_classes, 4), name="mrcnn_bbox")(x)

    return mrcnn_class_logits, mrcnn_probs, mrcnn_bbox

        ①进行ROIAlign操作:计算ROI对应的feature_map属于哪一层并将每个ROI进行ROIAlign操作使其缩放到同一尺寸(7*7)。

        经过ROI Align操作后,和传统的Faster R-CNN做法相同了:

        展平处理得到1024维的特征,将其BatchNorm及ReLU处理:

    x = KL.TimeDistributed(KL.Conv2D(1024, (pool_size, pool_size), padding="valid"),
                           name="mrcnn_class_conv1")(x)
    x = KL.TimeDistributed(BatchNorm(axis=3), name='mrcnn_class_bn1')(x)
    x = KL.Activation('relu')(x)
    x = KL.TimeDistributed(KL.Conv2D(1024, (1, 1)),
                           name="mrcnn_class_conv2")(x)
    x = KL.TimeDistributed(BatchNorm(axis=3),
                           name='mrcnn_class_bn2')(x)
    x = KL.Activation('relu')(x)

        预测目标概率分数:

    # Classifier head
    mrcnn_class_logits = KL.TimeDistributed(KL.Dense(num_classes),
                                            name='mrcnn_class_logits')(shared)
    mrcnn_probs = KL.TimeDistributed(KL.Activation("softmax"),
                                     name="mrcnn_class")(mrcnn_class_logits)

        这里由于是气球数据集,因此预测类别只有两类(是气球、不是气球),在COCO数据集里面这里就是81了。再通过softmax层将预测分数转成目标概率。

        预测边界框回归参数:

    # BBox head
    # [batch, boxes, num_classes * (dy, dx, log(dh), log(dw))]
    x = KL.TimeDistributed(KL.Dense(num_classes * 4, activation='linear'),
                           name='mrcnn_bbox_fc')(shared)
    # Reshape to [batch, boxes, num_classes, (dy, dx, log(dh), log(dw))]
    s = K.int_shape(x)
    mrcnn_bbox = KL.Reshape((s[1], num_classes, 4), name="mrcnn_bbox")(x)

        对于每个类别(2)均预测了回归边界框的四个参数。

        向上层函数返回每个边界框的预测分数、概率、偏移量的指标值。

2.Mask分支 

        和上文差不多:

def build_fpn_mask_graph(rois, feature_maps,
                         image_shape, pool_size, num_classes):
    """Builds the computation graph of the mask head of Feature Pyramid Network.

    rois: [batch, num_rois, (y1, x1, y2, x2)] Proposal boxes in normalized
          coordinates.
    feature_maps: List of feature maps from diffent layers of the pyramid,
                  [P2, P3, P4, P5]. Each has a different resolution.
    image_shape: [height, width, depth]
    pool_size: The width of the square feature map generated from ROI Pooling.
    num_classes: number of classes, which determines the depth of the results

    Returns: Masks [batch, roi_count, height, width, num_classes]
    """
    # ROI Pooling
    # Shape: [batch, boxes, pool_height, pool_width, channels]
    x = PyramidROIAlign([pool_size, pool_size], image_shape,
                        name="roi_align_mask")([rois] + feature_maps)

    # Conv layers
    x = KL.TimeDistributed(KL.Conv2D(256, (3, 3), padding="same"),
                           name="mrcnn_mask_conv1")(x)
    x = KL.TimeDistributed(BatchNorm(axis=3),
                           name='mrcnn_mask_bn1')(x)
    x = KL.Activation('relu')(x)

    x = KL.TimeDistributed(KL.Conv2D(256, (3, 3), padding="same"),
                           name="mrcnn_mask_conv2")(x)
    x = KL.TimeDistributed(BatchNorm(axis=3),
                           name='mrcnn_mask_bn2')(x)
    x = KL.Activation('relu')(x)

    x = KL.TimeDistributed(KL.Conv2D(256, (3, 3), padding="same"),
                           name="mrcnn_mask_conv3")(x)
    x = KL.TimeDistributed(BatchNorm(axis=3),
                           name='mrcnn_mask_bn3')(x)
    x = KL.Activation('relu')(x)

    x = KL.TimeDistributed(KL.Conv2D(256, (3, 3), padding="same"),
                           name="mrcnn_mask_conv4")(x)
    x = KL.TimeDistributed(BatchNorm(axis=3),
                           name='mrcnn_mask_bn4')(x)
    x = KL.Activation('relu')(x)

    x = KL.TimeDistributed(KL.Conv2DTranspose(256, (2, 2), strides=2, activation="relu"),
                           name="mrcnn_mask_deconv")(x)
    x = KL.TimeDistributed(KL.Conv2D(num_classes, (1, 1), strides=1, activation="sigmoid"),
                           name="mrcnn_mask")(x)
    return x

        在上文的ROI Align中,我们是将ROI统一大小为7*7的,在这里,我们debug一下:

        是14*14的。

        回想一下我们的标签:是28*28的。我们应该也把我们的预测结果做成28*28大小的,才能和标签对应起来才能用sigmoid交叉熵计算每一个像素的0/1值是否匹配。

        这里每个ROI经过4个3*3卷积,这里由于参数padding = same,ROI大小不变。

        连接一个转置卷积的操作,每个ROI大小变成了28*28。

        最后再连接一个1*1的卷积层,输出mask信息。

        最后的结果是28*28*2,2代表类别个数(气球、非气球)即每一个ROI我们计算出2个mask信息。(对于COCO数据集每一个ROI计算81个mask信息)

3.整体框架回顾

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/190386.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Biotin-SS-Sulfo-NHS;CAS:325143-98-4;生物素-二硫键-磺酸-活性酯

名称:生物素-二硫键-磺酸-活性酯 英文名称:Biotin-SS-Sulfo-NHS CAS:325143-98-4 分子式:C19H27N4NaO9S4 分子量:606.67 外观:白色固体或粘稠液体,取决于分子量大小 溶剂:溶于大部分有机溶…

JVM自动内存管理核心知识速览

目录运行时数据区程序计数器Java虚拟机栈本地方法栈Java堆方法区运行时常量池直接内存对象对象的创建类加载检查分配内存指针碰撞(Bump The Pointer)空闲列表(Free List)内存分配并发问题初始化值设置对象头执行init方法对象的内存…

一、Qt汽车仪表盘之绘制背景-绘制饼图

一、绘图坐标系分析 1、坐标系平移 1、从原来的坐标系中心移动到矩形仪表盘中心,相对应的坐标会发生变化。 2、了解绘制饼图的含义 (1)坐标系平移之后坐标变化 (2)绘制第一个饼图效果 第一个饼图:坐标…

[COMST 2022] 元宇宙的安全隐私问题

A Survey on Metaverse: Fundamentals, Security, and Privacyhttps://ieeexplore.ieee.org/abstract/document/9880528摘要元宇宙,作为下一代互联网的一个不断发展的范式,旨在建立一个完全沉浸式、超时空、自我维持的虚拟共享空间,供人类玩耍…

进销存ERP源码/ 进销存APP源码/小程序ERP系统/Thinkphp+Uniapp全开源销售进库出入库

框架:ThinkPHP5.0.24 uniapp 包含:服务端php全套开源源码,uniapp前端全套开源源码(可发布H5/android/iod/微信小程序/抖音小程序/支付宝/百度小程序) 注:这个是全开源,随便你怎么开,怎么来&…

JUC并发编程之SynchronousQueue的底层原理

作者简介:专注于研究Linux内核、Hotspot虚拟机、汇编语言、JDK源码、各大中间件源码等等喜欢的话,可以三连关注~SynchronousQueue是什么在JDK源码中JUC包下的并发编程阻塞/同步队列实现各种花样,但是队列的实现无非是。先进先出,后…

程序员必备的Linux命令——文件及目录命令

Linux命令就是我们对Linux系统进行管理的操作指令。类似于我们操作windows系统中可视化的各种操作动作。 在Linux系统中,我们任何东西都被认做是文件,比如cpu、内存、键盘以及用户全是文件。Linux命令类似于之前的DOS命令。 Linux系统中命令分为两种&a…

ORB-SLAM3算法和代码学习——系统初始化浅谈

总述 先放一张LocalMapping的代码结构图 相比于ORB-SLAM2,ORB-SLAM3的系统初始化分成了三个主要的模块:纯视觉初始化、纯IMU初始化、视觉和IMU联合优化。 纯视觉初始化和之前一样就是单目或者双目初始化,在Tracking线程中进行&#xff1b…

js数据结构之栈

1.栈数据结构 栈是一种遵从后进先出(LIFO)原则的有序集合。新添加或待删除的元素都保存在栈的同一端,称作栈顶,另一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。 在现实生活中也能发现许多栈的…

【服务器数据恢复】Raid5崩溃导致EMC存储不可用的数据恢复案例

服务器数据恢复环境: EMC存储,多块stat硬盘组建raid5磁盘阵列,两块热备盘,上层采用zfs文件系统。 服务器故障&检测&分析: EMC存储中的raid5磁盘阵列有2块硬盘出现故障,但是只有一块热备盘被激活&am…

关于原型和原型链的整理学习

关于原型和原型链是很多人学习或面试时遇到的问题,可能部分不懂,部分懂但不会说,下面关于原型和原型链进行简单的整理总结,希望可以帮助到大家。 一、JS中的原型和原型链 1、原型说明 所有的引用类型(数组、函数、对…

【Tools】Git和VS Code配置

文章目录0 前期教程1 前言2 基本使用2.1 配置2.2 获取帮助3 GitHub仓库和git3.1 新建一个GitHub仓库3.2 删除一个仓库(repository)3.3 上传项目代码4 git常用指令4.1 创建分支4.2 合并分支4.3 在git提交记录上移动4.4 撤销变更4.5 整理提交记录5 在VS Co…

蓝桥杯 stm32 DAC

文章代码使用 HAL 库。 文章目录前言一、根据手册了解 DAC 重要特性 :二、CubeMX 创建工程:三、DAC 代码:1. 设置DAC输出值函数。2. 开启DAC输出函数。3. DAC 输出电压。总结前言 DAC 就是 数字模拟信号转换器 ,也就是把 数字信号转变成模拟…

实施MES系统前,先想清楚首先用来解决什么问题

MES系统首先用来解决什么问题? 很多人会自然而然地认为,MES系统是用来解决管理问题的,是为了明确管理流程的,是为了建立管控标准的…… 甲方会有很多很多想解决的问题,甚至在系统导入过程中,各个部门也会…

vue中安装与引用echarts示例

第002个点击查看专栏目录Echarts发展到现在,已经陆续经过了很多版本,越来越完善,现在主要研究5.0以上的功能。这里是介绍在vue项目中,如果全局或者局部引用echarts,对项目初装echarts会起到非常大的帮助。 NPM 安装 E…

电脑文件如何自动备份?

电脑文件如何自动备份?计算机的出现是人类科技发展的重要标志,电脑已经成为我们工作、生活以及学习中必不可少的工具,尤其是在工作中的应用,它改变了以前传统的工作方式。电脑的使用给我们带来极大方便的同时,也带来了…

mPEG-SS-NH2 ;mPEG-SS-Amine;甲氧基聚乙二醇-双硫键-氨基-科研用试剂简介

mPEG-SS-NH2 甲氧基聚乙二醇-双硫键-氨基 英文名称:mPEG-SS-NH2 英文别名:mPEG-SS-Amine 存储条件:-20C,避光,避湿 用 途:仅供科研实验使用,不用于诊治 外观: 固体或粘性液体,取…

3D渲染优化入【Three.js】

Three.js 应用程序以每秒 60 帧 (FPS) 的速度执行 3D 渲染是流畅和愉快体验的保证。 然而,这是一个有时难以实现的目标!本文整理了优化 Three.js 应用程序和达到 60 FPS 的最佳提示和技巧! 推荐:使用 NSDT场景编辑器 快速搭建 3D…

Day13【元宇宙的实践构想02】—— 元宇宙与沉浸式交互技术介绍、支撑开发与应用

💃🏼 本人简介:男 👶🏼 年龄:18 ✍今日内容:《元宇宙的实践构想》02——元宇宙与沉浸式交互技术 🚩 今日留言:亮亮被迫去练科目二啦,定时发布的文章&#xff…

鉴源论坛 · 观通丨联锁系统原理浅析

作者 |刘艳青 上海控安安全测评中心安全测评部测试经理 版块 | 鉴源论坛 观通 01 联锁系统的硬件结构 根据联锁系统的层级关系,联锁系统的硬件层级可以分为4层:人机会话层、联锁层、接口层、室外设备层。 图1 联锁系统的硬件结构 02 联锁系统的软件结…