В этом примере показано, как сегментировать отдельные экземпляры людей и автомобилей с помощью мультикласса Маска находящаяся в области сверточная нейронная сеть (R-CNN).
Сегментация экземпляра является методом компьютерного зрения, в котором вы обнаруживаете и локализуете объекты, одновременно генерирование сегментации сопоставляет для каждого из обнаруженных экземпляров.
Этот пример сначала показывает, как выполнить сегментацию экземпляра с помощью предварительно обученной Маски R-CNN, который обнаруживает два класса. Затем можно опционально загрузить набор данных и обучить Маску мультикласса R-CNN с помощью передачи обучения.
Примечание: Этот пример требует Модели Computer Vision Toolbox™ для Маски R-CNN. Можно установить Модель Computer Vision Toolbox для Маски R-CNN из Add-On Explorer. Для получения дополнительной информации об установке дополнений, смотрите, Получают и Управляют Дополнениями.
Загрузите предварительно обученную Маску R-CNN. Сеть хранится как maskrcnn
объект.
dataFolder = fullfile(tempdir,"coco"); trainedMaskRCNN_url = 'https://www.mathworks.com/supportfiles/vision/data/maskrcnn_object_person_car.mat'; helper.downloadTrainedMaskRCNN(trainedMaskRCNN_url,dataFolder);
Pretrained MaskRCNN network already exists.
pretrained = load(fullfile(dataFolder,'maskrcnn_object_person_car.mat'));
net = pretrained.net;
Считайте тестовое изображение, которое содержит объекты целевых классов.
imTest = imread('visionteam.jpg');
Сегментируйте объекты и их маски с помощью segmentObjects
функция. segmentObjects
функция выполняет эти шаги предварительной обработки на входном изображении прежде, чем выполнить предсказание:
Нуль сосредотачивает изображения с помощью среднего значения набора данных COCO.
Измените размер изображения к входному размеру сети при поддержании соотношения сторон (добавление черных полос сверху и снизу).
[masks,labels,scores,boxes] = segmentObjects(net,imTest);
Визуализируйте предсказания путем накладывания обнаруженных масок на изображении с помощью insertObjectMask
функция.
overlayedImage = insertObjectMask(imTest,masks); 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.
trainClassNames = {'person', 'car'}; numClasses = length(trainClassNames); imageSizeTrain = [800 800 3];
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
функция.
helper.unpackAnnotations(trainClassNames,annotationFile,imageFolder,unpackAnnotationDir);
Loading and preparing annotations... DONE (t=9.11s). Unpacking annotations into MAT files... Done!
Маска R-CNN ожидает входные данные как массив ячеек 1 на 4, содержащий изображение обучения RGB, ограничительные рамки, метки экземпляра и маски экземпляра.
Создайте datastore файла с пользовательской функцией чтения, cocoAnnotationMATReader
, это читает содержимое распакованных файлов MAT аннотации, преобразует полутоновые учебные изображения в RGB и возвращает данные как массив ячеек 1 на 4 в требуемом формате. Пользовательская функция чтения присоединена к этому примеру как к вспомогательному файлу в папке helper
.
ds = fileDatastore(unpackAnnotationDir, ... 'ReadFcn',@(x)helper.cocoAnnotationMATReader(x,imageFolder));
Предварительно обработайте учебные изображения, ограничительные рамки и маски экземпляра к размеру, ожидаемому сетью с помощью transform
функция. transform
функциональные процессы данные с помощью операций заданы в preprocessData
функция помощника. Функция помощника присоединена к примеру как к вспомогательному файлу в папке helper
.
preprocessData
функция помощника выполняет эти операции на учебных изображениях, ограничительных рамках и масках экземпляра:
Измените размер изображений RGB и масок с помощью imresize
функционируйте и перемасштабируйте ограничительные рамки с помощью bboxresize
функция. Функция помощника выбирает однородный масштабный коэффициент, таким образом, что меньшая размерность изображения, ограничительной рамки или маски равна целевому сетевому входному размеру.
Обрежьте изображения RGB и маски с помощью imcrop
функционируйте и обрежьте ограничительные рамки с помощью bboxcrop
функция. Обрезки функции помощника, которые изображение, ограничительная рамка, или маскируют таким образом, что большая размерность равна целевому сетевому входному размеру.
Нуль сосредотачивает изображения с помощью среднего значения набора данных COCO изображений. (Коэффициент нормализации стандартного отклонения включен в веса первого сверточного слоя.)
dsTrain = transform(ds,@(x)helper.preprocessData(x,imageSizeTrain));
Предварительно просмотрите данные, возвращенные преобразованным datastore.
data = preview(dsTrain)
data=1×4 cell array
{800×800×3 single} {14×4 double} {14×1 categorical} {800×800×14 logical}
Маска R-CNN полагается на Faster R-CNN с базовой сетью ResNet-50. Чтобы передать учатся в предварительно обученной сети Mask R-CNN, используют maskrcnn
возразите, чтобы загрузить предварительно обученную сеть и настроить сеть для нового набора классов и ввести размер. По умолчанию, maskrcnn
возразите использует те же поля привязки в качестве набора данных COCO.
net = maskrcnn("resnet50-coco",trainClassNames,"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,numClasses,[trainClassNames {'background'}]);
params.ClassAgnosticMasks = false;
params.AnchorBoxes = net.AnchorBoxes;
params.FreezeBackbone = true;
Задайте опции для оптимизации SGDM. Обучите сеть в течение 10 эпох.
initialLearnRate = 0.0012; momentum = 0.9; decay = 0.01; velocity = []; maxEpochs = 10; 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 = true; if doTraining iteration = 1; start = tic; % Create subplots for the learning rate and mini-batch loss fig = figure; [lossPlotter, learningratePlotter] = 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 using dlfeval [gradients,loss,state,learnables] = dlfeval(@networkGradients,X,gtBox,gtClass,gtMask,net,params); %dlnet.State = state; % Compute the learning rate for the current iteration learnRate = initialLearnRate/(1 + decay*(epoch-1)); if(~isempty(gradients) && ~isempty(loss)) [net.AllLearnables,velocity] = sgdmupdate(learnables,gradients,velocity,learnRate,momentum); else continue; end % Plot loss/accuracy metric every 10 iterations if(mod(iteration,10)==0) helper.displayVerboseOutputEveryEpoch(start,learnRate,epoch,iteration,loss); D = duration(0,0,toc(start),'Format','hh:mm:ss'); addpoints(learningratePlotter,iteration,learnRate) addpoints(lossPlotter,iteration,double(gather(extractdata(loss)))) subplot(2,1,2) title(strcat("Epoch: ",num2str(epoch),", Elapsed: "+string(D))) drawnow end iteration = iteration + 1; end end % Save the trained network modelDateTime = string(datetime('now','Format',"yyyy-MM-dd-HH-mm-ss")); save(strcat("trainedMaskRCNN-",modelDateTime,"-Epoch-",num2str(epoch),".mat"),'net'); end
Training on GPU. |=========================================================================| | Epoch | Iteration | Time Elapsed | Mini-batch | Base Learning | | | | (hh:mm:ss) | Loss | Rate | |=========================================================================|
| 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 |
Используя обучивший сеть, можно выполнить сегментацию экземпляра на тестовых изображениях, такой, как продемонстрировано в разделе 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.
segmentObjects
| dlfeval
(Deep Learning Toolbox) | sgdmupdate
(Deep Learning Toolbox) | transform
| insertObjectMask
maskrcnn
| dlarray
(Deep Learning Toolbox) | dlnetwork
(Deep Learning Toolbox) | FileDatastore
| minibatchqueue
(Deep Learning Toolbox)