使用Mask-RCNN在实例分割应用中克服过拟合

2023-11-20

点击上方“AI公园”,关注公众号,选择加“星标“或“置顶”


作者:Kayo Yin

编译:ronghuaiyang

导读

只使用1349张图像训练Mask-RCNN,有代码。

代码:https://github.com/kayoyin/tiny-inst-segmentation

介绍

计算机视觉的进步带来了许多有前途的应用,如自动驾驶汽车或医疗诊断。在这些任务中,我们依靠机器的能力来识别物体。

我们经常看到的与目标识别相关的任务有4个:分类和定位、目标检测、语义分割和实例分割。

分类和定位中,我们感兴趣的是为图像中目标的分配类标签,并在目标周围绘制一个包围框。在这个任务中,要检测的目标数量是固定的

物体检测不同于分类和定位,因为这里我们没有预先假设图像中物体的数量。我们从一组固定的目标类别开始,我们的目标是分配类标签,并在每次这些类别中的一个目标出现在图像中时绘制边界框。

语义分割中,我们为每个图像像素分配一个类标签:所有属于草的像素被标记为“grass”,属于羊的像素被标记为“sheep”。值得注意的是,例如,这个任务不会对两只羊产生区别。

我们的任务是实例分割,它建立在目标检测和语义分割之上。在目标检测中,我们的目标是在预定义的类别中标记和定位目标的所有实例。但是,我们没有为检测到的目标生成边界框,而是进一步识别哪些像素属于该目标,就像语义分割一样。与语义分割不同的是,实例分割为每个目标实例绘制一个单独的掩码,而语义分割将为同一类的所有实例使用相同的掩码。

在本文中,我们将在一个很小的Pascal VOC数据集上训练一个实例分割模型,其中只有1349张图像用于训练,100张图像用于测试。这里的主要挑战是在不使用外部数据的情况下防止模型过拟合。

数据处理

标注采用COCO格式,因此我们可以使用pycocotools中的函数来检索类标签和掩码。在这个数据集中,共有20个类别。

下面是一些训练图像和相关mask的可视化显示。mask的不同阴影表示同一目标类别的多个实例的不同掩码。

图像的大小和长宽比各不相同,因此在将图像输入模型之前,我们调整每个图像的尺寸500x500。当图像尺寸小于500时,我们对图像进行优化,使最大边的长度为500,并添加必要的零以获得正方形图像。

为了使模型能够很好地泛化,特别是在这样一个有限的数据集上,数据增强是克服过拟合的关键。对于每一个图像,以0.5的概率水平翻转,以0.9到1倍的尺度进行随机剪裁,以0.5的概率进行高斯模糊,标准差为随机,对比度随机调整尺度为0.75和1.5之间,亮度随机调整尺度在0.8和1.2之间,以及一系列随机仿射变换如缩放、平移、旋转,剪切。

Mask-RCNN

我们使用matterport实现的Mask-RCNN进行训练。虽然结果可能会很好看,但我们不会用MS COCO的预训练权重来展示我们如何只用1349张训练图像就能得到好的结果。

Mask-RCNN是在2017年Mask-RCNN论文中提出的,是同一作者对Faster-RCNN的扩展。Faster-RCNN被广泛应用于目标检测,模型在被检测物体周围生成包围盒。Mask-RCNN进一步生成了目标的mask 。

我将在下面简要介绍模型体系结构。

首先,我们使用一个主干模型从输入图像中提取相关的特征。在这里,我们使用ResNet101架构作为骨干。图像由张量(500,500,3)转换为特征图(32,32,2048)。

然后将之前获得的特征输入到一个区域建议网络(RPN)中。RPN扫描feature map的区域,称为anchors,并尝试确定包含目标的区域。这些anchor的尺寸和纵横比各不相同。RPN为每个anchor分配一个类别:前景(正样本anchor)或背景(负样本anchor)。中性anchor是指不影响训练的anchor。

正样本anchors(左),中性anchors(中),负样本anchors(右)

建议层然后挑选最有可能包含目标的anchor,并优化anchor框以更接近目标。当太多anchor点重叠时,只保留前景分数最高的那个(非最大抑制)。这样,我们就得到了感兴趣的区域 (ROI)。

对于每个由ROI分类器选中的目标区域,模型生成28x28的mask。在训练过程中,将 ground truth mask缩小,用预测的mask计算损失,在推理过程中,将生成的mask放大到ROI的边界框大小。

迁移学习

特别是在数据有限的情况下,更快更好地训练模型的关键是迁移学习Imagenet数据集是一个巨大的自然图像语料库,类似于我们的图像。因此,我们可以将Resnet101骨干模型的权值初始化为在Imagenet上预先训练的权值。这将提高我们得到的特征图的准确性,从而提高整个模型。

为了微调在Imagenet上预训练的模型,我们首先只训练model heads。然后我们在剩下的epochs中训练从ResNet level 4和以上的层。这个训练方案也有助于最小化过拟合。我们可以不去微调第一层,因为我们可以重用模型从自然图像中提取特征的权重。

结果 & 检测pipeline可视化

我们的测试集上获得的mAP为0. 53650。下面是随机选择测试图像的模型输出的一些可视化结果:

我们还可以看到算法不同步骤的输出。下面,我们有在边界框细化之前的top anchors的得分。

接下来,我们有了细化的边界框和非最大抑制后的输出。这些建议然后被输入分类网络。注意,在这里,我们有一些框框住了一些目标,比如标志,这些目标不属于我们定义的目标类别。

在建议区域上运行分类网络,得到正样本的检测,生成类概率和边界框回归。

在得到边界框并对其进行细化后,实例分割模型为每个检测到的目标生成mask。mask是soft masks(具有浮点像素值),在训练时大小为28x28。

最后,预测的mask被调整为边界框的尺寸,我们可以将它们覆盖在原始图像上以可视化最终的输出。

—END—

英文原文:https://towardsdatascience.com/overcome-overfitting-during-instance-segmentation-with-mask-rcnn-32db91f400bc

请长按或扫描二维码关注本公众号

喜欢的话,请给我个在看吧

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Mask-RCNN在实例分割应用中克服过拟合 的相关文章

随机推荐

  • 性能测试流程

    性能测试流程 1 性能测试需求分析 2 性能测试计划和方案 3 性能测试用例编写 4 性能测试执行 编写 录制脚本 搭建场景 运行脚本 系统性能调优 5 性能测试报告总结 流程拆分 一 性能测试需求分析 1 1 熟悉被测系统 熟悉被测系统的
  • 在JDK17尝鲜Flink1.17

    在JDK17尝鲜Flink1 17 前言 还没玩明白老版本 Flink1 17就来了 总还是要向前看的 根据官网文档 https nightlies apache org flink flink docs release 1 17 docs
  • 【攻防世界】三 --- php_rce

    题目 php rce 一 writeup 主页中提示使用了ThinkPHP V5 在github中搜一下ThinkPHP V5的相关漏洞 可以找到一些 由于我们不知其具体的版本 随便找一个执行一下 这里选择第一个 会显出了root
  • 前端学习教程:快速入门前端图表插件ECharts

    前言 在前端项目开发中 有很多地方会遇到绘制图表的需求 一般的图表可以通过canvas来绘制 但是遇到复杂一点的图表怎么办呢 不要慌 在下今天就给大家推荐一个前端大佬们用的非常火的图表插件 ECharts ECharts特性简介 EChar
  • mysql不是内部或外部命令,也不是可运行的程序 或批处理文件。

    安装Mysql后 当我们在window r中输入cmd中敲入mysql时会出现 Mysql 不是内部或外部命令 也不是可运行的程序或其处理文件 打开我的电脑在我的电脑右键中选择属性 然后单击选择高级系统设置 在系统属性的 高级 中选择环境变
  • 域名及真实IP-信息收集

    顶级域名 a 国际域名 常用的是 com net org 推荐大家用 com 示范 taobao com dangdang com b 国家域名 中国国家域名 cn 美国国家域名 us 考虑政策原因 cn域名请个人网站谨慎使用 企业网站可以
  • Photoshop、Illustrator、Sketch哪个更好

    以前在交流组经常能看到大家争论哪个设计软件好 到底是你的吗 Illustrator好还是我的CorelDRAW或者他的Photoshop强大 但是跟着UI流行的设计 Sketch软件也加入了争论 让我们和你分享一下这篇文章 让我们来看看平面
  • 怎么检查代码完好?

    怎么检查代码完好 一 前言 在提交代码前 不论是提交到 SVN 还是 Git 仓库 我们都必须保证提交的代码是正确无误 那么咱们怎么才能确保资金调的代码是正确无误的呢 二 问题 1 maven 项目中提交代码前 怎么保证代码正确无误 2 W
  • 树莓派内核开发准备(内核源码获取、启动过程、源码目录树)

    目录 1 交叉编译工具的安装 2 内核源码获取 3 嵌入式设备带操作系统的启动过程扫盲 4 Linux内核源码树扫盲 1 内核源码简介 2 Linux内核源代码目录树结构 tree指令查看 内核源码目录树 1 交叉编译工具的安装 参照我之前
  • 【单片机笔记】基于STM32的8通道的开源无线遥控器手柄

    MARS STM32遥控器v1 0 MARS STM32遥控器v1 0 1 1 遥控器简介 1 2 硬件详解 8 2 1MCU主控部分 8 2 2电源部分 9 2 3摇杆 段位 拨轮通道部分 10 2 4五项按键 11 2 5蜂鸣器和LED
  • SpringCloud Alibaba 引入Dubbo踩坑

    前言 在搭建springcloud alibaba的时候 引入Dubbo相关依赖 项目启动报错 版本信息 依赖 版本 Spring Boot 2 4 2 Spring Cloud 2020 0 0 Spring Cloud Alibaba
  • 为什么大公司一定要使用DevOps?

    0 DevOps的意图 究竟什么是DevOps 要想回答这个问题 首先要明确DevOps这个过程参与的人员是谁 即开发团队和IT运维团队 那么 DevOps的意图是什么呢 即在两个团队之间 建立良好的沟通和协作 更快更可靠的创建高质量软件
  • 机器学习分类模型-线性回归Linear regression

    Linear regression module from collections import Counter import numpy as np import pandas as pd from imblearn over sampl
  • 阿里云ftp配置

    yum install vsftpd 安装ftp rpm Uvh http mirror centos org centos 6 os x86 64 Packages ftp 0 17 54 el6 x86 64 rpm 安装ftp插件 v
  • 学习PostgreSQL

    参考链接 https www runoob com postgresql postgresql tutorial html
  • Mysql 批量update和批量insert详解

    为了减少与数据库的连接 减少服务器的负荷 需要我们时常对SQL进行分析 优化等操作 针对mysql的批量更新 insert 和 update 就是使用一条INSERT UPDATE语句来更新多条记录 由于不是标准的SQL语法 只能在MySQ
  • 构建知识图谱,让自己更值钱 #CSDN博文精选# #知识图谱# #IT技术#

    大家好 我是小C 又见面啦 文章过滤器 精选大咖干货 助力学习之路 5天20篇CSDN精选博文带你掌握系统化学习方法 专栏将挑选有关 系统化学习方法 的20篇优质文章 帮助大家掌握更加科学的学习方法 在这里 你将收获 快速掌握系统化学习的理
  • Android 弹出通知

    Android 8 0
  • fatal error C1083: 无法打开包含文件:“iostream.h”: No such file or directory

    刚开始用Visual studio net 2003 一个这样的例子 新建了一个win 32项目 include stdafx h include
  • 使用Mask-RCNN在实例分割应用中克服过拟合

    点击上方 AI公园 关注公众号 选择加 星标 或 置顶 作者 Kayo Yin 编译 ronghuaiyang 导读 只使用1349张图像训练Mask RCNN 有代码 代码 https github com kayoyin tiny in