使用掩码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
函数在执行预测之前对输入图像执行这些预处理步骤。
使用COCO数据集均值将图像设为零居中。
将图像大小调整为网络的输入大小,同时保持纵横比(字母装箱)。
[mask,labels,scores,boxes] = segmentObjects(net,imTest,Threshold=0.98);
方法将检测到的掩码叠加在图像上,从而可视化预测insertObjectMask
函数。
overlayedImage = insertObjectMask(imTest,掩码);imshow (overlayedImage)
显示对象上的包围框和标签。
showShape (“矩形”,收集(盒)、标签=标签,LineColor =“r”)
下载培训资料
创建目录来存储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单元格数组。数组的每一行都包含(x,y)多边形沿图像中一个实例边界的坐标。但是,本例中的掩码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文件unpackAnnotations
Helper函数,该函数作为支持文件附加到本示例中。金宝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.
另请参阅
maskrcnn
|trainMaskRCNN
|segmentObjects
|变换
|insertObjectMask
相关的话题
- 开始使用掩码R-CNN进行实例分割
- MATLAB深度学习(深度学习工具箱)
- 用于深度学习的数据存储(深度学习工具箱)