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