В этом примере показано, как сегментировать отдельные экземпляры людей и автомобилей с помощью мультикласса Маска находящаяся в области сверточная нейронная сеть (R-CNN).
Сегментация экземпляра является методом компьютерного зрения, в котором вы обнаруживаете и локализуете объекты, одновременно генерирование сегментации сопоставляет для каждого из обнаруженных экземпляров.
Этот пример сначала показывает, как выполнить сегментацию экземпляра с помощью предварительно обученной Маски R-CNN, который обнаруживает два класса. Затем можно опционально загрузить набор данных и обучить Маску мультикласса R-CNN.
Загрузите предварительно обученную Маску R-CNN.
dataFolder = fullfile(tempdir,"coco"); trainedMaskRCNN_url = 'https://www.mathworks.com/supportfiles/vision/data/maskrcnn_pretrained_person_car.mat'; helper.downloadTrainedMaskRCNN(trainedMaskRCNN_url,dataFolder); pretrained = load(fullfile(dataFolder,'maskrcnn_pretrained_person_car.mat')); net = pretrained.net;
Извлеките подсеть сегментации маски с помощью extractMaskNetwork
функция помощника, которая присоединена к этому примеру как к вспомогательному файлу в папке helper
.
maskSubnet = helper.extractMaskNetwork(net);
Сеть обучена, чтобы обнаружить людей и автомобили. Задайте имена классов, включая 'background'
класс, а также количество классов, исключая 'background'
класс.
classNames = {'person','car','background'}; numClasses = length(classNames)-1;
Считайте тестовое изображение, которое содержит объекты целевых классов.
imTest = imread('visionteam.jpg');
Задайте целевой размер изображения для вывода.
targetSizeTest = [700 700 3];
Измените размер изображения, обеспечив соотношение сторон и масштабируя самую большую размерность к целевому размеру.
if size(imTest,1) > size(imTest,2) imTest = imresize(imTest,[targetSizeTest(1) NaN]); else imTest = imresize(imTest,[NaN targetSizeTest(2)]); end
Задайте параметры конфигурации сети с помощью createMaskRCNNConfig
функция помощника, которая присоединена к этому примеру как к вспомогательному файлу.
imageSizeTrain = [800 800 3]; params = createMaskRCNNConfig(imageSizeTrain,numClasses,classNames);
Обнаружьте объекты и их маски с помощью функции помощника detectMaskRCNN
, который присоединен к этому примеру как к вспомогательному файлу.
[boxes,scores,labels,masks] = detectMaskRCNN(net,maskSubnet,imTest,params);
Визуализируйте предсказания путем накладывания обнаруженных масок на изображении с помощью insertObjectMask
функция.
if(isempty(masks)) overlayedImage = imTest; else overlayedImage = insertObjectMask(imTest,masks); end imshow(overlayedImage)
Покажите ограничительные рамки и метки на объектах.
showShape("rectangle",gather(boxes),"Label",labels,"LineColor",'r')
COCO 2014 обучается, набор данных изображений [2] состоит из 82 783 изображений. Данные об аннотациях содержат по крайней мере пять заголовков, соответствующих каждому изображению.
Создайте директории, чтобы сохранить изображения обучения COCO и данные об аннотации.
imageFolder = fullfile(dataFolder,"images"); captionsFolder = fullfile(dataFolder,"annotations"); if ~exist(imageFolder,'dir') mkdir(imageFolder) mkdir(captionsFolder) end
Загрузите изображения обучения COCO 2014 и заголовки под эгидой https://cocodataset.org/#download путем щелкания по ссылкам "2014 Train images" и "2014 Train/Val annotations", соответственно. Извлеките файлы изображений в папку, заданную imageFolder
. Извлеките файлы аннотации в папку, заданную captionsFolder
.
annotationFile = fullfile(captionsFolder,"instances_train2014.json");
str = fileread(annotationFile);
Чтобы обучить Маску R-CNN, вам нужны эти данные.
Изображения RGB, которые служат входом к сети в виде H W 3 числовыми массивами.
Ограничительные рамки для объектов в RGB отображают в виде матриц NumObjects-4 со строками в формате [x y w h]).
Экземпляр помечает в виде векторов строки NumObjects-1.
Маски экземпляра. Каждая маска является сегментацией одного экземпляра в изображении. Набор данных COCO задает экземпляры объектов с помощью координат многоугольника, отформатированных как массивы ячеек NumObjects-2. Каждая строка массива содержит (x, y) координаты многоугольника вдоль контура одного экземпляра в изображении. Однако Маска R-CNN в этом примере требует бинарных масок, заданных как логические массивы размера H W NumObjects.
API COCO для MATLAB позволяет вам получить доступ к данным об аннотации. Загрузите API COCO для MATLAB под эгидой https://github.com/cocodataset/cocoapi путем нажимания кнопки "Code" и выбора "Download ZIP". Извлеките cocoapi-master
директория и ее содержимое к папке заданы dataFolder
. В случае необходимости для вашей операционной системы, скомпилируйте gason синтаксический анализатор путем следования инструкциям в gason.m
файл в MatlabAPI
подкаталог.
Задайте местоположение директории для API COCO для MATLAB и добавьте директорию в путь.
cocoAPIDir = fullfile(dataFolder,"cocoapi-master","MatlabAPI"); addpath(cocoAPIDir);
Задайте папку, в которой можно хранить файлы MAT.
unpackAnnotationDir = fullfile(dataFolder,"annotations_unpacked","matFiles"); if ~exist(unpackAnnotationDir,'dir') mkdir(unpackAnnotationDir) end
Извлеките аннотации COCO к файлам MAT с помощью unpackAnnotations
функция помощника, которая присоединена к этому примеру как к вспомогательному файлу в папке helper
. Каждый файл MAT соответствует одному учебному изображению и содержит имя файла, ограничительные рамки, метки экземпляра и маски экземпляра для каждого учебного изображения. Функция преобразует экземпляры объектов, заданные, когда многоугольник координирует к бинарным маскам с помощью poly2mask
функция.
trainClassNames = {'person','car'}; helper.unpackAnnotations(trainClassNames,annotationFile,imageFolder,unpackAnnotationDir);
Маска R-CNN ожидает входные данные как массив ячеек 1 на 4, содержащий изображение обучения RGB, ограничительные рамки, метки экземпляра и маски экземпляра.
Создайте datastore файла с пользовательской функцией чтения, cocoAnnotationMATReader
, это читает содержимое распакованных файлов MAT аннотации, преобразует полутоновые учебные изображения в RGB и возвращает данные как массив ячеек 1 на 4 в требуемом формате. Пользовательская функция чтения присоединена к этому примеру как к вспомогательному файлу в папке helper
.
ds = fileDatastore(unpackAnnotationDir, ... 'ReadFcn',@(x)helper.cocoAnnotationMATReader(x,imageFolder));
Задайте входной размер сети.
imageSize = [800 800 3];
Предварительно обработайте учебные изображения, ограничительные рамки и маски экземпляра к размеру, ожидаемому сетью с помощью transform
функция. transform
функциональные процессы данные с помощью операций заданы в preprocessData
функция помощника. Функция помощника присоединена к примеру как к вспомогательному файлу в папке helper
.
preprocessData
функция помощника выполняет эти операции на учебных изображениях, ограничительных рамках и масках экземпляра:
Измените размер изображений RGB и масок с помощью imresize
функционируйте и перемасштабируйте ограничительные рамки с помощью bboxresize
функция. Функция помощника выбирает однородный масштабный коэффициент, таким образом, что меньшая размерность изображения, ограничительной рамки или маски равна целевому сетевому входному размеру.
Обрежьте изображения RGB и маски с помощью imcrop
функционируйте и обрежьте ограничительные рамки с помощью bboxcrop
функция. Обрезки функции помощника, которые изображение, ограничительная рамка, или маскируют таким образом, что большая размерность равна целевому сетевому входному размеру.
Масштабируйте пиксельные значения изображений RGB к области значений [0, 1].
dsTrain = transform(ds,@(x)helper.preprocessData(x,imageSize));
Предварительно просмотрите данные, возвращенные преобразованным datastore.
data = preview(dsTrain)
data=1×4 cell array
{800×800×3 uint8} {16×4 double} {16×1 categorical} {800×800×16 logical}
Маска R-CNN полагается на Faster R-CNN с базовой сетью ResNet-101. Получите слои Faster R-CNN с помощью fasterRCNNLayers
функция.
netFasterRCNN = fasterRCNNLayers(params.ImageSize,numClasses,params.AnchorBoxes,'resnet101');
Измените сеть для Маски R-CNN с помощью createMaskRCNN
функция помощника. Эта функция присоединена к примеру как вспомогательный файл. Функция помощника выполняет эти модификации к сети:
Замените rpnSoftmaxLayer
с пользовательским об/мин softmax слой, заданный вспомогательным файлом RPNSoftmax
в папке layer
.
Замените regionProposalLayer
с пользовательским слоем предложения по области, заданным вспомогательным файлом RegionProposal
в папке layer
.
Замените roiMaxPooling2dLayer
с roiAlignLayer
.
Добавьте голову сегментации маски для сегментации пиксельного уровня.
netMaskRCNN = createMaskRCNN(netFasterRCNN,numClasses,params);
Преобразуйте сеть в dlnetwork
Объект (Deep Learning Toolbox).
dlnet = dlnetwork(netMaskRCNN);
Визуализируйте сеть с помощью Deep Network Designer.
deepNetworkDesigner(netMaskRCNN)
Задайте опции для оптимизации SGDM. Обучите сеть в течение 30 эпох.
initialLearnRate = 0.01; momentum = 0.9; decay = 0.0001; velocity = []; maxEpochs = 30; miniBatchSize = 2;
Создайте minibatchqueue
Объект (Deep Learning Toolbox), который справляется с мини-пакетной обработкой наблюдений в пользовательском учебном цикле. minibatchqueue
возразите также бросает данные к dlarray
Объект (Deep Learning Toolbox), который включает автоматическое дифференцирование в применении глубокого обучения.
Задайте пользовательскую функцию с именем пакетной обработки miniBatchFcn
. Изображения конкатенированы по четвертому измерению, чтобы получить H W C miniBatchSize сформированный пакет. Другие достоверные данные сконфигурированы массив ячеек длины, равной мини-пакетному размеру.
miniBatchFcn = @(img,boxes,labels,masks) deal(cat(4,img{:}),boxes,labels,masks);
Задайте мини-пакетный формат экстракции данных для данных изображения как "SSCB"
(пространственный, пространственный, канал, пакет). Если поддерживаемый графический процессор доступен для расчета, то minibatchqueue
объект предварительно обрабатывает мини-пакеты в фоновом режиме в параллельном пуле во время обучения.
mbqTrain = minibatchqueue(dsTrain,4, ... "MiniBatchFormat",["SSCB","","",""], ... "MiniBatchSize",miniBatchSize, ... "OutputCast",["single","","",""], ... "OutputAsDlArray",[true,false,false,false], ... "MiniBatchFcn",miniBatchFcn, ... "OutputEnvironment",["auto","cpu","cpu","cpu"]);
Чтобы обучить сеть, установите doTraining
переменная в следующем коде к true
. Обучите модель в пользовательском учебном цикле. Для каждой итерации:
Считайте данные для текущего мини-пакета с помощью next
(Deep Learning Toolbox) функция.
Оцените градиенты модели с помощью dlfeval
(Deep Learning Toolbox) функция и networkGradients
функция помощника. Функциональный networkGradients
, перечисленный как функция поддержки, возвращает градиенты потери относительно настраиваемых параметров, соответствующей мини-пакетной потери и состояния текущего пакета.
Обновите сетевые параметры с помощью sgdmupdate
(Deep Learning Toolbox) функция.
Обновите state
параметры сети со скользящим средним значением.
Обновите график процесса обучения.
Обучайтесь на графическом процессоре, если вы доступны. Используя графический процессор требует Parallel Computing Toolbox™, и CUDA® включил NVIDIA® графический процессор. Для получения дополнительной информации смотрите Поддержку графического процессора Релизом (Parallel Computing Toolbox).
doTraining = false; if doTraining iteration = 1; start = tic; % Create subplots for the learning rate and mini-batch loss fig = figure; [lossPlotter] = helper.configureTrainingProgressPlotter(fig); % Initialize verbose output helper.initializeVerboseOutput([]); % Custom training loop for epoch = 1:maxEpochs reset(mbqTrain) shuffle(mbqTrain) while hasdata(mbqTrain) % Get next batch from minibatchqueue [X,gtBox,gtClass,gtMask] = next(mbqTrain); % Evaluate the model gradients and loss [gradients,loss,state] = dlfeval(@networkGradients,X,gtBox,gtClass,gtMask,dlnet,params); dlnet.State = state; % Compute the learning rate for the current iteration learnRate = initialLearnRate/(1 + decay*iteration); if(~isempty(gradients) && ~isempty(loss)) [dlnet.Learnables,velocity] = sgdmupdate(dlnet.Learnables,gradients,velocity,learnRate,momentum); else continue; end helper.displayVerboseOutputEveryEpoch(start,learnRate,epoch,iteration,loss); % Plot loss/accuracy metric D = duration(0,0,toc(start),'Format','hh:mm:ss'); addpoints(lossPlotter,iteration,double(gather(extractdata(loss)))) subplot(2,1,2) title(strcat("Epoch: ",num2str(epoch),", Elapsed: "+string(D))) drawnow iteration = iteration + 1; end end net = dlnet; % Save the trained network modelDateTime = string(datetime('now','Format',"yyyy-MM-dd-HH-mm-ss")); save(strcat("trainedMaskRCNN-",modelDateTime,"-Epoch-",num2str(maxEpochs),".mat"),'net'); end
Используя обучивший сеть, можно выполнить сегментацию экземпляра на тестовых изображениях, такой, как продемонстрировано в разделе Perform Instance Segmentation Using Pretrained Mask R-CNN.
[1] Он, Kaiming, Джорджия Гкайоксэри, Петр Доллар и Росс Джиршик. “Маска R-CNN”. Предварительно распечатайте, представленный 24 января 2018. https://arxiv.org/abs/1703.06870.
[2] Лин, Цзун-И, Майкл Мэр, Серж Белонги, Любомир Бурдев, Росс Джиршик, Джеймс Хейс, Пьетро Перона, Дева Ramanan, К. Лоуренс Зитник и Петр Доллар. “Microsoft COCO: Общие Объекты в Контексте”, 1 мая 2014. https://arxiv.org/abs/1405.0312v3.
fasterRCNNLayers
| insertObjectMask
| transform
| dlfeval
(Deep Learning Toolbox) | sgdmupdate
(Deep Learning Toolbox)FileDatastore
| roiAlignLayer
| dlarray
(Deep Learning Toolbox) | dlnetwork
(Deep Learning Toolbox) | minibatchqueue
(Deep Learning Toolbox)