논문

하루에도 수만개의 글자를 읽고 있습니다. 하루에도 수백장의 종이를 들춰 읽습니다.
이것은 그 읽기에 대한 일기입니다.

You Only Look Once: Unified, Real-Time Object Detection

1. Introduction

최근 제안된 R-CNN은 먼저 이미지 내에서 물체가 존재할만한 영역의 바운딩 박스를 후보로써 생성하고, 그렇게 추출된 박스에서 분류기를 실행합니다. 게다가 분류 작업 이후에는 후처리를 통해서 박스를 정교화하고 중복된 결과를 지우고, 점수를 재설정하는 류의 일들이 수행되어야 합니다. 이러한 복잡한 파이프라인은 느린데다가, 각 요소들이 따로 학습되어야 하기 때문에 최적화하기 힘듭니다.

이러한 물체 검출 문제를 하나의 리그레션 문제로 만들어 이미지 픽셀들로부터 바운딩 박스의 위치와 클래스에 속할 확률을 한번에 계산하고자 합니다.

YOLO가 사용하는 통합 모델은 여러가지 이점이 있습니다. 검출을 리그레션을 통해서 복잡한 파이프라인 없이 실행되므로 빠릅니다. 또한 슬라이딩 윈도우 방식이나 영역 제안 방식과는 달리 학습과 테스트에 전체 이미지를 사용합니다. 마지막으로 YOLO는물체의 일반화된 표현을 학습할 수 있습니다.

2. Unified Detection

YOLO는 객체 검출의 분리되어있던 각 요소들을 하나의 신경망을 통합하였습니다. 이미지로부터 생성된 특징을 이용하여 각 바운딩 박스의 좌표과 그에 대한 클래스를 한번에 유추합니다.

먼저 입력 이미지를 $ S \times S$의 그리드로 나눕니다. 어떤 객체의 중심을 포함하는 그리드 셀이 그 객체를 검출하는 역할을 맡습니다. 각 그리드셀은 $B$개의 바운딩 박스와 그 박스의 신뢰도(confidence score)를 유추합니다. 신뢰도는 박스가 객체를 포함할 것인지에 대한 신뢰도임과 동시에 박스가 얼마나 정확하게 유추되었는지를 반영하는 수치입니다. 이것을 $\text{Pr(Object)} * \text{IOU}^{\text{truth}}_{\text{pred}}$로 정의하였습니다. 만약 셀 안에 객체가 없으면 이 값은 0이 될 것이며 그렇지 않으면 유추된 박스와 실제 박스 사이의 intersection of union (IOU)를 값으로 사용합니다.

각 바운딩 박스는 $x, y, w, h$와 신뢰도의 5개의 값을 유추합니다. $(x, y)$는 그리드 셀을 기준으로하는 박스 중심의 상대 좌표를 의미합니다. 폭 높이는 전체 이미지에 대해서 상대적인 값입니다. 마지막으로 신뢰도는 유추된 박스와 실제 물체 박스의 IOU값입니다.

각 그리드 셀은 또한 $C$개의 조건부 확률, 즉 $\text{Pr}(\text{Class}_{\text{i}} | \text{Object})$을 유추합니다. 이 값은 각 그리드 셀이 객체를 포함하고 있을 확률을 나타냅니다. 여기서는 $B$개의 박스 수와는 관계 없이 한 그리드 셀이 여러 클래스 중 하나의 물체만 유추하도록 하고 있습니다.

테스트 시에는 이 조건부 확률에 각 박스 신뢰도를 곱해서 각 클래스에 대한 신뢰도로 사용합니다.

$$ \text{Pr}(\text{Class}_\text{i} | \text{Object}) * \text{Pr}(\text{Object})*\text{IOU}^{\text{truth}}_{\text{pred}} = \text{Pr}(\text{Class}_\text{i}) *\text{IOU}^{\text{truth}}_{\text{pred}} $$

이 값은 클래스가 존재할 확률과 동시에 박스가 얼마나 객체에 맞기 유추되었는지를 나타냅니다.

논문에서는 PASCAL VOC에 적용하기 위해서 $S=7, B=2, C=20$를 사용하였고, 때문에 최종 출력은 $7 \times 7 \times 30 $ 크기의 텐서가 됩니다.

2.1 Network Design

구조는 GoogLeNet의 영향을 받았습니다. 24개의 컨볼루셔널 레이어와 2개의 완전 연결 레이어를 연결 시켰습니다. Inception 모듈 대신 1×1 reduction 레이어와 3×3 컨볼루셔널 레이어를 사용하였습니다.

또한 빠른 버전의 YOLO를 학습시켰는데 이 버전은 24개의 레이어 대신 9개의 컨볼루셔널 레이어를 사용하였습니다. 나머지 파라미터들은 같습니다.

2.2 Training

ImageNet 1000클래스 데이터셋으로 처음 20개 컨볼루셔널 넷과 거기에 평균 풀링 레이어 그리고 완전 연결 레이어를 붙여 프리트레이닝 시켰습니다. 그 뒤 4개의 컨볼루셔널 레이어와 2개의 완전 연결 레이어를 붙여 학습을 시켰습니다. 또한 세밀한 검출을 위해 입력 크기는 224 x 224에서 448 x 448로 늘렸습니다.

활성 함수는 leaky rectified linear activation을 사용하였습니다.

출력에 대해서 sum-squared error를 이용하여 최적화를 수행하였습니다. 이 에러를 사용한 이유는 최적화가 쉽기 때문이지만, 평균 precision을 높이는데는 잘 들어맞지는 않습니다. 위치 에러와 분류 에러에 동일한 가중치를 두지 않기 때문에, 더군다나 이미지 내의 모든 그리드 셀이 물체를 포함하지는 않기 때문에 단순히 그냥 사용하면 신뢰도 점수가 0으로 가도록 유도하게 됩니다. 이를 해결하기 위해 바운딩 박스의 위치에 대한 에러를 증가시키고 신뢰도에 대한 로스를 감소시켰습니다. 이러한 파라미터를 각각 $\lambda_{\text{coord}}, \lambda_{\text{noobj}}$ 라고 하고, 5와 0.5의 값을 사용하였습니다.

또한 큰 크기의 박스와 작은 카기의 박스가 같은 비중의 에러를 갖게 하기 위해서 박스의 크기를 직접 사용하지 않고 제곱근을 만들어 사용하였습니다.

학습 과정에서는 하나의 바운딩 박스가 각 객체를 유추하게 되므로 각 바운딩 박스마다 다른 양상으로 학습하게끔 유도됩니다. 즉, 각 박스는 특정 크기, 비율, 클래스 등에 특수화될 수 있습니다.

로스는 다음과 같습니다.

$$ \lambda_{\text{coord}} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{obj} \big[ (x_i – \hat{x}_i)^2 \\ + (y_i – \hat{y}_i) ^ 2\big] + \lambda_{\text{coord}} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{obj} \big[ (\sqrt{w_i} – \sqrt{\hat{w}_i})^2 \\ + (\sqrt{h_i} – \sqrt{\hat{h}_i}) ^ 2\big] + \sum_{i=0}^{S^2} \sum_{j=0}^B \mathbb{1}^{obj}_{ij} (C_i – \hat{C}_i)^2 \\ + \lambda_{noobj}\sum_{i=0}^{S^2} \sum_{j=0}^B \mathbb{1}_{ij}^{noobj}(C_i – \hat{C}_i)^2 \\ + \sum_{i=0}^{S^2} \sum_{c \in classes} \mathbb{1}_{ij}^{noobj}(p(c) – \hat{p}_i (c))^2$$

여기서 $\mathbb{1}_i^{obj}$는 셀 $i$에서 객체가 존재하는지를 나타냅니다. $\mathbb{1}_{ij}^{obj}$는 $i$번째의 $j$번째 바운딩 박스가 박스 유추를 해야하는지를 나타냅니다.

오버피팅을 맞기 위해서 드롭아웃과 데이터 어그멘테이션을 수행하였습니다. 드롭아웃 레이어는 처음 레이어 이후에 0.5로 적용하였습니다. 또한 랜덤 스케일링과 원래 이미지의 20%까지 이동을 시켰으녀, HSV 공간에서 노출과 saturation 조절을 1.5배까지 조절하였습니다.

2.3 Inference

큰 이미지일 수록 여러 출려깅 나올 수 있으므로 non-maximumal suppression을 수행하였습니다.

2.4 Limitations of YOLO

각 셀이 하나의 박스를 유추하게 되므로 그룹으로 객체가 묶여 있는 경우 어려움을 겪습니다.

3. Comparison to Other Detection Systems

4. Experiments

5. Real-Time Detection In The Wild

6. Conclusion

 

 


Add a Comment Trackback