# LFFD: A Light and Fast Face Detector for Edge Devices.
論文出處:CVPR 2019
論文連結:https://arxiv.org/pdf/1904.10633v3.pdf
github: https://github.com/YonghaoHe/LFFD-A-Light-and-Fast-Face-Detector-for-Edge-Devices

# 簡介
LFFD 是受到 one-stage 和 multi-scale object detection SSD 的啟發來設計的,並開發出新的 backbone:
總結來說,這篇 Paper 提出了以下貢獻:
- 探討了 RF (receptive field)、ERF (effective receptive field) 和 face detection 之間的關係,並將 **RF 視為一種天然的 anchor**,透過 RF 解決先前 anchor-based 策略的缺點,並提出了新的 anchor-free 方法。
- 使用一些常見的 layer 提出了新的 backbone,並且能達到高準確度和快入的 face detection。
- 在網路模型上由淺層到深層抽取8路特徵圖,使用 ERF 進行不同目標尺度的檢測(分類+邊界回歸)
- 採用 WIDER FACE 和 FDDB benchmark 進行測試,速度快模型小效果好。
## Multi-scale Object Detection SSD
SSD 和 Yolo 一樣是採用 one-stage 的方法來進行物件偵測,但不同的點是其採用了多尺度的特徵圖 (Multi-Scale feature map)。
所謂多尺度就是採用大小不同的特徵圖,一般來說 CNN 網絡前幾層的 feature map 會比較大(長寬),再經過幾層的 pooling 後 feature map 的大小就會逐漸降低。

透過對不同尺度的 feature map 來進行檢測,進而改善小物件難以被辨識的缺點。
在高解析度的 feature map 上使用較小的 anchor 來檢測那些小物件,並在低解析度的 feature map 上使用較大的 anchor 來檢測大物件。這樣的話本來難以偵測到的小物件也能夠被精準的偵測到。

## 什麼是 one-stage
通常來說物件偵測都會需要兩件任務,分別是 proposal selection 和對 物件進行 classification。主流的方法分為 **1. two-stage 2. one-stage**

### two-stage
two-stage方法,主要是把 proposal selection 和 classification 分成兩個網路,先使用某些 proposal selection (RPN、selective search)方法產生一系列稀疏的候選框,然後對這些候選框進行分類與回歸。
two-stage方法的優點是準確度高,但是速度較慢。
### one-stage
one-stage methods 將這兩項任務結合在一個網路內完成。也就是說
- One-Stage 只使用一個神經網路就能夠同時達到偵測和辨識。
- 還是會有候補物件框,但是每個框上面都已經有辨識的分類結果或是可能性。
常見的 one-stage 會在圖片的不同位置進行密集抽樣,抽樣時採用不同尺度和長寬比,然後利用提取特徵後直接進行分類與回歸,整個過程只需要一個網路。
所以 one-stage 的好處就在速度快,省下整整一個網路的運算時間,但缺點是降低了整體的精準度(正負樣本數不平均)。因此對於大多數的 one-stage,都會使用 anchor 的設計來得到比較好的準確度,並且設計越來越複雜的 heavy backbones。
## Anchor 的缺點
1. Anchor 很難完全覆蓋所有尺寸的人臉
2. 基於 IOU 的 Anchor 匹配機製本身存在比較大的問題:首先,閾值需要靠經驗選取;其次,按照 IOU 的計算方式,小臉跟 default box 之間的 IOU 值比較小,這種小臉可能在訓練的時候就被過濾掉了。
3. Anchor 數量與尺寸全靠經驗,容易導致設置不合理和冗餘計算
因此,需要一種更加合理的Anchor設計機制。
# Light and Fast Face Detector
## 重新探討 face detection 中的 RF
### 甚麼是 RF ?
> The receptive field is defined as the region in the input space that a particular CNN’s feature is looking at (i.e. be affected by).

RF 定義了 CNN feature 在輸入空間內,所能看到的區域(即受其影響)。因此如果目標物件被 RF 整個涵蓋在內就會有比較高的機率被偵測到。

### 甚麼是 ERF ?
RF 有一個很重要的特性就是輸入圖片的 pixel 在 neuron 的 activation 上有不同的影響。尤其是在 RF 中心附近的 pixel 影響特別大,並且遠離中心的 pixel 的影響遞減。這個現象就稱為 ERF (Effective Receptive Field)。 ERF 在 neural networks 上呈現高斯分布,因此在 RF 中心的目標物件也很重要。這篇提出的 LFFD 就是受惠於這樣的發現。
---
人臉辨識可以分為 大臉和小臉兩種,通常來說大張的臉的變化很少,就算他們有表情、髮型等等變化都還是很好區別的。但是小張的臉和大張的臉就差了許多,小臉通常會有很多難以辨識的五官。但是如果加上脖子肩膀等等特徵進去,小臉就會變得比較好辨識。

基於上述的理解後,了解到不同大小的人臉需要不同的 RF 策略,因此設計出了有效的 backbone :
- tiny/small 的人臉,ERF 需要覆蓋整張臉來得到充足的 context information。
- medium 的人臉,ERF 只需要保離較少的 context information。
- Large 的人臉,只需要保留 RF 就足夠了 (不需要 ERF)。
## RF 作為天然的 "Anchor"
通常來說,one-stage detectors 都會有預設定的 bbox anchors 來平衡正負樣本,進而提升準確率。如果只有單調的 anchor 設計就沒有辦法很好的偵測到每個物件,因此通常來說 anchor 會有多種的長寬比和大小。
通常來說在 face detection 任務中,長寬比會設定為 1:1,因為臉大多是正方形的。如果 kernel 設定長寬比相同的話,那麼 RF 的形狀也是正方形的。因此在這篇論文中,把 RF 作為一種天然的 anchor。
這篇論文的 matching strategy 不使用 thresholding IoU,而是使用直接簡單的方式,只有在 RF 的中心點落在 groundtruth bbox 裡面時,才會把 RF 和 groundtruth 做匹配。透過這樣的策略,RF 就能夠自然的處理連續的人臉尺度,anchor 正負樣本不平衡的問題也就能夠解決了。
RF 做為Anchor:模型中所有 RF 均勻的分佈在輸入圖像上,無需手動設計。不同層的 RF 理論上能覆蓋所有尺寸的人臉,
基於上述,這篇論文不使用任何的 anchor 並且並沒有真的把 anchors match 到 groundtruth bbox 裡面。因此這篇論文是一種 **one-stage 的 anchor-free 方法**。
## 網路架構

基於前面那些探討後,這篇論文設計了全新的 face detection backbone network。整體的網路設計只有使用常見的 1x1 和 3x3 conv layer、pooling 以及 ReLU。所有的 conv layer 的 kernel size 均為 3x3,loss branch 為了不改變 RF 的大小因此 conv layer 的 kernel size 為 1x1 。在 loss branch 內還有兩個 sub-branch,分別做 face classification 和 bbox regression。
網路中有兩個因素決定了 loss branch 的位置:**“the size and stride of RFs“**。
- RF 的 size 確保學習到的人臉特徵是強健而且可區別的
- RF 的 stride 確保整個人臉特徵是 100% 被 RF 覆蓋的
整體網路分為四個部分,並遵守在最快 downsample 的情況下保持 RF 100% 覆蓋整個人臉:
- tiny part
- small part
- medium part
- large part
在 tiny part 的部分,使用了兩個 loss branch,分別在 c8 和 c10 的 conv layer。這兩個 loss branch 的設計分別使用了不同的 RF size 來負責不同的 face scale (c8 使用 RF size 55 來處理 face scale 10-15,c10 使用 RF size 71 來處理 face scale 15-20)。並且如之前所說的,tiny face 需要更多的 context information 而且 ERF 比 RF 來得更小,因此這邊使用較大的 RF (face ratio 為 4.4)。觀察下表後,會發現 face ratio 從 4.4 降到 1.3,那是因為 large face 相比 tiny face 不用要那麼多的 context information。
small part 和 medinum part 差不多,負責不同的 face scales。因為 RF 增加的速度增快,因此只需要較少的 conv layer 就能達到目標的 RF size。
large part 有七層的 conv layer,因為這些 layer 的 feature map 很小所以需要花費的計算量也很少,因此使用三個 loss branch 來增加 detection scale。因為大張的臉比較容易分辨,所以 RF ratio 和 face scale 也設定的很小。

這個網路在 inference 時可以偵測 10 pixel 到 560 pixel 的人臉。
## 訓練細節
### Dataset:
使用 WIDER FACE benchmark,有 12,880 張圖片、多達 150,000 張人臉,並只取大於 10 pixel 的人臉。
### Data Augmentation
針對 Data augmentation 做了以下 :
- 顏色的變化,像是隨機的亮度噪音、隨機調整對比、亮度等等。
- 對於每個 sample 做隨機的 scale。
- 設計了**八個 loss branches** 每個負責不同連續的 scale。
1. 每個 branch 的人臉數量都是相同的
2. 每個人臉在每個分支上都會有相同的機率
- **因此我們隨機的選擇一張圖片並從裡面隨機取一張人臉**
- **接著選定連續的 face scale 然後把整張圖片和人臉以及 bbox 都縮放到 scale 以內**
- **最後我們把 640 x 640 輸入影像的中央裁出來,並把外圍的 pixel 填上黑色。**
- 隨機的水平翻轉,以機率為 0.5 對 crop image 作翻轉。
### Loss function
每個 loss branch 都有 face classification 和 bbox regression 的 sub-branches。
### Face Classification
針對 face classification,對兩個類別使用 softmax with cross-entropy loss。
有 match 的 RF anchor 標示為 positive,其他則標為 negative。
RF anchor 內如果有不只一張臉被 match 那就忽略掉整個 RF anchor。
### BBox Regression
針對 bbox regression,直接採用 L2 loss,並且只對 positive RF anchors 激活(不包含被忽略的)。
### 其他設定
使用 SGD with 0.9 momentum 作為 optimizor,不使用權重衰退 (zero decay) 和 batch size 32。不使用權重衰退是因為 LFFD 網路的權重很少,因此根本不需要做懲罰。
初始的 learning rate 設為 0.1,並且在訓練時達到 iteration 600,000、1,000,000、1,200,000 和 1,400,000 時將 learning rate 乘上 0.1。總共訓練 1,500,000 個 iterations。
總計使用兩張 NVIDIA GTX1080TI 訓練五天的時間。
# 實驗結果


## 在 FDDB 資料集的表現


## 在 WIDER FACE 資料集的表現


## LFFD 和其他方法的參數量差異。

## 在 Raspberry Pi 3 上的效率

## 在 TITAN Xp 上的執行效率。

# Conclusion
由於對 RF 積於 Face Detection 的重新思考,提出了解決 anchor-based drawback 的 anchor-free 方法。將 RF 視為能夠涵蓋連續 face scale 並且能夠達到 100% hit rate 的 nature "anchors" ,並重新探討 ERF 和 face scale 的關係,設計出了有八個 detecting branches 的 backbone network。 Backbone network 使用了更少的 filter 因此達到了更快的 inference speed。
# Reference
[目標檢測|SSD原理與實現](https://zhuanlan.zhihu.com/p/33544892)