YOLO v3 딥러닝 신경망을 사용한 객체 검출 코드 생성
이 예제에서는 YOLO(You Only Look Once) v3 객체 검출기에 대한 CUDA® MEX를 생성하는 방법을 보여줍니다. YOLO v2에서 개선된 YOLO v3는 더 작은 객체를 검출할 수 있도록 여러 스케일에서 검출을 수행하는 기능을 추가합니다. 훈련에 사용되는 손실 함수는 경계 상자 회귀에 대한 평균제곱오차와 객체 분류에 대한 이진 교차 엔트로피로 분리되어 검출 정확도를 높이는 데 도움이 됩니다. 이 예제의 YOLO v3 신경망은 COCO 데이터셋에 대해 훈련되었습니다. tiny YOLO v3 신경망은 YOLO v3 신경망에 다수로 포함된 컨벌루션 계층의 개수를 줄입니다. 이 신경망은 연산 능력 요구 사항이 더 낮기 때문에 실시간 객체 검출에 더 적합합니다. 자세한 내용은 Getting Started with YOLO v3 (Computer Vision Toolbox) 항목과 Object Detection Using YOLO v3 Deep Learning (Computer Vision Toolbox) 항목을 참조하십시오.
타사 선행 조건
필수
CUDA 지원 NVIDIA® GPU 및 호환되는 드라이버.
선택 사항
정적, 동적 라이브러리 또는 실행 파일과 같은 비 MEX 빌드의 경우, 이 예제에는 다음과 같은 추가 요구 사항이 있습니다.
NVIDIA CUDA 툴킷.
NVIDIA cuDNN 라이브러리.
컴파일러 및 라이브러리 환경 변수. 자세한 내용은 타사 하드웨어 항목과 필수 제품 준비하기 항목을 참조하십시오.
GPU 환경 확인하기
이 예제를 실행하는 데 필요한 컴파일러와 라이브러리가 올바르게 설치되었는지 확인하려면 coder.checkGpuInstall
함수를 사용하십시오.
envCfg = coder.gpuEnvConfig('host'); envCfg.DeepLibTarget = 'cudnn'; envCfg.DeepCodegen = 1; envCfg.Quiet = 1; coder.checkGpuInstall(envCfg);
사전 훈련된 YOLO v3 신경망
이 예제에서는 COCO 데이터셋에 대해 사전 훈련된 YOLO v3 객체 검출 신경망을 사용합니다. 이 객체 검출기는 사람, 자전거, 자동차 등 80가지의 다양한 객체를 검출할 수 있습니다. YOLO v3 신경망을 사용하려면 애드온 탐색기에서 Computer Vision Toolbox Model for YOLO v3 Object Detection을 다운로드하여 설치하십시오. 애드온 설치에 대한 자세한 내용은 애드온을 받고 관리하기 항목을 참조하십시오.
신경망의 이름을 지정하고 yolov3ObjectDetector
객체를 MAT 파일에 저장합니다. yolov3ObjectDetector
객체를 MAT 파일에 저장하고 계속 진행합니다.
name = "tiny-yolov3-coco"; vehicleDetector = yolov3ObjectDetector(name); matFile = 'tinyyolov3coco.mat'; save(matFile,'vehicleDetector'); net = vehicleDetector.Network; inputLayerSize = net.Layers(1).InputSize; disp(vehicleDetector.ClassNames(1:5))
person bicycle car motorbike aeroplane
tinyyolov3Detect
진입점 함수
tinyyolov3Detect
진입점 함수는 영상 입력을 받아 영상에 대해 검출기를 실행합니다. 이 함수는 tinyyolov3coco.mat
파일의 network 객체를 영속 변수 yolov3Obj
로 불러온 다음 후속 검출 호출에서 영속 객체를 재사용합니다.
type('yolov3Detect.m')
function outImg = yolov3Detect(in,matFile) % Copyright 2021-2022 The MathWorks, Inc. persistent yolov3Obj; if isempty(yolov3Obj) yolov3Obj = coder.loadDeepLearningNetwork(matFile); end % Call to detect method [bboxes,~,labels] = yolov3Obj.detect(in,Threshold = 0.6); % Convert categorical labels to cell array of charactor vectors labels = cellstr(labels); % Annotate detections in the image. outImg = insertObjectAnnotation(in,'rectangle',bboxes,labels);
CUDA MEX 생성하기
진입점 함수에 대한 CUDA 코드를 생성하려면 MEX 타깃에 대한 GPU 코드 구성 객체를 만들고 타깃 언어를 C++로 설정하십시오. coder.DeepLearningConfig
함수를 사용하여 CuDNN
딥러닝 구성 객체를 만들고 이 객체를 GPU 코드 구성 객체의 DeepLearningConfig
속성에 할당합니다. 입력 크기를 416×416×3으로 지정하여 codegen
명령을 실행합니다. 이 값은 YOLO v3 신경망의 입력 계층 크기입니다.
cfg = coder.gpuConfig('mex'); cfg.TargetLang = 'C++'; cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn'); inputArgs = {coder.typeof(uint8(0),inputLayerSize),coder.Constant(matFile)}; codegen -config cfg yolov3Detect -args inputArgs -report
Code generation successful: View report
생성된 MEX를 영상에 대해 테스트하기
입력 영상 하나를 불러옵니다. 입력 영상에 대해 tinyyolov3cocoDetect_mex
를 호출하고 검출 결과를 표시합니다.
im = imread('highway.png');
im = preprocess(vehicleDetector,im);
outputImage = yolov3Detect_mex(im,matFile);
imshow(outputImage);
생성된 MEX를 비디오에 대해 테스트하기
비디오 파일 리더를 설정하고 입력 비디오를 읽어 들입니다. 비디오 플레이어를 만들어서 비디오 및 출력 검출을 표시합니다.
videoFile = 'highway_lanechange.mp4'; videoFreader = VideoReader(videoFile); depVideoPlayer = vision.DeployableVideoPlayer('Size','Custom','CustomSize',[640 480]);
비디오 입력값을 프레임별로 읽어 들이고 검출기를 사용하여 비디오의 차량을 검출합니다.
cont = hasFrame(videoFreader); while cont I = readFrame(videoFreader); in = imresize(I,inputLayerSize(1:2)); out = yolov3Detect_mex(in,matFile); step(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. “YOLOv3: An Incremental Improvement.” arXiv, April 8, 2018. http://arxiv.org/abs/1804.02767.
2. Lin, Tsung-Yi, Michael Maire, Serge Belongie, James Hays, Pietro Perona, Deva Ramanan, Piotr Dollár, and C. Lawrence Zitnick. “Microsoft COCO: Common Objects in Context.” In Computer Vision – ECCV 2014, edited by David Fleet, Tomas Pajdla, Bernt Schiele, and Tinne Tuytelaars, 8693:740–55. Cham: Springer International Publishing, 2014. https://doi.org/10.1007/978-3-319-10602-1_48.
참고 항목
함수
객체
coder.gpuConfig
|coder.gpuEnvConfig
|coder.TensorRTConfig
|coder.CuDNNConfig
|dlarray
(Deep Learning Toolbox) |dlnetwork
(Deep Learning Toolbox)
관련 예제
- Object Detection Using YOLO v3 Deep Learning (Computer Vision Toolbox)