Этот пример показывает, как разработать обнаружение автомобиля и алгоритм оценки расстояния и использовать его, чтобы автоматизировать маркировку с помощью приложения Ground Truth Labeler. В этом примере вы будете учиться как:
Разработайте алгоритм компьютерного зрения, чтобы обнаружить автомобили в видео и использовать монокулярную настройку камеры, чтобы оценить расстояния до обнаруженных автомобилей.
Используйте API AutomationAlgorithm
, чтобы создать алгоритм автоматизации. Смотрите Создают Алгоритм Автоматизации для Маркировки (Computer Vision Toolbox) для деталей. Созданный алгоритм автоматизации может использоваться с приложением Ground Truth Labeler, чтобы автоматически маркировать автомобили, наряду с атрибутами, чтобы сохранить предполагаемые расстояния.
Хорошие наземные данные об истине крайне важны для разработки ведущих алгоритмов и оценки их производительности. Однако создание богатого и разнообразного набора аннотируемых ведущих данных требует значительного усилия. Приложение Ground Truth Labeler делает этот процесс эффективным. Можно использовать это приложение в качестве полностью ручного инструмента маркировки, чтобы отметить ограничительные рамки автомобиля, контуры маршрута и другие предметы интереса для автоматизированной ведущей системы. Можно также вручную задать атрибуты маркированных объектов. Однако ручная маркировка требует существенного количества времени и ресурсов. Как альтернатива, это приложение служит основой для создания алгоритмов, чтобы расширить и автоматизировать процесс маркировки. Можно использовать алгоритмы, которые вы создаете, чтобы быстро маркировать целые наборы данных, автоматически аннотировать метки атрибутами, и затем развить его с более эффективным, более коротким ручным шагом верификации. Можно также отредактировать результаты шага автоматизации составлять сложные сценарии, которые может пропустить алгоритм автоматизации.
Этот пример описывает, как вставить обнаружение автомобиля и алгоритм автоматизации оценки расстояния в рабочий процесс автоматизации приложения. Этот пример снова использует алгоритм автоматизации Обнаружения Автомобиля ACF, чтобы сначала обнаружить автомобили и затем автоматически оценить расстояния обнаруженных автомобилей от камеры, смонтированной на автомобиле, оборудованном датчиком. Алгоритм затем создает метку для каждого обнаруженного автомобиля с атрибутом, задающим расстояние до автомобиля.
Во-первых, создайте алгоритм обнаружения автомобиля. Визуальное Восприятие Используя Монокулярный пример Камеры описывает, как создать предварительно обученный детектор автомобиля и сконфигурировать его, чтобы обнаружить ограничительные рамки автомобиля с помощью калиброванной монокулярной настройки камеры. Чтобы обнаружить автомобили, испытайте алгоритм на одном кадре видео.
% Read a frame of interest from a video. vidObj = VideoReader('05_highway_lanechange_25s.mp4'); vidObj.CurrentTime = 0.1; I = readFrame(vidObj); % Load the monoCamera object. data = load('FCWDemoMonoCameraSensor.mat', 'sensor'); sensor = data.sensor; % Load the pretrained detector for vehicles. detector = vehicleDetectorACF(); % Width of a common vehicle is between 1.5 to 2.5 meters. vehicleWidth = [1.5, 2.5]; % Configure the detector to take into account configuration of the camera % and expected vehicle width detector = configureDetectorMonoCamera(detector, sensor, vehicleWidth); % Detect vehicles and show the bounding boxes. [bboxes, ~] = detect(detector, I); Iout = insertShape(I, 'rectangle', bboxes); figure; imshow(Iout) title('Detected Vehicles')
Теперь, когда автомобили были обнаружены, оценочные расстояния до обнаруженных автомобилей от камеры в мировых координатах.
предоставляет monoCamera
метод
, чтобы преобразовать точки от координат изображений, чтобы транспортировать координаты. Это может использоваться, чтобы оценить расстояние вдоль земли от камеры до обнаруженных автомобилей. Пример задает расстояние как центральную точку обнаруженного автомобиля вдоль земли непосредственно ниже его.imageToVehicle
% Find the midpoint for each bounding box in image coordinates. midPtsImg = [bboxes(:,1)+bboxes(:,3)/2 bboxes(:,2)+bboxes(:,4)./2]; midPtsWorld = imageToVehicle(sensor, midPtsImg); x = midPtsWorld(:,1); y = midPtsWorld(:,2); distance = sqrt(x.^2 + y.^2); % Display vehicle bounding boxes and annotate them with distance in meters. distanceStr = cellstr([num2str(distance) repmat(' m',[length(distance) 1])]); Iout = insertObjectAnnotation(I, 'rectangle', bboxes, distanceStr); imshow(Iout) title('Distances of Vehicles from Camera')
Включите обнаружение автомобиля и класс автоматизации оценки расстояния в рабочий процесс автоматизации приложения. Смотрите Создают Алгоритм Автоматизации для Маркировки (Computer Vision Toolbox) для получения дополнительной информации. Начните с существующего алгоритма автоматизации Обнаружения Автомобиля ACF выполнять обнаружение автомобиля с калиброванной монокулярной камерой. Затем измените алгоритм, чтобы выполнить автоматизацию атрибута. В этом примере используйте расстояние автомобиля от камеры как атрибут обнаруженного автомобиля. В этом разделе описываются шаги для внесения изменений в существующий класс алгоритма автоматизации Обнаружения Автомобиля ACF.
Шаг 1 содержит свойства, которые задают имя и описание алгоритма и направления для использования алгоритма.
%-------------------------------------------------------------------- % Define algorithm Name, Description, and UserDirections. properties(Constant)
%Name: Algorithm Name % Character vector specifying name of algorithm. Name = 'Vehicle Detection and Distance Estimation';
% Description: Provide a one-line description for your algorithm. Description = 'Detect vehicles using a pretrained ACF vehicle detector and compute distance of detected vehicles from camera.';
% 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 = {... 'Define a rectangle ROI Label to label vehicles.',... 'For the label definition created, define an Attribute with name Distance, type Numeric Value and default value 0.', ... 'Run the algorithm',... 'Manually inspect and modify results if needed'}; end
Шаг 2 содержит пользовательские свойства, должен был поддержать обнаружение автомобиля и автоматизацию оценки расстояния
%-------------------------------------------------------------------- % Vehicle Detector Properties %-------------------------------------------------------------------- properties %SelectedLabelName Selected label name % Name of selected label. Vehicles detected by the algorithm will % be assigned this variable name. SelectedLabelName
%Detector Detector % Pretrained vehicle detector, an object of class % acfObjectDetector. Detector
%VehicleModelName Vehicle detector model name % Name of pretrained vehicle detector model. VehicleModelName = 'full-view';
%OverlapThreshold Overlap threshold % Threshold value used to eliminate overlapping bounding boxes % around the reference bounding box, between 0 and 1. The % bounding box overlap ratio denominator, 'RatioType' is set to % 'Min' OverlapThreshold = 0.65;
%ScoreThreshold Classification Score Threshold % Threshold value used to reject detections with low detection % scores. ScoreThreshold = 30;
%ConfigureDetector Boolean value to decide on configuring the detector % Boolean value which decides if the detector is configured using % monoCamera sensor. ConfigureDetector = true;
%SensorObj monoCamera sensor % Monocular Camera Sensor object used to configure the detector. % A configured detector will run faster and can potentially % result in better detections. SensorObj = [];
%SensorStr monoCamera sensor variable name % Monocular Camera Sensor object variable name used to configure % the detector. SensorStr = '';
%VehicleWidth Vehicle Width % Vehicle Width used to configure the detector, specified as % [minWidth, maxWidth] describing the approximate width of the % object in world units. VehicleWidth = [1.5 2.5];
%VehicleLength Vehicle Length % Vehicle Length used to configure the detector, specified as % [minLength, maxLength] describing the approximate length of the % object in world units. VehicleLength = [ ]; end
%-------------------------------------------------------------------- % Attribute automation Properties %-------------------------------------------------------------------- properties (Constant, Access = private)
% Flag to enable Distance attribute estimation automation AutomateDistanceAttriibute = true;
% Supported Distance attribute name. % The label must have an attribute with the name specified. SupportedDistanceAttribName = 'Distance'; end
properties (Access = private)
% Actual attribute name for distance DistanceAttributeName;
% Flag to check if attribute specified is a valid distance % attribute HasValidDistanceAttribute = false; end
Шаг 3 инициализирует свойства.
%-------------------------------------------------------------------- % Initialize sensor, detector and other relevant properties. function initialize(algObj, ~)
% Store the name of the selected label definition. Use this % name to label the detected vehicles. algObj.SelectedLabelName = algObj.SelectedLabelDefinitions.Name;
% Initialize the vehicle detector with a pretrained model. algObj.Detector = vehicleDetectorACF(algObj.VehicleModelName);
% Initialize parameters to compute vehicle distance if algObj.AutomateDistanceAttriibute initializeAttributeParams(algObj); end end
function initializeAttributeParams(algObj) % Initialize properties relevant to attribute automation.
% The label must have an attribute with name Distance and type % Numeric Value. hasAttribute = isfield(algObj.ValidLabelDefinitions, 'Attributes') && ... isstruct(algObj.ValidLabelDefinitions.Attributes); if hasAttribute attributeNames = fieldnames(algObj.ValidLabelDefinitions.Attributes); idx = find(contains(attributeNames, algObj.SupportedDistanceAttribName)); if ~isempty(idx) algObj.DistanceAttributeName = attributeNames{idx}; algObj.HasValidDistanceAttribute = validateDistanceType(algObj); end end end
function tf = validateDistanceType(algObj) % Validate the attribute type.
tf = isfield(algObj.ValidLabelDefinitions.Attributes, algObj.DistanceAttributeName) && ... isfield(algObj.ValidLabelDefinitions.Attributes.(algObj.DistanceAttributeName), 'DefaultValue') && ... isnumeric(algObj.ValidLabelDefinitions.Attributes.(algObj.DistanceAttributeName).DefaultValue); end
Шаг 4 содержит обновленный метод run
, чтобы вычислить расстояние обнаруженных автомобилей и пишет метку и информацию об атрибуте к выходным меткам.
%-------------------------------------------------------------------- function autoLabels = run(algObj, I)
autoLabels = [];
% Configure the detector. if algObj.ConfigureDetector && ~isa(algObj.Detector,'acfObjectDetectorMonoCamera') vehicleSize = [algObj.VehicleWidth;algObj.VehicleLength]; algObj.Detector = configureDetectorMonoCamera(algObj.Detector, algObj.SensorObj, vehicleSize); end
% Detect vehicles using the initialized vehicle detector. [bboxes, scores] = detect(algObj.Detector, I,... 'SelectStrongest', false);
[selectedBbox, selectedScore] = selectStrongestBbox(bboxes, scores, ... 'RatioType', 'Min', 'OverlapThreshold', algObj.OverlapThreshold);
% Reject detections with detection score lower than % ScoreThreshold. detectionsToKeepIdx = (selectedScore > algObj.ScoreThreshold); selectedBbox = selectedBbox(detectionsToKeepIdx,:);
if ~isempty(selectedBbox) % Add automated labels at bounding box locations detected % by the vehicle detector, of type Rectangle having name of % the selected label. autoLabels.Name = algObj.SelectedLabelName; autoLabels.Type = labelType.Rectangle; autoLabels.Position = selectedBbox;
if (algObj.AutomateDistanceAttriibute && algObj.HasValidDistanceAttribute) attribName = algObj.DistanceAttributeName; % Attribute value is of type 'Numeric Value' autoLabels.Attributes = computeVehicleDistances(algObj, selectedBbox, attribName); end else autoLabels = []; end end
function midPts = helperFindBottomMidpoint(bboxes) % Find midpoint of bottom edge of the bounding box.
xBL = bboxes(:,1); yBL = bboxes(:,2);
xM = xBL + bboxes(:,3)/2; yM = yBL + + bboxes(:,4)./2; midPts = [xM yM];
end
function distances= computeDistances(algObj, bboxes) % Helper function to compute vehicle distance.
midPts = helperFindBottomMidpoint(bboxes); xy = algObj.SensorObj.imageToVehicle(midPts); distances = sqrt(xy(:,1).^2 + xy(:,2).^2);
end
function attribS = computeVehicleDistances(algObj, bboxes, attribName) % Compute vehicle distance.
numCars = size(bboxes, 1); attribS = repmat(struct(attribName, 0), [numCars, 1]);
for i=1:numCars distanceVal = computeDistances(algObj, bboxes(i,:)); attribS(i).(attribName) = distanceVal; end end
Группированная версия алгоритма вычисления расстояния автомобиля доступна в классе VehicleDetectionAndDistanceEstimation
. Использовать этот класс в приложении:
Создайте структуру папок, требуемую под текущей папкой, и скопируйте класс автоматизации в него.
mkdir('+vision/+labeler'); copyfile(fullfile(matlabroot,'examples','driving','main','VehicleDetectionAndDistanceEstimation.m'),'+vision/+labeler');
Загрузите информацию о monoCamera
в рабочую область. Эта информация о датчике камеры подходит для камеры, используемой в видео, используемом в этом примере, 05_highway_lanechange_25s.mp4
. Если вы загружаете различное видео, используйте информацию о датчике, подходящую для того видео.
load('FCWDemoMonoCameraSensor.mat', 'sensor')
Откройте приложение groundTruthLabeler
.
groundTruthLabeler 05_highway_lanechange_25s.mp4
В ROI Маркируют панель Definition слева, нажимают Label. Задайте метку с именем Vehicle
и введите Rectangle
. Опционально, добавьте описание метки. Затем нажмите ОК.
В ROI Маркируют панель Definition слева, нажимают Attribute. Задайте атрибут с именем Distance
, введите Numeric Value
и значение по умолчанию 0
. Опционально, добавьте описание атрибута. Затем нажмите ОК.
Выберите Algorithm> Select Algorithm> список Refresh.
Выберите Algorithm> Vehicle Detection и Distance Estimation. Если вы не видите эту опцию, гарантируете, что текущая рабочая папка имеет папку под названием +vision/+labeler
с файлом с именем VehicleDetectionAndDistanceEstimation.m
в ней.
Нажмите Automate. Новая вкладка открывается, отображая направления для использования алгоритма.
Нажмите Settings, и в диалоговом окне, которое открывается, введите sensor
в первое текстовое поле. Измените другие параметры в случае необходимости перед нажатием "ОК".
Нажмите Run. Обнаружение автомобиля и алгоритм вычисления расстояния прогрессируют через видео. Заметьте, что результаты не являются удовлетворительными в некоторых кадрах.
После того, как выполнение завершается, используйте ползунок или клавиши со стрелками, чтобы прокрутить через видео, чтобы определить местоположение кадров, где алгоритм перестал работать.
Вручную настройте результаты или перемещением ограничительной рамки автомобиля или путем изменения значения расстояния. Можно также удалить ограничительные рамки и связанные значения расстояния.
Если вы удовлетворены ограничительными рамками автомобиля и их расстояниями для целого видео, нажимаете кнопку Принять.
Автоматизированное обнаружение автомобиля и маркировка атрибута расстояния на видео завершены. Можно теперь маркировать другие предметы интереса и установить их атрибуты, сохранить сеанс или экспортировать результаты этой запущенной маркировки.
Этот пример показал шаги, чтобы включить обнаружение автомобиля и алгоритм автоматизации оценки атрибута расстояния в приложение Ground Truth Labeler. Можно расширить эту концепцию к другим пользовательским алгоритмам, чтобы расширить функциональность приложения.