В этом примере показано, как использовать предварительно обученный алгоритм семантической сегментации, чтобы сегментировать небо и дорогу в изображении, и использовать этот алгоритм, чтобы автоматизировать разметку достоверных данных в приложении 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'.
Включите этот алгоритм семантической сегментации в рабочий процесс автоматизации приложения путем создания класса, который наследовался абстрактному базовому классу 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'
запущенный
, и '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
интерфейс.
Brostow, Габриэль Дж., Джейми Шоттон, Жюльен Фокер и Роберто Сиполья. "Сегментация и распознавание Используя структуру от облаков точек движения". ECCV. 2008.
Brostow, Габриэль Дж., Жюльен Фокер и Роберто Сиполья. "Семантические классы объектов в видео: база данных основной истины высокой четкости". Буквы распознавания образов. 2008.