본문 바로가기

책/파이토치 트랜스포머를 활용한 자연어 처리와 컴퓨터비전 심층학습

09 객체 탐지 (7) YOLO

1. YOLOv1

Joseph Redmon이 2016년에 제안한 객체 탐지를 위한 모델이다. SSD와 마찬가지로 1-stage 구조로 영역 제안 네트워크를 필요로 하지 않고 구조 또한 단순하여 빠른 처리 속도를 보유하고 있어 real time object detection 작업에 적합하다. Faster R-CNN의 경우 처리 속도가 5fps인 반면, YOLO는 45fps 그리고 구조를 좀 더 단순화한 Fast YOLO의 경우 150fps이다.

 

다음은 YOLO의 구조이다.

YOLOv1 구조

 

다중 특징 맵을 사용하지 않으며 한 방향으로 순차적으로 진행하는 단일 특징 맵을 통해 객체 검출을 수행한다. 출력은 7x7x30인데 30은 (2 * B + C)로 계산되는 값이다. B는 (x, y, w, h, confidence score)이고, C는 클래스 개수 20이다. 따라서 이는 특징 맵의 그리드 셀마다 2개의 경계 상자를 예측해 총 98(7x7x2)개의 경계 상자를 예측한다는 뜻이다.

 

confidence score는 class specific confidence score를 뜻하는데, 이는 셀에서 하나의 클래스만 예측한다는 뜻이다. 그래서 겹쳐있는 객체를 예측하는 것이 어렵다. 또한 경계 상자의 수가 적기 때문에 다양한 형태의 객체를 검출하는 데 불리하다.

 

class specific confidence score의 수식은 다음과 같다.

 

$P({Class}_i \mid Object) * P(Object) * IOU = P({Class}_i) * IOU$

 

 

2. YOLOv2

Batch Normalization

YOLOv2는 v1에 비해 여러 가지 개선점이 있다. 먼저 모든 합성곱 계층에 배치 정규화를 적용하였다. v1에서는 배치 정규화가 적용되지 않았다. 이를 통해 mAP 측면에서 성능이 2% 향상되었다.

 

High resolutin feature map

v2에서는 고해상도의 특징 맵을 생성한다. v1에서는 최종 출력으로 7x7 특징 맵을 출력한 반면, v2에서는 13x13 특징 맵을 출력한다. 이는 네트워크가 이미지에 대한 더 많은 공간 정보를 가지게 한다.

 

Pass through layer

YOLOv2 구조

 

v2의 구조를 보면 신경망의 이전 레이어에서 나온 정보가 중간 레이어를 우회하고 최종 예측에 직접 영향을 줄 수 있도록 병렬 브랜치를 사용한다. 이는 FPN처럼 공간 정보를 유지할 수 있도록 도움이 된다.

 

 

Pass through layer에서는 특징 맵을 4개로 분할하고 마지막 차원을 기준으로 재결합하는 방법을 사용했다. 즉 26x26x512인 특징 맵을 13x13x2048 형식으로 재구성하는 것이다. 그런 다음 중간 레이어의 출력인 13x13x1024 특징 맵과 연결하여 13x13x3072 특징 맵을 만들어낸다. 이는 작은 객체에 대한 검출 성능 향상을 도운다.

 

Anchor box

v1에서는 특징 맵의 그리드 셀 당 2개의 바운딩 박스만 예측되어 총 98개의 예측이 생성되었다. 이러한 한정된 예측 수는 낮은 recall rates을 야기할 수 있다.

 

v2에서는 앵커 박스를 사용한다. 다만 Faster R-CNN 처럼 사전 정의된 앵커 박스를 사용하는 것이 아니라. Ground truth 박스를 k-means clustering을 사용해 공유 중심점을 가지며 유사한 종횡비 상자를 하나의 그룹으로 병합하여 데이터셋에서 가장 일반적인 객체 모양을 나타내는 앵커 박스를 생성한다. 논문에서는 실험을 통해 5개의 최적의 앵커 박스를 선택하는 것이 효과적이라고 한다.

 

Backbone

백본 모델로 DarkNet-19를 사용한다. v1은 85억 개의 매개변수를 가졌지만 v2는 55억 개로 줄였다.

 

ResNet과 비교하여도 성능이 준수하며 속도도 빠르다.

 

 

매개변수 감소를 위해 완전 연결 레이어를 제거하고 이를 대신해 합성곱 레이어를 추가하였다. 최종적으로 13x13x125의 특징 맵을 출력한다. 125는 5(앵커박스 개수) * (x, y, w, h, confidence score, 클래스 개수 20)으로 계산되는 값이다.

 

 

3. YOLOv3

Backbone

백본 모델로 마지막 3개의 레이어(avg pooling, fc layer, softmax)를 제외한 DarkNet-53을 사용한다. 이는 ResNet처럼 residual block이 사용된 합성곱 신경망 모델이다.

 

 

다양한 스케일의 출력 레이어

위 그림에서 최종 출력이 13x13이고, 그 전에 26x26과 52x52의 특징 맵이 출력됨을 알 수 있다. v3에서는 3개의 출력 레이어(y1, y2, y3)를 생성한다.

 

This image is taken from  https://yunyang1994.github.io/2018/12/28/YOLOv3/

 

 

v3은 마지막 레이어 뒤에 몇 개의 합성곱 레이어를 추가하고 첫 번째 출력 레이어 y1을 얻는다. 그리고 이를 2배 업샘플링하고 마지막에서 두 번째 출력 레이어와 연결한다. 이 뒤에 몇 개의 합성곱 레이어를 추가하고 y2를 얻는다. y3도 비슷한 방법으로 생성한다. 업샘플링으로 손실되는 정보들은 잔차 연결을 통해 보완한다. FPN과 마찬가지로 이는 다양한 크기의 객체를 검출하는데 도움이 된다. 크기가 13x13의 y1은 큰 객체를 검출하는 데 사용되고, 52x52로 그리가 많은 y3은 작은 객체를 검출하기에 유리하다. 

 

 

4. YOLOv4 / v5

source : https://kr.mathworks.com/help/vision/ug/getting-started-with-yolo-v4.html

 

 

YOLOv4는 다중 특징 맵을 사용할 때 객체의 세부 정보를 잃지 않도록 업샘플링 과정을 개선했다. 이를 위해 사용된 것이 SPP와 PAN이다.

 

 

SPP는 마지막 풀링 레이어를 공간 피라미드 풀링 레이어로 교체한다. YOLO에서 SPP는 크기가 1, 5, 9, 13인 슬라이딩 커널이 적용되고, 서로 다른 커널 크기의 특징 맵은 이후 연결되어 출력된다.

 

PAN은 FPN과 유사하지만 FPN은 Top-down 방식으로만 다중 특징 맵을 생성하는 반면 PAN은 Bottom-up 방식도 동시에 사용한다.

 

또한 특징 맵 간의 결합을 덧셈이 아닌 채널 단위로 수행해 더욱 효율적으로 정보를 전달한다. 

 

추가적으로 모델 구조를 개선하는 것 외에도 새로운 데이터 증강 기법을 도입하여 성능을 향상시켰다. 그중 모자이크 합성이 대표적인 기법이다. 

 

 

모자이크 합성은 학습 이미지를 네 개씩 모아서 바둑판 형식으로 붙여, 한번에 학습하는 기법이다. 이를 통해 v4는 다양한 크기와 위치에 대한 객체 인식 능력을 강화하고 데이터의 다양성을 높이는 효과를 얻을 수 있었다.

 

또한 모자이크 합성을 수행하면 이미지의 크기가 줄어들기 때문에 작은 객체 데이터를 효과적으로 수집할 수 있어, 크기 변화에 더 강인한 학습 효과를 기대할 수 있다.

 

YOLOv5는 모델 구조를 유지하고 파이토치 라이브러리로 이식하고 세부 사항을 조정했다. 이러한 과정으로 모델을 최적화해 인식 성능과 추론 속도를 개선했다. v5는 모델의 크기에 따라 Nano, Small, Medium, Large, Extra Large 버전으로 제공되며, 점진적으로 높은 정확도를 제공하지만 모델의 크기가 커지면 학습 및 추론 시간이 더 길어지는 단점이 있다.

 

 

5. YOLOv6 / v7

YOLOv6은 백본 모델에 RepBlock을 적용해 인식 성능과 추론 속도를 개선한 모델이다. RepBlock은 매개변수 재정의(Re-parameterization)라는 기법을 통해 설계된 네트워크로 RepVGG 구조를 참고해 설계됐다.

 

RepBlock을 적용한 모델은 학습 시 여러 방향으로 순전파가 진행되며, 추론 시 한 방향으로만 순전파가 진행된다.

 

 

RepBlcok은 여러 개의 분기로 1x1 합성곱 계층과 Identity(위 그림의 (B)에서 그냥 곡선) 계층을 사용해 ResNet의 잔차 연결과 유사한 방식으로 모델을 학습한다. 이후 추론 시에는 같은 위치의 합성곱 계층을 합성해 새로운 단일 3x3 합성곱 계층으로 변환한 후 한 방향으로 순전파를 진행한다.

 

또한 사전 정의된 앵커를 사용하지 않는 앵커 프리 구조를 사용해 불필요한 연산 과정을 제거했다. 앵커 프리 구조에 관한 내용은 다른 블로그에서 잘 정리해주셨다. 여기서는 한 가지 방법에 대해서만 소개한다.

 

FCOS: Fully Convolutional One-Stage Object Detection

 

 

네트워크의 출력을 보면 Classification, Center-ness regression, bounding box regression을 수행함을 알 수 있다. 바운딩 박스 regression에서는 (left, top, right, bottom)을 예측한다. Center-ness 브랜치는 물체의 중심과 가까운 예측만 활용하기 위해 도입되었다.

 

 

각 픽셀에 대한 (l, t, r, b)는 학습 과정에서 ground truth에는 중심 좌표와 바운딩 박스 좌표에 의해 supervised된다. 위 그림의 오른쪽의 경우 한 픽셀이 2가지 객체에 겹치는 경우도 있다. FCOS에서는 서로 다른 크기의 물체는 서로 다른 특징 맵에서 탐지하도록 학습되었기 때문에 겹쳐진 객체도 정확하게 인식할 수 있다. 

 

v7은 RepBlock 구조를 개선한 RepConvN을 사용한다. 이는 Identity 계층을 제거해 순전파가 중복되는 문제를 해결하였다.

그림 (d)를 보면 RepConv 내의 identity 계층과 input c에서 오는 identity 계층이 겹쳐 덧셈 연산이 두 번 수행된다. RepConvN 잔차 연결은 중복이 발생하지 않고 연산이 한 번만 수행된다.

 

또한 v7에서는 모델의 최종 출력인 lead head와 학습을 보조하는 auxiliary head를 따로 구성한다. lead head의 예측과 ground truth를 기반으로 soft label을 생성하여 auxiliary head를 학습시킨다. 이 과정에서 lead head는 학습하지 못한 다른 특징을 학습할 수 있는 residual learning이 가능하다.

 

 

참조

YOLOv1

YOLOv2

YOLOv3

YOLOv4

앵커 프리 구조

YOLOv7