终极指南:构建用于检测汽车损坏的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)
终极指南:构建用于检测汽车损坏的Mask R-CNN模型(附Python演练)的更多相关文章
- 硬货 | 手把手带你构建视频分类模型(附Python演练))
		译者 | VK 来源 | Analytics Vidhya 概述 了解如何使用计算机视觉和深度学习技术处理视频数据 我们将在Python中构建自己的视频分类模型 这是一个非常实用的视频分类教程,所以准 ... 
- 十八、dbms_repair(用于检测,修复在表和索引上的损坏数据块)
		1.概述 作用:用于检测,修复在表和索引上的损坏数据块. 2.包的组成 1).admin_tables语法:dbms_repair.admin_tables(table_name in varchar ... 
- 如何编写更好的SQL查询:终极指南-第三部分
		本次我们学习<如何编写更好的SQL查询>系列的最后一篇文章. 时间复杂度和大O符号 通过前两篇文章,我们已经对查询计划有了一定了解.接下来,我们还可以借助计算复杂度理论,来进一步深入地挖掘 ... 
- 【转】使用JMeter进行负载测试——终极指南
		使用JMeter进行负载测试——终极指南 这篇教程讨论的是JMeter,它是一款基于Java的.集合了几个应用程序.具有特定用途的负载和性能测试工具. 本篇主要涉及的内容: 解释一下JMeter的用途 ... 
- JMETER断言:终极指南
		你想要: 检查服务器响应是否包含特定字符串, 或验证服务器返回了HTTP 200 OK, 或者检查json字段的值(使用类似JsonPath$.store..price). 断言是要走的路. 问题是: ... 
- const extern static 终极指南
		const extern static 终极指南 不管是从事哪种语言的开发工作,const extern static 这三个关键字的用法和原理都是我们必须明白的.本文将对此做出非常详细的讲解. co ... 
- 每周一书《Oracle 12 c PL(SQL)程序设计终极指南》
		本周为大家送出的书是<Oracle 12 c PL(SQL)程序设计终极指南>,此书由机械工业出版社出版, 孙风栋,王澜,郭晓惠 著. 内容简介: <Oracle 12c PL/SQ ... 
- 15个Linux Wget下载实例终极指南
		15个Linux Wget下载实例终极指南 Linux wget是一个下载文件的工具,它用在命令行下.对于Linux用户是必不可少的工具,尤其对于网络管理员,经常要下载一些软件或从远程服务器恢复备份到 ... 
- [产品相关]   A/B测试终极指南(翻译)
		转载地址: http://blog.sina.com.cn/s/blog_9149268d0100zrx7.html 还记得以前导师说看了英文的文章就把它翻译一下吧,这样会对文章更好地理解,也会有更深 ... 
随机推荐
- 通过python脚本读取多台虚机硬件信息
			主要通过fabric模块实现 import fabric ''' hosts = [] ,): host = "192.168.75." + str(i) hosts.append ... 
- 一个基于Bootstrap实现的HMTL可视化编辑工具
			疫情禁足在家,用原生的JS实现了一个HTML可视化编辑工具,页面布局基于Bootstrap.大约一个月时间,打通主要技术关卡,实现了第一版: 可以拖放编辑,实现了几乎所有的bootstrap预定义 ... 
- 一些常用的 CSS 技巧和知识点
			作为一名前端工程师,CSS 是必备技能之一,然而在日常开发中,总有那么些时候,面对着炫酷的效果图,脑子里的 CSS 属性却一片空白,于是只能借助搜索引擎,在一堆复杂的介绍中找到需要的内容复制粘贴.有没 ... 
- 授人以渔式解析原生JS写轮播图
			需求与分析 需求:循环无缝自动轮播五张图,按左右箭头可以手动切换图片,鼠标点击轮播图下面按钮 1 2 3 4 5会跳转到对应的第1 2 3 4 5张图片.鼠标放到轮播图的图片上时不再自动轮播并且左右箭 ... 
- JS 获取一段时间内的工作时长小时数
			本来想是想找轮子的,但是并没有找到能用的,多数都是问题很大,所以就自己写了一个 需求说明 支持自选时间段,即开始时间与结束时间根据用户的上班及下班时间判定返回小时数 技术栈 moment.js 思考过 ... 
- Spring源码阅读笔记04:默认xml标签解析
			上文我们主要学习了Spring是如何获取xml配置文件并且将其转换成Document,我们知道xml文件是由各种标签组成,Spring需要将其解析成对应的配置信息.之前提到过Spring中的标签包括默 ... 
- C++ 命令行窗口打印二叉树(图形)
			写这个程序的目的是学习数据结构的时候方便调试,学习起来也比较直观. 这个是我测试SplayTree时候的gif STEP 1 新建一个头文件,命名为DrawATree.hh, 将以下内容复制进去 #i ... 
- python框架Django实战商城项目之工程搭建
			项目说明 该电商项目类似于京东商城,主要模块有验证.用户.第三方登录.首页广告.商品.购物车.订单.支付以及后台管理系统. 项目开发模式采用前后端不分离的模式,为了提高搜索引擎排名,页面整体刷新采用j ... 
- safari坑之 video
			博客地址: https://www.seyana.life/post/19 本来是打算给博客左上角的gif做个优化, 把gif换成webm,以video的形式自动播放,能从180k降到50k, 现在浏 ... 
- vue中eslint报错的解决方案
			1,Newline required at end of file but not found. (eol-last) //文末需要一行 这个是报错: 这个是不报错的: 只需要在最后一行加上一空行即可 ... 
