Автоматизируйте разметку достоверных данных для семантической сегментации

Этот пример показывает, как использовать предварительно обученный семантический алгоритм сегментации, чтобы сегментировать небо и дорогу в изображении, и использовать этот алгоритм, чтобы автоматизировать разметку достоверных данных в приложении Ground Truth Labeler.

Приложение Ground Truth Labeler

Хорошие наземные данные об истине крайне важны для разработки автоматизированных ведущих алгоритмов и оценки их производительности. Однако создание и поддержание разнообразного и высококачественного набора аннотируемых ведущих данных требуют значительного усилия. Приложение Ground Truth Labeler делает этот процесс легким и эффективным. Это приложение включает функции, чтобы аннотировать объекты как прямоугольники, строки или пиксельные метки. Пиксельная маркировка является процессом, в котором каждый пиксель в изображении присвоен класс или категория, которая может затем использоваться, чтобы обучить алгоритм сегментации пиксельного уровня. Несмотря на то, что можно использовать приложение, чтобы вручную маркировать все данные, этот процесс требует существенного количества времени и ресурсов, специально для пиксельной маркировки. Как альтернатива, приложение также служит основой, чтобы включить алгоритмы, чтобы расширить и автоматизировать процесс маркировки. Можно использовать алгоритмы, которые вы создаете, чтобы автоматически маркировать целые наборы данных, и затем закончиться более эффективным, более коротким ручным шагом верификации. Можно также отредактировать результаты шага автоматизации составлять сложные сценарии, которые может пропустить алгоритм.

В этом примере вы будете:

  • Используйте предварительно обученный алгоритм сегментации, чтобы сегментировать пиксели, которые принадлежат категориям 'Дорога' и 'Небо'.

  • Создайте алгоритм автоматизации, который может использоваться в приложении Ground Truth Labeler, чтобы автоматически маркировать пиксели дороги и неба.

Эти наземные данные об истине могут затем использоваться, чтобы обучить новую семантическую сеть сегментации или переобучить существующую.

Создайте алгоритм обнаружения дороги и неба

Во-первых, создайте семантический алгоритм сегментации что дорога сегментов и пиксели неба в изображении. Семантическая Сегментация Используя Глубокое обучение (Computer Vision Toolbox), который описывает пример, как обучить нейронную сеть для глубокого обучения семантической сегментации. Эта сеть была обучена, чтобы предсказать 11 классов семантических меток включая 'Дорогу' и 'Небо'. Производительность этих сетей зависит от того, насколько generalizable они. Применение сетей к ситуациям, с которыми они не сталкивались во время обучения, может привести к результатам ниже среднего. Итеративно вводящие пользовательские данные тренировки к процессу обучения могут заставить сеть выполнить лучше на подобных наборах данных.

Загрузите сеть, которая была предварительно обучена на наборе данных CamVid [1] [2] из Кембриджского университета.

pretrainedURL = 'https://www.mathworks.com/supportfiles/vision/data/segnetVGG16CamVid.mat';
pretrainedFolder = fullfile(tempdir,'pretrainedSegNet');
pretrainedSegNet = fullfile(pretrainedFolder,'segnetVGG16CamVid.mat');
if ~exist(pretrainedSegNet,'file')
    if ~exist(pretrainedFolder,'dir')
        mkdir(pretrainedFolder);
    end
    disp('Downloading pretrained SegNet (107 MB)...');
    websave(pretrainedSegNet,pretrainedURL);
end

Сегментируйте изображение и отобразите его.

% Load the semantic segmentation network
data = load(pretrainedSegNet);

% Load a test image from drivingdata
roadSequenceData = fullfile(toolboxdir('driving'), 'drivingdata', 'roadSequence');
I = imread(fullfile(roadSequenceData, 'f00000.png'));

% Run the network on the image
automatedLabels = semanticseg(I, data.net);

% Display the labels overlaid on the image, choosing relevant categories
figure, imshow(labeloverlay(I, automatedLabels, 'IncludedLabels', ["Sky", "Road"]));

Вывод сети представлен в MATLAB как категориальная матрица. Перечисленные категории включают все те, которые семантическая сеть сегментации была обучена на, не только категории, существующие в выводе. Эта информация также доступна от самого сетевого объекта.

  data.net.Layers(end).ClassNames
% List categories of pixels labeled
categories(automatedLabels)

% The blue overlay indicates the 'Sky' category, and the green overlay
% indicates 'Road'.
ans =

  11×1 cell array

    {'Sky'       }
    {'Building'  }
    {'Pole'      }
    {'Road'      }
    {'Pavement'  }
    {'Tree'      }
    {'SignSymbol'}
    {'Fence'     }
    {'Car'       }
    {'Pedestrian'}
    {'Bicyclist' }

Рассмотрите пиксельный класс автоматизации сегментации

Включите этот семантический алгоритм сегментации в рабочий процесс автоматизации приложения путем создания класса, который наследовал от абстрактного базового класса vision.labeler.AutomationAlgorithm. Этот базовый класс задает API что использование приложения, чтобы сконфигурировать и запустить алгоритм. Приложение Ground Truth Labeler обеспечивает удобный способ получить первоначальный шаблон класса автоматизации. Для получения дополнительной информации смотрите, Создают Алгоритм Автоматизации для Маркировки (Computer Vision Toolbox). Класс RoadAndSkySegmentation основан на этом шаблоне и обеспечивает готовый к использованию класс автоматизации для пиксельной сегментации метки.

Первый набор свойств в классе RoadAndSkySegmentation задает имя алгоритма, предоставляет краткое описание его и дает направления для использования его.

   properties(Constant)
       %Name
       %   Character vector specifying name of algorithm.
       Name = 'RoadAndSkySegmentation'
       %Description
       %   Character vector specifying short description of algorithm.
       Description = 'This algorithm uses semanticseg with a pretrained network to annotate roads and sky'
       %UserDirections
       %   Cell array of character vectors specifying directions for
       %   algorithm users to follow in order to use algorithm.
       UserDirections = {...
           ['Automation algorithms are a way to automate manual labeling ' ...
           'tasks. This AutomationAlgorithm automatically creates pixel ', ...
           'labels for road and sky.'], ...
           ['Review and Modify: Review automated labels over the interval ', ...
           'using playback controls. Modify/delete/add ROIs that were not ' ...
           'satisfactorily automated at this stage. If the results are ' ...
           'satisfactory, click Accept to accept the automated labels.'], ...
           ['Accept/Cancel: If results of automation are satisfactory, ' ...
           'click Accept to accept all automated labels and return to ' ...
           'manual labeling. If results of automation are not ' ...
           'satisfactory, click Cancel to return to manual labeling ' ...
           'without saving automated labels.']};
   end

Следующий раздел класса RoadAndSkySegmentation задает пользовательские свойства, необходимые основному алгоритму. Свойство PretrainedNetwork содержит предварительно обученную сеть. Свойство AllCategories содержит имена этих трех категорий.

   properties
       % PretrainedNetwork saves the SeriesNetwork object that does the semantic
       % segmentation.
       PretrainedNetwork
       % Categories holds the default 'background', 'road', and 'sky'
       % categorical types.
       AllCategories = {'background'};
       % Store names for 'road' and 'sky'.
       RoadName
       SkyName
   end

checkLabelDefinition, первый метод, заданный в RoadAndSkySegmentation, проверяет, что только метки типа PixelLabel включены для автоматизации. PixelLabel является единственным типом, необходимым для семантической сегментации.

       function TF = checkLabelDefinition(~, labelDef)
           isValid = false;
           if (strcmpi(labelDef.Name, 'road') && labelDef.Type == labelType.PixelLabel)
               isValid = true;
               algObj.RoadName = labelDef.Name;
               algObj.AllCategories{end+1} = labelDef.Name;
           elseif (strcmpi(labelDef.Name, 'sky') && labelDef.Type == labelType.PixelLabel)
               isValid = true;
               algObj.SkyName = labelDef.Name;
               algObj.AllCategories{end+1} = labelDef.Name;
           elseif(labelDef.Type == labelType.PixelLabel)
               isValid = true;
           end
       end

Следующий набор функций управляет осуществлением алгоритма. Класс vision.labeler.AutomationAlgorithm включает интерфейс, который содержит методы как 'initialize', 'run' и 'terminate' для подготовки и выполнения автоматизации легко. Функция initialize заполняет начальное состояние алгоритма на основе существующих меток в приложении. В классе RoadAndSkySegmentation функция initialize была настроена, чтобы загрузить предварительно обученную семантическую сеть сегментации от tempdir и сохранить его в свойство PretrainedNetwork.

       function initialize(algObj, ~, ~)
           % Point to tempdir where pretrainedSegNet was downloaded.
           pretrainedFolder = fullfile(tempdir,'pretrainedSegNet');
           pretrainedSegNet = fullfile(pretrainedFolder,'segnetVGG16CamVid.mat');
           data = load(pretrainedSegNet);
           % Store the network in the 'PretrainedNetwork' property of this object.
           algObj.PretrainedNetwork = data.net;
       end

Затем, функция run задает базовый семантический алгоритм сегментации этого класса автоматизации. run называется для каждого кадра видео и ожидает, что класс автоматизации возвратит набор меток. Функция run в RoadAndSkySegmentation содержит логику, введенную ранее для создания категориальной матрицы пиксельных меток, соответствующих "Дороге" и "Небу". Это может быть расширено к любым категориям, сеть обучена на и ограничивается этими двумя для рисунка только.

       function autoLabels = run(algObj, I)
           % Setup categorical matrix with categories including road and
           % sky
           autoLabels = categorical(zeros(size(I,1), size(I,2)),0:2,algObj.AllCategories,'Ordinal',true);
           pixelCat = semanticseg(I, this.PretrainedNetwork);
           if ~isempty(pixelCat)
               % Add the selected label at the bounding box position(s)
               autoLabels(pixelCat == "Road") = algObj.RoadName;
               autoLabels(pixelCat == "Sky") = algObj.SkyName;
           end
       end

Этот алгоритм не требует никакой очистки, таким образом, функция terminate пуста.

Используйте пиксельный класс автоматизации сегментации в приложении

Свойства и методы, описанные в предыдущем разделе, были реализованы в файле класса алгоритма автоматизации RoadAndSkySegmentation. Использовать этот класс в приложении:

  • Создайте структуру папок +vision/+labeler, требуемый под текущей папкой, и скопируйте класс автоматизации в него.

     mkdir('+vision/+labeler');
     copyfile('RoadAndSkySegmentation.m','+vision/+labeler');
  • Откройте приложение groundTruthLabeler с пользовательскими данными, чтобы маркировать. В целях рисунка откройте видео caltech_cordova1.avi.

     groundTruthLabeler caltech_cordova1.avi
  • На левой панели нажмите Define новая кнопка метки ROI и задайте две метки ROI с именами Road и Sky типа Pixel label как показано.

  • Нажмите Algorithm> Select Algorithm> список Refresh.

  • Нажмите Algorithm> RoadAndSkySegmentation. Если вы не видите эту опцию, гарантируете, что текущая рабочая папка имеет папку под названием +vision/+labeler с файлом с именем RoadAndSkySegmentation.m в ней.

  • Нажмите Automate. Новая панель открывается, отображая направления для использования алгоритма.

  • Нажмите Run. Созданный алгоритм выполняется на каждом кадре видео, сегментируя категории "Дороги" и "Неба". После того, как выполнение завершается, используйте ползунок или клавиши со стрелками, чтобы просмотреть видео путем прокрутки и проверить результат алгоритма автоматизации.

  • Очевидно, что области вне поля зрения камеры неправильно маркированы как "Небо", и части самого автомобиля, оборудованного датчиком отмечены как "Дорога". Эти результаты показывают, что сеть не была ранее обучена на таких данных. Этот рабочий процесс допускает создание ручных исправлений к этим результатам, так, чтобы итеративный процесс обучения и маркирующий (иногда названный активным изучением или человеком в цикле) мог использоваться, чтобы далее совершенствовать точность сети на пользовательских наборах данных. Можно вручную настроить результаты при помощи кисти во вкладке Label Pixels и добавляющих или удаляющих пиксельных аннотациях. Другие инструменты как заливка и умные полигоны также доступны во вкладке Label Pixels и могут использоваться в надлежащих случаях.

  • Если вы удовлетворены пиксельными категориями метки для целого видео, нажимаете кнопку Принять.

Автоматизация для пиксельной маркировки для видео завершена. Можно теперь возобновить маркировку других предметов интереса, сохранить сеанс или экспортировать результаты этой запущенной маркировки.

Заключение

Этот пример показал, как использовать предварительно обученную семантическую сеть сегментации, чтобы ускорить маркировку пикселей дороги и неба в приложении Ground Truth Labeler с помощью интерфейса AutomationAlgorithm.

Ссылки

  1. Brostow, Габриэль Дж., Джейми Шоттон, Жюльен Фокер и Роберто Сиполья. "Сегментация и распознавание Используя структуру от облак точек движения". ECCV. 2008.

  2. Brostow, Габриэль Дж., Жюльен Фокер и Роберто Сиполья. "Семантические классы объектов в видео: наземная база данных истины высокой четкости". Буквы распознавания образов. 2008.

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

Приложения

Объекты

Похожие темы