顔検出器CenterFaceで高速推論

まえがき

R&Dチームの宮﨑です。CenterFaceをTensorRTで実装したところ、かなりの性能が出たので記事にしました。

日々様々なDNNを実装・計測しているオプティムですが、その中でアンカーフリーの顔検出としてピックされたCenterFaceが期待できる結果が出たのでご紹介させていただきます。この取り組みは実際には去年の年末に行われたものであり、かなり遅れたご紹介にはなってしまっていることをご了承ください😢

背景・動機🤩

オプティムが提供する製品の一つにAI Cameraがあります。このAI Cameraの機能として顔検出が必要になるので、オプティムでは性能の良い顔検出器がないか日々目を光らせています。CenterFaceという近年注目されているアンカーフリーな手法で性能が期待できそうなものが出てきたのでさっそく実装・計測してみた次第です。

CenterFaceとは?🤔

公開された論文・コード

論文はこちらです。 論文にGitHubのリンクがあり、こちらにはncnnを用いたPython実装やOpenCVのDNNモジュールを用いたC++実装などがあります。去年の年末の段階ではTensorRTの実装はなかったので私が実装したわけですが、現在*1はTensorRTの実装もありますね。ONNXモデルも用意してくれていたりとプロダクションに取り組むオプティムにとっては親切なリポジトリとなっております🤣

特徴

軽量なモデルで顔のボックスとランドマーク*2の位置を高速かつ高精度に予測できます。 製品として実用段階を想定した時、必ずしもメモリや計算スペックの高い機器で推論させてもらえるとは限りません。従ってCenterFaceは汎用性の高い顔検出器と言えそうです。 またランドマークも同時に予測できることも実用性が高めることに一役買っています。 物体検出でよく用いられるアンカーボックス*3を使わない設計、すなわちアンカーフリー設計を導入することで、顔検出を標準的なキーポイント推定問題に変換し、従来の検出器に比べてより大きな出力分解能だけで済ませています。より具体的には、顔のバウンディングボックスの中心点を用いて顔を表現し、顔のボックスサイズとランドマークを中心位置の画像特徴量に直接回帰させます。

CenterFace実装の流れ💨

オプティムでは恒例のTensorRTで動くように実装します。 TensorRTとは?という方は以下の記事をご参照ください。

といってもONNXモデルは元リポジトリに用意されていましたし、前処理後処理もC++での実装があったのでやることは多くないです。

  1. ONNXモデルをパースしてTensorRTの推論ネットワークを構築する
  2. CUDA環境での実行となるので前処理後処理をCUDA実装に直しました
    • 後処理は基本的にシンプルにループ処理を並列化しました
    • NMS周りに見られた冗長な処理は整理してシンプルな処理に書き直した上で並列化しました*4
    • CUDAは基本的にAoS*5よりもSoA*6の方が効率的に動作するため、AoSで配置されていた顔情報*7をSoAに直しました
    • デバイス(GPU)上で推論した後どこかの段階でホストに転送する必要がありますが、デバイス → ホスト間の転送はコストがかかりやすく、転送量はなるべく少なくなるようにした方が高速に動作してくれます。今回はNMSを通して結果を絞り込む所までGPUで処理するかしないかで転送量が大きく変わり性能に大きく影響しました。

顔検出ベンチマーク比較🙈

各顔検出器のFPSです。環境は以下の通りです。条件は完全に統一できてませんがGPU が共通で同じコードベースなのである程度の参考にはなると思います。

DSFD/RetinaFace CenterFace
Linuxディストリビューション Arch Linux x86_64 Ubuntu x86_64
GPU GeForce GTX 1080 Ti GeForce GTX 1080 Ti
CUDAバージョン CUDA 10.2.89 CUDA 10.0.130
cuDNNバージョン cuDNN 7.6.5.32 cuDNN 7.5.0.56
TensorRTバージョン TensorRT 6.0.1 TensorRT 5.0.2

f:id:optim-tech:20200824104233p:plain

最後に🤖

今回はCenterFaceについての簡単な説明とベンチマークの結果を紹介しました。アンカーフリーの将来性を少しでも感じ取っていただけたら幸いです。

オプティムはSOTA*8を製品に組み込めるエンジニアを募集しています。

*1:2020/06/15

*2:顔の特徴点、CenterFaceの場合は右目・左目・鼻・口左端・口右端の5点

*3:アンカーボックスについてはこの記事が参考になります

アンカー ボックスによるオブジェクトの検出 - MATLAB & Simulink - MathWorks 日本

*4:後のコミットを見ると冗長に見えた部分は大きく書き直されていました

*5:Array of Structure

*6:Structure of Array

*7:顔のボックス四点とランドマーク

*8:State-Of-The-Art、最先端の意