Этот пример показывает, как разработать алгоритм для автоматизированной маркировки контуров маршрута в приложении 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
Чтобы включить этот алгоритм обнаружения маршрута в рабочий процесс автоматизации приложения, создайте класс, который наследовал от абстрактного базового класса
. Этот базовый класс задает свойства и подписи для методов, которые приложение использует для конфигурирования и выполнения пользовательского алгоритма. Приложение Ground Truth Labeler обеспечивает удобный способ получить первоначальный шаблон класса автоматизации. Для получения дополнительной информации смотрите, Создают Алгоритм Автоматизации для Маркировки (Computer Vision Toolbox). Класс vision.labeler.AutomationAlgorithm
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
. Использовать этот класс в приложении:
Создайте структуру папок, требуемую под текущей папкой, и скопируйте класс автоматизации в него.
mkdir('+vision/+labeler'); copyfile(fullfile(matlabroot,'toolbox','driving','drivingdemos','AutoLaneMarking.m'),'+vision/+labeler');
Загрузите информацию
в рабочую область.о monoCamera
configData = load('birdsEyeConfig'); sensor = configData.birdsEyeConfig.Sensor;
Откройте приложение Ground Truth Labeler.
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. Можно расширить эту концепцию к другим пользовательским алгоритмам, чтобы упростить и расширить функциональность приложения.