Face Detection은 빨라야 하고, weight가 작아야 한다.
예를 들어 얼굴인식으로 화면 잠금을 푸는 기술에서 서버로 이미지를 보낸 후 처리를 한다면? 인식하는 데에 시간이 소요가 되고, 여러 가지 영향들(네트워크 비용 + 서버 비용 + 인터넷 속도)때문에 적합하지 않다.
따라서 위의 영향들에 대해서 무관하게 항상 동작해야 하는데, 핸드폰에 모델을 올려서 바로 이용하는 방법이 있다.
그런데, 핸드폰에 모델을 올리려면 weight가 작은 모델이 유리하지만 작은 모델은 성능이 일반적으로 떨어지기 때문에 보완을 해야 한다.
어떻게 하면 빠르게?
Face Detection에서 시간이 많이 드는 요소는 Sliding window이므로 이것을 버려야 빨라진다.
∴ 2-stage 방식의 detection은 좋은 선택이 아니다.
또한, 병렬 연산이 가능해야 한다. 핸드폰을 크게 안드로이드와 아이폰으로 나누었을 때
안드로이드는 MLKit, 아이폰은 CoreML이라는 라이브러리를 통해서 가능하지만 제한이 많아서 TFLite라는 도구를 이용하여 pre-trained 된 모델을 이용하기도 한다.
하지만 무엇보다 적은 파라미터 수로도 정확한 성능을 가지는 모델을 설계하는 것이 가장 중요.
Single Stage Object Detection
2-stage-detector의 실행 속도는 느리다. 얼굴인식 같은 모델이 가벼워야 하는 태스크는 single stage 기반으로 하는 것이 유리
이제 1-stage object detection 모델을 위주로 하여 face detection에 적합한 모델들을 알아본다.
Ex ) YOLO, SSD, RetinaNet 등
YOLO v1
YOLO v1 원리
RCNN & YOLO
- RCNN 계열 : 물체가 존재할 것 같은 곳을 backbone network로 표현 가능 ==> region proposal network
- YOLO v1 : 이미지 내의 작은 영역을 나누면 그곳에 물체가 있다 ==> grid 내에 물체가 존재한다.
고로 YOLO v1에서는 grid가 고정이 되고, 각 grid안에 물체가 있을 확률이 중요하게 된다.
Ex ) YOLO v1에서 입력 이미지 크기가 448X448이고 output feature map이 7X7이면, 한 개의 grid box(1X1) 크기가 의미하는 사이즈는 448/7 = 64이므로 64X64 사이즈
grid cell
- YOLO는 이미지는 S X S grid로 나누고, 각 grid cell은 bounding box와 각 box의 confidence score를 예측한다.
※ confidence score : bbox가 object를 포함하는지를 모델이 얼마나 확신하는지, box가 그 사물을 얼마나 정확히 예측하는지를 보여주는 점수
- 각 bbox는 x, y, w, h, confidence로 총 5개의 예측을 하는데 x y좌표는 bbox의 중심 좌표이고, w h는 너비와 높이
- 각 grid cell은 C개의 조건부 class 확률 $P(Class_{i}|Object)$도 예측한다. 이 확률은 grid cell이 사물을 포함할 때를 조건으로 하는 확률
- bbox의 개수와 상관없이 각 grid cell의 확률만 예측
∴ YOLO의 예측값은 S * S * (B * 5 + C) 크기의 tensor로 출력된다.
Ex ) 1개의 7X7 grid 당 2개의 bbox와 20개의 클래스를 예측하는 YOLO를 만들 때, output tensor크기와 flatten 했을 때의 크기는?
- 7 X 7 X (2 X 5 + 20) = output tensor
- flatten = 1470
- 위의 이미지에서는 자전거를 포함하는 grid가 많다. 학습이 잘된 경우에는 해당 grid들이 모두 비슷한 크기로 자전거의 bbox를 잡지만 여기서 동일한 물체를 잡는 bbox가 많아진다는 게 문제이다.
- 이때는 NMS(Non-Maximum Suppression) 기법을 이용한다. object detector가 예측한 bbox 중 정확한 bbox를 선택하는 기법.
Non-Maximum Suppression(NMS)란?
YOLO의 목표는 grid cell에 속하는 물체를 잘 검출해야 한다는 것
- 1개의 grid에 있는 bbox정보 (x, y, w, h)의 학습 목표는 bbox의 ground truth와 최대한 동일하도록 학습되는 것.
- 객체 인식 모델 성능평가 도구인 IoU(Intersection over Union)를 사용
YOLO 특징
object detection에서 기존에 사용되던 RCNN 계열의 방법들은 검출 속도가 느렸다. 그중 빠르다고 여겨지던 faster RCNN도 YOLO보다 느리다.
그 이유는? Fater RCNN은 Region Proposal Network(RPN) 후보군을 뽑고 localization과 classification을 수행한다. 이때 RPN에서 300개의 영역을 제안하는데, 숫자가 많을수록 느려진다.
반면 YOLO는 이미지를 S X S개의 grid로 나누고 한 개의 grid 당 bbox의 좌표(x, y, w, h)와 confidence score만 예측하므로 빠르다.
YOLO의 Inference 과정
$P(class_{i}|Object)$는 마지막 layer에서 사용
- output tensor의 크기 7X7X30에서 7X7은 49개의 grid cell이고, 30은 2 * 5 + 20(조건부 class 확률 개수).
- 테스트할 때에는 조건부 확률 $P(class_{i}|Object)$를 각 box의 confidence prediction과 곱해 class specific confidence score를 얻을 수 있다. 각 score는 box안에 나타나는 클래스의 확률과 예측된 box가 사물에 얼마나 잘 맞는지를 보여준다.
$$P(class|object) * P(object) * IoU$$
- 각 bbox의 confidence score과 각 조건부 class 확률을 곱하면 각 bbox마다 class-specific confidence score를 얻을 수 있고, 그 개수는 7*7*2 = 98개.
- 이 98개의 class-specific confidence score에 대해 20개의 class를 기준으로 NMS를 하여 object에 대한 class와 bbox location을 결정할 수 있다.
YOLO v1의 성능
YOLO v1의 loss 함수
YOLO의 성능
YOLO v1의 단점
- 각 grid cell이 하나의 클래스만 예측 가능하므로 작은 object에 대해 예측이 어렵다.
- bbox의 형태가 훈련 데이터를 통해 학습되었기 때문에 분산이 너무 커서 새로운 형태의 bbox예측이 잘 되지 않는다.
- 모델 구조상 backbone만 거친 feature map을 대상으로 bbox정보를 예측하기 때문에 localization이 부정확
YOLO v2
YOLO v1의 단점을 보완한 YOLO v2
YOLO v2의 목적
- Make it better
- Do it faster
- Makes us stronger
Make it better
정확도를 올리기 위한 방법
- Batch Normalization, High Resolution Classifier, Convolutional with Anchor boxes, Dimension Clusters, Direct location prediction, Fine-Grained Features, Multi-Scale Training 사용
Do it faster
detection 속도를 향상.
- Darknet-19, Training for classification, Training for detection 사용
Makes us stronger
더 많은 범위의 class를 예측하기 위한 방법
- Hierarchical classification, Dataset combination with WordTree, Joint classification and detection 사용
- 9000개의 class 들을 classification 하면서 detection까지 해내는 놀라운 성능
YOLO v2의 성능 비교
YOLO v3
YOLO는 Anchor box를 도입하는데 아래와 같은 식을 통해서 bx, by는 [0,1] 값들로, bw, bh는 초기화된 값이 prior box부터 시작할 수 있게 하여 학습을 안정적으로 만들었다.
loss 계산 시에도 ground truth의 cx, cy, w, h와 바로 비교할 수 있게 했으므로 loss를 계산하는 과정도 간단하다.
YOLO v3에서는 추가로 다른 Detection Algorithms의 matching strategy를 가져왔다. yolo v1과 다르게 각 bbox마다 objectness score(바운딩 박스에 물체가 있는지 없는지) 예측하고,
이때 prior box(anchor box)와 ground truth box의 IoU가 가장 높은 박스를 1로 두어 매칭 시켰다.=> loss를 prior box와 같은 index, 위치를 가지는 predicted box의 offset만 계산해주겠다는 의미. 다른 알고리즘들과는 다르게 Best IoU에 대해서만 1 값을 가지게 하고 나머지는 무시.
YOLO v3 Class prediction
- Multi-label이 있을 수 있으므로 class prediction으로 softmax를 쓰지 않고, independent logistic classifiers를 쓴다.
- 따라서 loss도 binary cross-entropy로 바꾸었고, 이는 더 복잡한 데이터셋을 학습하는데 도움이 되었다.(multi label 예측 시)
YOLO v3 Predictions Accross Scales
- 3개의 bbox
- 3개의 feature map 활용
- 한 feature map에서의 output형태는
S(grid) X S(grid) X ( bbox * (offset + objectiveness + class)) = N X N X (3X(4+1+80))
- 총 9개(3개의 bbox X 3개의 feature map)의 anchor box는 k-means clustering을 통해 결정
YOLO v3 Feature Extractor
Darknet-19 → Darknet-53으로 변경, 모델과 성능은 아래
YOLO v3 이후
Redmon은 CV연구가 자신의 목적과는 다르게 군사적으로 사용되고 있는 것에 회의감을 느껴 연구를 중단한다.
Alexey Bochkovskiy가 메인테이너로 이어받게 되고 2020년에 YOLO v4가 발표가 되었다.
SSD의 특징
SSD (Single Shot MultiBox Detector)
SSD는 YOLO v1에서 grid를 사용해서 생기는 단점을 해결할 수 있는 기술을 제안했다.
- Image Pyramid
- Pre-defined Anchor Box
Image Pyramid
image pyramid는 VGG16을 사용. VGG에서 pooling layer를 거친 block은 하나의 image feature로 사용 가능
YOLO에서 7X7 feature map을 하나만 사용했다면, SSD는 38X38, 19X19, 10X10, 5X5, 3X3 등 다양한 크기의 feature map을 사용하였다.
각 feature map은 YOLO의 관점에서 보면 원본 이미지에서 grid 크기를 다르게 하는 효과가 있었다.
따라서 5X5 크기의 feature map에서 grid가 너무 커서 small object를 찾지 못하는 문제를 38X38 크기의 feature map에서 찾을 수 있게 하였다.
SSD의 workflow
YOLO v1의 두 번째 단점인 box 정보(x, y, w, h)를 예측하기 위한 seed정보가 없기 때문에 넓은 bbox분포를 모두 학습할 수 없었다는 점.
- 이로 인한 성능 손실을 방지하기 위해 faster RCNN 등에서 사용하는 anchor를 적용
- SSD에서는 Default Box라고 한다
SSD의 framework
(a) : Ground Truth데이터셋
(b) : VGG Backbone에 가까운 fine-grained feature map(각 grid에 3개 anchor box 적용)
고양이의 크기가 작기 때문에 8X8 feature map의 grid 중 1개의 anchor box로부터 학습 가능
※ fine-grained?
- 세밀하게 분류된, 즉, fine grained classification은 상대적으로 비슷한 특징을 가진 class를 분류
(c) : 개의 경우 세로로 긴 경향을 보이기 때문에 receptive field가 넓은 4X4 feature map이 사용
Default box를 위한 scale
다양한 크기의 default box생성을 위해 아래와 같은 식을 사용
$S_min$을 0.2, $S_max$를 0.9라고 하고 위의식에 넣으면 각 feature map당 서로 다른 6개의 s(scale) 값이 나온다.
aspect ratio를 1,2,3, 1/2, 1/3으로 설정하고, Default box의 width는 $s_lx \sqrt {r}$이라고 할 때, r=1인 경우
$$s_l = \sqrt {s_l * s_{l+1}}$$
Default box의 cx, cy는 $l$번째 feature map의 크기를 나눠서 사용한다.
학습할 이미지에 따라서 aspect ratio를 조정해야 한다. 임의로 정하는 것은 비효율적이므로 KNN과 같은 알고리즘을 활용
SSD의 Loss 및 성능
SSD Loss function
SSD Loss function에는 세 개의 loss function이 있다.
1. Objective Loss function
- Localization loss(loc)와 Confidence loss의 가중합(weighted sum)
$$L(x, c, l, g) = \frac {1}{N}(L_{conf}(x, c) + \alpha L_{loc}(x, l, g))$$
2. Localization Loss function
- 예측된 박스 $l$과 Ground truth box $g$ 파라미터 사이의 Smooth L1 loss
3. Confidence Loss function
- 여러 class의 confidence(c)의 softmax loss
- $x_{ij}^p$ : category p에 대한 i 번째 Default box와 j 번째 Ground Truth box의 물체인식 지표. 0.5이상이면 1, 미만이면 0
- $N$ : 매치된 Default Box의 개수, N이 0이면 loss도 0
- $l$ : 예측된 상자(predicted box)
- $g$ : Ground Truth
- $d$ : Default bbox
- $cx, cy$ : Default bbox의 x,y 좌표
- $w, h$ : Default bbox의 width, height
- $\alpha$ : 교차 검증으로 얻어진 값
SSD 의 성능
FCOS : One shot Anchor - Free Object detection
- 기존의 anchor box 기반에서 벗어나서 pixelwise로 예측
- anchor box를 사용하면서 생기는 단점들을 해결하고 좋은성능
- anchor를 사용하지 않으면 하이퍼파라미터를 조정해야하는 귀찮음을 덜 수 있고, 계산량도 줄여준다.
- SSD와 같은 모델들은 엄청많은 anchor들을 만들어내는데 positive로 판별되는 box의 비율은 매우 적어서 positive:negative의 비율에 큰 imbalance
- FCOS는 처음부터 negative와 positive의 비율을 맞춰서 결국 recall도 적절하게 만들었다.
FCOS 구조
- feature map을 만들기 위해 FPN 사용
- head를 모든 feature map에 붙여 classification과 bbox regression을 진행
- 추가적으로 centerness라는 과정 수행
FCOS Label mapping
- FCOS는 center를 찾아내는데 이 center를 point라고 함
- point가 ground truth에 걸쳐 있으면 무조건 positive이라고 가정(이런 방식으로 positive 비율이 늘어나게 한다)
- ground truth가 여러개 걸친 곳에 point가 자리 잡는것은 FPN을 사용함으로써 줄인다.
- 여러 ground truth에 걸친 point를 ambiguous annotation이라고 한다.
- FCOS는 bbox regression에서 뽑아내는 정보(edge간의 거리와 point(center) 정보 이용)
FCOS centerness
$$centerness^* = \sqrt{\frac{min(l^*, r^*)}{max(l^*, r^*)} \times \frac{min(t^*, b^*)}{max(t^*, b^*)} }$$
- FCOS는 grount truth(gt)에 걸친 point는 모두 positive로 판단하기 때문에 low quality의 box도 포함할 수 있다.
- 이걸 방지하고자 하는 것이 centerness.
※ Centerness : gt의 center에서 point(prediction box의 center)까지의 거리
- centerness는 BCELoss(Binary Cross Entropy Loss).
- centerness는 classification score에 곱해진다.
- 이러한 과정으로 low quality box를 뽑고, NMS가 이런 box들을 정리
Face Detection을 위한 다른 모델들
S3FD - Single Shot Scale-invariant Face Detector
DSFD(Dual Shot Face Detector)
RetinaFace
'DeepLearning|MachineLearning' 카테고리의 다른 글
TTA(Test-Time Augmentation) (0) | 2022.04.28 |
---|---|
Deep Pose (0) | 2022.01.21 |
OCR(Optical Character Recognition) (0) | 2022.01.06 |
Segmentation (0) | 2022.01.05 |
Object Detection (0) | 2021.12.29 |