Выполните сегментацию экземпляра Используя маску R-CNN

В этом примере показано, как сегментировать отдельные экземпляры людей и автомобилей с помощью мультикласса Маска находящаяся в области сверточная нейронная сеть (R-CNN).

Сегментация экземпляра является методом компьютерного зрения, в котором вы обнаруживаете и локализуете объекты, одновременно генерирование сегментации сопоставляет для каждого из обнаруженных экземпляров.

Этот пример сначала показывает, как выполнить сегментацию экземпляра с помощью предварительно обученной Маски R-CNN, который обнаруживает два класса. Затем можно опционально загрузить набор данных и обучить Маску мультикласса R-CNN с помощью передачи обучения.

Примечание: Этот пример требует Модели Computer Vision Toolbox™ для Маски R-CNN. Можно установить Модель Computer Vision Toolbox для Маски R-CNN из Add-On Explorer. Для получения дополнительной информации об установке дополнений, смотрите, Получают и Управляют Дополнениями.

Выполните сегментацию экземпляра Используя предварительно обученную маску R-CNN

Загрузите предварительно обученную Маску 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 функция выполняет эти шаги предварительной обработки на входном изображении прежде, чем выполнить предсказание:

  1. Нуль сосредотачивает изображения с помощью среднего значения набора данных COCO.

  2. Измените размер изображения к входному размеру сети при поддержании соотношения сторон (добавление черных полос сверху и снизу).

[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];

Формат данные об аннотации COCO как файлы MAT

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!

Создание Datastore

Маска 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

Маска 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.

Смотрите также

Функции

Объекты

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте