1. 磐创AI-开放猫官方网站首页
  2. Medium

实现您自己的Mask RCNN模型


在这篇文章中,我提供了一个分步指南来实现和部署您自己的Mask RCNN模型。当我创建自己的部署模型时,我在网上参考了很多博客,很少有博客使用用边界框注释的图像和单类分类,一些使用边界框注释的图像和多类分类,还有一些使用带有单类分类的多边形注释。这篇文章将提供所有这些场景的代码及其解释。该职位的流动情况如下:

MASK RCNN模型有63,749,552个总参数,63,638,064个可训练参数,111,488个不可训练参数。这是很多参数,别担心,你不需要了解Mask RCNN模型的所有内容就可以实现它,也就是说,我强烈建议你在这里阅读Mask RCNN的论文。为了实现这个模型,我使用了Matterport Mask R-CNN。here matterport Mask R-CNN

Mask RCNN模型简介

MASK RCNN是一个用于图像分割任务的深度学习模型。我将Mask RCNN模型视觉化如下:

主干网-实现为ResNet 101和特征金字塔网络(FPN),该网络提取前向传播到其他组件的初始特征图。

区域建议网络(RPN)-用于从图像中提取感兴趣区域(ROI),并应用非最大值抑制来选择最合适的边界框或从RPN生成的ROI。

ROI对齐(ROI Align)-将感兴趣区域(ROI)包裹到固定尺寸。

完全连接的层-由两个平行层组成,一个使用Softmax进行分类,另一个使用回归进行边界框预测。

蒙版分类器-为图像中的每个实例生成二进制蒙版。

关于我的面具RCNN模型

我开发了一个Mask RCNN模型来检测汽车的四种外部损伤,即划痕、凹痕、破碎和错位。我已经使用步骤4a、步骤4b和步骤4c训练了我的模型。

我发现,如果需要生成精确蒙版的模型,则应该使用带多边形注释的图像,如果只需要精确的边界框,则可以使用边界框注释。

步骤1:数据收集和清理

任何数据科学项目的第一步都是收集数据。您可以使用BeautifulSoup(静电网页)或Selenium(交互式网页)通过抓取网页来收集图像数据,也可以使用Kaggle上提供的开源数据集。如果你想创建一个小的数据集,你可以从Google Images手动下载图片。收集数据集后,您需要清理不适合您的任务的映像。一件重要的事情是确保您为每个图像命名,使其具有唯一的数字id,例如:0001.jpg、0002.jpg等。Kaggle

对于边界框注释,数据集目录结构应为:

customImages
|__ annots (all .xml annotation)
|__ images (all images)

对于多边形注记,数据集目录结构应为:

customImages
|__ train (all training images and annotation file)
|__ val (all validation images and annotation file)

步骤2:图像注释

正如你可能知道的那样,神经网络是有监督的学习算法,因此你需要用地面事实来注释你的图像,即在你想要检测的对象周围创建一个边界框或多边形。对于多边形批注,我推荐使用VGG图像批注器,对于边界框批注使用Labellmg。VGG image annotator Labellmg

步骤3:下载要求

首先,您需要克隆Matterport Mask RCNN存储库。

git clone https://github.com/matterport/Mask_RCNN.git

其次,您需要从Matterport存储库中安装Mask RCNN库。

cd Mask_RCNN
python setup.py install

对于Linux/Mac OS,请改用sudo命令。

第三,您需要安装以下软件包来训练模型。

这可以通过安装Matterport存储库中或我自己的Mask RCNN项目存储库中提供的requirements.txt文件来完成。project repository

pip3 install -r requirements.txt

最后,在此处下载MS Coco数据集的Mask RCNN权重。您将根据这些预先训练好的权重训练您的自定义数据集,并利用转移学习。here

现在你都准备好了!!让我们开始培训您的自定义数据集模型。

模范训练

DataSet类-我们将DataSet类功能继承到我们的用户定义类CustomDataset中。这使我们能够创建自己的函数来提取边界框、加载掩码和加载数据集。

Load_DataSet函数-该函数负责在对模型进行训练之前在数据集中添加类和图像,这是通过使用self.add_image()添加图像和使用self.add_class()添加类来完成的。

self.add_image(source, image_id, path, annotation) # bounding box
self.add_image(source, image_id, path, width, height, polygons, num_ids)# polygon

EXTRACT_BOCKS函数-该函数仅用于边界框注释的情况,我们需要提取定义边界框的4个值,分别是xmin、ymin、xmax和ymax,以及图像的高度和宽度。

LOAD_MASK函数-此函数用于带边界框注释的图像和带多边形注释的图像,并用于加载蒙版。请注意,在边界框注释图像的情况下,蒙版将始终是框。

IMAGE_INSERVICATION函数-此函数用于返回给定图像ID的图像的路径。

Config类-我们继承Config类来初始化我们的配置。我们需要有单独的培训和测试配置。使用以下内容显示配置:

config = CustomConfig()
config.display()

EVALUATE_MODEL函数-此函数在全局名称空间中声明,用于计算模型的平均平均精度(MAP)。

导入库

注意:您只需要使用步骤4中的一个子步骤(a、b或c)来训练模型。但是,请开始理解步骤4 a中的代码。您可以在我的项目库中的model-Training目录中找到所有的模型训练代码。project repository

步骤4a:模型训练(边界框注释和单类分类)

步骤4b:模型训练(边界框注释和多类分类)

步骤4c:模型训练(多边形注记和多类分类)

现在您已经了解了所有三个场景的代码。您可以自己更改以下场景的上述代码吗?

图像增强

图像数据增强是一种可用于通过在数据集中创建图像的修改版本来人为地扩展训练数据集的大小的技术。这可以通过颠倒或左右翻转图像、旋转图像或缩放图像来实现。这可以按如下方式实现:Image data augmentation is a technique that can be used to artificially expand the size of a training dataset by creating modified versions of images in the dataset.

import imgaug.augmenters as iaa

第5步:模型评估

如果您无法完成待办事项任务,请参阅我的培训笔记本。training notebook

步骤6:单幅图像预测

步骤7:在本地使用Flask部署网站

当您对模型的性能感到满意时,下一步是为用户开发一个与模型交互的网站。我不会在这一节解释代码,只提供给您使用。use

app.add_url_rule('/base','base',views.base)
app.add_url_rule('/','index',views.index)
app.add_url_rule('/damageapp','damageapp',views.damageapp)
app.add_url_rule('/damageapp/damage','damage',views.damage,methods=['GET','POST'])

如果您不想使用成本评估功能,只需将app/views.py第45行的COST_FOR_IMPORT变量更改为false即可。成本评估功能仅用于视觉目的,并根据蒙版大小与图像比例计算成本。

注意:使用GitHub存储库中的mcrnn目录进行部署,因为我对原始库进行了一些更改。

参考文献

[1]He,K.,Gkioxari,G.,Dolár,P.和Girshick,R.,“Mask R-CNN”,arxiv e-print,2017。He, K., Gkioxari, G., Dollár, P., and Girshick, R., “Mask R-CNN”, arXiv e-prints, 2017.

[2]利用Matterport屏蔽R-CNN进行目标检测和分割。Mask R-CNN for Object Detection and Segmentation

原创文章,作者:fendouai,如若转载,请注明出处:https://panchuang.net/2021/06/28/%e5%ae%9e%e7%8e%b0%e6%82%a8%e8%87%aa%e5%b7%b1%e7%9a%84mask-rcnn%e6%a8%a1%e5%9e%8b-2/

联系我们

400-800-8888

在线咨询:点击这里给我发消息

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息