Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

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

result.png
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.

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away