exponenta event banner

Автоматизация атрибутов помеченных объектов

В этом примере показано, как разработать алгоритм обнаружения и оценки расстояния транспортного средства и использовать его для автоматизации маркировки с помощью приложения Ground Truth Labeler. В этом примере вы узнаете, как:

  • Разработка алгоритма компьютерного зрения для обнаружения транспортных средств в видео и использование конфигурации монокулярной камеры для оценки расстояний до обнаруженных транспортных средств.

  • Используйте AutomationAlgorithm API для создания алгоритма автоматизации. Дополнительные сведения см. в разделе Создание алгоритма автоматизации для маркировки. Созданный алгоритм автоматизации можно использовать с приложением 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')

Figure contains an axes. The axes with title Detected Vehicles contains an object of type image.

Оценка расстояний до обнаруженных транспортных средств

Теперь, когда транспортные средства были обнаружены, оцените расстояния до обнаруженных транспортных средств с камеры в мировых координатах. 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')

Figure contains an axes. The axes with title Distances of Vehicles from Camera contains an object of type image.

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

Включить класс автоматизации обнаружения транспортного средства и оценки расстояния в процесс автоматизации приложения. Для получения дополнительной информации см. Создание алгоритма автоматизации для маркировки. Начните с существующего алгоритма автоматизации ACF Vehicle Detection для определения транспортного средства с помощью калиброванной монокулярной камеры. Затем измените алгоритм для автоматизации атрибутов. В этом примере в качестве атрибута обнаруженного транспортного средства используется расстояние транспортного средства от камеры. В этом разделе описываются шаги по внесению изменений в существующий класс алгоритма автоматизации ACF Vehicle Detection.

Шаг 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
       AutomateDistanceAttribute = 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.AutomateDistanceAttribute
           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.AutomateDistanceAttribute && 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 (ROI Label Definition) слева щелкните Метка (Label). Определение метки с именем Vehicle и тип Rectangle. При необходимости добавьте описание метки. Затем нажмите кнопку ОК.

  • На панели Определение метки ROI (ROI Label Definition) слева щелкните Атрибут (Attribute). Определение атрибута с именем Distance, тип Numeric Valueи значение по умолчанию 0. При необходимости добавьте описание атрибута. Затем нажмите кнопку ОК.

  • Выберите Алгоритм > Выбрать алгоритм > Обновить список.

  • Выберите Алгоритм > Обнаружение транспортного средства и оценка расстояния. Если этот параметр не отображается, убедитесь, что текущая рабочая папка содержит папку с именем +vision/+labeler, с именем файла VehicleDetectionAndDistanceEstimation.m в этом.

  • Щелкните Автоматизировать (Automate). Откроется новая вкладка, отображающая направления использования алгоритма.

  • Нажмите «Параметры» и в открывшемся диалоговом окне введите sensor в первом текстовом поле. При необходимости измените другие параметры, прежде чем нажать кнопку ОК.

  • Щелкните Выполнить (Run). Алгоритм обнаружения транспортного средства и вычисления расстояния проходит через видео. Обратите внимание, что результаты в некоторых кадрах неудовлетворительны.

  • После завершения выполнения используйте ползунок или клавиши со стрелками для прокрутки видео, чтобы найти кадры, в которых произошел сбой алгоритма.

  • Вручную сдвигайте результаты, перемещая ограничительную рамку транспортного средства или изменяя значение расстояния. Можно также удалить ограничивающие рамки и связанные значения расстояний.

  • После того, как вы будете удовлетворены ограничительными коробками транспортного средства и их расстояниями для всего видео, нажмите Принять.

Автоматизированное обнаружение транспортного средства и маркировка атрибутов расстояния на видео завершены. Теперь можно пометить другие интересующие объекты и задать их атрибуты, сохранить сессию или экспортировать результаты этого прогона маркировки.

Заключение

В этом примере показаны шаги по включению алгоритма обнаружения транспортного средства и автоматизации оценки атрибутов расстояния в приложение Ground Truth Labeler. Вы можете распространить эту концепцию на другие пользовательские алгоритмы для расширения функциональности приложения.

См. также

Приложения

Объекты

Связанные темы