Этот пример показывает, как использовать глубокие сверточные нейронные сети внутри модели Simulink ® для выполнения обнаружения маршрута и транспортного средства. Этот пример принимает системы координат из видео трафика в качестве входов, выводит два контуров маршрута, которые соответствуют левой и правой полосам автомобиля , оборудованного датчиком, и обнаруживает транспортные средства в системе координат.
Этот пример использует предварительно обученную сеть обнаружения маршрута из примера обнаружения маршрута, оптимизированного с помощью GPU Coder Toolbox™ GPU Coder. Для получения дополнительной информации смотрите Обнаружение маршрута Оптимизированное с GPU Coder (GPU Coder).
Этот пример также использует предварительно обученную сеть обнаружения транспортных средств из обнаружения объектов, используя пример глубокого обучения YOLO v2 toolbox™ Компьютерное Зрение. Для получения дополнительной информации смотрите Обнаружение объектов с использованием YOLO v2 Глубокое Обучение (Computer Vision Toolbox).
Показан блок алгоритмического рабочего процесса модели Simulink.
The 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
за исключением того, что последние несколько слоев заменены слоем меньшего полносвязного слоя и выхода регрессии. The Lane Detection Coordinates
Блок MATLAB function задает функцию 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
The Lane and Vehicle Annotation
Блок MATLAB function задает функцию 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>
С помощью GPU Coder™ можно ускорить выполнение модели на графических процессорах NVIDIA ® и сгенерировать код CUDA ® для модели. Для получения дополнительной информации смотрите Генерацию кода для модели Глубокое Обучение Simulink, которая выполняет обнаружение маршрута и транспортного средства (GPU Coder).
Закройте модель Simulink.
close_system('laneAndVehicleDetectionMDL/Lane and Vehicle Detection Output'); close_system('laneAndVehicleDetectionMDL');