exponenta event banner

Маркировка объектов с помощью полигонов

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

Сведения о метках полигонов

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

  • Семантические сети сегментации с использованием матрицы меток H-by-W. При использовании полигонов сохраняется порядок создания или изменения порядка меток (с помощью Send to Back и Bring to Front опции). Семантическая сегментация требует пиксельной карты изображения с метками. Для этого необходимо выровнять метки (потеряв слоистый порядок меток). Представьте, что все многоугольные метки являются непрозрачными и сохраняют все заполненные области в виде матрицы меток.

  • Сети сегментации экземпляров с использованием стека масок H-by-W-by-NumObjects.

  • Необработанные многоугольники в массиве NumObjects-by-1 ячеек, где каждая ячейка содержит M-by-2 точки.

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

Загрузить немаркированные данные

Можно загрузить изображения, хранящиеся в хранилище данных, из папки или загрузить предыдущий сеанс работы с метками. Изображения должны быть доступны для чтения imread. В этом примере выполняется загрузка данных, содержащих ряд транспортных средств, включая лодки, танкер и самолет.

Программная загрузка данных

Используйте этот процесс для программной загрузки изображений из хранилища данных:

  1. Создание хранилища данных из папки изображений. Например, при наличии папки с именем «лодки», содержащей изображения, можно создать хранилище данных изображений с этим кодом.

    imageFolder = fullfile(toolboxdir('vision'),'visiondata','boats');
    imds = imageDatastore(imageFolder);

  2. Загрузите хранилище данных в приложение Image Labeler:

    imageLabeler(imds);

Можно также загрузить папку изображений непосредственно в Image Labeler:

imageFolder = fullfile(toolboxdir('vision'),'visiondata','boats');
imageLabeler(imageFolder);

Загрузка данных непосредственно из приложения

Щелкните Импорт (Import), чтобы загрузить изображения, или Открыть сессию (Open Session), чтобы открыть сохраненную сессию.

Создание меток полигонов

Создайте многоугольники для парусников, танкеров и самолетов.

  1. На панели «Метки окупаемости инвестиций» слева нажмите «Метка».

  2. Выберите Polygon тип метки и ее имя Sailboat.

  3. При необходимости можно изменить цвет метки, щелкнув цвет предварительного просмотра.

  4. Нажмите кнопку ОК.

    На панели «ROI Labels» появится этикетка парусника.

  5. Повторите шаги 1-4 для создания этикетки танкера и этикетки самолета. Можно переместить метку в списке, щелкнув ее левой кнопкой мыши и перетащив вверх или вниз.

Рисование меток окупаемости инвестиций полигона

  1. Выберите этикетку парусника, а затем с помощью мыши нарисуйте полигон ROI вокруг каждого из парусников.

  2. Выберите этикетку танкера и нарисуйте полигон окупаемости инвестиций вокруг танкера.

  3. Выберите метку «Самолет» и нарисуйте вокруг самолета окупаемость инвестиций в многоугольник.

    Sailboats, tanker, and airplane labeled with polygons

Изменение настроек полигона и порядка укладки

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

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

  1. Чтобы изменить цвет метки окупаемости инвестиций самолета, щелкните правой кнопкой мыши значок Airplane на панели «Метки ROI» и выберите «Редактировать метку». Щелкните предварительный просмотр цвета и выберите цвет.

  2. Чтобы отобразить имена меток ROI при создании меток, выберите Всегда (Always) в меню Показать метки ROI (Show ROI Labels) в разделе Вид (View).

  3. Чтобы увеличить непрозрачность метки, используйте ползунок «Полигон» в разделе «Непрозрачность метки». Увеличение непрозрачности помогает распознать, какие метки находятся перед или за другими метками в сцене.

    All objects have complete opacity

  4. Этикетка танкера находится перед этикеткой парусника, но она должна быть за ней. Положение влияет на порядок укладки в экспортируемой истинной основе. Чтобы изменить порядок укладки, щелкните правой кнопкой мыши метку окупаемости инвестиций танкера в сцене и выберите «Отправить обратно».

    Tanker appears behind sailboat in the scene

  5. Для просмотра экземпляров меток окупаемости инвестиций выберите By Instance из раскрывающегося меню «ROI Color» в разделе «View».

    Each object is a different color

  6. Экспортируйте помеченные данные истинности основания, щелкнув Экспорт (Export) и выбрав В рабочую область (To Workspace). Имя файла MAT с данными о истинности земли gTruth.

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

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

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

ШагОписаниеПроцедура

1 - Отображение достоверных данных о земле

Экспортированный объект истинности основания содержит данные для пяти объектов и трех определений.

Войти gTruth в командной строке MATLAB ®.

>> gTruth

gTruth = 

  groundTruth with properties:

          DataSource: [1×1 groundTruthDataSource]
    LabelDefinitions: [3×5 table]
           LabelData: [1×3 table]

2 - Получение данных полигона

Свойство LabelData группирует данные по имени метки. Sailboat массив ячеек метки содержит три элемента, Tanker массив ячеек содержит один элемент, и Airplane массив ячеек содержит один элемент.

Напечатать gTruth.LabelData.

>> gTruth.LabelData

ans =

  1×3 table

     Sailboat       Tanker       Airplane 
    __________    __________    __________

    {3×1 cell}    {1×1 cell}    {1×1 cell}

3 - Стек данных истинного полигона земли

Парусник и танкер перекрываются. Эта информация (относительный порядок пикселей) теряется в этом формате.

Используйте gatherLabelData объектная функция для группирования данных по типу метки. В результате получается одна таблица, содержащая пять объектов в виде стека.

Используйте gatherLabelData и сохранить выходные данные.

>> out = gatherLabelData(gTruth,[labelType.Polygon],'GroupLabelData','LabelType')

out =

  1×1 cell array

    {1×1 table}

Отображение содержимого таблицы.

>> out{1}.PolygonData
ans =

  1×1 cell array

    {5×2 cell}

4 - Просмотр данных истинности грунта по порядку глубины

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

Теперь, когда этикетки уплощены, в основании находится танкер, а парусник над ним перезаписывает танкер там, где они перекрываются.

Отображение данных полигона.

>> out{1}.PolygonData{1}

ans =

  5×2 cell array

    {12×2 double}    {'Airplane'}
    { 6×2 double}    {'Sailboat'}
    { 7×2 double}    {'Sailboat'}
    {13×2 double}    {'Sailboat'}
    { 9×2 double}    {'Tanker'  }

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

ШагОписаниеПроцедура

1 - Создание карты идентификаторов меток

Создайте карту, связывающую имена классов с идентификаторами классов.

classNames = {'Airplane','Sailboat','Tanker'};
classIds = 1:numel(classNames);

labelIDMap = containers.Map(classNames,classIds);

2 - Извлечь полигоны

Извлеките координаты полигона и метки полигона из структуры вывода.

polygons = out{1}.PolygonData{1}(:,1);
polygonLabels = out{1}.PolygonData{1}(:,2);

3 - Сведение многоугольников к семантической карте сегментации

Преобразуйте имена меток в идентификаторы.

Преобразование координат полигона в семантическую карту сегментации.

polygonLabelIDs = cellfun(@(x)labelIDMap(x),polygonLabels);
 
imageSize = [645 916]; % size(boats_im)
outputIm = poly2label(polygons,polygonLabelIDs,imageSize);

Преобразование данных полигона для сегментации экземпляров

ШагОписаниеПроцедура

Предварительное выделение стека масок для сегментации

Предварительно распределите набор масок высотой и шириной, равными размерам изображения, и глубиной канала, равной количеству многоугольников.
polygons = out{1}.PolygonData{1}(:,1);
numPolygons = size(polygons,1);

imageSize = [645 916]; % size(boats_im)
maskStack = false([imageSize(1:2) numPolygons]);

Преобразование полигонов в маски экземпляров

Преобразуйте каждый полигон в отдельную маску и вставьте его в набор масок.

for i = 1:numPolygons
    maskStack(:,:,i) = poly2mask(polygons{i}(:,1), ...
                       polygons{i}(:,2),imageSize(1),imageSize(2));
end

См. также

Приложения

Функции

Объекты

Связанные темы