终极指南:构建用于检测汽车损坏的Mask R-CNN模型(附Python演练)

来源 | AnalyticsVidhya

整理 | 磐石

【磐创AI导读】:本文分享了一个mask rcnn实战项目。想要学习更多的机器学习、深度学习知识

介绍

计算机视觉领域的应用继续令人惊叹着。从检测视频中的目标到计算人群中的人数,计算机视觉似乎没有无法克服的挑战。

这篇文章的目的是建立一个自定义Mask R-CNN模型,可以检测汽车上的损坏区域(参见上面的图像示例)。这种模型的基本应用场景为,如果用户可以上传照片并且可以评估来自他们的损害,保险公司可以使用它来更快地处理索赔。如果贷方承销汽车贷款,特别是二手车,也可以使用这种模式。

什么是MaskR-CNN?

Mask R-CNN是一个实例分割模型,它允许我们识别目标类别的像素位置。“实例分割”意味着对场景内的各个目标进行分段,无论它们是否属于同一类型- 即识别单个车辆,人员等。查看以下在COCO 数据集上训练的Mask-RCNN模型的GIF 。如你所见,它可以识别汽车,人员,水果等的像素位置。

Mask R-CNN不同于经典目标检测模型--Faster R-CNN等,除了识别类别及其边界框位置之外,还可以对边界框中与该类别对应的像素区域进行着色。那么哪些任务需要这些额外的细节呢?我能想到的一些例子是:

  • 自动驾驶汽车需要知道道路的确切像素位置; 其他汽车也可以据此避免碰撞
  • 机器人可能需要他们想要拾取的物体的像素位置(这里可以联想到亚马逊的无人机)

Mask R-CNN的工作原理

在我们构建Mask R-CNN模型之前,让我们首先了解它是如何工作的。理解Mask R-CNN的一个好的方式是把它看作一个混合的Faster R-CNN,一个可以进行目标检测(类别+边界框)和可以实现像素级别标注的FCN(完全卷积网络)的组合。见下图:

Mask RCNN是Faster RCNN和FCN的组合

Mask R-CNN在概念上很简单:首先使用Faster R-CNN为每个候选目标提供两个输出,一个类别标签和一个边界框偏移; 同时,添加了第三个输出目标Mask的分支- 一个二进制Mask,用于表明目标在边界框中的像素位置;另外,额外的Mask输出与类别和边界框输出不同,需要提取目标更精细的空间布局。为此,Mask R-CNN使用下面描述的 Fully Convolution Network(FCN)。

FCN是一种用于进行语义分割的流行算法。该模型使用多种卷积和最大池化层来首先将图像解压缩到其原始大小的1/32。然后,它在此粒度级别进行类别预测。最后,它使用了上采样和反卷积层来将图像大小调整为原始尺寸。

因此,简而言之,我们可以说Mask R-CNN网络架构结合了两个网络- Faster R-CNN和FCN。模型的损失函数是进行分类,生成边界框和生成mask的总损失。

Mask RCNN还有一些额外的改进,使其比FCN更精确。可以在论文中

(https://arxiv.org/pdf/1703.06870.pdf)阅读更多相关信息 。

如何构建用于汽车损伤检测的Mask R-CNN模型

为了构建自定义Mask R-CNN,我们将参考 Matterport Github存储库(https://github.com/matterport/Mask_RCNN)。虽然在最新TensorFlow目标检测库也提供了构建Mask R-CNN的选项,但是在使用的过程很容易遇到报错:TensorFlow版本,object detection版本,Mask格式等都是报错的可能原因。在这里推荐使用 Matterport Github存储库。

收集数据

在本次练习中,我从Google收集了66张受损车辆的图像(50张训练集和16张验证集)。看看下面的一些例子。

注释数据

Mask R-CNN模型要求用户注释图像并识别损坏区域。我使用的注释工具是VGG Image Annotator - v 1.0.6。可以使用此链接

(http://www.robots.ox.ac.uk/~vgg/software/via/via-1.0.6.html)提供的html版本 。使用此工具可以创建多边形mask,如下所示:

创建完所有注释后,可以下载注释并以json格式保存。您可以在此我存储库下customImages文件夹里查看我的存储库中的图像和注释。

训练模型

现在我们开始训练模型的。首先克隆'Matterport Mask R-CNN'存储库

( https://github.com/matterport/Mask_RCNN)

接下来我们将加载我们的图像和注释。

class CustomDataset(utils.Dataset):
 
def load_custom(self, dataset_dir, subset):
"""Load a subset of the Balloon dataset.
dataset_dir: Root directory of the dataset.
subset: Subset to load: train or val
"""
# Add classes. We have only one class to add.
self.add_class("damage", 1, "damage")
 
# Train or validation dataset?
assert subset in ["train", "val"]
dataset_dir = os.path.join(dataset_dir, subset)
 
# We mostly care about the x and y coordinates of each region
annotations1 = json.load(open(os.path.join(dataset_dir, "via_region_data.json")))
annotations = list(annotations1.values()) # don't need the dict keys
 
# The VIA tool saves images in the JSON even if they don't have any
# annotations. Skip unannotated images.
annotations = [a for a in annotations if a['regions']]
 
# Add images
for a in annotations:
# Get the x, y coordinaets of points of the polygons that make up
# the outline of each object instance. There are stores in the
# shape_attributes (see json format above)
polygons = [r['shape_attributes'] for r in a['regions'].values()]
 
# load_mask() needs the image size to convert polygons to masks.
image_path = os.path.join(dataset_dir, a['filename'])
image = skimage.io.imread(image_path)
height, width = image.shape[:2]
 
self.add_image(
"damage", ## for a single class just add the name here
image_id=a['filename'], # use file name as a unique image id
path=image_path,
width=width, height=height,
polygons=polygons)

我使用了Matterport共享的balloon.py文件并对其进行了修改,以创建一个加载图像和注释的自定义代码,并将它们添加到CustomDataset类中。在这我的存储库内custom.py上查看整个代码。本代码可适用其他检测任务情形(请注意:此代码仅适用于一个类别)

此外,可以使用此笔记本(https://github.com/priya-dwivedi/Deep-Learning/blob/master/mask_rcnn_damage_detection/inspect_custom_data.ipynb) 可视化给定图像上的mask。请参阅以下示例:

为了训练模型,我们使用COCO训练的模型作为检查点来执行迁移学习。可以在Matterport存储库下载此模型。

运行以下代码块训练模型:

## Train a new model starting from pre-trained COCO weights
python3 custom.py train --dataset=/path/to/datasetfolder --weights=coco
 
## Resume training a model that you had trained earlier
python3 custom.py train --dataset=/path/to/datasetfolder --weights=last

我使用GPU并在20-30分钟内训练模型10个epochs。

验证您的模型

您可以使用此notebook中(inspect_custom_weights.ipynb)的代码检查模型权重- 检查自定义权重。请在此笔记本中链接你的最后一个检查点。此notebook可以帮助进行健全性检查--权重和偏差是否分布正常。请参阅下面的示例输出:

在图像上运行模型并进行预测

使用笔记本 inspect_custom_model 对来自val set的图像运行模型,并查看模型预测。请参阅以下示例结果:

至此,已经完成建立了一个Mask R-CNN模型来检测汽车上的损坏。

结束笔记

Mask-RCNN是目标检测模型的下一个发展方向,它面向更精确的检测。Matterport公开了它的存储库并允许我们利用它来构建自定义模型去实现更多有意义的任务。本文只是Mask R-CNN模型可以完成的一个小例子。

参考:

【1】Very good explanation of Mask RCNN:(https://www.youtube.com/watch?v=UdZnhZrM2vQ&t=111s)

原文发布于微信公众号 - 磐创AI(xunixs)

原文发表时间:2018-07-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏利炳根的专栏

学习笔记CB010:递归神经网络、LSTM、自动抓取字幕

递归神经网络(RNN),时间递归神经网络(recurrent neural network),结构递归神经网络(recursive neural network...

5924
来自专栏ATYUN订阅号

词序:神经网络能按正确的顺序排列单词吗?

当学习第二语言时,最困难的挑战之一可能是熟悉单词顺序。词序在机器翻译中也很重要,因为翻译大致上是一种处理目标语言词汇的过程,它与源语言是对等的。也许你已经做过一...

3514
来自专栏PaddlePaddle

【目标检测】SSD目标检测

场景文字识别 目标检测任务的目标是给定一张图像或是视频帧,让计算机找出其中所有目标的位置,并给出每个目标的具体类别。对于人类来说,目标检测是一个非常简单的任务。...

5749
来自专栏机器学习算法原理与实践

支持向量机原理(四)SMO算法原理

  在SVM的前三篇里,我们优化的目标函数最终都是一个关于$\alpha$向量的函数。而怎么极小化这个函数,求出对应的$\alpha$向量,进而求出分离超平面我...

1102
来自专栏ATYUN订阅号

【技术】使用Tensorflow对象检测接口进行像素级分类

AiTechYun 编辑:yuxiangyu 在过去,我们使用Tensorflow对象检测API来实现对象检测,它的输出是图像中我们想要检测的不同对象周围的边界...

3854
来自专栏人工智能LeadAI

什么!卷积要旋转180度?!

一看这个标题就会想,这有什么大惊小怪的,可能好多人觉得这是个脑残话题,但我确实误解了两三年……

1731
来自专栏Coding迪斯尼

从零开始构造一个识别猫狗图片的卷积网络

在深度学习的项目实践中,往往会遇到两个非常难以克服的难题,一是算力,要得到精确的结果,你需要设计几千层,规模庞大的神经网络,然后使用几千个GPU,把神经网络布置...

2212
来自专栏机器之心

资源 | 如何利用VGG-16等模型在CPU上测评各深度学习框架

选自GitHub 机器之心编译 参与:蒋思源、刘晓坤 本项目对比了各深度学习框架在 CPU 上运行相同模型(VGG-16 和 MobileNet)单次迭代所需要...

6738
来自专栏新智元

猫狗大战识别准确率直冲 Kaggle Top 2%,手把手教你在 Keras 搭建深度 CNN

猫狗大战 数据集来自 kaggle 上的一个竞赛:Dogs vs. Cats,训练集有25000张,猫狗各占一半。测试集12500张,没有标定是猫还是狗。 ?...

8047
来自专栏刁寿钧的专栏

使用 Tensorflow 构建 CNN 进行情感分析实践

本次实验参照的是 Kim Yoon 的论文,代码放在我的 github 上,可直接使用。

3.1K1

扫码关注云+社区

领取腾讯云代金券