В этом примере показано, как сегментировать отдельные экземпляры людей и автомобилей с помощью мультикласса Маска находящаяся в области сверточная нейронная сеть (R-CNN).
Сегментация экземпляра является методом компьютерного зрения, в котором вы обнаруживаете и локализуете объекты, одновременно генерирование сегментации сопоставляет для каждого из обнаруженных экземпляров.
Этот пример сначала показывает, как выполнить сегментацию экземпляра с помощью предварительно обученной Маски R-CNN, который обнаруживает два класса. Затем можно опционально загрузить набор данных и обучить Маску мультикласса R-CNN с помощью передачи обучения.
Примечание: Этот пример требует Модели Computer Vision Toolbox™ для Маски R-CNN. Можно установить Модель Computer Vision Toolbox для Маски R-CNN из Add-On Explorer. Для получения дополнительной информации об установке дополнений, смотрите, Получают и Управляют Дополнениями.
Загрузите предварительно обученную Маску R-CNN. Сеть хранится как maskrcnn
Объект (Computer Vision Toolbox).
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
(Computer Vision Toolbox) функция. segmentObjects
функция выполняет эти шаги предварительной обработки на входном изображении прежде, чем выполнить предсказание:
Нуль сосредотачивает изображения с помощью среднего значения набора данных COCO.
Измените размер изображения к входному размеру сети при поддержании соотношения сторон (добавление черных полос сверху и снизу).
[masks,labels,scores,boxes] = segmentObjects(net,imTest);
Визуализируйте предсказания путем накладывания обнаруженных масок на изображении с помощью insertObjectMask
(Computer Vision Toolbox) функция.
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
(Image Processing Toolbox) функция.
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
(Computer Vision Toolbox) функция. Функция помощника выбирает однородный масштабный коэффициент, таким образом, что меньшая размерность изображения, ограничительной рамки или маски равна целевому сетевому входному размеру.
Обрежьте изображения RGB и маски с помощью imcrop
(Image Processing Toolbox) функция и обрезка ограничительные рамки с помощью bboxcrop
(Computer Vision Toolbox) функция. Обрезки функции помощника, которые изображение, ограничительная рамка, или маскируют таким образом, что большая размерность равна целевому сетевому входному размеру.
Нуль сосредотачивает изображения с помощью среднего значения набора данных 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
объект, который справляется с мини-пакетной обработкой наблюдений в пользовательском учебном цикле. minibatchqueue
возразите также бросает данные к dlarray
объект, который включает автоматическое дифференцирование в применении глубокого обучения.
Задайте пользовательскую функцию с именем пакетной обработки 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
функция.
Оцените градиенты модели с помощью dlfeval
функционируйте и networkGradients
функция помощника. Функциональный networkGradients
, перечисленный как функция поддержки, возвращает градиенты потери относительно настраиваемых параметров, соответствующей мини-пакетной потери и состояния текущего пакета.
Обновите сетевые параметры с помощью sgdmupdate
функция.
Обновите 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.
fasterRCNNLayers
(Computer Vision Toolbox) | dlfeval
| sgdmupdate
| transform
| insertObjectMask
(Computer Vision Toolbox) | dlarray
| dlnetwork
| FileDatastore
| roiAlignLayer
(Computer Vision Toolbox) | minibatchqueue