PointPillars 딥러닝을 사용하여 라이다 객체 검출을 위한 코드 생성하기
이 예제에서는 PointPillars 객체 검출기에 대한 CUDA® MEX를 생성하는 방법을 보여줍니다. 자세한 내용은 Lidar Toolbox™의 PointPillars 딥러닝을 사용한 라이다 3차원 객체 검출 예제를 참조하십시오.
타사 선행 조건
필요
CUDA 지원 NVIDIA® GPU 및 호환되는 드라이버.
선택 사항
정적 및 동적 라이브러리 또는 실행 파일과 같은 비 MEX 빌드의 경우, 이 예제에는 다음과 같은 추가 요구 사항이 있습니다.
NVIDIA CUDA 툴킷.
NVIDIA cuDNN 라이브러리.
컴파일러 및 라이브러리 환경 변수. 자세한 내용은 타사 하드웨어 (GPU Coder) 항목과 필수 제품 준비하기 (GPU Coder) 항목을 참조하십시오.
GPU 환경 확인하기
이 예제를 실행하는 데 필요한 컴파일러와 라이브러리가 올바르게 설치되었는지 확인하려면 coder.checkGpuInstall
(GPU Coder) 함수를 사용합니다.
envCfg = coder.gpuEnvConfig('host'); envCfg.DeepLibTarget = 'cudnn'; envCfg.DeepCodegen = 1; envCfg.Quiet = 1; coder.checkGpuInstall(envCfg);
사전 훈련된 PointPillars 신경망
PointPillars 딥러닝을 사용한 라이다 3차원 객체 검출 예제에서 훈련시킨 사전 훈련된 pointPillarsObjectDetector
을(를) 불러옵니다. 검출기를 직접 훈련시키려면 PointPillars 딥러닝을 사용한 라이다 3차원 객체 검출 항목을 참조하십시오.
matFile = 'pretrainedPointPillarsDetector.mat'; pretrainedDetector = load('pretrainedPointPillarsDetector.mat','detector'); detector = pretrainedDetector.detector;
pointpillarsDetect
진입점 함수
pointpillarsDetect
진입점 함수는 포인트 클라우드와 신뢰 임계값을 입력으로 받아 예측을 위해 이를 pointpillarDetect
함수를 통해 훈련된 pointPillarsObjectDetector
에 전달합니다. pointpillarsDetect
함수는 MAT 파일의 검출기 객체를 영속 변수로 불러온 다음 후속 예측 호출에 영속 객체를 재사용합니다.
type('pointpillarsDetect.m')
function [bboxes,scores,labels] = pointpillarsDetect(matFile,dataLoc,dataInt,threshold) % Predict the output of network and extract the confidence, x, y, % width, height, and class. % load the deep learning network for prediction persistent pointPillarObj; if isempty(pointPillarObj) pointPillarObj = coder.loadDeepLearningNetwork(matFile); end ptCloud = pointCloud(dataLoc,'Intensity',dataInt); [bboxes,scores,labels] = pointPillarObj.detect(ptCloud,'Threshold',threshold); end
검출기의 객체 검출 평가하기
포인트 클라우드를 읽어옵니다.
pc = pcread('pandasetDrivingData.pcd');
사전 훈련된 검출기에서 검출 메서드를 사용합니다.
confidenceThreshold = 0.7; [bboxes,~,labels] = detect(detector,pc,'Threshold',confidenceThreshold); bboxesCar = bboxes(labels == 'Car',:); bboxesTruck = bboxes(labels == 'Truck',:);
포인트 클라우드에 검출을 표시합니다.
helperDisplay3DBoxesOverlaidPointCloud(pc.Location,bboxesCar,'green',... bboxesTruck,'magenta','Predicted bounding boxes');
CUDA MEX 생성하기
pointpillarsDetect
진입점 함수에 대한 CUDA® 코드를 생성하려면 MEX 타깃에 대한 GPU 코드 구성 객체를 만들고 타깃 언어를 C++로 설정하십시오. coder.DeepLearningConfig
(GPU Coder) 함수를 사용하여 cuDNN 딥러닝 구성 객체를 만들고 이 객체를 GPU 코드 구성 객체의 DeepLearningConfig
속성에 할당합니다.
cfg = coder.gpuConfig('mex'); cfg.TargetLang = 'C++'; cfg.DeepLearningConfig = coder.DeepLearningConfig(TargetLibrary='cudnn'); dataLoc = pc.Location; dataInt = pc.Intensity; args = {coder.Constant(matFile) coder.typeof(dataLoc,[Inf,3],[1 0]) coder.typeof(dataInt,[Inf,1],[1 0]) coder.typeof(confidenceThreshold)}; codegen -config cfg pointpillarsDetect -args args -report
Code generation successful: View report
생성된 MEX 실행하기
포인트 클라우드를 사용하여 생성된 CUDA MEX를 호출합니다. 결과를 표시합니다.
[bboxes,~,labels] = pointpillarsDetect_mex(matFile,dataLoc,dataInt,confidenceThreshold); bboxesCar = bboxes(labels == 'Car',:); bboxesTruck = bboxes(labels == 'Truck',:); helperDisplay3DBoxesOverlaidPointCloud(pc.Location,bboxesCar,'green',... bboxesTruck,'magenta','Predicted bounding boxes');
헬퍼 함수
function helperDisplay3DBoxesOverlaidPointCloud(ptCld,labelsCar,carColor,... labelsTruck,truckColor,titleForFigure) % Display the point cloud with different colored bounding boxes for different % classes figure; ax = pcshow(ptCld); showShape('cuboid',labelsCar,'Parent',ax,'Opacity',0.1,'Color',... carColor,'LineWidth',0.5); hold on; showShape('cuboid',labelsTruck,'Parent',ax,'Opacity',0.1,'Color',... truckColor,'LineWidth',0.5); title(titleForFigure); zoom(ax,1.5); end
참고 문헌
[1] Lang, Alex H., Sourabh Vora, Holger Caesar, Lubing Zhou, Jiong Yang, and Oscar Beijbom. "PointPillars: Fast Encoders for Object Detection From Point Clouds." In 2019 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), 12689-12697. Long Beach, CA, USA: IEEE, 2019. https://doi.org/10.1109/CVPR.2019.01298.
[2] Hesai and Scale. PandaSet. https://scale.com/open-datasets/pandaset.