exponenta event banner

Обнаружение полосы движения и транспортного средства в симуляторе с помощью глубокого обучения

В этом примере показано, как использовать глубокие сверточные нейронные сети в модели Simulink ® для определения полосы движения и транспортного средства. В этом примере в качестве входных данных взяты кадры из видео дорожного движения, выведены две границы полосы движения, соответствующие левой и правой полосам движения эго-транспортного средства, и обнаружены транспортные средства в кадре.

В этом примере используется предварительно обученная сеть обнаружения полосы из примера оптимизированного обнаружения полосы с кодером GPU Toolbox™ кодера GPU. Дополнительные сведения см. в разделе Определение полосы, оптимизированной с помощью кодера графического процессора (GPU Coder).

В этом примере также используется предварительно обученная сеть обнаружения транспортного средства из примера «Обнаружение объектов с помощью глубокого обучения YOLO v2» toolbox™ компьютерного зрения. Дополнительные сведения см. в разделе Обнаружение объектов с помощью глубокого обучения YOLO v2 (Computer Vision Toolbox).

Алгоритмический рабочий процесс

Показана блок-схема алгоритмического рабочего процесса модели Simulink.

Получение предварительно обученных сетей обнаружения движения и транспортных средств

getVehicleDetectionAndLaneDetectionNetworks функция загружает trainedLaneNet.mat и yolov2ResNet50VehicleExample.mat если они еще не присутствуют.

getVehicleDetectionAndLaneDetectionNetworks()
Downloading pretrained lane detection network (143 MB)...
Downloading pretrained vehicle detection network (98 MB)...

Загрузить пример видео

if ~exist('./caltech_washington1.avi', 'file')
    url = 'https://www.mathworks.com/supportfiles/gpucoder/media/caltech_washington1.avi';
    websave('caltech_washington1.avi', url);
end

Модель симулятора определения полосы движения и транспортного средства

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

open_system('laneAndVehicleDetectionMDL');

Определение полосы движения

Для обнаружения переулка транспортное видео предварительно обработано, изменив размеры каждой структуры видео к 227 на 227 на 3 и затем измерено фактором 255. Предварительно обработанные кадры затем вводятся в trainedLaneNet.mat сеть загружена в Predict блок из Toolbox™ глубокого обучения. Эта сеть принимает изображение в качестве входных данных и выводит две границы полосы движения, которые соответствуют левой и правой полосам движения эго-транспортного средства. Каждая граница полосы представлена параболическим уравнением:

$y = ax^2+bx+c$

Здесь y - боковое смещение, а x - продольное расстояние от транспортного средства. Сеть выводит три параметра a, b и c для каждой полосы. Сетевая архитектура аналогична AlexNet за исключением того, что последние несколько слоев заменены меньшим полностью соединенным слоем и выходным слоем регрессии. Lane Detection Coordinates Функциональный блок MATLAB определяет функцию lane_detection_coordinates который принимает выходные данные из блока прогнозирования и выводит три параметра; laneFound, ltPts, и rtPts. Пороговое значение используется для определения наличия как левой, так и правой границ полосы движения. Если найдены оба, laneFound имеет значение true, и траектории границ вычисляются и сохраняются в ltPts и rtPts соответственно.

type lane_detection_coordinates
function [laneFound,ltPts,rtPts] = lane_detection_coordinates(laneNetOut)

% Copyright 2020 The MathWorks, Inc.

persistent laneCoeffMeans;
if isempty(laneCoeffMeans)
    laneCoeffMeans = [-0.0002    0.0002    1.4740   -0.0002    0.0045   -1.3787];
end

persistent laneCoeffStds;
if isempty(laneCoeffStds)
    laneCoeffStds = [0.0030    0.0766    0.6313    0.0026    0.0736    0.9846];
end

params = laneNetOut .* laneCoeffStds + laneCoeffMeans;

isRightLaneFound = abs(params(6)) > 0.5; %c should be more than 0.5 for it to be a right lane
isLeftLaneFound =  abs(params(3)) > 0.5;

persistent vehicleXPoints;
if isempty(vehicleXPoints)
    vehicleXPoints = 3:30; %meters, ahead of the sensor
end

ltPts = coder.nullcopy(zeros(28,2,'single'));
rtPts = coder.nullcopy(zeros(28,2,'single'));

if isRightLaneFound && isLeftLaneFound
    rtBoundary = params(4:6);
    rt_y = computeBoundaryModel(rtBoundary, vehicleXPoints);
    ltBoundary = params(1:3);
    lt_y = computeBoundaryModel(ltBoundary, vehicleXPoints);
    
    % Visualize lane boundaries of the ego vehicle
    tform = get_tformToImage;
    % map vehicle to image coordinates
    ltPts =  tform.transformPointsInverse([vehicleXPoints', lt_y']);
    rtPts =  tform.transformPointsInverse([vehicleXPoints', rt_y']);
    laneFound = true;
else
    laneFound = false;
end

end

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

В этом примере для обнаружения транспортных средств используется сеть на основе YOLO v2. Сеть обнаружения объектов YOLO v2 состоит из двух подсетей: сети извлечения признаков, за которой следует сеть обнаружения. Эта предварительно обученная сеть использует ResNet-50 для извлечения элемента. Подсеть обнаружения является небольшим CNN по сравнению с сетью извлечения признаков и состоит из нескольких сверточных слоев и слоев, специфичных для YOLO v2.

Модель Simulink выполняет обнаружение транспортного средства внутри MATLAB Function блок Vehicle Detection YOLOv2. Этот функциональный блок определяет функцию vehicle_detection_yolo_v2 который загружает предварительно обученный детектор YOLO v2. Эта сеть принимает изображение в качестве входных данных и выводит координаты ограничивающей рамки вместе с показателями достоверности для транспортных средств на изображении.

type vehicle_detection_yolo_v2
function [bboxes,scores] = vehicle_detection_yolo_v2(In)

% Copyright 2020 The MathWorks, Inc.

persistent yolodetector;
if isempty(yolodetector)
    yolodetector = coder.loadDeepLearningNetwork('yolov2ResNet50VehicleExample.mat');
end

[bboxes,scores,~] = yolodetector.detect(In, 'threshold', .2);

end

Аннотация ограничительных боксов транспортного средства и траектории полосы движения в видео движения

Lane and Vehicle Annotation Функциональный блок MATLAB определяет функцию lane_vehicle_annotation который аннотирует ограничивающие боксы транспортного средства вместе с показателями достоверности. Если laneFound true, то левая и правая границы полосы сохраняются в ltPts и rtPts накладываются на видео трафика.

type lane_vehicle_annotation
function In = lane_vehicle_annotation(laneFound, ltPts, rtPts, bboxes, scores, In)

% Copyright 2020 The MathWorks, Inc.

if ~isempty(bboxes)
    In = insertObjectAnnotation(In, 'rectangle', bboxes, scores);
end

pts = coder.nullcopy(zeros(28, 4, 'single'));
if laneFound
    prevpt =  [ltPts(1,1) ltPts(1,2)];
    for k = 2:1:28
        pts(k,1:4) = [prevpt ltPts(k,1) ltPts(k,2)];
        prevpt = [ltPts(k,1) ltPts(k,2)];
    end
    In = insertShape(In, 'Line', pts, 'LineWidth', 2);
    prevpt =  [rtPts(1,1) rtPts(1,2)];
    for k = 2:1:28
        pts(k,1:4) = [prevpt rtPts(k,1) rtPts(k,2)];
        prevpt = [rtPts(k,1) rtPts(k,2)];
    end
    In = insertShape(In, 'Line', pts, 'LineWidth', 2);
    In = insertMarker(In, ltPts);
    In = insertMarker(In, rtPts);
end

end

Запуск моделирования

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

set_param('laneAndVehicleDetectionMDL', 'SimulationMode', 'Normal');
sim('laneAndVehicleDetectionMDL');
Warning: Saturate on overflow detected.

In MATLAB Function '<a
href="matlab:Stateflow.Debug.Runtime.open_object('laneAndVehicleDetectionMDL/Lane
and Vehicle Annotation', 0);">laneAndVehicleDetectionMDL/Lane and Vehicle
Annotation</a>':

    function In = LaneVehicleAnnotation(laneFound, ltPts, rtPts, bboxes, scores,
    In)

Suggested Actions:
    • Suppress future instances of this diagnostic from this source. - <a
    href="matlab:Simulink.SuppressedDiagnostic({'laneAndVehicleDetectionMDL/Lane
    and Vehicle
    Annotation'},'Stateflow:Runtime:DataSaturateError');">Suppress</a>
 

Создание кода

С помощью графического процессора Coder™ можно ускорить выполнение модели на графических процессорах NVIDIA ® и создать код CUDA ® для модели. Дополнительные сведения см. в документе Создание кода для модели симулятора глубокого обучения, которая выполняет обнаружение полосы движения и транспортного средства (GPU Coder).

Очистка

Закройте модель Simulink.

close_system('laneAndVehicleDetectionMDL/Lane and Vehicle Detection Output');
close_system('laneAndVehicleDetectionMDL');