阅读时间将近11分钟

介绍

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

这篇文章的目的是建立一个自定义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)


欢迎扫码关注:

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

  1. 深度学习模型的准备和使用教程,LSTM用于锂电池SOH预测(第一节)(附Python的jypter源代码)

    本Python笔记本显示和分析了如何处理NASA获得的电池充电/放电数据集. 对于这个模型的训练阶段,需要安装Python 3.x以及以下库: Tensorflow 2.0 Numpy Pandas ...

  2. 【目标检测】(10) Mosaic 数据增强方法,附Python完整代码

    各位同学好,今天和大家分享一下目标检测算法中常用的图像数据增强方法 Mosaic.先放张图看效果.将四张图片缩放后裁剪拼接在一起,并调整检测框的坐标位置,处理位于图像边缘的检测框.文末有完整代码 1. ...

  3. 深度学习模型的准备和使用教程,LSTM用于锂电池SOH预测(第二节)(附Python的jypter源代码)

    测试SOH预测模型 为测试模型的正确性,对同一电池 (B0006) 进行充电. dataset_val, capacity_val = load_data('B0006') attrib=['cycl ...

  4. 手把手带你从0完成医疗行业影像图像检测三大经典模型InceptionV3-RestNet50-VGG16(附python源代码及数据库)——改变世界经典人工智能项目实战(一)手把手教学迁移学习

    手把手带你从0完成医疗行业影像图像检测三大经典模型InceptionV3-RestNet50-VGG16 1.迁移学习简介 2.项目简介 3.糖尿病视网膜病变数据集 4.考虑类别不平衡问题 5.定义模 ...

  5. 教程 | 理解和实现自然语言处理终极指南(附Python代码)

     教程 | 理解和实现自然语言处理终极指南(附Python代码) 时间 2017-02-16 14:41:39 机器之心 原文  http://www.jiqizhixin.com/article ...

  6. 微信sdk swift版_使用Swift 4的iOS版Google Maps SDK终极指南

    微信sdk swift版 by Dejan Atanasov 通过Dejan Atanasov 使用Swift 4的iOS版Google Maps SDK终极指南 (Your ultimate gui ...

  7. 教你在Python中构建物体检测系统(附代码、学习资料)

    作者:FAIZANSHAIKH 翻译:闫晓雨 校对:张玲 本文约3200字,建议阅读10分钟. 本文介绍物体检测技术以及解决此领域问题的几种不同方法,带你深入研究在Python中如何构建我们自己的对象 ...

  8. 终极指南:如何使用Visual Studio Code进行 Java 开发?

    VS Code(Visual Studio Code)已成为多语言开发人员的首选文本编辑器. 大量Javascript.TypeScript.Go.Python 和其它语言的开发人员都在使用VS Co ...

  9. 深度学习中交叉熵_深度计算机视觉,用于检测高熵合金中的钽和铌碎片

    深度学习中交叉熵 计算机视觉 (Computer Vision) Deep Computer Vision is capable of doing object detection and image ...

最新文章

  1. vc++6.0的工作空间/工作区是什么?工程 文件 工作区什么区别?
  2. CAS实现单点登录方案(SSO完整版)
  3. java 检查进程是否存在
  4. Hexo+GitHub 快速搭建个人博客(二)---- 域名解析
  5. 【B站免费教程】2W 收藏!火爆 B 站的计算机科学速成教程发布,全中文版
  6. html app效果图,app端效果图.html
  7. tftp的安装、设置以及put、get传输实验
  8. Xcode7.x中安装Alcatraz
  9. python中的map对象_python map对象
  10. 【GNN框架系列】DGL第一讲:使用Deep Graph Library实现GNN进行节点分类
  11. DOM SAXReader
  12. ffmpeg音频格式转码(编码器)
  13. excel分列---多页批量操作--vba宏实现
  14. 我用 Python 画了一盘粽子送给大家
  15. 小姐姐让我帮忙修照片
  16. VSCode中snippets(代码模板)的使用
  17. 动态获取Bing每日壁纸
  18. 求10000以内所有的质数
  19. 基于51单片机的全自动洗衣机仿真原理图程序方案设计
  20. 需求工程各个步骤详解

热门文章

  1. 【无标题】C语言实现幻方
  2. 清华教授三个小故事,讲透经济学
  3. 最新计算机专业毕业设计选题 - 选题推荐
  4. Google Play市场包体大小判断
  5. Linux系统上没有scp命令,bash scp:未找到命令的解决方法
  6. WGS完整流程介绍(原始数据质控、数据预处理、变异检测、数据注释)
  7. ctfshow-1024杯
  8. 利用MATlab实现简单的曲线图片识别
  9. Mac电脑,python+appium+安卓模拟器使用步骤
  10. linux禁用rm命令 最简单的方法