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

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

【磐创AI导读】:本文分享了一个mask rcnn实战项目。

介绍

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

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

目录

什么是Mask R-CNN?
Mask R-CNN的工作原理
如何构建用于汽车损坏检测的Mask R-CNN
收集数据
注释数据
训练模型
验证模型
运行图像模型并进行预测

什么是MaskR-CNN?

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


image

Mask R-CNN不同于经典目标检测模型--Faster R-CNN等,除了识别类别及其边界框位置之外,还可以对边界框中与该类别对应的像素区域进行着色。那么哪些任务需要这些额外的细节呢?我能想到的一些例子是:
自动驾驶汽车需要知道道路的确切像素位置; 其他汽车也可以据此避免碰撞
机器人可能需要他们想要拾取的物体的像素位置(这里可以联想到亚马逊的无人机)
Mask R-CNN的工作原理

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

image

Mask RCNN是Faster RCNN和FCN的组合

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

image

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张验证集)。看看下面的一些例子。

image

注释数据

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,如下所示:

image


创建完所有注释后,可以下载注释并以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。请参阅以下示例:

image

为了训练模型,我们使用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可以帮助进行健全性检查--权重和偏差是否分布正常。请参阅下面的示例输出:

image

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

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

image

至此,已经完成建立了一个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

原文发布时间为:2018-07-30
本文作者:磐石
本文来自云栖社区合作伙伴“磐创AI ”,了解相关信息可以关注“磐创AI ”。

相关文章
|
1天前
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现智能食品加工优化的深度学习模型
使用Python实现智能食品加工优化的深度学习模型
90 59
|
2天前
|
机器学习/深度学习 数据采集 数据库
使用Python实现智能食品营养分析的深度学习模型
使用Python实现智能食品营养分析的深度学习模型
21 6
|
1天前
|
机器学习/深度学习 算法 PyTorch
用Python实现简单机器学习模型:以鸢尾花数据集为例
用Python实现简单机器学习模型:以鸢尾花数据集为例
8 1
|
4天前
|
机器学习/深度学习 供应链 安全
使用Python实现智能食品供应链管理的深度学习模型
使用Python实现智能食品供应链管理的深度学习模型
20 3
|
6天前
|
机器学习/深度学习 PyTorch TensorFlow
使用Python实现智能食品质量检测的深度学习模型
使用Python实现智能食品质量检测的深度学习模型
36 1
|
3天前
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现智能食品安全监测的深度学习模型
使用Python实现智能食品安全监测的深度学习模型
16 0
|
28天前
|
机器学习/深度学习 人工智能 算法框架/工具
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第7天】本文将深入探讨卷积神经网络(CNN)的基本原理,以及它如何在图像识别领域中大放异彩。我们将从CNN的核心组件出发,逐步解析其工作原理,并通过一个实际的代码示例,展示如何利用Python和深度学习框架实现一个简单的图像分类模型。文章旨在为初学者提供一个清晰的入门路径,同时为有经验的开发者提供一些深入理解的视角。
|
14天前
|
机器学习/深度学习 人工智能 自动驾驶
深度学习中的卷积神经网络(CNN)及其应用
【10月更文挑战第21天】本文旨在深入探讨深度学习领域的核心组成部分——卷积神经网络(CNN)。通过分析CNN的基本结构、工作原理以及在图像识别、语音处理等领域的广泛应用,我们不仅能够理解其背后的技术原理,还能把握其在现实世界问题解决中的强大能力。文章将用浅显的语言和生动的例子带领读者一步步走进CNN的世界,揭示这一技术如何改变我们的生活和工作方式。
|
21天前
|
机器学习/深度学习 人工智能 监控
深入理解深度学习中的卷积神经网络(CNN):从原理到实践
【10月更文挑战第14天】深入理解深度学习中的卷积神经网络(CNN):从原理到实践
62 1
|
3天前
|
机器学习/深度学习 人工智能 TensorFlow
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第32天】本文将介绍深度学习中的一个重要分支——卷积神经网络(CNN),以及其在图像识别领域的应用。我们将通过一个简单的代码示例,展示如何使用Python和TensorFlow库构建一个基本的CNN模型,并对其进行训练和测试。

热门文章

最新文章