这个例子展示了如何使用基于多类掩码区域的卷积神经网络(R-CNN)分割人和车的个体实例。
实例分割是一种计算机视觉技术,在该技术中,可以检测和定位对象,同时为每个检测到的实例生成分割图。
本例首先演示如何使用检测两个类的预训练掩码R-CNN执行实例分割。然后,您可以选择下载数据集并使用转移学习训练多类掩码R-CNN。
笔记:此示例需要计算机视觉工具箱™ 面具模型R-CNN。您可以从附加资源管理器安装Mask 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”);
使用以下命令分割对象及其遮罩:分段对象
(计算机视觉工具箱)功能分段对象
函数在执行预测之前对输入图像执行以下预处理步骤:
使用COCO数据集平均值将图像置零。
将图像调整为网络的输入大小,同时保持纵横比(字母框)。
(面具,标签,分数,盒子)= 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];
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}
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”]);
要训练网络,请设置溺爱
以下代码中的变量符合事实的
. 在自定义训练循环中训练模型。对于每个迭代:
使用读取当前小批量的数据下一个
作用
使用德尔费瓦尔
功能与功能networkGradients
helper函数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.
fasterRCNNLayers
(计算机视觉工具箱)|德尔费瓦尔
|sgdmupdate
|使改变
|插入对象掩码
(计算机视觉工具箱)|dlarray
|数据链路网络
|文件数据存储
|ROI校准层
(计算机视觉工具箱)|小型批处理队列