В этом примере показано, как разработать алгоритм для автоматизированной маркировки контуров маршрута в приложении 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 обеспечивает удобный способ получить первоначальный шаблон класса автоматизации. Для получения дополнительной информации смотрите, Создают Алгоритм Автоматизации для Маркировки. 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
класс. Использовать этот класс в приложении:
Создайте структуру папок, требуемую под текущей папкой, и скопируйте класс автоматизации в него.
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. Можно расширить эту концепцию к другим пользовательским алгоритмам, чтобы упростить и расширить функциональность приложения.