"scale aware face detection"と"finding tiny faces" (cvpr'17) の解説
TRANSCRIPT
Copyright©DeNACo.,Ltd.AllRightsReserved.
ハワイ2017読み会YusukeUchida(@yu4u)⾏けないので画像で気分だけ盛り上げております
1
Photoby(c)Tomo.YunhBp://www.yunphoto.net
背景
! マルチスケールの物体検出(sliding window)a. 1つのスケールの物体のみを検出する検出器+画像リスケールb. 複数のスケールの物体を検出する検出器を全スケール分c. 少数のスケールの物体を検出する検出器+画像ピラミッド
d. マルチスケール・シングルショット検出器(e.g. Faster R-CNN, SSD, YOLOv2)
3
e.g.HOG+SVM
背景
! マルチスケールの物体検出(sliding window)a. 1つのスケールの物体のみを検出する検出器+画像リスケールb. 複数のスケールの物体を検出する検出器を全スケール分c. 少数のスケールの物体を検出する検出器+画像ピラミッド
d. マルチスケール・シングルショット検出器(e.g. Faster R-CNN, SSD, YOLOv2)
4
e.g.HOG+SVM マルチスケール処理は重い!
(おおざっぱ)
アプローチ
! Single-scale detectorベース! 各スケールについて、画像中にそのスケールの顔が存在するかを判定し
顔が存在するスケールのみ検出を⾏う
5
これらのスケールには顔が存在しないので、検出処理をスキップ
ScaleProposalNetwork(SPN)
フレームワーク
6
①(計算量のため)ダウンサンプルした⼊⼒画像をSPNに⼊⼒しスケール候補を取得(⻑辺448px)
②SPNで検出されたスケール候補に対応する画像サイズのみをリサンプル
③各リサンプルされた画像に対しシングルスケールの顔検出
ScaleProposalNetwork
7
なんでも良いのでテキトーなFCN
HxWxCの特徴マップCはスケール数
Globalmaxpooling→sigmoidで[0,1]そのスケールの顔が(最低1つ)存在する確率
W
H
C
! 正解は、⻑さがスケール数のベクトル! 各要素は、logスケールで⼀定間隔のスケール幅に対応し
そのスケール幅内に収まるスケールの顔が存在すれば1、otherwise 0(厳密には違うので後述)
groundtruth
スケール選択
8
ノイズの影響を減らすため移動平均からのnon-maximumsuppression
• ビンの数は結構多い→顔のスケールで23〜29を60分割
• NMSの幅は顔検出器がカバーするスケール幅より⼩さめ→36-72pxなのでlogスケールで幅1
23 29
11
Non−maximumsuppression詳細
検出幅
NMS幅<1
ScaleProposalNetworkの特徴マップ
! SPNに対しては明⽰的に顔の場所を教えていない
! しかし、global average pooling前の特徴マップを⾒るとそのスケール情報だけから顔の位置も学習している!(収束遅くない?
9
各スケールの顔があるかないかだけ
この部分は結局マルチスケールの顔検出器もどき(だったらこれだけで良い気ももしかしたら顔のサイズの共起性をうまく利⽤できている?)
顔のboundingboxおよびスケールについて
! 顔のスケールは顔のbounding boxの辺の⻑さで定義される! しかし、顔のbounding boxはかなり主観が⼊るため
全ての訓練データで⼀貫性をもたせることが難しい! これに対し、顔の5点のランドマークから⾃動的にbounding boxを定義
する⁃ 利⽤するランドマーク:左⽬、右⽬、⿐、⼝元(左右)
! 5点のランドマークにより定義される正⽅形のbounding box(中⼼+スケール):
10
SPNの出⼒の正解について
! 理想的にはそのスケール幅内に収まるスケールの顔が存在すれば1、otherwise 0
! ノイズがあるのでガウシアンかけてmax
! 個⼈的には近接ビンは1にして、⼀定以上遠いところは0で、それ以外はロス0とかのほうが好き
11
23 29
学習データの顔のスケール
顔のboundingboxについて(余談
! データセットによってポリシーが違うデータセット間のbounding boxの違いを吸収するだけでも精度が向上(本質的?⾒た⽬上?)Face detection without bells and whistles, ECCVʼ14.https://www.slideshare.net/yonetani/face-detection-without-bells-and-whistles
! ⼀義的なbounding boxの定義は重要
12
Mul?/SingleScaleRegionProposalNetwork(RPN)
! Faster R-CNN、SSD、YOLO等(アンカーがスケールの違いのみのケース)
! 本論⽂ではスケール数=1
13
W
H
C
GoogLeNetベースIncepeon3bまでSPNは更にフィルタ数を1/4
スケール数×4存在確率 + 中⼼座標(x,y)+スケール
このセルに中⼼がありスケールが特定の範囲内の顔の存在確率存在するとすればその中⼼座標とスケール
→
実験
! テストデータセット⁃ FDDB, AFW, MALF
! 訓練データセット⁃ インターネットから700K(!)画像収集、うち350Kが顔を含む⁃ AFLWも追加⁃ 顔を含まないインターネットの350KとCOCOデータセットを
ネガティブサンプルとして利⽤! ⽐較⼿法
⁃ SA-RPN (Scale-Aware RPN)• 提案⼿法
⁃ Multi-Scale Testing RPN (MST-RPN)• 画像を6スケールにリサイズしてsingle-scale RPN
⁃ Single-Shot Multi-Anchor RPN (RPN)• 6アンカーのmulti-scaleのRPN
14
ScaleProposalNetworkの評価
15
平均scaleproposal数 vsrecall1scaleでrecall0.8くらい=顔が複数あっても同じスケール
顔のサイズ vs⾒逃し率⾒逃しているのは⼩さい顔が多い
State-of-the-artとの⽐較
! train-valid-testに分かれていないテストデータだけのデータセット
! ⼤体提案⼿法群が⼀番良いよ! MST-RPNが⼀番いいよ(scale proposalが6の提案⼿法のようなもの)
16
SA-RPN:0.938MSTRPN:0.928RPN:0.912
SA-RPN:0.882MST-RPN:0.892RPN:0.871
SA-RPN:0.988MST-RPN:0.992RPN:0.982
感想
! スケール選択は⾯⽩い(再現率が⼼配だが意外に⼤丈夫そう)⁃ 選択スケールが細かいところが意外⁃ ⼀般物体はスケール⾊々なので難しそう
! 細かいパラメータが書いてない!⁃ Confidenceのしきい値とか、平均proposal数とか
! 現実問題ではスケールが結構限定されているケースが多い
! SPNとRPNが断絶している⁃ 同じようなことをやっているのでくっつけられそうだが
画像のリサイズが結構細かいスケールで⾏われるので難しそう
18
検出の基本はHeatmapPredic?on(さっきと同じ)
! Faster R-CNN、SSD、YOLO等(アンカーがスケールの違いのみのケース)
! GitHub上のコードではres3 + deconvしたres4=⼊⼒の1/8、スケール25(feature mapの解像度は1種類)
24
W
H
C
ResNet101ResNet50VGG16
スケール数×5存在確率 +(x,y,w,h)
このセルに中⼼がありスケールが特定の範囲内の顔の存在確率存在するとすればその中⼼座標とスケール
→
コンテキストの影響(heatmappredic?on)
! 異なるスケールのfeature mapを統合したheatmap prediction精度
! コンテキストを増やすほど精度が向上する⁃ ⼩さい顔でres5まで追加すると精度低下→過学習によるもの
! ⼩さい顔は⼩さい受容野でも精度が⾼い(顔がまるまる⼊るので! ⼩さい顔のほうがゲインが⼤きい=⼈の精度とconsistent
26
+18.9%
+1.5%
Fovealstructureの影響
! Foveal structure=マルチスケールの特徴を統合していること⁃ 中⼼のほうが情報量が⾼くなるので⽬の中⼼窩のアナロジー
! 単純に受容野を⼤きく取るだけではなくマルチスケール特徴が重要⁃ 顔のスケールに応じて⾃動で重要なスケール特徴を選択している⁃ ある程度⼈が設計しても良いかも
27
リサイズされた画像に対する認識率
! ⼤きな顔に対し、⼩さくリサイズしてから検出するほうが精度が⾼い⁃ 学習データのサイズの違い
! ⼩さい顔は、⼤きくリサイズしてから検出するほうが精度が⾼い⁃ こちらはfine-tune元のImageNetの物体サイズに引きづられている
※顔は⼩さいほうがデータが多い、ImageNetは中くらいの物体が多い28
各スケールの顔を検出する際にベストな解像度
29
元画像での顔のスケール
精度
⼤きい顔はx0.5中くらいの顔はx1⼩さい顔はx2のスケールで検出すると良い
x0.5を検出器A
x1を検出器A
x2を検出器A
x2を検出器B
極⼩の顔は20px以下の顔を検出する専⽤の検出器を利⽤