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)


相关推荐

  • c++ cin输入空格_cin输入string遇到空格

    c++ cin输入空格_cin输入string遇到空格文章目录一、cin>>用法1:输入一个数字或字符用法2:接收一个字符串,遇“空格”、“TAB”、“回车”就结束二、cin.getline()用法:接收一个字符串,可以接收空格并输出延伸:三、getline()用法:接收一个字符串,可以接收空格并输出,需包含“#include”四、注意的问题一、cin>>用法1:输入一个数字或字符#include using name……

  • 关于尺度空间的理解和认识_尺度空间理论

    关于尺度空间的理解和认识_尺度空间理论通常会听到尺度变化等这类词语,看到的也总是一堆的数学公式,有时候真的不知道这到底有啥用,有啥意义,没有弄懂这些意义,当然就更不可能的理解,不可能去掌握应用它了,现在我才理解,小波变化其实也是一种尺度变化。今天我看到一篇南航数学系写的关于尺度空间解释的文章,感觉很通俗易懂,我们不从数学上来推倒什么是尺度空间,只是从生活常识方面来解释尺度空间的意义,意义懂了,数学方面自然就好理解了。       

    2022年10月11日
  • CreateCompatibleDC

    CreateCompatibleDCVB声明DeclareFunctionCreateCompatibleDCLib”gdi32″Alias”CreateC

  • java string转long类型(c语言字符串存入数组)

    背景在日常开发需求中,跟前端交互,时有传由多个id组成的id字符串给后端的情况,然而在数据库中保存的id是整型,比如Long类型,这个时候就需要把字符串数组转成一个Long类型的List了代码publicstaticvoidmain(String[]args){str…

  • 对比学习、自监督学习的理解「建议收藏」

    对比学习、自监督学习的理解「建议收藏」自监督学习定义:自监督学习主要是利用辅助任务从大规模的无监督数据中挖掘自身的监督信息来提高学习表征的质量,通过这种构造监督信息对网络进行训练,从而可以学习到对下游任务具有价值的表征。辅助任务(pretext):可以认为是一种为达到特定训练任务而设计的间接任务。pretext任务的好处是为了简化原任务的求解,在深度学习中就是避免人工标记样本,实现无监督的语义提取。Pretext任务可以进一步理解为:对目标任务有帮助的辅助任务。主要pretexttask包括:图像旋转、图像着色、图像修复。下游任务:图

  • nginx 实现动静分离访问项目资源

    nginx 实现动静分离访问项目资源nginx动静分离访问可以将一些css,js,img,html等一些静态资源没必要去让tomcat去加载好处是减少tomcat压力,提高响应速度,让tomcat只去处理跟数据库打交道的请求项目结构(图片) 1页面图片展示  2nginx.confg配置  #设置tomcat集群 upstreamlocal{ #i…

发表回复

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

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