Main Content

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

Figure contains an axes object. The axes object with title Predicted bounding boxes contains an object of type scatter.

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

Figure contains an axes object. The axes object with title Predicted bounding boxes contains an object of type scatter.

헬퍼 함수

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.