В приложении Ground Truth Labeler можно пометить сигналы от источников данных облака точек и изображения. Эти источники включают видео, последовательности изображений, последовательности облака точек, пакетное получение Velodyne® (PCAP) файлы и rosbags. Чтобы загрузить источники данных, которые исходно не поддерживает приложение, можно создать класс, чтобы загрузить тот источник в приложение.
В этом примере показано, как использовать один из предопределенных классов источника данных, которые загружают сигналы от источников данных в приложение Ground Truth Labeler: vision.labeler.loading.PointCloudSequenceSource
класс. Приложение использует этот определенный класс, чтобы загрузить последовательности данных об облаке точек (PCD) или многоугольника (PLY) файлы от папки.
Чтобы начать, откройте vision.labeler.loading.PointCloudSequenceSource
класс. Используйте свойства и методы, описанные для этого класса, чтобы помочь вам записать свой собственный класс.
edit vision.labeler.loading.PointCloudSequenceSource
Приложение Ground Truth Labeler распознает классы источника данных, только если те файлы находятся в +vision/+labeler/+loading
папка, которая находится на пути поиска файлов MATLAB®.
vision.labeler.loading.PointCloudSequenceSource
класс и другие предопределенные классы источника данных хранятся в этой папке.
matlabroot\toolbox\vision\vision\+vision\+labeler\+loading
В этом пути,
корень вашей папки MATLAB.matlabroot
Сохраните классы источника данных, которые вы создаете к этой папке. В качестве альтернативы создайте свой собственный +vision/+labeler/+loading
папка, добавляет это к пути поиска файлов MATLAB и сохраняет ваш класс в эту папку.
Классы источника данных должны наследоваться vision.labeler.loading.MultiSignalSource
класс. Просмотрите определение класса для vision.labeler.loading.PointCloudSequenceSource
класс.
classdef PointCloudSequenceSource < vision.labeler.loading.MultiSignalSource
Когда вы загружаете сигнал последовательности облака точек в приложение Ground Truth Labeler, приложение создает экземпляр класса, то есть, PointCloudSequenceSource
объект. После маркировки этого сигнала в приложении, когда вы экспортируете метки, экспортируемый groundTruthMultisignal
объектно-ориентированная память этот PointCloudSequenceSource
объект в его DataSource
свойство.
При определении класса источника данных замените PointCloudSequenceSource
с именем вашего пользовательского класса источника данных.
Классы источника данных должны задать эти абстрактные, постоянные свойства.
Name
— Строковый скаляр, задающий тип источника данных
Description
— Строковый скаляр, описывающий класс
В приложении Ground Truth Labeler, когда вы загружаете сигналы от диалогового окна Add/Remove Signal, Name
строка появляется как опция в параметре Source Type. Этот рисунок показывает Name
строка для vision.labeler.loading.PointCloudSequenceSource
класс.
Description
строка не появляется в диалоговом окне. Однако оба Name
и Description
строки хранятся как свойства только для чтения в экземплярах этого класса.
Этот код показывает Name
и Property
строки для vision.labeler.loading.PointCloudSequenceSource
класс.
properties (Constant) Name = "Point Cloud Sequence" Description = "A PointCloud sequence reader" end
При определении класса источника данных задайте Name
и Description
значения свойств, чтобы совпадать с именем и описанием вашего пользовательского источника данных. Можно также задать любые дополнительные частные свойства, которые характерны для загрузки источника данных. Специфичные для источника свойства для vision.labeler.loading.PointCloudSequenceSource
класс не показывают в этом примере, но можно просмотреть их в файле класса.
В классах источника данных, customizeLoadPanel
метод управляет отображением панели для загрузки сигналов в диалоговом окне Add/Remove Signal приложения. Этой панелью является Panel
объект создается при помощи uipanel
функция. Панель содержит параметры и управляет, должен был загрузить сигналы от источников данных.
Этот рисунок показывает панель загрузки для vision.labeler.loading.PointCloudSequenceSource
класс. В списке Source Type, когда вы выбираете Point Cloud Sequence
, приложение вызывает customizeLoadPanel
метод и загрузки панель для последовательностей облака точек.
Этот код показывает customizeLoadPanel
метод для vision.labeler.loading.PointCloudSequenceSource
класс. Этот метод использует uicontrol
функция, чтобы задать текст, кнопки и параметры в панели.
function customizeLoadPanel(this, panel) this.Panel = panel; computePositions(this); this.FolderPathText = uicontrol('Parent', this.Panel,... 'Style', 'text',... 'String', 'Folder Name: ',... 'Position', this.FolderPathTextPos,... 'HorizontalAlignment', 'left',... 'Tag', 'fileText'); this.FolderPathBox = uicontrol('Parent', this.Panel,... 'Style', 'edit',... 'String', '',... 'Position', this.FolderPathBoxPos,... 'Tag', 'fileEditBox'); this.FolderTextBox = uicontrol('Parent', this.Panel,... 'Style', 'Text',... 'String', 'Only PCD/PLY files are supported.',... 'Position', this.FolderTextPos,... 'Tag', 'fileText'); this.FolderBrowseButton = uicontrol('Parent', this.Panel,... 'Style', 'togglebutton',... 'String', 'Browse',... 'Position', this.FolderBrowseButtonPos,... 'Callback', @this.browseButtonCallback,... 'Tag', 'browseBtn'); this.TimeStampsText = uicontrol('Parent', this.Panel,... 'Style', 'text',... 'String', 'Timestamps: ',... 'Position', this.TimeStampsTxtPos,... 'HorizontalAlignment', 'left',... 'Tag', 'timeStampTxt'); this.TimeStampsDropDown = uicontrol('Parent', this.Panel,... 'Style', 'popupmenu',... 'String', ["Use Default", "From Workspace"],... 'Position', this.TimeStampsDropDownPos,... 'Callback', @this.timeStampsDropDownCallback,... 'Tag', 'timeStampSourceSelectList'); this.TimeStampsNote = uicontrol('Parent', this.Panel,... 'Style', 'text',... 'String', 'Default timestamps = (0:numPointClouds-1) s',... 'Position', this.TimeStampsNotePos,... 'HorizontalAlignment', 'left',... 'Tag', 'timeStampNote'); end
При разработке этого метода или других методов источника данных, можно использовать статический метод loadPanelChecker
предварительно просматривать отображение и функциональность диалогового окна загрузки для вашего пользовательского источника данных. Этот метод не требует, чтобы у вас был сеанс приложения, открытый, чтобы использовать его. Например, используйте loadPanelChecker
метод с vision.labeler.loading.PointCloudSequence
класс.
vision.labeler.loading.PointCloudSequenceSource.loadPanelChecker
В диалоговом окне Add/Remove Signal, после того, как вы просматриваете сигнал, устанавливают необходимые параметры и нажимают Add Source, приложение вызывает эти два метода по очереди.
getLoadPanelData
— Введите в данные панель.
loadSource
— Загрузите данные в приложение.
Этот рисунок показывает отношение между этими методами и кнопкой Add Source при загрузке сигнала последовательности облака точек при помощи vision.labeler.loading.PointCloudSequenceSource
класс.
При определении пользовательского источника данных необходимо задать getLoadPanelData
метод, который возвращает эти выходные параметры.
sourceName
— Имя источника данных
sourceParams
— Структура, содержащая поля с информацией, запрошенной, чтобы загрузить источник данных
Этот код показывает getLoadPanelData
метод для vision.labeler.loading.PointCloudSequenceSource
класс. Этот метод устанавливает sourceName
к имени, введенному в параметре Folder Name диалогового окна и sourceParams
к пустой структуре. Если параметр Timestamps устанавливается на From Workspace
и имеет загруженные метки времени, затем приложение заполняет эту структуру с теми метками времени.
function [sourceName, sourceParams] = getLoadPanelData(this) sourceName = string(this.FolderPathBox.String); sourceParams = struct(); end
Необходимо также задать loadSource
метод в вашем пользовательском классе данных. Этот метод должен взять sourceName
и sourceParams
возвращенный в getLoadPanelData
метод как входные параметры. Этот метод должен также заполнить эти свойства, которые хранятся в экземпляре объекта источника данных, что приложение создает.
SignalName
— Идентификаторы строки для каждого сигнала в источнике данных
SignalType
— Массив vision.labeler.loading.SignalType
перечисления, задающие тип каждого сигнала в источнике данных
Timestamp
— Векторный массив или массив ячеек меток времени для каждого сигнала в источнике данных
SourceName
— Имя источника данных
SourceParams
— Структура, содержащая поля с информацией, запрошенной, чтобы загрузить источник данных
Этот код показывает loadSource
метод для vision.labeler.loading.PointCloudSequenceSource
класс. Этот метод выполняет эти действия.
Проверяйте, что последовательность облака точек имеет правильное расширение, и сохраните информацию, запрошенную для чтения облаков точек в fileDatastore
объект.
Установите Timestamp
свойство объекта источника данных.
Если метки времени загружаются от переменной рабочей области (Timestamps = From workspace
), затем метод устанавливает Timestamp
к меткам времени, сохраненным в sourceParams
входной параметр.
Если метки времени выведены из самой последовательности облака точек (Timestamps = Use Default
), затем метод устанавливает Timestamp
к duration
вектор секунд, с одной секундой на облако точек.
Подтвердите загруженную последовательность облака точек.
Установите SignalName
свойство к имени папки источника данных.
Установите SignalType
свойство к PointCloud
тип сигнала.
Установите SourceName
и SourceParams
свойства к sourceName
и sourceParams
выходные параметры, соответственно.
function loadSource(this, sourceName, sourceParams) % Load file ext = {'.pcd', '.ply'}; this.Pcds = fileDatastore(sourceName,'ReadFcn', @pcread, 'FileExtensions', ext); % Populate timestamps if isempty(this.Timestamp) if isfield(sourceParams, 'Timestamps') setTimestamps(this, sourceParams.Timestamps); else this.Timestamp = {seconds(0:1:numel(this.Pcds.Files)-1)'}; end else if ~iscell(this.Timestamp) this.Timestamp = {this.Timestamp}; end end import vision.internal.labeler.validation.* checkPointCloudSequenceAndTimestampsAgreement(this.Pcds,this.Timestamp{1}); % Populate signal names and types [~, folderName, ~] = fileparts(sourceName); this.SignalName = makeValidName(this, string(folderName), "pointcloudSequence_"); this.SignalType = vision.labeler.loading.SignalType.PointCloud; this.SourceName = sourceName; this.SourceParams = sourceParams; end
Последним требуемым методом, который необходимо задать, является readFrame
метод. Этот метод читает систему координат из сигнала, сохраненного в источнике данных. Приложение вызывает этот метод каждый раз, когда вы перешли к новой системе координат. Индекс к конкретной метке времени в Timestamp
свойство передается этому методу.
Этот код показывает readFrame
метод для vision.labeler.loading.PointCloudSequenceSource
класс. Метод читает системы координат из последовательности облака точек при помощи pcread
функция.
function frame = readFrame(this, signalName, index) if ~strcmpi(signalName, this.SignalName) frame = []; else frame = pcread(this.Pcds.Files{index}); end end
Можно также задать любые дополнительные частные свойства, которые характерны для загрузки источника данных. Специфичные для источника методы для vision.labeler.loading.PointCloudSequenceSource
класс не показывают в этом примере, но можно просмотреть их в файле класса.
Этот пример показал, как использовать vision.labeler.loading.PointCloudSequenceSource
класс, чтобы помочь вам создать свой собственный класс. Эта таблица показывает полный список классов источника данных, что можно использовать в качестве начальных точек для собственного класса.
Класс | Источник данных, загруженный классом | Команда, чтобы просмотреть исходный код класса |
---|---|---|
vision.labeler.loading.VideoSource | Видеофайл | edit vision.labeler.loading.VideoSource |
vision.labeler.loading.ImageSequenceSource | Папка последовательности изображений | edit vision.labeler.loading.ImageSequenceSource |
vision.labeler.loading.VelodyneLidarSource | Пакетное получение Velodyne (PCAP) файл | edit vision.labeler.loading.VelodyneLidarSource |
vision.labeler.loading.RosbagSource | Файл Rosbag | edit vision.labeler.loading.RosbagSource |
vision.labeler.loading.PointCloudSequenceSource | Папка последовательности облака точек | edit vision.labeler.loading.PointCloudSequenceSource |
vision.labeler.loading.CustomImageSource | Формат пользовательского изображения | edit vision.labeler.loading.CustomImageSource |