Main Content

YOLO v2를 사용하여 객체 검출을 위한 코드 생성하기

이 예제에서는 YOLO(You Only Look Once) v2 객체 검출기에 대한 CUDA® MEX를 생성하는 방법을 보여줍니다. YOLO v2 객체 검출 신경망은 2개의 하위 신경망으로 구성됩니다. 하나의 특징 추출 신경망이 있고, 그 뒤에 검출 신경망이 옵니다. 이 예제에서는 Computer Vision Toolbox™의 YOLO v2 딥러닝을 사용한 객체 검출 예제에서 훈련시킨 신경망에 대한 코드를 생성합니다. 자세한 내용은 YOLO v2 딥러닝을 사용한 객체 검출 (Computer Vision Toolbox) 항목을 참조하십시오. Computer Vision Toolbox™의 Import Pretrained ONNX YOLO v2 Object Detector 예제에서 가져온 신경망에 대해 CUDA® MEX를 생성하도록 이 예제를 수정할 수 있습니다. 자세한 내용은 Import Pretrained ONNX YOLO v2 Object Detector (Computer Vision Toolbox) 항목을 참조하십시오.

타사 선행 조건

필수

이 예제는 CUDA MEX를 생성하며, 다음과 같은 타사 요구 사항이 있습니다.

  • CUDA® 지원 NVIDIA® GPU 및 호환되는 드라이버.

선택 사항

정적, 동적 라이브러리 또는 실행 파일과 같은 비 MEX 빌드의 경우, 이 예제에는 다음과 같은 추가 요구 사항이 있습니다.

GPU 환경 확인하기

coder.checkGpuInstall (GPU Coder) 함수를 사용하여 이 예제를 실행하는 데 필요한 컴파일러와 라이브러리가 올바르게 설치되었는지 확인합니다.

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

사전 훈련된 DAGNetwork 가져오기

이 예제에서는 훈련된 신경망을 포함하는 yolov2ResNet50VehicleExample MAT 파일을 사용합니다. 이 파일의 크기는 약 98MB입니다. MathWorks® 웹사이트에서 파일을 다운로드합니다.

matFile = matlab.internal.examples.downloadSupportFile('vision/data','yolov2ResNet50VehicleExample.mat');
vehicleDetector = load(matFile);
net = vehicleDetector.detector.Network
net = 
  DAGNetwork with properties:

         Layers: [150×1 nnet.cnn.layer.Layer]
    Connections: [162×2 table]
     InputNames: {'input_1'}
    OutputNames: {'yolov2OutputLayer'}

DAG 신경망은 컨벌루션 계층, ReLU 계층, 배치 정규화 계층, YOLO v2 변환 계층 및 YOLO v2 출력 계층을 비롯한 150개의 계층으로 이루어져 있습니다. 딥러닝 신경망 아키텍처의 대화형 시각화를 표시하려면 analyzeNetwork 함수를 사용하십시오.

analyzeNetwork(net);

yolov2_detect 진입점 함수

yolov2_detect.m 진입점 함수는 영상을 입력값으로 받아 yolov2ResNet50VehicleExample.mat 파일에 저장된 딥러닝 신경망을 사용하여 이 영상에 대해 검출기를 실행합니다. 이 함수는 yolov2ResNet50VehicleExample.mat 파일의 network 객체를 영속 변수 yolov2Obj로 불러온 다음 후속 검출 호출에서 영속 객체를 재사용합니다.

type('yolov2_detect.m')
function outImg = yolov2_detect(in,matFile)

%   Copyright 2018-2021 The MathWorks, Inc.

persistent yolov2Obj;

if isempty(yolov2Obj)
    yolov2Obj = coder.loadDeepLearningNetwork(matFile);
end

% Call to detect method
[bboxes,~,labels] = yolov2Obj.detect(in,'Threshold',0.5);

% Convert categorical labels to cell array of charactor vectors
labels = cellstr(labels);

% Annotate detections in the image.
outImg = insertObjectAnnotation(in,'rectangle',bboxes,labels);

MEX 코드 생성 실행하기

진입점 함수에 대한 CUDA 코드를 생성하려면 MEX 타깃에 대한 GPU 코드 구성 객체를 만들고 타깃 언어를 C++로 설정하십시오. coder.DeepLearningConfig (GPU Coder) 함수를 사용하여 CuDNN 딥러닝 구성 객체를 만들고 이 객체를 GPU 코드 구성 객체의 DeepLearningConfig 속성에 할당합니다. 입력 크기를 224×224×3으로 지정하여 codegen 명령을 실행합니다. 이 값은 YOLOv2의 입력 계층 크기입니다.

cfg = coder.gpuConfig('mex');
cfg.TargetLang = 'C++';
cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');
cfg.GenerateReport = true;
inputArgs = {ones(224,224,3,'uint8'),coder.Constant(matFile)};

codegen -config cfg yolov2_detect -args inputArgs
Code generation successful: View report

생성된 MEX 실행하기

비디오 파일 리더를 설정하고 입력 비디오를 읽어 들입니다. 비디오 플레이어를 만들어서 비디오 및 출력 검출을 표시합니다.

videoFile = 'highway_lanechange.mp4';
videoFreader = VideoReader(videoFile);
depVideoPlayer = vision.DeployableVideoPlayer('Size','Custom','CustomSize',[640 480]);

비디오 입력값을 프레임별로 읽어 들이고 검출기를 사용하여 비디오의 차량을 검출합니다.

while hasFrame(videoFreader)
    I = readFrame(videoFreader);
    in = imresize(I,[224,224]);
    out = yolov2_detect_mex(in,matFile);
    depVideoPlayer(out);
    % Exit the loop if the video player figure window is closed
    cont = hasFrame(videoFreader) && isOpen(depVideoPlayer); 
end

참고 문헌

[1] Redmon, Joseph, and Ali Farhadi. "YOLO9000: Better, Faster, Stronger." 2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR). IEEE, 2017.