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

В этом примере показано, как разработать алгоритм для автоматизированной маркировки контуров маршрута в приложении 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');

Figure contains an axes. The axes with title Detected Left Lane Boundary Model contains an object of type image.

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

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

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

Figure contains an axes. The axes with title Automatically Marked Lane Boundary Points contains 2 objects of type image, line.

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

Чтобы включить этот алгоритм обнаружения маршрута в рабочий процесс автоматизации приложения, создайте класс, который наследовался абстрактному базовому классу vision.labeler.AutomationAlgorithm. Этот базовый класс задает свойства и подписи для методов, которые приложение использует для конфигурирования и выполнения пользовательского алгоритма. Приложение Ground Truth Labeler обеспечивает удобный способ получить первоначальный шаблон класса автоматизации. Для получения дополнительной информации смотрите, Создают Алгоритм Автоматизации для Маркировки. 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 = im2gray(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. Можно расширить эту концепцию к другим пользовательским алгоритмам, чтобы упростить и расширить функциональность приложения.

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

Приложения

Объекты

Похожие темы