Mask_RCNN训练自己的数据——制作COCO格式的数据集[通俗易懂]

Mask_RCNN训练自己的数据——制作COCO格式的数据集[通俗易懂]matterport版mask_rcnn系列:1.Mask_RCNN训练自己的数据2.目标检测:使用Open_cv在图像上批量画boundingbox3.Mask_RCNN:使用COCO权重进行特定类别预测(只标记出你需要的类别)4.Mask_RCNN:ValueError:Dimension1inbothshapes……………

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

 ⚡插播一条老家自产的糖心苹果,多个品种,欢迎选购!有问题随时私信我⚡:

??来自雪域高原的馈赠——海拔2000米的大凉山高原生态糖心苹果??icon-default.png?t=M666https://blog.csdn.net/qq_15969343/article/details/126107252

matterport版mask_rcnn系列:

      1.Mask_RCNN训练自己的数据

      2.目标检测:使用Open_cv在图像上批量画bounding box

      3.Mask_RCNN:使用COCO权重进行特定类别预测(只标记出你需要的类别)

      4.Mask_RCNN:ValueError: Dimension 1 in both shapes must be equal, but are 8 and 324.Mask_RCNN:使用自己训练好的模型进行预测

      5.Mask_RCNN训练自己的数据,其中Labelme的使用说明

#2018/06/29 更新

这个版本的Mask_rcnn精度和速度都没有FAIR的detectron好,同一个数据集,detectron要高出至少20%的精度,而且由于框架的特性,detectron速度也要快得多~~要不要了解一下如何把自己的数据转换为detectron所需的coco格式?需要的同学点这里:

Detectron:训练自己的数据集——将自己的数据格式转换成COCO格式_Jayce~的博客-CSDN博客_数据集转为coco格式

#2018/05/22 更新

使用训练好的Mask_RCNN模型进行预测看这里:

Mask_RCNN:使用自己训练好的模型进行预测_Jayce~的博客-CSDN博客_maskrcnn预训练模型

该Mask_RCNN版本为基于:Python3,Keras,TensorFlow,我使用的具体版本为:

  • Python 3.6.3
  • TensorFlow 1.7
  • Keras 2.1.5
  • PyQt5  5.9.2
  • VIA 1.0.5

tensorflow安装:

win10下安装Tensorflow1.7+CUDA9.0+Cudnn7.0.3_Jayce~的博客-CSDN博客_tensorflow1.7安装

Mask-RCNN :

GitHub – matterport/Mask_RCNN: Mask R-CNN for object detection and instance segmentation on Keras and TensorFlow

安装scikit-image(0.14):

从github下载开发者版本的源码进行编译安装scikit-image(0.14)_Jayce~的博客-CSDN博客_github源码编译

标注工具(墙裂推荐VIA):

VGG Image Annotator(VIA):

Visual Geometry Group – University of Oxford

备选标注工具:

labelme:

https://github.com/wkentaro/labelme

RectLabel:

RectLabel – Labeling images for bounding box object detection and segmentation

LabelBox:

Labelbox: The leading training data platform for data labeling

COCO UI:

https://github.com/tylin/coco-ui

这篇文章中,我将介绍两件事情:首先是Mask RCNN的概述。 其次,如何从头开始训练模型并用它来进行实例分割。

什么是实例分割?

实例分割是在像素级识别对象轮廓的任务。 与类似的计算机视觉任务相比,这是最困难的视觉任务之一。如下:

Mask_RCNN训练自己的数据——制作COCO格式的数据集[通俗易懂]

分类:此图像中有气球。

语义分割:将气球和背景分离出来。

对象检测:在这些位置的图像中有7个气球,并且给出每个气球的位置。

实例分割:在这些位置的图像中有7个不同的气球,在像素层面给出属于每个气球的像素。

1.Mask R-CNN

Mask R-CNN(区域卷积神经网络)是一个两阶段框架:第一阶段扫描图像并生成proposals(可能包含对象的区域)。 第二阶段对proposals进行分类并生成边界框和掩码。

它是2017年时,在其前身Faster R-CNN的基础上提出的。 Faster R-CNN是一种流行的对象检测框架,Mask R-CNN通过添加mask进行实例分割对其进行了扩展。

Mask_RCNN训练自己的数据——制作COCO格式的数据集[通俗易懂]

                      Mask R-CNN framework. Source: https://arxiv.org/abs/1703.06870

首先,Mask R-CNN由以下几部分组成:

1.1.骨干网络(Backbone)

Mask_RCNN训练自己的数据——制作COCO格式的数据集[通俗易懂]

这是一个标准的卷积神经网络(通常是ResNet50或ResNet101),我们用它来提取特征。 较低层检测低级特征(边缘和角落),后续层检测更高级别的特征(汽车,人物,天空)。

通过骨干网络,图像从1024x1024x3(RGB)转换为形状为32x32x2048的feature map,并且成为后续阶段的输入。

1.1.1特征金字塔网络(Feature Pyramid Network)

Mask_RCNN训练自己的数据——制作COCO格式的数据集[通俗易懂]

虽然上述骨干网络很好,但是可以改进。特征金字塔网络可以更好地在多个尺度上进行检测。该Mask RCNN的实现使用ResNet101 + FPN。

1.2. 区域提议网络(Region Proposal Network,RPN)

Mask_RCNN训练自己的数据——制作COCO格式的数据集[通俗易懂]

RPN是一个轻量级的神经网络,以滑动窗口的方式扫描图像并找到包含对象的区域。RPN扫描的区域称为锚点也就是分布在图像区域上的红框,如上图所示。不过,这只是是一个简化的视图。实际上,大约有200K的不同尺寸和高宽比的锚,它们重叠覆盖尽可能多的图像。

RPN扫描速度有多快?其实很快。滑动窗口允许它并行扫描所有区域(在GPU上)。此外,RPN不会直接扫描图像(即使我们在图像上绘制锚点以便说明)。相反,RPN扫描骨干网络生成的Feature map。这允许RPN有效地重用提取的特征并避免大量的重复计算。根据Faster-RCNN的论文,RPN运行大约10 ms。在Mask RCNN中,我们通常使用更大的图像和更多的锚点,因此可能需要更长的时间。针对每个锚点,RPN有两个输出

Mask_RCNN训练自己的数据——制作COCO格式的数据集[通俗易懂]

1.锚点的种类:前景或背景。前景类意味着该框中可能有一个对象。

2.边界框细化:前景锚点(也称为正锚点)可能没有完全正对该对象。 因此,RPN会输出一个很小的微量变化(百分比):(x, y, width, heigh),以更好地适应物体。

使用RPN预测,我们选择可能包含对象并优化其位置和大小的顶部锚点。如果几个锚点重叠太多,我们会保留具有最高前景分数的锚点并丢弃其余的(称为非极大值抑制:Non-max Suppression)。在这之后我们会得到进入下一阶段的最终提案(感兴趣的区)。

1.3.ROI分类器和边界框回归(ROI Classifier & Bounding Box Regressor)

这个阶段运行在RPN提出的感兴趣区(ROI)上。就像RPN一样,对每个ROI生成两个输出:

Mask_RCNN训练自己的数据——制作COCO格式的数据集[通俗易懂]

                Illustration of stage 2. Source: Fast R-CNN (https://arxiv.org/abs/1504.08083)

1.具体的类别:ROI中对象的类。 与具有两个类别(前景/ 背景)的RPN不同,该网络更深并且具有将区域分类为特定类别(人,车,椅子等)的能力。并且它也可以生成背景类,这样可以让部分消极的ROI被丢弃。

2.边界框细化:与RPN中的完成方式非常相似,其目的是进一步细化边界框的位置和大小以包含对象。

1.3.1ROI池化

在进行下一步之前,有一点问题需要解决:分类器不能很好地处理可变的输入大小。通常需要固定的输入大小。 但是,由于RPN中的边界框细化步骤,ROI框可能具有不同的大小。 这时就需要ROI Pooling。

Mask_RCNN训练自己的数据——制作COCO格式的数据集[通俗易懂]

roi_pooling
标题

ROI池化是指裁剪feature map的一部分并将其大小调整为固定大小。 原则上类似于裁剪图像的一部分,然后重新调整大小(但实现细节存在差异)。Mask R-CNN的作者提出了一种称为ROIAlign的方法,他们在不同的点对feature map进行采样并应用双线性插值。 在我们的实现中,为了简单起见,我们使用了TensorFlow的crop_and_resize函数,因为它对于大多数目的来说已经足够用了。

1.4. 分割掩膜(Segmentation Masks)

如果你在上一步停下来,那么你已经得到了Faster R-CNN来进行对象检测。 而Mask网络是则是在其上进行的扩展:

Mask_RCNN训练自己的数据——制作COCO格式的数据集[通俗易懂]

该Mask网络分支是一个卷积网络,它采用由ROI分类器选择的正区域并为它们生成mask。生成了低分辨率的mask:28×28像素。但它们是以浮点数表示的soft masks,因此它们比二进制的mask拥有更多的细节;低分辨率的mask可以得到轻量级的Mask网络。 在训练期间,我们将mask缩小到28×28以计算Loss,并且在预测期间,我们将mask放大到ROI边界框的大小,得到了最终的mask。

2.利用Mask R-CNN进行实例分割

Mask_RCNN训练自己的数据——制作COCO格式的数据集[通俗易懂]

生成的示例1

Mask_RCNN训练自己的数据——制作COCO格式的数据集[通俗易懂]示例2

2.1训练数据

首先,你可以搜索公共的数据集:像COCO这一类,在这里,我会展示如何从头开始构建自己的数据集。为了训练时间的减少,我总共选取了75张图片,并将它们分为训练集和验证集。得到图像很容易。注释图像才是困难的部分。

Mask_RCNN训练自己的数据——制作COCO格式的数据集[通俗易懂]

等等!难道我们不需要一百万幅图像来训练深度学习的模型吗?有时候你会,但在这里我们并没有那么多数据。因此,基于以下两点来显著减少训练样本的数量:

1.迁移学习

这意味着,不是从头开始训练模型,而是从COCO数据集上训练的权重文件开始。尽管COCO数据集不包含气球类别,但它包含许多其他图像(大约120K),因此训练后的权重已经学习了很多自然图像中常见的特征,这是非常有帮助的。

2.只是一个简单的示例

在这里,只是为了阐述如何实现Mask-RCNN,因此,并不需要这个模型有很高的准确性,这个小数据集已经足够了。

有很多工具来注释图像。根据其简单性,我最终使用了VIA(VGG Image Annotator)。这是一个单独的HTML文件,你可以下载并在浏览器中打开:

Mask_RCNN训练自己的数据——制作COCO格式的数据集[通俗易懂]

如果你不喜欢VIA,你也可以使用以下工具:

VGG Image Annotator(VIA):快速,轻便,设计精良。这是我最终使用的那个。我使用其中的rectangle进行标记,其中用到了skimage,但是现在发行的版本还不能使用rectangle,因此你需要从源码编译安装,见这篇文章:

从github下载开发者版本的源码进行编译安装scikit-image(0.14)

Labelme:最知名的工具之一。 但是UI有点太慢了,尤其是在放大图像时。它的具体使用方式见我的另外一篇博客:

Mask_RCNN训练自己的数据,其中Labelme的使用说明

RectLabel:简单易用。但是仅限Mac。

LabelBox:适用于大型标签项目,并且可以选择不同类型的标签。

COCO UI:用于注释COCO数据集的工具。

2.2加载数据集

掩码的加载方式并没有普遍接受的格式。 一些数据集将它们保存为PNG图像(像labelme),其他数据集将它们存储为多边形点(VIA, COCO)等等。 为了处理这些情况,需要实现提供一个继承的Dataset类,然后重写几个函数以便以恰好的格式读取数据。

VIA工具将注释保存在JSON文件中,每个掩码都是一组多边形点。 通过查看生成的JSON很容易找到这些注释。 我在代码中加入了注释来解释这是如何完成的。

小提示:为新数据集编写代码的简单方法是复制coco.py并将其修改为自己所需要的。在这里,以气球为例子,并且将新文件保存为balloons.py

我的BalloonDataset类看起来像这样:
 

class BalloonDataset(utils.Dataset):
     def load_balloons(self,dataset_dir,subset):
        ...
     def load_mask(self,image_id):
        ...
     def image_reference(self,image_id):
        ...

load_balloons读取JSON文件,并且提取注释,并迭代调用内部的add_classadd_image函数来构建数据集。

load_mask通过绘制多边形为图像中的每个对象生成mask。

image_reference只是返回一个字符串,用于识别图像以进行调试。 这里它只是返回图像文件的路径。

你可能已经注意到这个类不包含加载图像或返回边界框的函数。这是因为基础数据集类中默认的load_image函数处理加载图像。 而且,边界框是从mask动态生成的。

2.2.1验证数据集及代码是否正确

为了验证新代码是否正确实现,需要加载数据集,可视化mask和边界框,并可视化锚点以验证的锚点大小是否适合对象的大小:

Mask_RCNN训练自己的数据——制作COCO格式的数据集[通俗易懂]

2.3配置

此项目的配置与用于训练COCO数据集的基本配置类似,所以只需要重写3个值即可。 正如上述对Dataset类所做的那样,可以从基础配置类继承并添加需要修改的值:

class BalloonConfig(Config):
    # Give the configuration a recognizable name
    NAME = "balloons"
    # Number of classes (including background)
    NUM_CLASSES = 1 + 1  # Background + balloon
    # Number of training steps per epoch
    STEPS_PER_EPOCH = 100

基本配置使用尺寸为1024×1024的输入图像以获得最佳准确性。但是你的图像可能尺寸大小不一,别怕!该模型可以自动调整大小,如果你实在不放心的话,你也像我一样可以自己写个程序调整尺寸。

2.4训练

Mask R-CNN是一个相当大的模型,特别是我们使用ResNet101和FPN。所以你需要一个具有12GB内存的GPU。在这里,我们应该从预先训练好的COCO权重开始,并且只需要训练Heads即可,毕竟我们的数据集很小;当然,你也可以全部层都训练,但是那样速度很慢。

2.5检查结果

inspect_balloon_model文件显示训练模型生成的结果。你可以查看其中的其它细节,结果如下:

Mask_RCNN训练自己的数据——制作COCO格式的数据集[通俗易懂]

另:使用自己训练好的模型进行预测,看这里:

Mask_RCNN:使用自己训练好的模型进行预测_Jayce~的博客-CSDN博客_maskrcnn预训练模型Mask_RCNN训练自己的数据——制作COCO格式的数据集[通俗易懂]https://blog.csdn.net/qq_15969343/article/details/80388311

都看到这里了,还不赶紧点赞评论收藏走一波? 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/185973.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • super vlan原理_super vlan应用场景

    super vlan原理_super vlan应用场景SuperVLAN主要通过实现多个VLAN共用同一个IP网段,从而达到节省IP地址资源的目的。

  • oppo手机锁屏断网怎么解除_oppo手机锁屏的时间怎么调整位置

    oppo手机锁屏断网怎么解除_oppo手机锁屏的时间怎么调整位置oppo手机是有很多种锁屏时钟的,手机在息屏状态下,即可以查看时间,还可以在屏幕上显示很多相关的信息,不过很多小伙伴想要更多的个性化锁屏界面,比如把锁屏时钟调个位置和样式等等。那么oppo锁屏时钟怎么改格式?锁屏时钟位置在哪里设置调整呢?下面小编就来详细讲一讲!oppo锁屏时钟怎么改格式?锁屏时钟位置在哪里设置调整一、先来看oppo锁屏时钟怎么改格式?1、第一找到桌面上的“设置”—“显示与亮度”—…

  • 创建自己的个人网站(一)

    创建自己的个人网站(一)在学习过程中,我们想要将自己的作品发布到网上,创建个人网站,以下是个人网站搭建的简单介绍。 (建议建站前,了解常用linux指令)步骤:1.注册域名     2.开通云服务器     3.搭建网站环境     4.发布网站内容     5.域名解析      6.完成ICP备案(本次仅介绍静态网站的搭建,动态网站后续文章详细介绍)1.注册域名  …

  • Android Log日志

    Android Log日志

  • 机器学习算法——线性回归(超级详细且通俗)

    机器学习算法——线性回归(超级详细且通俗)通俗理解线性回归回归分析什么是回归分析呢?这是一个来自统计学的概念。回归分析是指一种预测性的建模技术,主要是研究自变量和因变量的关系。通常使用线/曲线来拟合数据点,然后研究如何使曲线到数据点的距离差异最小。例如,存在以下数据然后我们拟合一条曲线f(x):回归分析的目标就是要拟合一条曲线,让图中红色线段加起来的和最小。线性回归(简介)线性回归是回归分析的一种。假设目标值(因变量)与特征值(自变量)之间线性相关(即满足一个多元一次方程,如:f(x)=w1x1+…+wnxn+b.)。然后构

  • windows7 python 指定源组播 10049_试图绑定到特定的外部ip :: [Errno 10049]请求的地址在其上下文中无效无法打开socket-(python 2.7)…[通俗易懂]

    windows7 python 指定源组播 10049_试图绑定到特定的外部ip :: [Errno 10049]请求的地址在其上下文中无效无法打开socket-(python 2.7)…[通俗易懂]socket.INADDR_ANY等于socket.bind(‘0.0.0.0’)如果绑定到“0.0.0.0”可以监听所有接口(可用)MoxaTCP示例:importsocket,timeimportthread#Exampleclientclass_client:def__init__(self):self.status=Falsedefrun(self,clientso…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号