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

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

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

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

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

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

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

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

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

Во-первых, создайте семантический алгоритм сегментации, который сегментирует пиксели дороги и неба в изображении. Пример Semantic Segmentation Using Deep Learning описывает, как обучить нейронную сеть для глубокого обучения семантической сегментации. Эта сеть была обучена прогнозированию 11 классов семантических меток, включая 'Road' и 'Sky'. Эффективность этих сетей зависит от того, насколько они обобщаемы. Применение сетей к ситуациям, с которыми они не сталкивались во время обучения, может привести к результатам подгруппы. Итерационное введение пользовательских обучающих данных в процесс обучения может сделать сеть лучше работать с аналогичными наборами данных.

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

Следующий набор функций управляет выполнением алгоритма. The vision.labeler.AutomationAlgorithm класс включает интерфейс, содержащий такие методы, как 'initialize', 'run', и 'terminate' для простоты настройки и запуска автоматизации. The 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 вызывается для каждого видеокадра и ожидает, что класс автоматизации вернет набор меток. The run функция в RoadAndSkySegmentation содержит логику, введенную ранее для создания категориальной матрицы пиксельных меток, соответствующих «Road» и «Sky». Это может быть распространено на любые категории, в которых обучена сеть, и ограничено этими двумя для рисунка.

       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
  • На левой панели нажмите кнопку Задать новую метку ROI и задайте две метки информация только для чтения с именами Road и Sky, типа Pixel label как показано.

  • Щелкните Алгоритм > Выбрать Алгоритм > Обновить список.

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

  • Щелкните Автоматизировать (Automate). Откроется новая панель, отображающая направления для использования алгоритма.

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

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

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

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

Заключение

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

Ссылки

  1. Brostow, Gabriel J., Jamie Shotton, Julien Fauqueur, and Roberto Cipolla. «Сегментация и распознавание с использованием структуры из облаков точек движения». ECCV. 2008.

  2. Brostow, Gabriel J., Julien Fauqueur, and Roberto Cipolla. Semantic Object Classes in Video: A High-Definition Ground Truth Database (неопр.) (недоступная ссылка). Распознавание Букв. 2008.