Автоматизируйте разметку достоверных данных контуров маршрута

Этот пример показывает, как разработать алгоритм для автоматизированной маркировки контуров маршрута в приложении Ground Truth Labeler.

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

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

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

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

configData = load('birdsEyeConfig');
sensor     = configData.birdsEyeConfig.Sensor;
monoSensor = helperMonoSensor(sensor);
I          = imread('road.png');

sensorOut = processFrame(monoSensor, I);
lb = sensorOut.leftEgoBoundary;
figure
IwithLane = insertLaneBoundary(I, lb, sensor, [3 30], 'Color', 'blue');
imshow(IwithLane);
title('Detected Left Lane Boundary Model');

Граничные точки Марка Лейна

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

ROI      = [3 30];
xPoints  = [3 3.5 4 5 7 12 30]'; % More dense closer to the vehicle
yPoints  = lb.computeBoundaryModel(xPoints);

% Find corresponding image locations
boundaryPointsOnImage = vehicleToImage(sensor, [xPoints, yPoints]);

imshow(I)
hold on
plot(boundaryPointsOnImage(:,1), boundaryPointsOnImage(:,2),...
    'o',...
    'MarkerEdgeColor','b',...
    'MarkerFaceColor','b',...
    'MarkerSize',10)
title('Automatically Marked Lane Boundary Points');
hold off

Подготовьте класс автоматизации обнаружения маршрута

Чтобы включить этот алгоритм обнаружения маршрута в рабочий процесс автоматизации приложения, создайте класс, который наследовал от абстрактного базового класса vision.labeler.AutomationAlgorithm. Этот базовый класс задает свойства и подписи для методов, которые приложение использует для конфигурирования и выполнения пользовательского алгоритма. Приложение Ground Truth Labeler обеспечивает удобный способ получить первоначальный шаблон класса автоматизации. Для получения дополнительной информации смотрите, Создают Алгоритм Автоматизации для Маркировки (Computer Vision Toolbox). Класс AutoLaneMarking базируется прочь этого шаблона и предоставляет вам готовый к использованию класс автоматизации для обнаружения маршрута. Комментарии схемы класса основные шаги должны были реализовать каждый вызов API.

Шаг 1 содержит свойства, которые задают имя и описание алгоритма и направления для использования алгоритма.

   %----------------------------------------------------------------------
   % Step 1: Define required properties describing the algorithm. This
   %         includes Name, Description, and UserDirections.
   properties(Constant)
       % Name: Give a name for your algorithm.
       Name = 'Lane Detector';
       % Description: Provide a one-line description for your algorithm.
       Description = 'Automatically detect lane-like features';
       % UserDirections: Provide a set of directions that are displayed
       %                 when this algorithm is invoked. The directions
       %                 are to be provided as a cell array of character
       %                 vectors, with each element of the cell array
       %                 representing a step in the list of directions.
       UserDirections = {...
           'Load a MonoCamera configuration object from the workspace using the settings panel',...
           'Specify additional parameters in the settings panel',...
           'Run the algorithm',...
           'Manually inspect and modify results if needed'};
   end

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

   %---------------------------------------------------------------------
   % Step 2: Define properties to be used during the algorithm. These are
   % user-defined properties that can be defined to manage algorithm
   % execution.
   properties
       %MonoCamera
       %  The monoCamera object associated with this video
       MonoCamera          = [];
       %MonoCameraVarname
       %  The workspace variable name of the monoCamera object
       MonoCameraVarname   = '';
       %BirdsEyeConfig
       %  The birdsEyeView object needed to create the bird's-eye view
       BirdsEyeConfig      = [];
       %MaxNumLanes
       %  The maximum number of lanes the algorithm tries to annotate
       MaxNumLanes         = 2;
       %ROI
       %  The region of interest around the vehicle used to search for
       %  lanes
       ROI            = [3, 30, -3, 3];
       %LaneMaskSensitivity
       %  The sensitivity parameter used in the segmentLaneMarkerRidge function
       LaneMaskSensitivity = 0.25;
       %LaneBoundaryWidth
       %  The lane boundary width, used in findParabolicLaneBoundaries
       LaneBoundaryWidth   = 0.6;
       %XPoints
       %  The x-axis points along which to mark the lane boundaries
       XPoints             = [3 3.5 4 4.5 5 6 7 10 30];
   end

Шаг 3 имеет дело с функциональными определениями. Первая функция, checkLabelDefinition, гарантирует, что только метки соответствующего типа включены для автоматизации. Для обнаружения маршрута необходимо гарантировать, что только метки типа, который включен Line, таким образом, эта версия функции проверяет Type меток:

       function TF = checkLabelDefinition(~, labelDef)
           % Lane detection only works with Line type labels
           TF = labelDef.Type == labelType.Line;
       end

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

       function TF = checkSetup(algObj, ~)
           % This is the only required input
           TF = ~isempty(algObj.MonoCamera);
       end

Затем, функция settingsDialog получает и изменяет свойства, заданные на Шаге 2. Этот вызов API позволяет вам создать диалоговое окно, которое открывается, когда пользователь нажимает кнопку Settings во вкладке Automate. Чтобы создать это диалоговое окно, используйте функцию inputdlg, чтобы быстро создать простое модальное окно, чтобы попросить, чтобы пользователь задал объект monoCamera. Следующий отрывок кода обрисовывает в общих чертах базовый синтаксис. Полный код AutoLaneMarking расширяет эту логику и также добавляет шаги контроля ввода.

   % Describe the inputs
   prompt = {...
       'Enter the MonoCamera variable name',...
       'Maximum number of Lanes',...
       };
   defaultAnswer = {...
       '',...
       num2str(2),...
       };
   % Create an input dialog
   name = 'Settings for lane detection';
   numLines = 1;
   options.Resize      = 'on';
   options.WindowStyle = 'normal';
   options.Interpreter = 'none';
   answer = inputdlg(prompt,name,numLines,defaultAnswer,options);
   % Obtain the inputs
   monoCameraVarname = answer{1};
   maxNumberOfLanes  = answer{2};

Шаг 4 задает функции выполнения. Некоторые алгоритмы автоматизации должны реализовать стандартную программу initialize, чтобы заполнить начальное состояние алгоритма на основе существующих меток в приложении. Этот алгоритм обнаружения маршрута работает над каждым кадром независимо, таким образом, версия по умолчанию шаблона была обрезана, чтобы не принять меры.

       function initialize(~, ~, ~)
       end

Затем, функция run задает базовый алгоритм обнаружения маршрута этого класса автоматизации. run требуется каждый кадр видео и ожидает, что класс автоматизации возвратит набор меток. Функция run в AutoLaneMarking содержит логику, введенную ранее для обнаружения маршрута и преобразования в точки. Код от helperMonoSensor также был свернут в для более компактной ссылки.

       function autoLabels = run(algObj, I)
           Ig = rgb2gray(I);
           birdsEyeViewImage = transformImage(algObj.BirdsEyeConfig, Ig);
           birdsEyeViewBW    = segmentLaneMarkerRidge(birdsEyeViewImage, ...
               algObj.BirdsEyeConfig, algObj.LaneBoundaryWidth, ...
               'Sensitivity', algObj.LaneMaskSensitivity);
           % Obtain lane candidate points in world coordinates
           [imageX, imageY] = find(birdsEyeViewBW);
           boundaryPointsxy = imageToVehicle(algObj.BirdsEyeConfig, [imageY, imageX]);
           % Fit requested number of boundaries to it
           lbs = findParabolicLaneBoundaries(...
               boundaryPointsxy,algObj.LaneBoundaryWidth, ...
               'MaxNumBoundaries',algObj.MaxNumLanes);
           numDetectedLanes = numel(lbs);
           % Convert the model to discrete set of points at the specified
           % x coordinates
           boundaryPoints = cell(1,numDetectedLanes);
           xPoints = algObj.XPoints';
           for ind = 1:numel(lbs)
               yPoints             = lbs(ind).computeBoundaryModel(xPoints);
               boundaryPoints{ind} = vehicleToImage(algObj.MonoCamera, [xPoints, yPoints]);
           end
           % Package up the results in a table
           autoLabels = table(...
               boundaryPoints',...
               repmat(labelType.Line, [numDetectedLanes,1]),...
               repmat(algObj.SelectedLabelDefinitions.Name, [numDetectedLanes,1]));
           autoLabels.Properties.VariableNames = {'Position','Type','Name'};
       end

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

       function terminate(~)
       end

Используйте класс автоматизации AutoLaneMarking в приложении

Группированная версия алгоритма обнаружения маршрута теперь готова к употреблению в классе AutoLaneMarking. Использовать этот класс в приложении:

  • Создайте структуру папок, требуемую под текущей папкой, и скопируйте класс автоматизации в него.

     mkdir('+vision/+labeler');
     copyfile(fullfile(matlabroot,'toolbox','driving','drivingdemos','AutoLaneMarking.m'),'+vision/+labeler');
  • Загрузите информацию о monoCamera в рабочую область.

    configData = load('birdsEyeConfig');
    sensor   = configData.birdsEyeConfig.Sensor;
     groundTruthLabeler caltech_cordova1.avi
  • На левой панели нажмите Define новая кнопка метки ROI и задайте показанный стиль линии ROI. Затем нажмите ОК.

  • Нажмите Algorithm> Select Algorithm> список Refresh.

  • Нажмите Algorithm> Auto Lane Detection. Если вы не видите эту опцию, гарантируете, что текущая рабочая папка имеет папку под названием +vision/+labeler с файлом с именем AutoLaneMarking.m в ней.

  • Нажмите Automate. Новая вкладка откроется, отображая направления для использования алгоритма.

  • Нажмите Settings, и в диалоговом окне, которое открывается, введите sensor в первое текстовое поле. Измените другие параметры в случае необходимости перед нажатием "ОК".

  • Нажмите Run. Алгоритм обнаружения маршрута прогрессирует на видео. Заметьте, что результаты не являются удовлетворительными в некоторых кадрах.

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

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

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

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

Заключение

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

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

Приложения

Объекты

Похожие темы