主要内容

使用Mask R-CNN执行实例分割

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

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

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

笔记:此示例需要计算机视觉工具箱™ 面具模型R-CNN。您可以从附加资源管理器安装Mask R-CNN的计算机视觉工具箱模型。有关安装附加组件的详细信息,请参阅获取和管理加载项

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

下载预训练面罩R-CNN。网络存储为马斯克伦(计算机视觉工具箱)对象

dataFolder = fullfile (tempdir,“可可”); 培训生=“//www.tatmou.com/金宝appsupportfiles/vision/data/maskrcnn_object_person_car.mat”;helper.downloadTrainedMaskRCNN (trainedMaskRCNN_url dataFolder);
预先训练的MaskRCNN网络已经存在。
预训练=加载(完整文件(数据文件夹,“maskrcnn\u object\u person\u car.mat”)); net=pretrained.net;

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

imTest=imread(“visiontam.jpg”);

使用以下命令分割对象及其遮罩:分段对象(计算机视觉工具箱)功能分段对象函数在执行预测之前对输入图像执行以下预处理步骤:

  1. 使用COCO数据集平均值将图像置零。

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

(面具,标签,分数,盒子)= segmentObjects(网络,imt);

通过将检测到的遮罩覆盖在图像上,使用插入对象掩码(计算机视觉工具箱)作用

overlayedImage=插入对象掩码(imTest,掩码);imshow(overlayedImage)

显示对象上的边界框和标签。

showShape (“矩形”,收集(盒),“标签”,标签,“线条颜色”,“r”)

下载培训数据

COCO 2014列车图像数据集[2]由82783个图像组成。注释数据包含对应于每个图像的至少五个标题。

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

imageFolder=fullfile(数据文件夹,“图片”); captionsFolder=fullfile(dataFolder,“注释”);如果~exist(imageFolder,“dir”mkdir (imageFolder) mkdir (captionsFolder)终止

从以下网址下载COCO 2014培训图片和说明:https://cocodataset.org/#download分别单击“2014列车图像”和“2014列车/Val注释”链接。将图像文件提取到图像文件夹. 将注释文件解压缩到指定的文件夹中captionsFolder

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

读取和预处理训练数据

为了训练R-CNN,你需要这些数据。

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

  • RGB图像中对象的边界框,指定为天体- × 4矩阵,行格式为[xYWH]).

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

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

初始化训练数据参数

列车类别名称={“人”,“汽车”}; numClasses=长度(列车类别名称);imageSizeTrain=[800 3];

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

CocoAPI for MATLAB使您能够访问注释数据https://github.com/cocodataset/cocoapi通过点击“代码”按钮并选择“下载ZIP”,提取椰子大师目录及其内容到指定的文件夹数据文件夹. 如果您的操作系统需要,请按照加森马特拉巴皮子目录。

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

cocoAPIDir=fullfile(dataFolder,“椰子树大师”,“MatlabAPI”);目录(cocoAPIDir);

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

unpacannotationdir=fullfile(dataFolder,“未打包的批注”,“数据文件”);如果~存在(unpackAnnotationDir“dir”)mkdir(解包注释dir)终止

使用解压注释Helper函数,它作为文件夹中的支持文件附加到本示例中金宝app帮手.每个MAT文件对应于单个训练图像,并包含每个训练图像的文件名、边界框、实例标签和实例掩码。属性将指定为多边形坐标的对象实例转换为二进制掩码poly2mask(图像处理工具箱)作用

解包注释(trainClassNames、annotationFile、imageFolder、解包注释Dir);
加载和准备批注…完成(t=9.11s)。将批注解包到MAT文件中…完成!

创建数据存储

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

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

ds=文件数据存储(unpacannotationdir,...“ReadFcn”,@(x)helper.cocoAnnotationMATReader(x,imageFolder));

将训练图像、边界框和实例遮罩预处理为网络使用使改变功能使改变函数使用中指定的操作处理数据预处理数据辅助函数。助手函数作为文件夹中的支持文件附加到示例金宝app帮手

这个预处理数据辅助函数对训练图像、边界框和实例遮罩执行以下操作:

  • 使用以下命令调整RGB图像和遮罩的大小:imresize函数并使用bboxresize(计算机视觉工具箱)辅助函数选择一个同质比例因子,使图像、边界框或遮罩的较小尺寸等于目标网络输入尺寸。

  • 使用imcrop(图像处理工具箱)函数并使用bboxcrop(计算机视觉工具箱)功能帮手function crops the image, bounding box, or mask such that the larger dimension is equal to the target network input size.

  • 使用COCO数据集图像平均值将图像置零。(标准偏差归一化因子包含在第一卷积层的权重中。)

dsTrain =变换(ds, @ (x) helper.preprocessData (x, imageSizeTrain));

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

数据=预览(dsTrain)
资料=1×4单元阵列{800×800×3 single} {14×4 double} {14×1 categorical} {800×800×14 logical}

创建遮罩R-CNN网络层

Mask R-CNN建立在带有ResNet-50基础网络的更快的R-CNN之上。要在预先训练的Mask R-CNN网络上转移学习,使用马斯克伦对象加载预训练网络,并根据新的类集和输入大小自定义网络马斯克伦对象使用与COCO数据集相同的锚定框。

net=maskrcnn(“resnet50-coco”,列车类别名称,“InputSize”,imageSizeTrain)
net = maskrcnn with properties: ModelName: 'maskrcnn' ClassNames: {'person' ' 'car'} InputSize: [800 800 3] AnchorBoxes: [15×2 double]

创建一个包含Mask R-CNN网络配置参数的结构。

params=createMaskRCNNConfig(imageSizeTrain,numclass,[trainClassNames{“背景”}]);params.ClassAgnosticMasks=false;params.AnchorBoxes=net.AnchorBoxes;params.freezeConfrance=true;

指定培训选项

指定SGDM优化的选项。对网络进行10个阶段的训练。

initialLearnRate=0.0012;动量=0.9;衰减=0.01;速度=[];maxEpochs=10;最小批量大小=2;

批量训练数据

创建一个小型批处理队列对象,该对象管理自定义训练循环中观察值的小批量处理。这个小型批处理队列对象还将数据强制转换到dlarray对象,在深度学习应用程序中实现自动区分。

定义一个名为小批量. 这些图像沿第四维连接,以获得一个H——- - - - - -W——- - - - - -C——- - - - - -小批量成型批次。另一个地面真实数据配置为长度等于最小批次大小的单元阵列。

minbatchfcn = @(img,boxes,labels,masks) deal(cat(4,img{:}),boxes,labels,masks);

将图像数据的小批量数据提取格式指定为“SSCB“(空间、空间、通道、批处理)。如果支持的GPU可用于计算,则金宝app小型批处理队列对象在训练期间在后台的并行池中预处理小批。

mbqTrain = minibatchqueue (dsTrain 4...“MiniBatchFormat”,[“SSCB”,"","",""],...“最小批量大小”,小批量,...“输出广播”,[“单身”,"","",""],...“OutputAsDlArray”,真的,假的,假的,假的,...“MiniBatchFcn”,miniBatchFcn,...“外部环境”,[“自动”,“cpu”,“cpu”,“cpu”]);

列车网络

要训练网络,请设置溺爱以下代码中的变量符合事实的. 在自定义训练循环中训练模型。对于每个迭代:

  • 使用读取当前小批量的数据下一个作用

  • 使用德尔费瓦尔功能与功能networkGradientshelper函数networkGradients,作为支持函数列出,返回损失金宝app相对于可学习参数的梯度、相应的小批量损失以及当前批次的状态。

  • 使用以下命令更新网络参数:sgdmupdate作用

  • 更新状态网络参数采用移动平均法。

  • 更新培训进度图。

如果GPU可用,在GPU上训练。使用GPU需要并行计算工具箱™ 以及支持CUDA®的NVIDIA®GPU。有关更多信息,请参阅GPU支金宝app持情况(并行计算工具箱)

doTraining=true;如果doTraining迭代=1;开始=抽搐;%为学习率和小批量损失创建子批次图=图;[lossPlotter,LearningRate绘图仪]=助手。配置TrainingProgress绘图仪(图);%初始化详细输出helper.initializeVerboseOutput([]);%自定义训练循环对于历元=1:maxEpochs重置(mbqTrain)随机播放(mbqTrain)虽然hasdata(mbqTrain)%从minibatchqueue获取下一批[X, gtBox gtClass, gtMask] =下一个(mbqTrain);%使用dlfeval评估模型梯度和损失(梯度、损失、状态,可学的)= dlfeval (@networkGradients X, gtBox、gtClass gtMask,净,params);%dlnet.State=状态;%计算当前迭代的学习率learnRate = initialLearnRate/(1 + decay*(epoch-1));如果(~isempty(gradient) && ~isempty(loss))[净。全部的Learnables,velocity] = sgdmupdate(learnables,gradients,velocity,learnRate,momentum);其他的持续终止%每10次迭代的Plot loss/accuracy metric如果(mod(iteration,10)==0)helper.显示verboseoutputeveryepoch(start,learnRate,epoch,iteration,loss);D=持续时间(0,0,toc(start),“格式”,“hh:mm:ss”); 添加点(learningratePlotter,迭代,learnRate)添加点(lossPlotter,迭代,double(收集(提取数据(丢失)))子批次(2,1,2)标题(strcat(“时代:”,num2str(历代),,已过:+字符串(D)))现在开始终止迭代=迭代+1;终止终止%拯救训练有素的网络modelDateTime=string(datetime)(“现在”,“格式”,“yyyy MM dd HH MM ss”)); 保存(strcat)(“trainedMaskRCNN——”modelDateTime,“-纪元—,num2str(历代),“.mat”),“净”);终止
GPU培训|=============================================================================================================================================新纪元|迭代|时间流逝|小批量|基础学习|(hh:mm:ss)|损失|率||=========================================================================|
| 1 | 10 | 00:00:26 | 1.9042 | 0.0012 | | 1 | 20 | 00:00:45 | 2.3645 | 0.0012 | | 1 | 30 | 00:01:03 | 2.1728 | 0.0012 | | 1 | 40 | 00:01:22 | 2.4587 | 0.0012 | | 1 | 50 | 00:01:40 | 1.6101 | 0.0012 | | 1 | 60 | 00:01:59 | 1.9428 | 0.0012 | | 1 | 70 | 00:02:17 | 2.0966 | 0.0012 | | 1 | 80 | 00:02:35 | 1.8483 | 0.0012 | | 1 | 90 | 00:02:53 | 1.9071 | 0.0012 | | 1 | 100 | 00:03:11 | 2.3982 | 0.0012 | | 1 | 110 | 00:03:29 | 1.8156 | 0.0012 | | 1 | 120 | 00:03:48 | 1.1133 | 0.0012 | | 1 | 130 | 00:04:07 | 1.5866 | 0.0012 | | 1 | 140 | 00:04:24 | 1.5608 | 0.0012 | | 1 | 150 | 00:04:43 | 0.9455 | 0.0012 | | 1 | 160 | 00:05:01 | 1.5179 | 0.0012 | | 1 | 170 | 00:05:20 | 1.5809 | 0.0012 | | 1 | 180 | 00:05:39 | 1.1198 | 0.0012 | | 1 | 190 | 00:05:58 | 1.9142 | 0.0012 | | 1 | 200 | 00:06:17 | 1.5293 | 0.0012 | | 1 | 210 | 00:06:35 | 1.9376 | 0.0012 | | 1 | 220 | 00:06:53 | 1.1024 | 0.0012 | | 1 | 230 | 00:07:11 | 2.7115 | 0.0012 | | 1 | 240 | 00:07:29 | 1.0415 | 0.0012 | | 1 | 250 | 00:07:48 | 2.0512 | 0.0012 | | 1 | 260 | 00:08:07 | 1.9210 | 0.0012 |

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

参考文献

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

[2] 林宗毅、迈克尔·梅尔、塞尔吉·贝隆吉、卢波米尔·布尔德夫、罗斯·吉尔希克、詹姆斯·海斯、彼得罗·佩罗纳、德瓦·拉马南、C·劳伦斯·齐特尼克和皮奥特·多拉,《微软COCO:上下文中的常见对象》,2014年5月1日。https://arxiv.org/abs/1405.0312v3

另见

(计算机视觉工具箱)||||(计算机视觉工具箱)||||(计算机视觉工具箱)|

相关话题

外部网站