exponenta event banner

Создание кода для детектора транспортного средства системы технического зрения

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

В этом примере выполняется следующее:

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

  • Смоделировать модель испытательного стенда с помощью детекторов транспортного средства на основе ACF и YOLOv2 и сравнить рабочие характеристики.

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

Введение

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

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

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

  2. Моделирование с помощью детекторов ACF и YOLOv2 ТС - настройка вариантов ACF и YOLOv2 ТС и оценка производительности с использованием метрик.

  3. Генерация кода C++ для детектора транспортного средства ACF - Настройка детектора транспортного средства ACF для генерации кода C++ для целей ЦП.

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

  5. Генерация кода CUDA для YOLOv2 детектора транспортного средства - настройка YOLOv2 детектора транспортного средства для генерации кода CUDA для целей GPU.

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

В этом примере проверяется алгоритм детектора транспортного средства в среде моделирования 3D, в которой используется нереальный движок Epic Games ®. Для среды моделирования вождения Unreal Engine требуется 64-разрядная платформа Windows ®.

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);

Изучение модели испытательного стенда

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

  • Модель испытательного стенда - модель испытательного стенда моделирует и тестирует поведение алгоритма детектора зрительного транспортного средства в разомкнутом контуре.

  • Эталонная модель - Блок Vehicle Detector в модели испытательного стенда вызывает VisionVehicleDetector ссылочная модель. Эталонная модель реализует алгоритм обнаружения транспортного средства и генерирует код C++ для детектора транспортного средства ACF и код CUDA для детектора транспортного средства YOLOv2. Эта ссылочная модель может быть интегрирована с системами с замкнутым контуром, такими как Система следования по полосам движения.

Откройте модель испытательного стенда.

open_system('VisionVehicleDetectorTestBench');

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

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

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

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

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

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

open_system('VisionVehicleDetectorTestBench/Sensors and Environment');

Vehicle Detector является эталонной моделью, которая обнаруживает транспортные средства в кадрах камеры. Откройте эталонную модель Vehicle Detector.

open_system('VisionVehicleDetector');

Эталонная модель Vehicle Detector содержит вариационную подсистему. Содержит три варианта детектора транспортного средства.

  • ACF

  • YOLOv2 Моделирование

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

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

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

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

open_system('VisionVehicleDetectorTestBench/Metrics Assessment');

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

Имитация с помощью детекторов автомобилей ACF и YOLOv2

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

Моделирование с использованием ACF

Сконфигурируйте модель испытательного стенда детектора транспортного средства Vision для использования scenario_VVD_01_Curve_FiveVehicles сценарий и вариант детектора транспортного средства ACF.

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

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

simoutACF = sim('VisionVehicleDetectorTestBench');

Вы также можете визуализировать границы транспортного средства на земле, включив EnableTruthDisplay параметр маски в блоке «Визуализация».

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

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

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

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

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

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

helperPlotDetectionMetrics("ACF", simoutACF.logsout);

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

Моделирование с помощью YOLOv2

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

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

Сконфигурируйте модель испытательного стенда детектора транспортного средства Vision для использования 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 транспортных средств.

Генерация кода C++ для детектора транспортного средства ACF

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

helperSLVisionVehicleDetectorSetup("detectorVariantName","ACF");

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

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

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

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

  • initialize - Однократный вызов при инициализации.

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

  • terminate - Однократный вызов при прекращении.

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

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

После генерации кода C++ для варианта детектора транспортного средства технического зрения ACF теперь можно оценить функциональность кода с помощью моделирования SIL. Он обеспечивает раннее понимание поведения развернутого приложения. Дополнительные сведения о моделировании SIL см. в разделе Моделирование SIL и PIL (встроенный кодер).

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

Сконфигурируйте алгоритм и параметры модели стенда для поддержки моделирования 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.

helperPlotDiffSignals(diffResult);

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

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

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

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

helperPlotExecutionProfile(simoutACFSIL.executionProfile);

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

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

При наличии лицензии GPU Coder™ можно настроить модель для генерации кода CUDA для YOLOv2 детектора транспортного средства. Сконфигурируйте модель стенда для использования варианта создания кода YOLOv2.

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

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

  • initialize - Однократный вызов при инициализации.

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

  • terminate - Однократный вызов при прекращении.

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

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

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

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

См. также

| | | |

Связанные темы