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

В приложении 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

В этом пути, matlabroot корень вашей папки MATLAB.

Сохраните классы источника данных, которые вы создаете к этой папке. В качестве альтернативы создайте свой собственный +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 с именем вашего пользовательского класса источника данных.

Class Properties

Классы источника данных должны задать эти абстрактные, постоянные свойства.

  • 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 класс. Этот метод выполняет эти действия.

  1. Проверяйте, что последовательность облака точек имеет правильное расширение, и сохраните информацию, запрошенную для чтения облаков точек в a fileDatastore объект.

  2. Установите Timestamp свойство объекта источника данных.

    • Если метки времени загружаются от переменной рабочей области (Timestamps = From workspace), затем метод устанавливает Timestamp к меткам времени, сохраненным в sourceParams входной параметр.

    • Если метки времени выведены из самой последовательности облака точек (Timestamps = Use Default), затем метод устанавливает Timestamp к a duration вектор секунд, с одной секундой на облако точек.

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

  4. Установите SignalName свойство к имени папки источника данных.

  5. Установите SignalType свойство к PointCloud тип сигнала.

  6. Установите 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 (Computer Vision Toolbox) функция.

        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

Смотрите также

Приложения

Классы

Объекты

Для просмотра документации необходимо авторизоваться на сайте