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

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

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

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

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

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

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

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

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

Во-первых, создайте алгоритм семантической сегментации что дорога сегментов и пиксели неба в изображении. Семантическая Сегментация Используя пример Глубокого обучения описывает, как обучить нейронную сеть для глубокого обучения семантической сегментации. Эта сеть была обучена, чтобы предсказать 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
Downloading pretrained SegNet (107 MB)...

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

% 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)
ans = 11×1 cell
    {'Sky'       }
    {'Building'  }
    {'Pole'      }
    {'Road'      }
    {'Pavement'  }
    {'Tree'      }
    {'SignSymbol'}
    {'Fence'     }
    {'Car'       }
    {'Pedestrian'}
    {'Bicyclist' }

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

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

Включите этот алгоритм семантической сегментации в рабочий процесс автоматизации приложения путем создания класса, который наследовался абстрактному базовому классу vision.labeler.AutomationAlgorithm. Этот базовый класс задает API что использование приложения, чтобы сконфигурировать и запустить алгоритм. Приложение Ground Truth Labeler обеспечивает удобный способ получить первоначальный шаблон класса автоматизации. Для получения дополнительной информации смотрите, Создают Алгоритм Автоматизации для Маркировки. 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'запущенный, и '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, algObj.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.