YOLO v4 시작하기
YOLO v4(You Only Look Once 버전 4) 객체 검출 신경망은 단일 단계 객체 검출 신경망이며 백본(backbone), 넥(neck), 헤드(head)의 세 부분으로 구성됩니다.
백본은 COCO 또는 ImageNet 데이터 세트를 기반으로 훈련된 VGG16 또는 CSPDarkNet53과 같은 사전 훈련된 컨벌루션 신경망일 수 있습니다. YOLO v4 신경망의 백본은 입력 영상에서 특징 맵을 계산하는 특징 추출 신경망 역할을 합니다.
넥은 백본과 헤드를 연결합니다. 이는 공간 피라미드 풀링(SPP: Spatial Pyramid Pooling) 모듈과 경로 집계 신경망(PAN: Path Aggregation Network)으로 구성됩니다. 넥은 백본 신경망의 서로 다른 계층에서 특징 맵을 결합하여 헤드에 입력으로 전송합니다.
헤드는 집계된 특징을 처리하고 경계 상자, 객체성 점수(objectness score), 분류 점수(classification score)객체를 예측합니다. YOLO v4 신경망은 YOLO v3과 같은 단일 단계 객체 검출기를 검출 헤드로 사용합니다.

YOLO v4 신경망은 입력 영상에서 특징을 추출하기 위한 백본으로 CSPDarkNet-53을 사용합니다. 백본은 5개의 잔차 블록 모듈로 구성되며, 잔차 블록 모듈의 특징 맵 출력값은 YOLO v4 신경망의 넥에서 혼합됩니다.
넥의 SPP 모듈은 저해상도 특징 맵의 최댓값 풀링 출력값을 결합하여 가장 대표적인 특징을 추출합니다. SPP 모듈은 최댓값 풀링 연산을 위해 1×1, 5×5, 9×9, 13×13 크기의 커널을 사용합니다. 스트라이드 값은 1로 설정됩니다. 특징 맵을 결합하면 백본 특징의 수용 영역이 증가하고 작은 객체 검출 시 신경망의 정확도가 향상됩니다. SPP 모듈의 결합된 특징 맵은 PAN을 사용하여 고해상도 특징 맵과 혼합됩니다. PAN은 업샘플링과 다운샘플링 연산을 사용하여 저수준 특징(low-level feature)과 저수준 특징(high-level feature)을 결합하기 위한 상향식 및 하향식 경로를 설정합니다.
PAN 모듈은 예측에 사용할 집계된 특징 맵 세트를 출력합니다. YOLO v4 신경망에는 세 개의 검출 헤드가 있습니다. 각 검출 헤드는 최종 예측을 계산하는 YOLO v3 신경망입니다. YOLO v4 신경망은 19×19, 38×38, 76×76 크기의 특징 맵을 출력하여 경계 상자, 분류 점수, 객체성 점수를 예측합니다.
Tiny YOLO v4 신경망은 더 적은 신경망 계층으로 구성된 YOLO v4 신경망의 경량 버전입니다. Tiny YOLO v4 신경망은 특징 피라미드 신경망(feature pyramid network)을 넥으로 사용하고 두 개의 YOLO v3 검출 헤드를 갖습니다. 이 신경망은 예측 계산을 위해 13×13과 26×26 크기의 특징 맵을 출력합니다.
YOLO v4를 사용하여 객체 예측하기
YOLO v4는 앵커 상자를 사용하여 영상에서 객체 클래스를 검출합니다. 앵커 상자에 대한 자세한 내용은 객체 검출용 앵커 상자 항목을 참조하십시오. YOLO v3와 마찬가지로 YOLO v4는 각 앵커 상자에 대해 다음 세 가지 특성을 예측합니다.
IoU(Intersection over Union) — 각 앵커 상자의 객체성 점수를 예측합니다.
앵커 상자 오프셋 — 앵커 상자 위치를 미세 조정합니다.
클래스 확률 — 각 앵커 상자에 할당된 클래스 레이블을 예측합니다.
다음 그림은 특징 맵의 각 위치에 점선으로 표시된 미리 정의된 앵커 상자와 오프셋을 적용한 후 미세 조정된 위치를 보여줍니다. 클래스와 일치된 앵커 상자는 색으로 표시되어 있습니다.

신경망을 훈련시키는 동안 선험적 상자(a priori box)로도 불리는 미리 정의된 앵커 상자와 클래스를 지정해야 합니다.
YOLO v4 객체 검출 신경망 만들기
YOLO v4 딥러닝 신경망을 프로그래밍 방식으로 만들려면 yolov4ObjectDetector 객체를 사용하십시오. 사전 훈련된 YOLO v4 딥러닝 신경망인 csp-darknet53-coco와 tiny-yolov4-coco를 사용하여 영상에서 객체를 검출하는 yolov4ObjectDetector 객체를 만들 수 있습니다. 이 신경망들은 COCO 데이터 세트를 기반으로 훈련되었습니다. csp-darknet53-coco는 세 개의 검출 헤드를 가진 YOLO v4 신경망이고, tiny-yolov4-coco는 두 개의 검출 헤드를 가진 Tiny YOLO v4 신경망입니다. 이러한 YOLO v4 사전 훈련된 신경망을 다운로드하려면 Computer Vision Toolbox™ Model for YOLO v4 Object Detection 지원 패키지를 설치해야 합니다.
YOLO v4 신경망을 사용하여 객체 훈련 및 검출하기
레이블이 지정된 데이터셋을 기반으로 YOLO v4 객체 검출 신경망을 훈련시키려면 trainYOLOv4ObjectDetector 함수를 사용하십시오. 신경망 훈련에 사용하는 데이터 세트의 클래스 이름과 미리 정의된 앵커 상자를 지정해야 합니다.
훈련 함수는 훈련된 신경망을 yolov4ObjectDetector 객체로 반환합니다. 그런 다음 detect 함수를 사용하여 훈련된 YOLO v4 객체 검출기를 사용하여 테스트 영상에서 알 수 없는 객체를 검출할 수 있습니다. YOLO v4 객체 검출기를 생성하고 객체 검출을 훈련시키는 방법은 YOLO v4 딥러닝을 사용한 객체 검출 예제를 참조하십시오.
앵커 상자 지정하기
훈련에 사용되는 앵커 상자의 형태, 크기, 개수는 YOLO v4 객체 검출 신경망의 효율성과 정확도에 영향을 미칩니다. 앵커 상자는 훈련 데이터 내 객체의 크기와 종횡비를 가장 근접하게 나타내야 합니다. 훈련 데이터에는 ground truth 영상과 레이블이 모두 포함되어야 합니다. 훈련 영상의 크기는 신경망 입력 크기와 동일해야 하며, 경계 상자 레이블은 훈련 영상의 크기와 일치해야 합니다.
YOLO v4 신경망의 각 검출 헤드에 동일한 개수의 앵커 상자를 할당해야 합니다. 각 검출 헤드에 할당된 앵커 상자의 크기는 검출 헤드에서 출력된 특징 맵의 크기와 일치해야 합니다. 저해상도 특징 맵을 사용하는 검출 헤드에는 큰 앵커 상자를, 고해상도 특징 맵을 사용하는 검출 헤드에는 작은 앵커 상자를 할당해야 합니다.
예를 들어, 다음 단계에서는 각각 19×19, 38×38, 76×76 크기의 특징 맵을 사용하는 세 개의 검출 헤드를 가진 YOLO v4 신경망을 훈련시키기 위해 앵커 상자를 지정하는 방법을 보여줍니다.
각 검출 헤드에 대해 앵커 상자를 4개 지정한다고 가정합니다. 그러면 신경망 훈련에 사용하는 앵커 상자의 총 개수는 12개여야 합니다.
estimateAnchorBoxes함수를 사용하면 지정된 훈련 데이터에 대한 앵커 상자를 자동으로 추정할 수 있습니다.numAnchors = 12; [anchors] = estimateAnchorBoxes(trainingData,numAnchors);
각 앵커 상자의 면적을 계산하고 내림차순으로 정렬합니다.
area = anchors(:,1).*anchors(:,2); [~,idx] = sort(area,"descend"); sortedAnchors = anchors(idx,:)YOLO v4 신경망에는 검출 헤드가 3개 있으므로, 각각 앵커 상자 4개씩 3세트를 만듭니다.
anchorBoxes = {sortedAnchors(1:4,:) sortedAnchors(5:8,:) sortedAnchors(9:12,:)};yolov4ObjectDetector함수를 사용하여 YOLO v4 객체 검출 신경망을 만듭니다. 클래스와 정렬된 앵커 상자를 지정합니다. 이 함수는 첫 번째 앵커 상자 세트를 첫 번째 검출 헤드에 할당하고, 두 번째 세트를 두 번째 검출 헤드에 할당하는 방식으로 진행합니다. 처음 네 개의 앵커 상자는 넓은 면적을 가지므로 저해상도 19×19 특징 맵을 출력하는 첫 번째 검출 헤드에 할당해야 합니다. 다음 네 개의 앵커 상자는 38×38 크기의 특징 맵을 출력하는 두 번째 검출 헤드에 할당해야 합니다. 마지막 네 개의 앵커 상자는 가장 높은 해상도인 76×76 특징 맵을 출력하는 세 번째 검출 헤드에 할당합니다.detector = yolov4ObjectDetector("csp-darknet53-coco","car",anchorBoxes);
trainYOLOv4ObjectDetector함수를 사용하여 검출기를 훈련시킵니다.detector = trainYOLOv4ObjectDetector(trainingData,detector,trainingOptions);
전이 학습
전이 학습을 수행하려면 사전 훈련된 컨벌루션 신경망(CNN)을 YOLO v4 딥러닝 신경망의 기본 신경망으로 사용합니다. 앵커 상자와 새로운 객체 클래스를 지정하여 새로운 데이터 세트를 사용하여 훈련할 수 있도록 YOLO v4 딥러닝 신경망을 구성합니다. yolov4ObjectDetector 객체를 사용하여 ResNet-50과 같은 사전 훈련된 CNN에서 사용자 지정 YOLO v4 검출 신경망을 생성합니다. 그런 다음 trainYOLOv4ObjectDetector 함수를 사용하여 신경망을 훈련시킵니다.
사용자 지정 YOLO v4 객체 검출기를 만드는 방법에 대한 자세한 내용은 Create Custom YOLO v4 Object Detector 항목을 참조하십시오.
딥러닝을 위해 훈련 데이터에 레이블 지정하기
영상 레이블 지정기, 비디오 레이블 지정기 또는 Ground Truth 레이블 지정기 (Automated Driving Toolbox) 앱을 사용하여 대화형 방식으로 픽셀에 레이블을 지정하고 훈련을 위해 레이블 데이터를 내보낼 수 있습니다. 또한 이러한 앱을 사용하여 객체 검출을 위해 축 정렬되고 회전된 사각형 관심 영역(ROI)에 레이블을 지정하고, 영상 분류를 위해 장면에 레이블을 지정하고, 의미론적 분할을 위해 픽셀에 레이블을 지정할 수 있습니다. 레이블 지정기에서 내보낸 ground truth 객체로부터 훈련 데이터를 만들려면 objectDetectorTrainingData 또는 pixelLabelTrainingData 함수를 사용합니다. 자세한 내용은 Training Data for Object Detection and Semantic Segmentation 항목을 참조하십시오.
참고 문헌
[1] Bochkovskiy, Alexey, Chien-Yao Wang, and Hong-Yuan Mark Liao. “YOLOv4: Optimal Speed and Accuracy of Object Detection.” ArXiv:2004.10934 [Cs, Eess], April 22, 2020. https://arxiv.org/abs/2004.10934.
[2] Redmon, Joseph, Santosh Divvala, Ross Girshick, and Ali Farhadi. "You only look once: Unified, real-time object detection." In 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 779–788. Las Vegas, NV: USA: IEEE, 2016. https://doi.org/10.1109/CVPR.2016.91.
[3] Simon, Martin, Stefan Milz, Karl Amende, and Horst-Michael Gross. "Complex-yolo: Real-time 3d object detection on point clouds." arXiv preprint arXiv:1803.06199 (2018).
참고 항목
앱
- 영상 레이블 지정기 | Ground Truth 레이블 지정기 (Automated Driving Toolbox) | 비디오 레이블 지정기 | 심층 신경망 디자이너 (Deep Learning Toolbox)
객체
함수
도움말 항목
- YOLO v4 딥러닝을 사용한 객체 검출
- 객체 검출용 앵커 상자
- MATLAB의 딥러닝 (Deep Learning Toolbox)
- 사전 훈련된 심층 신경망 (Deep Learning Toolbox)