В этом примере показано, как использовать глубокие сверточные нейронные сети в модели Simulink®, чтобы выполнить обнаружение транспортного средства и маршрут. Этот пример берет системы координат из видео трафика как вход, выходные параметры два контура маршрута, которые соответствуют левым и правым маршрутам автомобиля, оборудованного датчиком, и обнаруживает транспортные средства в системе координат.
Этот пример использует предварительно обученную сеть обнаружения маршрута от Обнаружения Маршрута, Оптимизированного с примером GPU Coder GPU Coder Toolbox™. Для получения дополнительной информации смотрите Обнаружение Маршрута, Оптимизированное с GPU Coder (GPU Coder).
Этот пример также использует предварительно обученную сеть обнаружения транспортного средства от Обнаружения объектов Используя пример YOLO v2 Глубокого обучения Компьютерного зрения toolbox™. Для получения дополнительной информации смотрите, что Обнаружение объектов Использует Глубокое обучение (Computer Vision Toolbox) YOLO v2.
Блок-схему для алгоритмического рабочего процесса модели 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 блок из Deep Learning Toolbox™. Эта сеть берет изображение в качестве входа и выходных параметров два контура маршрута, которые соответствуют левым и правым маршрутам автомобиля, оборудованного датчиком. Каждый контур маршрута представлен параболическим уравнением:

Здесь y является боковым смещением, и x является продольным расстоянием от транспортного средства. Сетевые выходные параметры эти три параметра a, b, и c на маршрут. Сетевая архитектура похожа на AlexNet за исключением того, что последние несколько слоев заменяются меньшим полносвязным слоем и регрессией выходной слой. Lane Detection Coordinates Блок MATLAB function задает функциональный lane_detection_coordinates это берет выход из предсказать блока и выходные параметры три параметра; laneFound, ltPts, и rtPts. Пороговая обработка используется, чтобы определить, найдены ли оба левых и правых контура маршрута оба. Если оба найдены, laneFound набор должен быть верным, и траектории контуров вычисляются и хранятся в 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 function задает функциональный lane_vehicle_annotation который аннотирует ограничительные рамки транспортного средства наряду с оценками достоверности. Если laneFound верно, затем левые и правые контуры маршрута, сохраненные в ltPts и rtPts overlayed на видео трафика.
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>

С GPU Coder™ можно ускорить выполнение модели на NVIDIA® графические процессоры и сгенерировать код CUDA® для модели. Смотрите Генерацию кода для Глубокого обучения Модель Simulink, которая Выполняет Обнаружение Маршрута и Транспортного средства (GPU Coder) для получения дополнительной информации.
Закройте модель Simulink.
close_system('laneAndVehicleDetectionMDL/Lane and Vehicle Detection Output'); close_system('laneAndVehicleDetectionMDL');