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

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

В этом примере вы:

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

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

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

Введение

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

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

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

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

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

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

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

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

Этот пример проверяет алгоритм детектора транспортного средства в 3D среде симуляции, которая использует Unreal Engine из 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);

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

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

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

  • Образец модели - Блок Vision Vehicle Detector в тестовой модели вызывает VisionVehicleDetector образец модели. Образец модели реализует алгоритм обнаружения транспортного средства и генерирует код С++ для детектора транспортного средства ACF и код CUDA для YOLOv2 детектора транспортного средства. Этот образец модели может быть интегрирована с системами с обратной связью, такими как система Highway Lane Following.

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

open_system('VisionVehicleDetectorTestBench');

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

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

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

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

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

Эта подсистема аналогична подсистеме Simulation 3D Scenario в примере Highway Lane Following. Кроме того, он также вычисляет основную истину транспортного средства ограничивающие рамки, используя фактические положения актёра из Scenario Reader и маркированное изображение из блока Симуляции 3D Camera Forward Facing. Откройте Подсистему Датчиков и Окружения.

open_system('VisionVehicleDetectorTestBench/Sensors and Environment');

Vision Транспортного средства Detector - это образец модели, которая обнаруживает транспортные средства в системы координат камеры. Откройте образец модели Vision Vehicle Detector.

open_system('VisionVehicleDetector');

Образец модели Vision Vehicle Detector содержит подсистему вариантов. Он содержит три варианта детектора транспортных средств.

  • ACF

  • YOLOv2 симуляции

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

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

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

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

open_system('VisionVehicleDetectorTestBench/Metrics Assessment');

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

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

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

Симуляция с ACF

Сконфигурируйте модель Vision Vehicle Detector Test Bench, чтобы использовать scenario_VVD_01_Curve_FiveVehicles сценарий и вариант детектора транспортного средства ACF.

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

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

simoutACF = sim('VisionVehicleDetectorTestBench');

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

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

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

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

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

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

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

helperPlotDetectionMetrics("ACF", simoutACF.logsout);

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

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

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

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

Сконфигурируйте модель Vision Vehicle Detector Test Bench, чтобы использовать scenario_VVD_01_Curve_FiveVehicles сценарий и YOLOv2 Simulation vehicle detector вариант и моделируйте тестовую модель. В целях этого примера отключите предупреждения, связанные с вычислительными возможностями графического процессора.

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 - Вызов один раз при расторжении.

Дополнительные методы get и set для интерфейса сигнала объявлены в 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'         }

Сконфигурируйте тестовую модель, чтобы симулировать Vision Транспортного средства Detector в режиме 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);

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

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

Проверьте окружение GPU

Чтобы убедиться, что компиляторы и библиотеки, необходимые для выполнения этого раздела, настроены правильно, используйте 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

Откройте диалоговое окно параметров конфигурации. На панели Генерации кода установите значение Language на C++ и включите Generate графического процессора кода.

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 детектора.

См. также

| | | |

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте