Kerasでウェブカメラから顔領域を検出し、年齢・性別を推定する


はじめに

顔画像から年齢・性別を推定するためのデータセットIMDB-WIKIで紹介したデータセットを利用して、顔画像から年齢・性別を推定するネットワークを学習し、ウェブカメラからの入力画像を認識するデモを作成する。実装はGitHubを参照。


IMDBのデータで学習し、WIKIのデータで検証した例。

デモ

学習済みモデルもアップロードしているので、とりあえず学習なしでお試し可能(自動的に重みがダウンロードされます)。ウェブカメラからの入力画像からdlibで顔領域を検出し、年齢と性別をCNNで推定している。MBAでも1fpsくらいでてる気がする。
macOS Sierra, Python 3.6.0, Keras 2.0.2, Tensorflow 1.0.0, dlib 19.1.0, OpenCV 3.2.0, NumPy 1.12.0で動作確認。

git clone https://github.com/yu4u/age-gender-estimation.git
cd age-gender-estimation
python3 demo.py

年齢・性別を推定するネットワークを学習する

下記では、自分でデータセットをダウンロードし、ネットワークを学習する手順。

データセット

IMDB-WIKIデータセットを利用する。このデータセットは、Internet Movie Database (IMDB) およびWikipediaをクローリングして作られたデータベースで、プロフィール画像、プロフィール画像から顔領域を抽出した画像、人物に関するメタデータから構成される。
下記により、IMDBおよびWIKIのデータセットがダウンロードできる。

git clone https://github.com/yu4u/age-gender-estimation.git
cd age-gender-estimation
./download.sh

下記で、学習に必要なデータ一式を.matファイルに変換する。顔画像(顔検出器で検出された顔領域の前後左右を40%拡張した画像)、年齢、性別がセットで格納される。

python3 create_db.py --output data/imdb_db.mat --db imdb --img_size 64

パラメータとか。

  • output:出力.matファイル名
  • db:利用するデータベース名(wiki or imdb
  • img_size:利用する画像サイズ(ネットワークへの入力)
  • min_score:利用する顔画像のスコアのしきい値

データセットさえ整えてしまえば、別にKerasでなくても他のフレームワークでも簡単に同様の実装が可能。

ネットワークモデル

CNNであれば何でも良い。元の論文 [1] では、pre-trainされたVGG-16をfine-tuningしている。ここでは、ResNet系で、より効率的に学習できるWideResNet [2] を利用する。[1] では、年齢と性別を推定するネットワークを別々に構築していたが、ここでは両方を同時に推定するため、global average poolingの出力に、出力数101のFC層と、出力数2のFC層をくっつける。
出力数101のFC層では、入力された顔画像を0〜100歳に分類する問題を解く。そして、推定された各年齢の確率と年齢をかけることで、年齢の期待値を年齢の推定値とする。[1] では、単純に年齢をRegressionするよりもこちらのほうが精度が良いことが示されている。
出力数2のFC層は単純に男女のクラス分類を解く。
本来はこれらの2つのタスクのロスに対して混合率$\lambda$のようなパラメータを設定してチューニングすべきかもしれないが、単純に1:1で足しても問題なさそうだったので特に何もしていない。

入力画像のサイズを64x64とした際のWideResNetの構成。幅のパラメータ$k$と深さのパラメータ$N$が存在する。

学習結果

上記のネットワークで、小さめのパラメータ$k=8$、$N=2$でIMDBデータセットを学習した結果は下記。OptimizerはベタにSGD+Momentumを利用。


精度


ロス

データ数がある程度大きいので、数エポックでかなり収束する。学習率を0.1、0.02、0.004、0.0008と下げているが、途中から過学習するようだ。GTX1080で1エポック30分くらい。まだまだチューニングの余地がありそうだが、とりあえず上記の設定でval_lossが一番良かったモデルをデモ用に保存してある。

[1] R. Rothe, R. Timofte, and L. V. Gool, "Deep expectation of real and apparent age from a single image without facial landmarks," in IJCV, 2016.
[2] S. Zagoruyko and N. Komodakis, "Wide Residual Networks," in Proc. of BMVC, 2016.