Сгенерируйте код для детектора транспортного средства видения

В этом примере показано, как протестировать основанный на монокуляре-камерой детектор транспортного средства и сгенерировать развертываемый код для приложений реального времени на предварительно созданной 3D сцене из Нереального Engine® ведущая среда симуляции.

В этом примере, вас:

  • Спроектируйте тестовую модель, чтобы проверить функциональность основанного на монокуляре-камерой детектора транспортного средства с помощью информации об основной истине.

  • Симулируйте тестовую модель с ACF, и YOLOv2 основывал детекторы транспортного средства, и сравните эффективность.

  • Сгенерируйте Код С++ для основанного на ACF детектора, и код CUDA для YOLOv2 основывал детектор, и подтвердите функциональную эквивалентность с симуляцией.

Введение

Детектор транспортного средства является основным компонентом восприятия автоматизированного ведущего приложения. Детектор анализирует изображения дорог, полученных с помощью монокулярного датчика камеры, и возвращает информацию о положениях различных транспортных средств, которые находятся в видимой области значений камеры. Можно спроектировать и симулировать алгоритм детектора транспортного средства с помощью MATLAB® или Simulink® и оценить его точность с помощью известной основной истины. Можно использовать различные детекторы, чтобы обнаружить транспортные средства, включая vehicleDetectorACF и vehicleDetectorYOLOv2. На основе выбранного детектора и целевой платформы, можно сделать C++ или генерацию кода CUDA и интегрировать детектор во внешнюю программную среду и развернуть его в транспортное средство. Выполняющая генерация кода и верификация модели Simulink гарантируют функциональную эквивалентность между симуляцией и реализацией в реальном времени.

В этом примере показано, как протестировать детектор транспортного средства в Нереальном Engine ведущая среда симуляции и сгенерировать развертываемый код для реализации в реальном времени. В этом примере, вас:

  1. Исследуйте тестовую модель — тестовая модель содержит сценарий и среду, детектор транспортного средства видения и метрики, чтобы оценить функциональность.

  2. Симулируйте с ACF, и детекторы транспортного средства YOLOv2 — Конфигурируют варианты ACF и YOLOv2 детектора транспортного средства и оценивают эффективность с помощью метрик.

  3. Сгенерируйте Код С++ для детектора транспортного средства ACF — Конфигурируют детектор транспортного средства ACF, чтобы сгенерировать Код С++ для целей центрального процессора.

  4. Оцените функциональность программного обеспечения использования сгенерированного кода в цикле — Проверяют реализацию с программным обеспечением в цикле (SIL) симуляция.

  5. Сгенерируйте код CUDA для детектора транспортного средства YOLOv2 — Конфигурируют детектор транспортного средства YOLOv2, чтобы сгенерировать код CUDA для целей графического процессора.

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

Этот пример тестирует алгоритм детектора транспортного средства в 3D среде симуляции, которая использует Нереальный Engine от Epic Games®. Нереальный Engine ведущая среда симуляции требует Windows® 64-битная платформа.

if ~ispc
    error(['3D simulation is supported only on Microsoft', char(174), ' Windows', char(174), '.'])
end

Настройте файлы в качестве примера и откройте проект.

addpath(fullfile(matlabroot, 'toolbox', 'driving', 'drivingdemos'));
helperDrivingProjectSetup("VVDTestBench.zip", "workDir",pwd);

Исследуйте тестовую модель

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

  • Тестовая модель — тестовая модель симулирует и тестирует поведение алгоритма детектора транспортного средства видения в разомкнутом контуре.

  • Образец модели — блок Vision Vehicle Detector в тестовой модели вызывает VisionVehicleDetector образец модели. Образец модели реализует алгоритм обнаружения транспортного средства и генерирует Код С++ для детектора транспортного средства ACF и код CUDA для детектора транспортного средства YOLOv2. Этот образец модели может быть интегрирован с системами с обратной связью, такими как Хайвей Лейн После системы.

Откройте тестовую модель.

open_system('VisionVehicleDetectorTestBench');

Открытие этой модели запускает helperSLVisionVehicleDetectorSetup скрипт, который инициализирует дорожный сценарий с помощью drivingScenario объект в базовом рабочем пространстве. Это также конфигурирует параметры детектора транспортного средства, параметры модели транспортного средства и сигналы шины Simulink, требуемые для определения вводов и выводов для VisionVehicleDetectorTestBench модель. Тестовая модель содержит эти подсистемы:

  • Датчики и Среда — Подсистема, которая задает сцену, транспортные средства и датчик камеры, используемый для симуляции, и вычисляет ограничительные рамки транспортного средства основной истины.

  • Детектор Транспортного средства видения — Подсистема, которая реализует алгоритм обнаружения транспортного средства.

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

Подсистема Датчиков и Среды конфигурирует дорожную сеть, устанавливает положения транспортного средства и синтезирует датчик камеры.

Эта подсистема похожа на Симуляцию 3D подсистема Сценария в Магистральном примере Следующего Маршрута. Кроме того, это также вычисляет ограничительные рамки транспортного средства основной истины с помощью фактических положений агента от Читателя Сценария и помеченного изображения от блока Simulation 3D Camera Forward Facing. Откройте подсистема Среды и Датчики.

open_system('VisionVehicleDetectorTestBench/Sensors and Environment');

Детектор Транспортного средства видения является образцом модели, который обнаруживает транспортные средства в системах координат камеры. Откройте образец модели Детектора Транспортного средства Видения.

open_system('VisionVehicleDetector');

Образец модели Детектора Транспортного средства Видения содержит различную подсистему. Это содержит три варианта детектора транспортного средства.

  • ACF

  • Симуляция YOLOv2

  • Генерация кода YOLOv2

Можно сконфигурировать желаемый вариант с помощью helperSLVisionVehicleDetectorSetup скрипт. Вариант по умолчанию является ACF и может быть сконфигурирован и для интерпретированного выполнения и для генерации кода.

Каждый из этих вариантов берет системы координат, полученные датчиком камеры, как введено, и выводит обнаруженные транспортные средства при помощи шины BusVision Simulink.

Метрическая подсистема Оценки оценивает точность результатов обнаружения с помощью информации об основной истине. Откройте Метрическую подсистему Оценки.

open_system('VisionVehicleDetectorTestBench/Metrics Assessment');

Метрическая подсистема Оценки вычисляет истинные положительные стороны, ложные отрицательные стороны и ложные положительные стороны для обнаружений. Модель использует эти значения, чтобы проверить точность алгоритма во время симуляции с помощью Проверки Статическая Область значений (Simulink) блоки.

Симулируйте с ACF и детекторами транспортного средства YOLOv2

В этом разделе вы оцениваете и сравниваете результаты симуляции ACF и детекторов транспортного средства YOLOv2 с помощью сценария тестирования. Этот сценарий содержит пять транспортных средств, включая автомобиль, оборудованный датчиком. В этом сценарии тестирования ведущее транспортное средство перемещается в маршруте эго с постоянной скоростью 14 м/с и расстоянием прогресса 20 метров. Другое целевое транспортное средство перемещается в смежном правильном маршруте с постоянной скоростью 14 м/с. Другие два транспортных средства перемещаются в противоположном направлении в левом маршруте, смежном с маршрутом эго.

Симулируйте с ACF

Сконфигурируйте Тестовую модель Детектора Транспортного средства Видения, чтобы использовать scenario_VVD_01_Curve_FiveVehicles сценарий и вариант детектора транспортного средства ACF.

helperSLVisionVehicleDetectorSetup(...
    "scenarioFcnName", "scenario_VVD_01_Curve_FiveVehicles", ...
    "detectorVariantName", "ACF");

Симулируйте тестовую модель. Используйте окно визуализации, чтобы просмотреть результаты обнаружения, в то время как симуляция запускается.

simoutACF = sim('VisionVehicleDetectorTestBench');

Можно также визуализировать ограничительные рамки транспортного средства основной истины путем включения EnableTruthDisplay параметр маски в блоке Visualization.

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

  • Количество транспортных средств (основная истина) является количеством доступных транспортных средств в области значений датчика камеры в любой данный момент времени.

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

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

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

В процессе моделирования модель регистрирует эти значения к simoutACF.logsout переменная рабочей области. Можно построить значения в simoutACF.logsout при помощи helperPlotDetectionMetrics функция.

helperPlotDetectionMetrics("ACF", simoutACF.logsout);

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

Симулируйте с YOLOv2

Если у вас есть лицензия Deep Learning Toolbox™, можно запустить вариант детектора транспортного средства YOLOv2.

isDLTAvailable = license('test', 'Neural_Network_Toolbox');

Сконфигурируйте Тестовую модель Детектора Транспортного средства Видения, чтобы использовать scenario_VVD_01_Curve_FiveVehicles сценарий и вариант детектора транспортного средства Симуляции YOLOv2 и симулируют тестовую модель. В целях этого примера выключите предупреждения, связанные, чтобы вычислить возможность устройства графического процессора.

warning('off', 'parallel:gpu:device:DeviceDeprecated');
if(isDLTAvailable)
    helperSLVisionVehicleDetectorSetup(...
        "scenarioFcnName", "scenario_VVD_01_Curve_FiveVehicles", ...
        "detectorVariantName", "YOLOv2 Simulation");
    simoutYOLOv2 = sim('VisionVehicleDetectorTestBench');

    helperPlotDetectionMetrics("YOLOv2", simoutYOLOv2.logsout);
end

Графики показывают, что обнаружения транспортного средства от детектора транспортного средства YOLOv2 более сопоставимы.

Можно также сравнить общую производительность ACF и детекторов транспортного средства YOLOv2 путем графического вывода отзыва против точности и ложных положительных сторон на изображение против коэффициента непопаданий. Можно построить эти кривые с помощью helperPlotPrecisionAndMissrate функция.

if(isDLTAvailable)
    helperPlotPrecisionAndMissrate(simoutACF.logsout, simoutYOLOv2.logsout);
end

График показывает, что YOLOv2 выполняет немного лучше, чем ACF для этого сценария тестирования.

Можно также использовать этот испытательный стенд, чтобы сгенерировать код для ACF и детекторов транспортного средства YOLOv2.

Сгенерируйте код С++ для детектора транспортного средства ACF

Можно сгенерировать Код С++ для алгоритма ACF, применить общую оптимизацию и сгенерировать отчет упростить исследование сгенерированного кода. Сконфигурируйте тестовую модель, чтобы использовать вариант ACF.

helperSLVisionVehicleDetectorSetup("detectorVariantName","ACF");

Сконфигурируйте VisionVehicleDetector модель, чтобы сгенерировать Код С++ для реализации в реальном времени алгоритма. Установите параметры модели, чтобы включить генерацию кода и отобразить значения настройки.

Установите и просмотрите параметры модели, чтобы включить генерацию Кода С++.

helperSetModelParametersForCodeGeneration('VisionVehicleDetector');
save_system('VisionVehicleDetector');
 
 Model  configuration parameters: 
 
                 Parameter                      Value                                                              Description                                                      
    ___________________________________    _______________    ______________________________________________________________________________________________________________________

    {'SystemTargetFile'               }    {'ert.tlc'    }    {'Code Generation>System target file'                                                                                }
    {'TargetLang'                     }    {'C++'        }    {'Code Generation>Language'                                                                                          }
    {'SolverType'                     }    {'Fixed-step' }    {'Solver>Type'                                                                                                       }
    {'FixedStep'                      }    {'auto'       }    {'Solver>Fixed-step size (fundamental sample time)'                                                                  }
    {'EnableMultiTasking'             }    {'on'         }    {'Solver>Treat each discrete rate as a separate task'                                                                }
    {'ProdLongLongMode'               }    {'on'         }    {'Hardware Implementation>Support long long'                                                                         }
    {'BlockReduction'                 }    {'on'         }    {'Simulation Target>Block reduction'                                                                                 }
    {'MATLABDynamicMemAlloc'          }    {'on'         }    {'Simulation Target>Simulation Target>Dynamic memory allocation in MATLAB functions'                                 }
    {'OptimizeBlockIOStorage'         }    {'on'         }    {'Simulation Target>Signal storage reuse'                                                                            }
    {'InlineInvariantSignals'         }    {'on'         }    {'Simulation Target>Inline invariant signals'                                                                        }
    {'BuildConfiguration'             }    {'Faster Runs'}    {'Code Generation>Build configuration'                                                                               }
    {'RTWVerbose'                     }    {'of'         }    {'Code Generation>Verbose build'                                                                                     }
    {'CombineSignalStateStructs'      }    {'on'         }    {'Code Generation>Interface>Combine signal/state structures'                                                         }
    {'SupportVariableSizeSignals'     }    {'on'         }    {'Code Generation>Interface>Support variable-size signals'                                                           }
    {'CodeInterfacePackaging'         }    {'C++ class'  }    {'Code Generation>Interface>Code interface packaging'                                                                }
    {'GenerateExternalIOAccessMethods'}    {'Method'     }    {'Code Generation>Interface>Data Member Visibility>External I/O access'                                              }
    {'EfficientFloat2IntCast'         }    {'on'         }    {'Code Generation>Optimization>Remove code from floating-point to integer conversions that wraps out-of-range values'}
    {'ZeroExternalMemoryAtStartup'    }    {'off'        }    {'Code Generation>Optimization>Remove root level I/O zero initialization (inverse logic)'                            }
    {'CustomSymbolStrGlobalVar'       }    {'$N$M'       }    {'Code Generation>Symbols>Global variables'                                                                          }
    {'CustomSymbolStrType'            }    {'$N$M_T'     }    {'Code Generation>Symbols>Global types'                                                                              }
    {'CustomSymbolStrField'           }    {'$N$M'       }    {'Code Generation>Symbols>Field name of global types'                                                                }
    {'CustomSymbolStrFcn'             }    {'APV_$N$M$F' }    {'Code Generation>Symbols>Subsystem methods'                                                                         }
    {'CustomSymbolStrTmpVar'          }    {'$N$M'       }    {'Code Generation>Symbols>Local temporary variables'                                                                 }
    {'CustomSymbolStrMacro'           }    {'$N$M'       }    {'Code Generation>Symbols>Constant macros'                                                                           }

Сгенерируйте код и рассмотрите отчет генерации кода от образца модели.

rtwbuild('VisionVehicleDetector');
### Starting build procedure for: VisionVehicleDetector
### Successful completion of build procedure for: VisionVehicleDetector

Build Summary

Top model targets built:

Model                  Action                       Rebuild Reason                                    
======================================================================================================
VisionVehicleDetector  Code generated and compiled  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 1m 52.773s

Используйте отчет генерации кода исследовать сгенерированный код. Для получения дополнительной информации об отчете генерации кода, см. Отчеты для Генерации кода (Embedded Coder). Используйте ссылку отчета интерфейса кода в генерации кода, сообщают, чтобы исследовать эти сгенерированные методы:

  • initialize — Вызовите однажды на инициализации.

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

  • terminate — Вызовите однажды после завершения.

Дополнительные методы для получения и установки интерфейса сигнала объявляются в VisionVehicleDetector.h и заданный в VisionVehicleDetector.cpp.

Оцените функциональность Используя SIL

После генерации Кода С++ для варианта детектора транспортного средства видения ACF можно теперь оценить функциональность кода с помощью SIL симуляции. Это обеспечивает раннее понимание поведения развертываемого приложения. Для получения дополнительной информации о SIL симуляции, см. SIL и PIL симуляции (Embedded Coder).

SIL симуляция позволяет вам проверить, эквивалентен ли скомпилированный сгенерированный код на хосте функционально режиму normal mode.

Сконфигурируйте алгоритм и параметры тестовой модели, чтобы поддержать SIL симуляцию и логарифмическое выполнение профильная информация.

helperSetModelParametersForSIL('VisionVehicleDetector');
helperSetModelParametersForSIL('VisionVehicleDetectorTestBench');
 
VisionVehicleDetector configuration parameters:
 
               Parameter                       Value                                    Description                         
    ________________________________    ____________________    ____________________________________________________________

    {'SystemTargetFile'            }    {'ert.tlc'         }    {'Code Generation>System target file'                      }
    {'TargetLang'                  }    {'C++'             }    {'Code Generation>Language'                                }
    {'CodeExecutionProfiling'      }    {'on'              }    {'Code Generation>Verification>Measure task execution time'}
    {'CodeProfilingSaveOptions'    }    {'AllData'         }    {'Code Generation>Verification>Save options'               }
    {'CodeExecutionProfileVariable'}    {'executionProfile'}    {'Code Generation>Verification>Workspace variable'         }

 
VisionVehicleDetectorTestBench configuration parameters:
 
               Parameter                       Value                                    Description                         
    ________________________________    ____________________    ____________________________________________________________

    {'SystemTargetFile'            }    {'ert.tlc'         }    {'Code Generation>System target file'                      }
    {'TargetLang'                  }    {'C++'             }    {'Code Generation>Language'                                }
    {'CodeExecutionProfiling'      }    {'on'              }    {'Code Generation>Verification>Measure task execution time'}
    {'CodeProfilingSaveOptions'    }    {'AllData'         }    {'Code Generation>Verification>Save options'               }
    {'CodeExecutionProfileVariable'}    {'executionProfile'}    {'Code Generation>Verification>Workspace variable'         }

Сконфигурируйте тестовую модель, чтобы симулировать Детектор Транспортного средства Видения в режиме SIL.

set_param('VisionVehicleDetectorTestBench/Vision Vehicle Detector','SimulationMode','Software-in-the-loop (SIL)');
simoutACFSIL = sim('VisionVehicleDetectorTestBench');
### Starting build procedure for: VisionVehicleDetector
### Generated code for 'VisionVehicleDetector' is up to date because no structural, parameter or code replacement library changes were found.
### Successful completion of build procedure for: VisionVehicleDetector

Build Summary

0 of 1 models built (1 models already up to date)
Build duration: 0h 0m 29.479s
### Preparing to start SIL simulation ...
Building with 'Microsoft Visual C++ 2019 (C)'.
MEX completed successfully.
### Starting SIL simulation for component: VisionVehicleDetector
### Stopping SIL simulation for component: VisionVehicleDetector

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

runIDs = Simulink.sdi.getAllRunIDs;
normalSimRunID = runIDs(end - 2);
SilSimRunID = runIDs(end);
diffResult = Simulink.sdi.compareRuns(normalSimRunID, SilSimRunID);

Постройте различия между метрическими значениями обнаружения, вычисленными из режима SIL и режима normal mode.

helperPlotDiffSignals(diffResult);

Различиями между метрическими значениями обнаружения между нормальным режимом симуляции и режимом SIL симуляции является нуль.

Оцените время выполнения

Во время SIL симуляции регистрируйте метрики времени выполнения для сгенерированного кода на хосте - компьютере к переменной executionProfile в базовом рабочем пространстве MATLAB. Эти времена могут быть ранним индикатором эффективности сгенерированного кода. Для точных измерений времени выполнения профилируйте сгенерированный код, когда он интегрирован во внешнюю среду или когда вы используете процессор в цикле (PIL) симуляция. Чтобы узнать больше о профилировании PIL, обратитесь к Профилированию Выполнения кода с SIL и PIL (Embedded Coder).

Постройте сколько времени VisionVehicleDetector_step функционируйте берет, чтобы выполнить использование helperPlotExecutionProfile функция.

helperPlotExecutionProfile(simoutACFSIL.executionProfile);

Используя график, можно вывести среднее время, когда детектор транспортного средства видения берет, чтобы выполнить каждую систему координат. Для получения дополнительной информации о генерации профилей выполнения и анализе их во время SIL симуляции, смотрите, что Время выполнения Профилирует для SIL и PIL (Embedded Coder).

Сгенерируйте код CUDA для детектора транспортного средства YOLOv2

Если у вас есть лицензия GPU Coder™, можно сконфигурировать модель, чтобы сгенерировать код CUDA для детектора транспортного средства YOLOv2. Сконфигурируйте тестовую модель, чтобы использовать вариант YOLOv2 Code Generation.

isGPCAvailable = license('test', 'GPU_Coder');

if(isGPCAvailable && isDLTAvailable)
  helperSLVisionVehicleDetectorSetup("detectorVariantName","YOLOv2 Code Generation");
end

Проверьте среду графического процессора

Чтобы проверить, что компиляторы и библиотеки, необходимые для выполнения этого раздела, настраиваются правильно, используйте coder.checkGpuInstall функция. Установите DeepLibTarget к любому 'cudnn' или 'tensorrt' на основе доступности соответствующих библиотек по цели.

if(isGPCAvailable && isDLTAvailable)
     % Deep learning code generation for target library cuDNN requires the
     % GPU Coder Interface for Deep Learning Libraries support package.
     info = matlabshared.supportpkg.getInstalled;
     isDLGPUCodegenAvailable = 0;
     if(~isempty(info))
         for i = 1:length(info)
             if(strcmp(info(i).Name, 'GPU Coder Interface for Deep Learning Libraries'))
                 isDLGPUCodegenAvailable = 1;
             end
         end
     end

    if(isDLGPUCodegenAvailable)
        envCfg = coder.gpuEnvConfig('host');
        envCfg.DeepLibTarget = 'cudnn';
        envCfg.DeepCodegen = 1;
        envCfg.Quiet = 1;
        coder.checkGpuInstall(envCfg);
    end
end

Откройте диалоговое окно параметров конфигурации. В панели Генерации кода, Языке набора на C++ и включают, Генерируют код графического процессора.

if(isGPCAvailable && isDLTAvailable && isDLGPUCodegenAvailable)
    set_param('VisionVehicleDetector','TargetLang','C++');
    set_param('VisionVehicleDetector','GenerateGPUCode','CUDA');
    set_param('VisionVehicleDetector','DLTargetLibrary','cuDNN');
    save_system('VisionVehicleDetector');
end

Сгенерируйте и создайте модель Simulink на хосте графический процессор при помощи rtwbuild команда. Генератор кода помещает файлы в папку сборки, которая является подпапкой под названием VisionVehicleDetector_ert_rtw под вашей текущей рабочей папкой.

if(isGPCAvailable && isDLTAvailable && isDLGPUCodegenAvailable)
    rtwbuild('VisionVehicleDetector');
end

Используйте отчет генерации кода исследовать сгенерированный код. Для получения дополнительной информации об отчете генерации кода, см. Отчеты для Генерации кода (Embedded Coder). Используйте ссылку отчета интерфейса кода в генерации кода, сообщают, чтобы исследовать эти сгенерированные методы:

  • initialize — Вызовите однажды на инициализации.

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

  • terminate — Вызовите однажды после завершения.

После генерации кода CUDA для детектора транспортного средства видения можно теперь оценить функциональность кода с помощью SIL симуляции, похожей на вариант детектора транспортного средства ACF.

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

warning('on', 'parallel:gpu:device:DeviceDeprecated');

В этом примере вы сравнили эффективность ACF и алгоритмов обнаружения транспортного средства YOLOv2, сгенерированного Кода С++ для детектора ACF и оценили функциональность с помощью SIL симуляции и сгенерировали код CUDA для детектора YOLOv2.

Смотрите также

| | | |

Похожие темы