TensorFlowによるアイドル顔識別器の話 - 2016.12.13 TensorFlow User Group #2

  • 37
    Like
  • 0
    Comment

自己紹介

  • すぎゃーん (id:sugyan)
    • Web系エンジニア
    • ドルヲタ
  • TensorFlowで機械学習に入門 (2015.11〜)
  • はてなブログ書いてます

アジェンダ

  • アイドル顔識別について
    • 自作識別器の紹介
  • データセット・学習の話
  • 可視化

前回のあらすじ

TensorFlowによるアイドル顔識別器の話 (2016.9.28)

  • 学習用データセットの収集・作成
    • …の苦労話
  • モデルの評価と実験
  • 収集したデータを使った顔画像生成

など


アイドル顔識別について

問題設定 (やりたいこと)

「入力した画像に対し、写っているのが『どのアイドル(人物)か』を機械学習により自動判定する」

  • 画像に対する 物体検出 + 分類
    • 顔検出は今のところCloud Vision API任せ
  • 検出された領域を抽出した個々の顔画像に対する分類がメイン

LINE BOTを作りました

友だち追加

http://memo.sugyan.com/entry/2016/11/28/131952


2016.12.13現在 識別対象数 898人


※識別対象とする「アイドル」の定義については難しい問題

とりあえず今は

  • Twitterアカウントを持っていて
  • 多くの自撮りを投稿している
  • ライブアイドル

をメインに独断と偏見で


データ提供していただければ対応も考慮します🙇


アイドル顔識別器

  • 入力: (96, 96, 3) の画像
  • 出力: 各分類ラベルに対応するsoftmax

CIFAR-10のモデルなどを参考に自分で組み立てて調整したもの

4層の畳み込み&プーリング 3層の全結合
19.09.45.png 19.10.07.png

学習データの準備

  • 顔画像の収集
  • 分類のためのラベル付け

教師あり学習のため、それぞれの顔画像に「それが誰であるか」正しいラベルが付与されている必要がある


収集

  • 取得対象のTwitterアカウントを登録 (ほぼ手動)
    • 2016.12時点で約1,500件
  • 検索APIで定期的に画像付きTweetを取得
  • 自作の顔検出器で顔部分だけを抽出

放っておいても毎日2,000件くらい集まる


ラベル付け

  • 収集された1つ1つの顔画像に「正解ラベル」を対応付ける
  • 超高度な知識が要求される
  • とにかく頑張る
    • 頑張るしかない

色々仕組みを考えたり工夫している が、TensorFlowほぼ関係ないので割愛


約10ヶ月続けて 10万/70万 くらい

1.png


「私のデータセットは53万です」

って言えるくらいまで頑張りたい


学習に使うデータセット

  • 10万枚ラベル付けした、といっても色々ある
    • 400枚くらい揃っている人物、数枚しかない人物
    • アイドルではない人物
    • そもそも人間の顔じゃないもの (誤検出されたもの)

  • できるだけ各クラス均等な数で
  • それなりに分類できるところを目指したい

(検証用とかで分ける余裕はまだ無い)


人物ごとの枚数差はとても大きい

2.png


上限を120、下限を30として抽出 (30以下は学習対象外にする)

3.png


60以下のものは2倍に水増し

4.png


「学習対象外」のものは1つのラベルとしてまとめて1万件ほど抽出

  • 30件未満しか集まっていない人物
  • アイドルではない人物
  • アイドルではなくなった人物…
  • 顔ではないもの
  • つまり学習対象の人物の顔ではないものすべて

学習の実行

  • tfrecordsファイルからbatch_size=128tf.train.shuffle_batch
  • 重みの初期値はtf.truncated_normal_initializerによる乱数値
  • loss(cross entropyなど)が減少するよう各層のweight, biasを更新していく

が、まっさらな状態から学習は上手くいくのか?


データ数、分類数が多くなると収束しにくくなる (当然)

5.png


850クラス分類を初期値から学習開始するとぜんぜん収束しない

6.png


まず10クラスなど、簡単な分類である程度学習させ、

そのパラメータを再利用して最終出力層だけ繋ぎ変える


中間層が事前学習してあれば割とイイカンジに

7.png


  • 学習データが増えるごとに徐々に分類数を増やす
  • が、初期値から学習をやり直すのは最終出力層の部分だけ
    • g2.2xlargeで3時間くらい

というのを繰り返して分類数を増やしてきた

今のところはこの手法で大きな問題なく動いている


可視化の話

0.12.0(現時点ではRC1) からTensorBoardに新機能が追加


http://memo.sugyan.com/entry/2016/12/05/022346


デモ

現在の識別モデルで、識別対象になっていない画像群を入力したときの中間層出力の分布をEmbedding Projecotorで見てみる


未知のデータのクラスタリングを視覚的に確認できそう


まとめ

  • 学習データが増えてもどうにか学習はできている
    • あとはとにかく増やし続けるのみ
    • まだまだ課題はあるし仕組みは考えていきたい
  • 可視化たのしい