主要内容

使用掩码R-CNN进行实例分割

这个例子展示了如何使用基于多类掩码区域的卷积神经网络(R-CNN)分割人和汽车的单个实例。

实例分割是一种计算机视觉技术,您可以检测和定位对象,同时为每个检测到的实例生成分割映射。

这个例子首先展示了如何使用预训练的掩码R-CNN(检测两个类)执行实例分割。然后,您可以选择下载一个数据集,并使用迁移学习训练一个多类掩码R-CNN。

使用预训练的掩码R-CNN进行实例分割

指定dataFolder作为预训练网络和数据的期望位置。

dataFolder = fullfile(tempdir,“可可”);

下载预训练的面具R-CNN。网络存储为maskrcnn对象。

trainedMaskRCNN_url =“//www.tatmou.com/金宝appsupportfiles/vision/data/maskrcnn_object_person_car_v2.mat”;downloadTrainedMaskRCNN (trainedMaskRCNN_url dataFolder);负载(fullfile (dataFolder“maskrcnn_object_person_car_v2.mat”));

读取包含目标类对象的测试映像。

imTest = imread(“visionteam.jpg”);

类分割对象及其掩码segmentObjects函数。的segmentObjects函数在执行预测之前对输入图像执行这些预处理步骤。

  1. 使用COCO数据集均值将图像设为零居中。

  2. 将图像大小调整为网络的输入大小,同时保持纵横比(字母装箱)。

[mask,labels,scores,boxes] = segmentObjects(net,imTest,Threshold=0.98);

方法将检测到的掩码叠加在图像上,从而可视化预测insertObjectMask函数。

overlayedImage = insertObjectMask(imTest,掩码);imshow (overlayedImage)

显示对象上的包围框和标签。

showShape (“矩形”,收集(盒)、标签=标签,LineColor =“r”

图中包含一个轴对象。axis对象包含一个image类型的对象。

下载培训资料

创建目录来存储COCO训练图像和注释数据。

imageFolder = fullfile(数据文件夹,“图片”);captionsFolder = fullfile(数据文件夹,“注释”);如果~存在(imageFolder“dir”mkdir(captionsFolder)结束

COCO 2014训练图像数据集[2]由82,783张图像组成。注释数据包含至少五个对应于每个图像的标题。下载COCO 2014培训图片和说明https://cocodataset.org/#download分别点击“2014年列车图片”和“2014年列车/Val注释”链接。将图像文件解压缩到指定的文件夹imageFolder.所指定的文件夹中提取注释文件captionsFolder

注释文件= fullfile(标题文件夹,“instances_train2014.json”);str = fileread(注释文件);

读取和预处理训练数据

要训练一个Mask R-CNN,你需要这些数据。

  • 作为网络输入的RGB图像,指定为H——- - - - - -W-by-3数值数组。

  • RGB图像中对象的包围框,指定为NumObjects-by-4矩阵,行格式为[xywh])。

  • 实例标签,指定为NumObjects-by-1字符串向量。

  • 实例的面具。每个掩码是图像中一个实例的分割。COCO数据集使用格式为的多边形坐标指定对象实例NumObjects-by-2单元格数组。数组的每一行都包含(xy)多边形沿图像中一个实例边界的坐标。但是,本例中的掩码R-CNN需要指定为大小逻辑数组的二进制掩码H——- - - - - -W——- - - - - -NumObjects

初始化训练数据参数

trainClassNames = [“人”“汽车”];numClasses = length(trainClassNames);imageSizeTrain = [800 800 3];

将COCO注释数据格式化为MAT文件

MATLAB的COCO API使您能够访问注释数据。下载MATLAB的COCO APIhttps://github.com/cocodataset/cocoapi点击“编码”按钮并选择“下载ZIP”即可。提取cocoapi-master目录及其内容复制到指定的文件夹中dataFolder.方法中的说明编译gason解析器(如果您的操作系统需要)gason.m文件在MatlabAPI子目录。

为MATLAB的COCO API指定目录位置,并将目录添加到路径中。

cocoAPIDir = fullfile(dataFolder,“cocoapi-master”“MatlabAPI”);目录(cocoAPIDir);

指定存储MAT文件的文件夹。

unpackAnnotationDir = fullfile(数据文件夹,“annotations_unpacked”“matFiles”);如果~存在(unpackAnnotationDir“dir”mkdir (unpackAnnotationDir)结束

方法将COCO注释提取到MAT文件unpackAnnotationsHelper函数,该函数作为支持文件附加到本示例中。金宝app每个MAT文件对应一个单独的训练图像,并包含每个训练图像的文件名、包围框、实例标签和实例掩码。函数将指定为多边形坐标的对象实例转换为二进制掩码poly2mask函数。

unpackAnnotations (trainClassNames annotationFile、imageFolder unpackAnnotationDir);

创建数据存储

Mask R-CNN期望输入数据为1 × 4单元格数组,其中包含RGB训练图像、边界框、实例标签和实例掩码。

使用自定义读取函数c创建文件数据存储ocoAnnotationMATReader,读取解包注释MAT文件的内容,将灰度训练图像转换为RGB,并以所需格式的1 × 4单元格数组返回数据。自定义读取函数作为支持文件附加到这个示例中。金宝app

ds = fileDatastore(unpackAnnotationDir,...ReadFcn = @ (x) cocoAnnotationMATReader (x, imageFolder));

预览转换后的数据存储返回的数据。

数据=预览(ds)
data =1×4单元格数组{428×640×3 uint8} {16×4 double} {16×1 categorical} {428×640×16 logical}

创建掩码R-CNN网络层

Mask R-CNN建立在ResNet-50基础网络的Faster R-CNN之上。要在预训练的Mask R-CNN网络上转移学习,请使用maskrcnn对象加载预训练的网络,并为新的类集和输入大小自定义网络。默认情况下,maskrcnn对象使用与COCO数据集训练相同的锚框。

网络= maskrcnn(“resnet50-coco”、trainClassNames InputSize = imageSizeTrain)
net = maskrcnn与属性:ModelName: 'maskrcnn' ClassNames:{'人' '车'}InputSize:[800 800 3]主播箱:[15×2 double]

如果您希望使用特定于训练数据集的自定义锚框,则可以使用estimateAnchorBoxes函数。属性指定锚定框AnchorBoxes属性时的名称-值参数maskrcnn对象。

列车网络的

指定SGDM优化的选项并训练网络10个epoch。

指定ExecutionEnvironment名称-值参数为“图形”在GPU上训练。建议使用至少12mb可用内存的GPU进行训练。使用GPU需要并行计算工具箱™和支持CUDA®的NVIDIA®GPU。有关更多信息,请参见GPU计算要求(并行计算工具箱)

选项= trainingOptions(“个”...InitialLearnRate = 0.001,...LearnRateSchedule =“分段”...LearnRateDropPeriod = 1,...LearnRateDropFactor = 0.95,...情节=“没有”...动量= 0.9,...MaxEpochs = 10,...MiniBatchSize = 2,...BatchNormalizationStatistics =“移动”...ResetInputNormalization = false,...ExecutionEnvironment =“图形”...VerboseFrequency = 50);

要训练Mask R-CNN网络,请设置doTraining变量转换为真正的.训练网络使用trainMaskRCNN函数。因为训练数据集与预训练网络所训练的数据相似,所以可以使用FreezeSubNetwork名称-值参数。

doTraining = true;如果doTraining [net,info] = trainMaskRCNN(ds,net,options,FreezeSubNetwork=“骨干”);modelDateTime = string(datetime(“现在”格式=“yyyy-MM-dd-HH-mm-ss”));保存(“trainedMaskRCNN——”+ modelDateTime +“.mat”“净”);结束

使用训练过的网络,您可以在测试图像上执行实例分割,如本节所演示的使用预训练的掩码R-CNN进行实例分割

参考文献

[1] He, Kaiming, Georgia Gkioxari, Piotr Dollár和Ross Girshick。“面具R-CNN。”预印本,2018年1月24日提交。https://arxiv.org/abs/1703.06870

[2]林、宗义、迈克尔·梅尔、塞尔日·贝隆吉、卢博米尔·布尔德夫、罗斯·吉什克、詹姆斯·海斯、彼得罗·佩罗纳、德瓦·拉马南、C.劳伦斯·齐特尼克和彼得亚特Dollár。“Microsoft COCO:上下文中的通用对象”,2014年5月1日。https://arxiv.org/abs/1405.0312v3

另请参阅

||||

相关的话题