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

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

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

  • Используйте AutomationAlgorithm API для создания алгоритма автоматизации. Для получения дополнительной информации см. раздел «Создание алгоритма автоматизации для маркировки». Созданный алгоритм автоматизации может использоваться с приложением Ground Truth Labeler для автоматической маркировки транспортных средств вместе с атрибутами для хранения предполагаемых расстояний.

Приложение Ground Truth Labeler

Хорошие достоверные данные имеют решающее значение для разработки алгоритмов вождения и оценки их характеристик. Однако создание богатого и разнообразного набора аннотированных приводных данных требует значительных усилий. Приложение Ground Truth Labeler делает этот процесс эффективным. Вы можете использовать это приложение как полностью ручной инструмент маркировки для маркировки ограничивающих коробок транспортного средства, контуров маршрута и других объектов, представляющих интерес для автоматизированной системы вождения. Можно также вручную задать атрибуты маркированных объектов. Однако ручная маркировка требует значительного количества времени и ресурсов. В качестве альтернативы это приложение предоставляет среду для создания алгоритмов для расширения и автоматизации процесса маркировки. Можно использовать алгоритмы, которые вы создаете, чтобы быстро пометить целые наборы данных, автоматически аннотировать метки с помощью атрибутов, а затем следовать им с более эффективным, более коротким шагом ручной верификации. Можно также отредактировать результаты шага автоматизации, чтобы учесть сложные сценарии, которые алгоритм автоматизации мог пропустить.

Этот пример описывает, как вставить алгоритм автоматизации обнаружения и оценки расстояния в рабочий процесс автоматизации приложения. Этот пример повторно использует алгоритм автоматизации обнаружения транспортных средств ACF, чтобы сначала обнаружить автомобили, а затем автоматически оценить расстояния обнаруженных транспортных средств от камеры, установленной на транспортном средстве ego. Затем алгоритм создает метку для каждого обнаруженного транспортного средства с атрибутом, определяющим расстояние до транспортного средства.

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

Сначала создайте алгоритм обнаружения транспортных средств. Пример Visual Perception Using Monocular Camera описывает, как создать предварительно обученный детектор транспортного средства и сконфигурировать его, чтобы обнаружить транспортное средство ограничительные коробки с помощью калиброванной монокулярным строением камеры. Чтобы обнаружить транспортные средства, попробуйте алгоритм на одном видеокадре.

% 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.

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

Включите класс автоматизации обнаружения транспортного средства и оценки расстояния в рабочий процесс автоматизации приложения. Для получения дополнительной информации смотрите Create Automation Algorithm for Labeling. Начните с существующего алгоритма автоматизации обнаружения транспортных средств 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
       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 слева нажмите Атрибут. Задайте атрибут с именем Distance, тип Numeric Value, и значение по умолчанию 0. Вы можете добавить описание атрибута. Затем нажмите кнопку ОК.

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

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

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

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

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

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

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

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

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

Заключение

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

См. также

Приложения

Объекты

Похожие темы