终极指南:构建用于检测汽车损坏的掩模R-CNN模型(使用Python代码)

Introduction

计算机视觉的应用继续令人惊讶。 从检测视频中的对象到计算人群中的人数,计算机视觉似乎无法克服这一挑战。

计算机视觉的一个更有趣的应用是识别场景中的像素并将其用于多种且非常有用的目的。 我们将在本文中讨论一个这样的应用程序,并试图了解它如何使用Python工作!

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

Table of Contents

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

What is Mask R-CNN?

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

掩码R-CNN不同于经典对象检测模型,如Faster R-CNN,其中除了识别类及其边界框位置之外,还可以对边界框中与该类对应的像素着色。 你认为我们什么时候需要这个额外的细节? 我能想到的一些例子是:

  • 自动驾驶汽车需要知道道路的确切像素位置; 可能还有其他汽车以避免碰撞
  • 机器人可能需要他们想要拾取的物体的像素位置(亚马逊的无人机在这里浮现在脑海中)

尝试构建在COCO类上的Mask R-CNN模型的最简单方法是使用Tensorflow Object Detection API。 您可以参考本文 (written by me)(由我编写),其中包含有关如何使用API以及在YouTube视频上运行模型的信息。

How Mask R-CNN works

在我们构建Mask R-CNN模型之前,让我们首先了解它的实际工作原理。

考虑Mask R-CNN的一个好方法是它是一个快速的R-CNN组合,它可以进行物体检测(类+边界框)和FCN(完全卷积网络),可以实现像素方向的边界。 见下图:

在这里插入图片描述
掩码RCNN是更快的RCNN和FCN的组合

掩码R-CNN在概念上很简单:更快的R-CNN为每个候选对象提供两个输出,一个类标签和一个边界框偏移; 为此,我们添加了第三个输出对象掩码的分支 - 这是一个二进制掩码,指示对象在边界框中的像素。 但是额外的掩码输出与类和框输出不同,需要提取对象的更精细的空间布局。 为此,Mask R-CNN使用下面描述的完全卷积网络(FCN)。
在这里插入图片描述
FCN是用于进行语义分割的流行算法。 该模型使用各种卷积和最大池层来首先将图像解压缩到其原始大小的1/32。 然后,它在此粒度级别进行类预测。 最后,它使用了采样和反卷积层来将图像大小调整为原始尺寸。

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

掩码RCNN还有一些额外的改进,使其比FCN更准确。 您可以在论文中阅读更多相关信息。

How to build a Mask R-CNN Model for Car Damage Detection

为了构建自定义Mask R-CNN,我们将利用Matterport Github存储库。 最新的TensorFlow对象检测库还提供了构建Mask R的选项-CNN。 但是我只会为强心者推荐这个! TensorFlow,对象检测,掩码格式等版本可以要求调试错误。 我能够使用它成功训练Mask R-CNN。

但我看到很多人都在为各种各样的错误而斗争。 所以我现在强烈推荐Matterport Mask R-CNN存储库给任何冒险进入这个领域的人。

Collecting Data

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

在这里插入图片描述

Annotating the Data

Mask R-CNN模型要求用户注释图像并识别损坏区域。 我使用的注释工具是VGG Image Annotator - v 1.0.6。 您可以使用此链接提供的html版本。 使用此工具可以创建多边形蒙版,如下所示:
在这里插入图片描述

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

Training a model

现在我们开始实际训练模型的有趣工作! 首先克隆’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类中。 查看整个代码here。 遵循相同的代码块并针对您的类的任何细节更新它。 请注意,此代码仅适用于一个类。

此外,您可以使用此笔记本来显示给定图像上的蒙版。 请参阅以下示例:

在这里插入图片描述
为了训练模型,我们使用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

I am using a GPU and trained the model for 10 epochs in 20–30 minutes.

Validate your model

您可以使用笔记本检查模型权重 - Inspect Custom Weights。 请在此笔记本中链接您的最后一个检查点。 如果您的重量和偏差分布正确,这款笔记本可以帮助您进行健全性检查。 请参阅下面的示例输出:

在这里插入图片描述

Run model on images and make predictions

使用笔记本inspect_custom_model对来自test / val set的图像运行模型,并查看模型预测。 请参阅下面的示例结果:
在这里插入图片描述

你刚刚建立了一个Mask R-CNN模型来检测汽车的损坏。 学习深度学习真是太棒了。

End Notes

Mask-RCNN是物体检测模型的下一个发展,它允许更精确的检测。 非常感谢Matterport公开他们的存储库并允许我们利用它来构建自定义模型。 这只是我们用这个精彩模型可以完成的一个小例子。

如果您对本文有任何疑问或反馈,请使用下面的评论部分进行分享。

References

Mask RCNN Paper
Understand difference b/w instance segmentation and semantic segmentation
Very good explanation of Mask RCNN
Good blog from Matterport on training on custom dataset
Matterport Github repo
Fully Convolutional Network

猜你喜欢

转载自blog.csdn.net/weixin_41697507/article/details/89422281