终极指南:构建用于检测汽车损坏的Mask R-CNN模型(附Python演练)
介绍
计算机视觉领域的应用继续令人惊叹着。从检测视频中的目标到计算人群中的人数,计算机视觉似乎没有无法克服的挑战。
这篇文章的目的是建立一个自定义Mask R-CNN模型,可以检测汽车上的损坏区域(参见上面的图像示例)。这种模型的基本应用场景为,如果用户可以上传照片并且可以评估来自他们的损害,保险公司可以使用它来更快地处理索赔。如果贷方承销汽车贷款,特别是二手车,也可以使用这种模式。
目录
-
什么是Mask R-CNN?
-
Mask R-CNN的工作原理
-
如何构建用于汽车损坏检测的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)