RetinaFace 논문 리뷰 연습
논문 읽기 연습/Computer Vision

RetinaFace 논문 리뷰 연습

※ 학사 졸업생으로 전문적인 연구원으로써 분석하는게 아니라 메모용으로 기록하는 것이라 부족한 점이 많을 수 있음.

※ 그래서 혹시나 보는 사람이 있다면 피드백 주시면 감사하겠습니다.

 

논문은 이거

https://paperswithcode.com/paper/190500641

 

Papers with Code - RetinaFace: Single-stage Dense Face Localisation in the Wild

#2 best model for Face Detection on WIDER Face (Hard) (AP metric)

paperswithcode.com

 

코드는 누가 pytorch로 번형한

https://github.com/biubug6/Pytorch_Retinaface

 

GitHub - biubug6/Pytorch_Retinaface: Retinaface get 80.99% in widerface hard val using mobilenet0.25.

Retinaface get 80.99% in widerface hard val using mobilenet0.25. - GitHub - biubug6/Pytorch_Retinaface: Retinaface get 80.99% in widerface hard val using mobilenet0.25.

github.com

 

를 참고했음.

 

 

context modules, graph convolution

 

요약

face detection은 많이 발전했지만, 자연상태(wild)에서의 얼굴 감지는 여전히 어려웠다. 그래서 여기 논문은 one-stage인 RetinaFace를 소개하며, extra-supervised와 self-supervised 장점을 가져서 대상 크기에 상관없이 픽셀 단위로 얼굴을 탐지한다. 특히 5가지 관점으로 접근한다.

(1) WIDER FACE 데이터셋에서 얼굴에 5개의 landmark를 직접 표시했으며, 추가 supervision signal로써 얼굴 감지 향상을 관찰할 수 있었다.

(2) 픽셀 단위의 3d 얼굴 모양 정보를 예측하는 self-supervised mesh decoder branch를 추가했음 (무슨 말인지 모르겠음)

(3) WIDER FACE의 hard testset에서 RetinaFace는 sota 모델보다 AP 1.1% 증가했다.

(4) IJB-C testset에선 sota 모델인 ArcFace 의 face verification 성능을 올릴 수 있었음.

(5) 가벼운 backbone network로 VGA 해상도 이미지를 실시간 싱글 CPU로 돌릴 수 있었음.

 

1. 서론

Automatic face localisation은 facial attribute나 facial identity recognition과 같은 얼굴 이미지의 사전 작업 단계다. face localisation은 전통적인 face detection보다 작은 범위의 정의인데, 크기나 위치 상관없이 얼굴에 bounding box를 예측하는걸 목표로 하는 작업이다. 그래도 여기 논문에선 face localisation 정의를 확장해서 face detection, face alignment, 픽셀 단위의 face parsing, 3D correspondence regression을 포함하게 한다. 이렇게 확장한 정의가 모든 얼굴 크기에서 face position 예측을 향상시켰다.

일반적인 object detection의 발전으로 face detection에서도 놀라운 기술 반전이 있었다. 일반적인 object detction과는 다르게 face detection은 더 작은 변수성을 가지고 있으나 크기는 더 큰 변수성을 가지고 있다 (얼굴 크기 픽셀이 몇 개의 픽셀에서 수천개의 픽셀) (셀카를 찍는다고 하면 저 멀리 있는 사람의 얼굴은 겨우 몇 픽셀이지만 셀카 찍은 사람의 얼굴은 몇십만개 픽셀로 나타내는 걸 말하는 것 같다.). 가장 최신 모델들은 얼굴 위치와 feature pyramid에 주목한 single-stage 디자인에 집중하며, 이건 two-stage에 비해 빠른 성능을 얻을 수 있다. 이 흐름을 따라, 우리는 single-stage face detection 구조를 사용하고, 강한 supervised와 self-supervised signals를 통해 multi-task losses를 사용하여 sota 의 dence face localisation 방법론을 목표로 하였다. 이는 Fig.1에 잘 나와있다.

Fig 1. box localisation, classification, randmark regression을 한번에 수행한다. 각 모델 anchor outputs으론 (1) 얼굴 점수, (2) 박스 점수, (3) 5개의 landmark 점수, (4) 평먼 사진에서 3d face vertices 목표가 있다.

전형적으로 face detection 훈련은 classification loss와 box regression loss를 사용하는데, 이는 face detection과 alignment를 목적으로 하고 face shapes는 face classification보다 더 나은 feature를 기반으로 한다. MTCNN과 STN에 영감을 받아 얼굴 감지와 5개의 facial landmarks를 감지한다. 훈련 데이터 한계로, JDA, MTCNN, STN은 작은 얼굴을 감지하는데 5개의 facial landmakrs가 도움이 되는지는 확인하지 못했다. 여기 논문에서 얻고자 하는건 5개의 facial landmarks가 WIDER FACE의 hard testset을 감지하는데 도움이 되는지 알고싶다.

Mask R-CNN은 object mask를 bounding box recgnition과 regression을 위한 branch를 병렬적으로 추가 하여 성능이 비약적으로 향상되었다. 이것이 픽셀 단위의 표시(annotations)가 detection에도 좋다고 확신했다. 근데 WIDER FACE에는 face annotation 불가능했다(뭐라는 건지..). supervised signal는 쉽게 얻을 수 없어서 앞으로 face detection에 unsupervised 방법은 사용할 수 있을지는 모르겠다.

FAN에선 폐쇄적인 face detection을 향상시키려고 anchor-level의 attention map을 사용했다(화질 안좋은 사진 말하는것 같다.). (anchor는 faster rcnn에서 나온 물체 위치 확인하는 후보 anchor에서 나온 개념). 하지만 제안된 attention map은 유동적이지 못하고 semantic 정보는 가지고 있지 않다. 최근엔 self-supervised 변형 가능한 3D 모델이 자연에서 3d face 모델링을 달성하기도 했다. 특히, Mesh Decoder는 모양과 텍스쳐를 합친 graph convolution을 확장해서 실시간 속도를 달성했다. 하지만 single-stage detector에서 사용하기엔 문제가 있는데, (1) 카메라 파라미터를 정확히 감지하기 어렵고(?) (2) latent shape와 텍스쳐 표현이 RoI pooled feature 대신에 single feature vector로 예측되는데(1x1 conv on feature pyramid), feature shift에 위험하다. 이 논문에선 픽셀 단위의 3d 얼굴 모양을 예측하려고 존재하는 supervised branch들을 병렬적으로 사용하는 mesh decoder bransh를 self-supervision 으로 채용했다.

요약하자면, 주요 내용은

  • single-stage 디자인 기반으로 픽셀단위로 face localisation을 예측하는 RetinaFace를 제안하며, face score, face box, five facial landmarks, 3D position and correspondence of each facial pixel을 multi-task로 학습하는 방식을 사용했다.
  • WIDER FACE의 hard subset에서 RetinaFace는 sota인 two-stage model을 사용하는 방법보다 1.1% 향상되었다.
  • IJB-C dataset에선, RetinaFace가 ArcFace의 verification 정확도를 향상시켜줬다. 이것은 좋은 face localisation이 face recognition을 향상시켜 줄 수 있다는걸 보여준다.
  • 가벼운 backbone 구조 채용으로, VGA 해상도 이미지에서 싱글 CPU로 실시간 성능을 낼 수 있었다.
  • 추가적인 annotations과 코드를 앞으로 연구할거다.

 

2. 관련 작업

Image pyramid v.s. feature pyramid

몇십년 전엔 sliding window 페라다임이 있었다. Viola-Jones이 실시간으로 효과적인 image pyramid의 false face region을 거부하고 크기에 무관한 얼굴 감지 프레임워크 같은 폭넓은 접근을 이끌었다. image pyramid의 sliding-window가 좋은 detection 페러다임이긴 했지만, multi-scale의 feature maps인 feature pyramid, sliding-anchor 등장으로, face detection을 빠르게 점거하고 있다.

Two-stage v.s. single-stage

최근의 얼굴 감지는 물체 감지(object detection) 접근방식을 따라하고 있으며 two-stage 방법(예: Faster R-CNN)과 single-stage(예: SSD, RetinaNet)의 2가지 방법으로 나뉜다. Two-stage 방법은 높은 localisation 정확도를 자랑하는 "proposal and refinement" 메커니즘을 사용한다. 반면 single-stage방법은 밀도있는 face location과 scale를 샘플링하며, 샘플 훈련 중 positive와 negative가 굉장히 언밸런스 하다(F1보면 positive true, positive false, negative true, negative fale로 나뉘는데 이런거 말하는 듯.). 이 언밸런스를 보완하기 위해 샘플링과 re-weighting 방법이 넓게 사용되어 왔다. two-stage 방법과 비교하면 single-stage 방법은 더 효율적이고 높은 recall 비율을 가지지만 높은 false positive 비율과 위험한 localisation 정확도를 보인다.

Context Modelling

모델의 작은 얼굴 감지를 위한 contextual reasoning power를 향상시키기 위해, SSH와 PyramidBox가 feature pyramid가 적용되어 Euclidean grid에서 receptive field를 향상시킨다. CNN의 non-rigid 변환 모델링 수용을 향상시키기 위해(?), deformable convolution network (DCN)이 채용되어 model geometric transformations을 사용하기 위해 novel deformatable layer를 사용한다(이해 못함.). WIDER FACE Challenge 2018의 우승자 솔루션은 rigid와 non-rigid(deformation)한 context modelling이 face detection 성능 향상에 있어 보완적이고 직각적(orthogonal)(수학적으로 서로 다른 차원이라는 말이 아니라 그냥 많이 올라갔다는 뜻인 듯)이었다.

Multi-task Learning

face detection과 alignment를 합친건 aligned face 모양이 face classification의 더 좋은 특성으로써 널리 사용된다. Mask R-CNN에선 감지 성능이 이미 있는 branches에 object mask를 예측하는 branch를 병렬적으로 추가하여 detection 성능을 비약적으로 향상시켰다(mask-rcnn 에서 two-stage로 나뉘는거 말하는 듯.). Densepose는 Mask-RCNN 구조를 취해서 dense part labels과 각가의 selected regions를 얻었다. 그럼에도, Mask-rcnn과 Densepose안에 있는 branch는 supervised learning으로 훈련되었다. 추가로, dense branch는 픽셀 단위의 dense mapping을 예측하는 각각의 RoI안에 작은 FCN이었다.

 

3. RetinaFace

3.1. Multi-task Loss

어떤 훈련 anchor i에 대해, 우리는 다음과 같은 minimise multi-task loss를 적용하였다.

(1) Face classification loss인 L_cls(p_i, p*_i)로, p_i는 i가 얼굴일 확률과 p*_i는 1은 positive anchor, 0은 negative anchor. classification loss인 L_cls는 face/not face인 binary classes로써 softmax loss를 사용한다.

(2) Face box regression loss인 L_box(t_i, t*_i)는 t_i={t_x, t_y, t_w, t_h}이고 t*_i={t*_x, t*_y, t*_w, t*_h}_i고 t*_i={t*_x, t*_y, t*_w, t*_h}_i로 표현되어 예측 박스 좌표와 ground-truth box를 positive anchor로 표현한다. 우린 Fast r-cnn으로 box regression targets을 정규화한다(즉, centre location, width, height들을 정규화한다). 또 L_box(t_i, t*_i)=R(t_i-t*_i)를 사용하는데 R은 Fase r-cnn에서 정의된 robust loss function (smooth-L_1)이다.

(3) Facial landmark regression loss인 L_pts(l_i, l*_i)는 l_i={l_x1, l_y1, ..., l_x5, l_y5}_i 이고 l*_i={l*_x1, l*_y1, ..., l*_x5, l*_y5}_i로 5개의 facial landmarks와 positive anchor인 ground-truth 를 나타낸다. box centre regression과 비슷하게, 5개의 facial landmark regression은 anchor centre를 기반으로 target normalisation을 사용하였다.

(4) Dense regression loss인 L_pixel (Eq. 3) 이다. loss-밸런스 파라미터 (상수들) lambda_1~lambda_3는 각각 0.25, 0.1, 0.01로 맞춘다. 즉 box와 supervision signal에서 나온 landmark locations에 더 중요성을 높인다.

3.2. Dense Regression Branch

(수식 적는건 너무 엉망이라 실제 논문을 보는걸 추천)

Mesh Decoder.

우리는 "Dense 3d face decoding over 2500fps"[70] 와 "Generating 3d faces using convolutional mesh autoencoders."[40] 의 mesh decoder(mesh convolution and mesh up-sampling)을 채용하였는데, 빠른 localised spectral filtering을 기반으로 한 graph convolution 방법론이다(graph convolution이 뭔지 찾아보자). 더 빠르게 하기 위해 모양만 decode 하는 [40] 와는 다르게 모양과 텍스쳐 decoder인 [70] 와 비슷하게 사용했다.

후에 graph convolutions 개념을 설명하고 왜 저들([70])이 fast decoding이었는지 간략히 알려주겠다. Fig. 3(a)에 그려진 것 처러미, 2D convolutional 작동은 Euclidean grid receptive field로 "kernel-weighted neighbour sum"을 사용한다. 비슷하게, graph convolution도 Fig. 3(b)와 같은 개념을 사용한다. 그러나, 이웃 거리는 연결되어 있는 두 개의 vertices(점들) edges의 가장 작은 숫자로 counting 된다(이해 못함.). 우리는 coloured face mesh인 G = (V,E)로 정의한 [70]를 따라하기로 했는데, (이해 못해서 원문 적음) V ∈ R n×6 is a set of face vertices containing the joint shape and texture information, and E ∈ {0, 1} n×n is a sparse adjacency matrix encoding the connection status between vertices. The graph Laplacian is defined as L = D − E ∈ R n×n where D ∈ R n×n is a diagonal matrix with Dii = P j Eij .

kernel gθ가 있는 graph convolution 은 K로 자른 recursive Chebyshev polynomial 으로 정의할 수 있으며, 다음과 같이 정의된다.

 

θ ∈ R K 은 Chebyshev coefficients의 벡터고 Tk(L˜) ∈ R n×n 은 라플라시안 L˜으로 scaled된 k 순서로 계산된 Chebyshev polynomial이다. x¯k = Tk(L˜)x ∈ R n 으로 사용하여, x¯k = 2L˜x¯k−1− x¯k−2 with x¯0 = x and x¯1 = Lx˜  으로 계산할 수 있다. 전체 필터 작동은 K sparse 행렬벡터 계산과 하나의 밀도높은 행렬 벡터 계산 y = gθ(L)x = [¯x0, . . . , x¯K−1]θ을 포함하여 매우 효율적이다 (행렬이 sparse한게 많아서 0이 많아서 계산이 빠르다는걸 의미하는 걸까, 애초에 행렬 계산이 독립적이라 효율적이니 비슷한 건가).

Differentiable Renderer.

모양과 텍스쳐 파라미터 P_ST ∈ R 128 을 예측한 뒤에, 우린 colouredmesh D_P_ST 를 카메라 파라미터 P_cam = [xc, yc, zc, x0 c , y0 c , z0 c , fc] (즉, camera location, camera pose and focal length)와 환영 파라미터 P_ill = [xl , yl , zl , rl , gl , bl , ra, ga, ba] (즉, 빛 점 위치, 색 값, 주변 및의 색 값)을 같이 사용하여 단순한 2D image에 투영하기 위해 효율적인 differentiable 3D mesh renderer를 채용한다.

Dense Regression Loss.

2D face R(D_P_ST , P_cam, P_ill)을 렌더링 했으니, 다음 식으로 렌더링된 이미지와 원본 2D face를 픽셀 단위로 비교하면 된다.

W와 H는 잘린 anchor I*_i,j의 상대적인 width, height이다.

Fig 2. single-stage dense face localisation 접근의 전체적인 모습. RetinaFace는 independent context modules을 사용하는 feature pyramids를 기반으로 디자인 되었다. context modules를 통해, 각 anchor의 multi-task loss를 계산할 수 있다.
Fig 3. (a) 2D Convolution은 Euclidean grid receptive field의 kernel-weighted 이웃 합이다. 각 convolutional layer는 kernel_H * kernel_W * Channel_in * Channel_out 파라미터를 가진다. (b) Graph convolution도 kernel-weighted 이웃 합이지만, 이웃과의 거리가 graph에서 적은 이웃을 거쳐가는 최소의 수로 정의된다. 각 convolutional layer는 K*Channel_in*Channel_out 파라미터를 가지며, Chebysehv coefficients θi,j ∈ R K 는 K 순서로 잘려있다.

 

4. 실험

4.1. Dataset

WIDER FACE 데이터셋은 32,203의 이미지와 393,793개의 다양한 크기, 포즈, 표현, occlusion, 조명 변수들이 적용된 얼굴 bounding box가 있다.. WIDER FACE 데이터셋은 training(40%), validation(10%), test(50%)로 나뉘어져 있고 61개의 카테고리들을 랜덤으로 넣었다. EdgeBox의 detection rate를 기반으로 엄격한 샘플링 하에 3개의 어려운 단계 (즉, Easy, Medium, Hard)로 정의되었다.

Extra Annotations.

Fig. 4와 Tab. 1에 나와있듯 우린 (얼굴에서 landmark를 정하는게 얼마나 어려운지에 따라) 이미지 퀄리티를 5개의 단계로 나누고 training set과 validation set에서 알아볼 수 있는 이미지에는 5개의 facial landmark 주석을 달았다(즉, 양쪽 눈 중심, 코 끝, 입 끝). 그래서 training set에는 84.6k개의 얼굴에, validation set에는 18.5k개의 얼굴에 작성했다.

Fig 4. WIDER FACE training set과 validation set에 추가적인 5개의 face landmark를 표시하였다(이것을 annotatable 이라고 불렀다.).
Tab 1. 5개의 이미지 퀄리티. 노력없이 사람이 알아볼 수 있는 곳에 landmark들을 표시했다. 예측이 필요한 위치는 노력이 좀 필요했다.

4.2. 실험 디테일

Feature Pyramid.

RetinaFace는 피라미드 레벨 P_2~P_6까지 적용했는데, P_2~P_6은 top-down 방식의 ResNet residual stage (C_2부터 C_5 까지) 통과한 output이며 "Dsfd: dual shot face detector"[28], "r. Focal ´ loss for dense object detection"[29] 처럼 측면 연결이다. P_6은 3*3 convolution 에 stride가 2인 C_5를 통과한 output이다. C_1부터 C_5까지는 Classification용 Network ResNet-152가 ImageNet-11k를 통해 학습한 것이며 P6은 "Understanding the difficulty of training deep feedforward neural networks"[17] 방법의 "Xavier"으로 무작위 초기화 되었다.

Context Module.

SSH("Ssh: Single stage headless face detector"[36])와 Pyramid-Box("Pyramidbox: A context-assisted single shot face detector"[49])에 영감을 받아, 우린 receptive field와 rigid context modelling power를 향상시키기 위해 5개의 feature pyramid 단계에 독립적인 context module를 적용시켰다. WIDER Face Challenge 2018"Wider face and pedestrian challenge 2018: Methods and results"[33]의 우승자의 교훈으로, 모든 3*3 convolution layer들을 "Deformable convolutional networks. In ICCV, 2017"[9], "Deformable convnets v2: More deformable, better results"[74]에 적용된 deformable convolution network (DCN)의 측면 conntection과 context module들로 바꿨는데, 이건 non-rigid context modelling 수용성을 매우 강하게 했다.

Loss Head.

negative anchor들엔 classification loss만 적용한다. positive anchor엔 multi-task loss가 적용된다. 우린 다른 feature maps들 Hn × Wn × 256, n ∈ {2, . . . , 6}에서 하나의 loss head(1*1conv)를 공유한다. mesh decoder에 대해선, 우린 
"Dense 3d face decoding over 2500fps: Joint texture and shape convolutional mesh decoders"[70]의 pretrained 를 사용했는데, 이건 효율적인 추론을 가능하게 하는 작은 overhead다.

Anchor Setting.

Tab. 2에서 볼 수 있듯, 우린 "Face attention network: an effective face detector for the occluded faces."[56] 처럼 feature pyramid인 P_2부터 P_6까지에 특정한 anchor 크기를 적용했다. 여기서 P_2는 계산 시간과 더 많은 false positive 위험을 감수하면서 작은 anchor들로 작은 얼굴을 감지하도록 디자인했다. 우린 scale step을 2^1/3으로 설정하고 aspect ratio를 1:1로 했다. 입력 이미지 사이즈가 640*640이고, anchor는 feature pyramid 단계에서 16*16부터 406*406 크기까지 커버한다. 총 102,300개의 anchor가 있고, 75%는 P_2에 있다.

Tab 2. RetinaFace에서 feature pyramid, stride 크기, anchor의 자세한 정보. 640*640 입력 이미지에 대해서 총 102,300개의 anchor가 있고 75%는 P_2에 있다.

훈련 중, anchor는 ground-truth box와 IoU가 0.5 이상, 배경 IoU가 0.3 이하일 때 매칭이 된다. 매칭되지 않은 anchor들은 훈련 중 무시된다. 대부분의 anchor(99% 이상)들이 matching step 이후 negative이기 때문에, 우린 training example들에서 positive와 negative 사이의 큰 imbalance를 조정하기 위해 표준 OHEM("Training regionbased object detectors with online hard example mining", "S3fd: Single shot scale-invariant face detector")을 사용했다. 더 자세하게는 negative anchor들을 loss values로 정렬하고 top 하나만 선택해서 negative와 positive samples 비율을 최소 3:1이다.

Data Augmentation.

WIDER FACE training set엔 약 20%가 작은 얼굴이므로, 우린 더 많은 training face를 만들기 위해 [68][49]를 따라하고 원본 이미지에서 무작위로 사각형 patch들을 crop하여 640*640로 resize 하였다. 더 자세하게는 사각형 patch들은 원본 이미지에서 0.3~1 비율 크기로 잘랐다. 잘린 얼굴 경계에서 우린 중심이 crop patch 안에 있으면 얼굴 부분을 overlap 했다(?). 또 랜덤 crop에서, 0.5확률로 horizontal flip하고 photo-metric colour distortion으로 augmentation도 진행했다.

Training Details.

우린 RetinaFace를 SGD optimizer에(momentum은 0.9, weight decay는 0.0005, batch size는 8*4) 4개의 NVIDIA Tesla P40 (24GB) GPU를 사용했다. learning rate는 0.001에서 시작하고 5 epoch후엔 0.01 증가하고 55epoch와 68epoch에선 10으로 나눈다. training 진행은 80epoch에서 중단했다.

Testing Details.

WIDER FACE testing에선, [36,68]의 표준 실행을 따라했고 flip과 multi-scale(the short edge of image at [500, 800, 1100, 1400, 1700]) 을 사용했다. Box voting은 예측 box와 얼마나 겹치는지를 IoU threshold 0.4를 적용했다.

4.3. 절제(Ablation) 연구

제안된 RetinaFace의 더한 이해를 위해, 우린 5개의 facial landmark들과 제안된 dense regression branch가 양적으로 face detection 성능에 영향을 미치는지 실험하기 위해 절제된 추가 실험을 진행했다. 또 Easy, Medium, Hard set에 대해 IoU=0.5로 설정했을 때 average precision(AP)의 표준 evaluation metric에 대해, 우린 WIDER Face Challenge 2018의 development server (Hard validation subset)도 사용했는데, 이건 더 까다로운 IoU=0.5:0.05:0.95에 대한 mean AP(mAP)도 사용해서, 얼굴 감지기의 정확도를 더 높혔다.

Tab 3에 나온것처럼, 우린 WIDER FACE validation에 여러 다른 세팅들로 evaluate를 진행했으며 Hard subset의 AP와 mAP에 집중하였다. sota기술을 적용함으로써(FPN, context module, deformable convolution) 강력한 베이스라인을 만들었는데(91.286%), 이는 ISRN(90.9%) 살짝 높은 수준이었다. 5개의 facial landmark regression의 branch를 추가한건 Hard subset의 face box AP(0.408%)와 mAP(0.775%)를 높혔는데, lankmark localisation은 face detection 성능을 높이는데 중요하다고 제안한다. 반면에, dense regression branch를 추가하는건 Easy와 Medium에서는 face box AP가 조금 올라갔지만 Hard subset의 결과에선 조금 악화되었는데, 이는 dense regression를 적용하는건 아직 도전해야 할 사항으로 보인다. 그럼에도, landmark와 dense regression을 학습하는건 landmark regression만 배우는 것보다는 더 향상이 있었다. 이것은 lankmark regression은 dense regression에 도움이 된다는 것을 설명하며, face detection 성능을 더 끌어올릴 수도 있다.

Tab 3. WIDER FACE validation subset에서의 절제된 실험.

4.4. Face box Accuracy

WIDER FACE 데이터셋의 기본적인 evaluation 과정을 따라, 우린 training set으로만 훈련하고 validation과 test set으로만 테스트했다. test set에 대한 evaluation 결과를 얻기 위해, 우린 evaluation을 보려고 주최측에 detection 결과를 제출했다. Fig 5에서 볼 수 있듯, 우린 RetinaFace를 다른 24개의 sota face detection 알고리즘(i.e. Multiscale Cascade CNN [60], Two-stage CNN [60], ACFWIDER [58], Faceness-WIDER [59], Multitask Cascade CNN [66], CMS-RCNN [72], LDCF+ [37], HR [23], Face R-CNN [54], ScaleFace [61], SSH [36], SFD [68], Face RFCN [57], MSCNN [4], FAN [56], Zhu et al. [71], PyramidBox [49], FDNet [63], SRN [8], FANet [65], DSFD [27], DFS [50], VIM-FD [69], ISRN [67])들과 비교했다. 우리의 결과는 AP 관점에서 이 sota 방법론들을 능가했다. 더 정확하게는, RetinaFace는 validation subset과 test subset 모두에서 최고의 AP를 내었는데, validation set의 Easy 96.9%, Medium 96.1%, Hard 91.8%, test set의 Easy 96.3%, Medium 95.6%, Hard 91.4%를 달성했다. 가장 최근의 최고 방법과 비교하면, RetinaFace는 많은 작은 얼굴들까지 포함해서 Hard subset에서 놀라운 기록(91.4% v.s. 90.3%)을 보여줬다.

Fig 5. WIDER FACE validation과 test subset들에 대해 Precision-recall의 상관관계.

Fig. 6에서, 우린 밀도 높은 얼굴들이 있는 셀카에서 질적인 결과를 보여준다. RetinaFace는 1,151개의 얼굴 중 약 900개의 얼굴(threshold 0.5)을 성공적으로 찾았다. 거기다 bounding box 정확도에서, RetinaFace로 감지된 5개의 facial landmakr들은 pose, occlusion, resolution의 큰 변수에도 robust했다. 무거운 occlusion에서 밀도높은 face localistion은 몇 가지는 실패했지만, 몇 가지 dense regression 결과들은 명확했고 큰 얼굴들은 좋았고 좋은 변수들을 보여줬다.

Fig 6. RetinaFace는 extra-supervised와 self-supervised multi-task learning의 조합 이점으로, 1151명의 사람 중 900개의 얼굴(threshold 0.5)를 감지할 수 있다. 검출기 신뢰도는 오른쪽의 유색바로 주어진다. 밀도 localisation mask는 파란색이다. 줌 인 하여 밀도 높은 작은 얼굴들도 얼마나 잘 감지했는지 자세시 봐주길 바란다.

4.5. Five Facial Landmark Accuracy

5개의 facial landmark localisation 정확도를 측정하기 위해, 우린 RetinaFace를 WIDER FACE validation set(18.5k개의 얼굴)도 사용하면서 AFLW dataset(24,386개의 얼굴) 데이터셋을 MTCNN과 비교하였다. 우린 face box 크기를 정규화 거리로써 (√ W × H) 을 사용했다. Fig. 7(a)에 나온것과 같이, 우린 AFLW 데이터셋에 대해 각각의 ficial landmark 에러가 있다. RetinaFace는 MTCNN과 비교하면 normalised mean errors (NME)가 2.72%에서 2.21%로 미세하게 감소하였다. Fig. 7(b)에서, WIDER FACE validation set에 대한 cumulative(누적) error distribution (CED) 커브를 볼 수 있다. MTCNN과 비교해서, RetinaFace는 실패비율이 26.31%에서 9.37%로(NME threshold 10%) 놀라운 수치로 감소했다.

Fig 7. MTCNN과 RetinaFace의 5개의 facial landmark location에 대한 질적 비교. (a) AFLW (b) WIDER FACE validation set.

4.6. Dense Facial Landmark Accuracy

box와 5개의 facial landmark 외에, RetinaFace는 밀도있는 얼굴 correspondence (?) 결과를 내놨지만 dense regression branch는 self-supervised learning으로만 훈련했다. "Joint 3d face reconstruction and dense alignment with position map regression network"[12], "Dense 3d face decoding over 2500fps: Joint texture and shape convolutional mesh decoders"[70]에 따라, 우린 (1) 2D 영상 주석의 68개 landmark (2) 3D 영상의 모든 landmark를 고려하여 facial landmark localisation을 AFLW2000-3D dataset을 통해 측정하였다. mean error는 아까같이 bounding box 크기 [75]로 정규화 하였다. Fig 8(a)와 8(b)에서, 우린 RetinaFace와 다른 sota 방법들[12,70,75,25,3]의 CED 커브를 볼 수 있다. supervised와 self-supervised 방법간의 성능 차이는 존재하지만, RetinaFace의 dense regression 결과는 sota 방법들과 비교해볼 만 하다. 더 정확히는, 우린 (1) 5개의 facial landmark regression이 dense regression branch 학습의 어려움을 보완해주고 dense regression 결과를 매우 향상시켜준다는 점과 (2) dense correspondence 파라미터를 예측하기 위한 single-stage feature (RetinaFace로써) 사용이 (Region of Interest) RoI features (Mesh Decoder로써) 를 사용하는 것보다 훨씬 어렵다는 것에 주목했다. Fig. 8(c)처럼, RetinaFace는 포즈 변수를 쉽게 제어하지만 복잡한 시나리오에선 힘들어한다. 이것은 정렬이 안되어 있고 초복잡한 특징 표시(1*1*256 in RetinaFace)는 single-stage 프레임워크가 dense regression 에서 높은 정확도를 내는데 장애물이 된다는 것이다. 그럼에도, dense regression branch에서의 영상 얼굴 지역은 절제 연구에서 face detection을 향상시키는데 도움을 줄 수 있는 attention에 여전히 효과가 있다(?).

Fig 8. AFLW2000-3D에서의 CED 커브. (a) 2D 영상에서 68개의 landmark 성능측정과 (b) 3D 영상에서 모든 landmark 성능 측정. (c)에선, 우린 RetinaFace와 Mesh Decoder의 dense regression 결과를 비교한다. RetinaFace는 포즈 변수는 쉽게 제어하지만 복잡한 시나리오에서 정확한 dense correspondence는 어려웠다.

4.7. Face Recognition Accuracy

face detection은 rebust한 face recognition에서 중요한 역할을 하지만 이 영향은 측정된 적이 거의 없다. 이 논무에서, 우린 face detection 방법이 현재 공개된 sota인 ArcFace 성능을 어떻게 끌어올릴 수 있었는지 설명하겠다. ArcFace는 deep convolutional neural network (즉, training set, network, loss function 선택에 따라) 훈련 과정의 관점이 (훈련을 어떤 방식으로 하느냐를 말하는 듯) face recognition 성능에 얼마나 영향을 미치는지 연구했다. 그러나, ArcFace 논문은 detection과 alignment를 MTCNN만 사용해서 진행하고 face detection 효과는 연구하지 않았다. 이 논문에선, 우린 모든 훈련 데이터 (MS1M)과 테스트 데이터(LFW, CFP-FP, AgeDB-30, IJBC)를 MTCNN이 아닌 RetinaFace로 교체하여 detect와 align을 진행했고 embedding network(ResNet100)와 loss function (additive angular margin)은 ArcFace에서 했던것과 똑같이 하였다.

Tab. 4에서 우린 널리 쓰이는 MTCNN과 제안하는 RetinaFace를 비교하여 face detection과 alignment가 deep face recognition (ArcFace)에 영향이 미치는 것을 보았다. CFP-FP 결과를 보면, RetinaFace는 ArcFace의 검증 정확도를 98.37%에서 99.49%로 올렸음을 보여준다. 이 결과는 frontal-profile face verification 성능이 frontal-frontal face verification (예. LFW에서 99.86%)에 접근했음을 보여준다.

Tab 4. LFW, CFP-FP와 AgeDB-30에서 다른 방법에 따른 검증 성능(%)

Fig. 9에서 we show the ROC curves on the IJB-C dataset as well as the TAR for FAR= 1e − 6 at the end of each legend. 우린 face 검증 정확도를 점진적으로 향상시키기 위해 투가지 트릭을 적용했다 (flip test와 템플릿 안에서 몇가지 샘플을 중요하게 하기 위한 face detection score). 공평한 비교 아래, TAR (FAR=1e-6)은 MTCNN을 RetinaFace로 바꾼 것 만으로 88.29%에서 89.59%로 매우 올라갔다. 이것은 (1) face detection과 alignment는 face recognition 성능에 영향을 준다는 것이고 (2) RetinaFace는 face recognition application을 위한 MTCNN보다 더 강력한 baseline 이라는걸 시사한다.

Fig 9. IJB-C 데이터셋에서 1:1 검증 프로토콜의 ROC 커브들. "+F"는 feature embedding 중 flip test를 나타내고 "+S"는 몇가지 탬플릿에 무게를 둔 face detection score를 가리킨다. 우린 또한 각 legend 끝에 FAR=1e-6인 TAR도 제공한다.

4.8. Inference Efficiency

테스팅 동안, RetinaFace는 single stage에서 face localisation을 진행했는데, 이는 유연하고 효율적이다. 게다가 above-explored heavy-weight 모델 (ResNet-152, 사이즈 262MB, WIDER FACE hard set에서 AP 91.8%)을 찾는데, 우리는 또한 inference 가속을 하려고 light-weight 모델 (MobileNet-0.25, 사이즈 1MB, WIDER FACE hard set에서 AP 78.2%)도 재정렬 해보았다.

가벼운 모델에 대해, 우린 입력 이미지에 7*7 convolution과 stride=4를 사용하여 데이터 사이즈를 줄이고, [36]처럼 P_3, P_4, P_5에 dense anchor들을 tile 하고, deformable layer들을 제거했다.. 추가로, 처음 두개의 convolution 레이어들은 높은 정확도를 위해 ImageNet pre-trained로 초기화하였다.

Tab. 5는 다른 입력 사이즈 관점에서 두가지 모델의 inference time을 보여준다. 우린 dense regression branch에 대한 시간 소비를 측정하여 시간 통계가 입력 이미지의 얼굴 밀도와 무관하다. 우리는 model inference 가속을 위해 TVM 이점을 얻었고, 시간 측정은 NVIDIA Tesla P40 GPU, Intel i7-6700K CPU와 ARM-RK3399의 성능으로 진행했다. RetinaFace-ResNet-152는 높은 face localisation 정확도로 디자인 되어서, VGA 이미지 (640*480)에서 13FPS를 보였다. 반면, RetinaFace-MobileNet-0.25는 높은 face localisation 효율로 디자인 되어서 GPU에서 4K(4096*2160) 이미지는 고려해볼만한 속도인 40FPS, HD(1920*1080) 이미지는 멀티-쓰레드 CPU에서 20FPS, VGA(640*480) 이미지는 싱글-쓰레드 CPU에서 60FPS이 나왔다. 더 놀라운건, VGA(640*480) 이미지에 대해 16 FPS가 나오는 ARM은 모바일 장치에서 빠른 시스템을 제공한다는 것이다.

Tab 5. 다른 입력 사이즈들(VGA@640*480, HD@1920*1080, 4K@4096*2160)에 대한 다른 backbone들(ResNet-152와 MobileNet-0.25)에서 RetinaFace의 inference time (ms). "CPU-1"과 "CPU-m"은 싱글-쓰레드고 멀티-쓰레드 테스트는 Intel i7-6700K CPU이다. "GPU"는 NVIDIA Tesla P40 GPU고 "ARM" 플랫폼은 RK3399(A72x2).

5. 결론

우린 이미지에서 임의의 얼굴 크기에서 dense localisation과 alignment를 동시에 진행하는 문제를 연구했고 우린 처음이자 우리 최고의 지식으로 one-stage solution (RetinaFace)를 제안한다. 우리의 해결책은 대부분의 도전적인 face detection 벤치마크에서 sota 방법론들을 뛰어넘었다. 더욱이, RetinaFace가 face recognition의 sota 문제와 결합하면 정확도도 눈에띄에 향상된다. 데이터와 모델들은 이 토픽의 연구를 촉진시키기 위하여 공개적으로 제공된다.

6. 지식들

Jiankang Deng씨가 Imperial President's PhD Scholarship에서 금전적인 제공을 받았고 NVIDIA에서 GPU 기부를 받았음. Stefanon Zafeiriou씨가 EPSRC Fellowship DEFORM, FACER2VM과 Google Faculty Fellowship에서 도움을 받았음.

 

 

===============================

모델에서 SSH로 옆으로 빼는 부분 즉

 

이 그림에 해당하는 코드는

여기서 확인 가능하다.

 

더 자세히는 torchvision의 _utils.IntermediateLayerGetter 이라는 메소드가 있는데, 이걸 사용하면 레이어 중간에 결과를 빼올 수 있다.

 

이렇게 빼온걸 upscaling 하며 합쳐서 사용하는것 같다.

 

 

모델의 결과도 multi loss를 쓴다고 했는데, 실제 output도 보면 3개의 결과가 나온다.

이 결과들을 multibox loss에 넣어준다.

MultiBoxLoss 클래스 부분은 수학적 지식이 필요할 듯.. 시간내서 분석해야 이해할 것 같다.

 

 

이렇게 해서 내가 개조해서 만든 코드. mobilenetv3의 small 과 large를 mobile0.25에서 stride로 이미지 크기 줄여나가는 규칙 보고 적용한거다. 안타깝게도 mobilenetv3 large는 내 GPU(1060GTX 6GB)로 훈련을 못함.

https://github.com/sglee487/Pytorch_Retinaface

 

GitHub - sglee487/Pytorch_Retinaface: Retinaface get 80.99% in widerface hard val using mobilenet0.25.

Retinaface get 80.99% in widerface hard val using mobilenet0.25. - GitHub - sglee487/Pytorch_Retinaface: Retinaface get 80.99% in widerface hard val using mobilenet0.25.

github.com