ユニファ開発者ブログ

ユニファ株式会社システム開発部メンバーによるブログです。

深層学習で馬を見分ける(その2)

R&Dエンジニアの浅野です。前回の記事で写真から馬の顔を検出することができるようになりました。今回は切り出した顔からどの馬なのかを判定するモデルを作成します。全3回のシリーズ記事の2回目です。

  1. 顔の検出器の作成 ← 前回
  2. 分類器の作成 ← 今ここ
  3. スマホで動くようにする

データセット

馬を識別するモデルを学習するにあたり、公開されている馬の顔データセットを使用することにします。このデータは、47頭の馬を様々な天候や光の当たり具合で撮影したビデオから各頭30枚ずつの顔部分(正面と左右からのアングル)を切り出したものです。こうやって時間をかけてデータセットを整備して公開してくれるのは本当にありがたいことです。

f:id:unifa_tech:20190322133407j:plainf:id:unifa_tech:20190322133357j:plain:w110f:id:unifa_tech:20190322133354j:plain
データセットに含まれる写真の例。すべて違う馬です。

モデルの学習

シンプルな4層のCNNを用いて47頭の馬の顔を分類するモデルを作ります。47*30=1,410枚の画像のうち、1,118枚を学習用、141枚をバリデーション用、そして残り141枚をテスト用に分割して学習を行いました。100エポック回したときの様子を下に図示しています。順調に学習がすすんでいます。テスト用画像で精度を測ったところ95.03%と思ったより良い結果がでました。4層のCNNとはいえ最適化すべきパラメータ数は300万以上あるのに、1,000枚ちょっとの画像でそれなりの結果がでてしまうのが面白いところです。

f:id:unifa_tech:20190322143954j:plain:w500
学習の様子

ちなみに、ImageNetで学習済みのResNet50から転移学習(全結合層のみの学習)を行った際の精度は96.45%, Convolution層も含めてFine Tuningを行った場合の精度は98.58%とさらに高い数値が出ています。ImageNetの画像には馬が写っている画像が含まれていることもありますが、さすがに様々な画像系のタスクの転移学習で利用されるだけあって、馬の顔認証というニッチな用途でも効果を発揮してくれました。

今後に向けて

今回は画像分類として馬の認識を行いましたが、この方法だと追加で認識させたい馬がでてきたときに、その馬の顔データを十分な数だけ集めてモデルを学習しなおす必要があります。一方、人間の顔認証でやっているように、Triplet lossArcFaceなどの手法を用いて顔画像からembeddingを計算するモデルを作成しておくと、その後の運用を楽にすることができます。ただしそのモデル作成のためには今回使ったものよりもはるかに多数の正解データが必要なので実現はまだ先になりそうです。

前回と今回の記事で、画像から馬の顔を切り出し、その顔からどの馬なのか判定することができるようになりました。これまではクラウド環境でGPUを使用して学習および推論を実行してきましたが、次回はスマホで推論を実行できるようにしたいと思います。

保育の世界を変えるエンジニア募集中

(今回の内容も保育とは全く関係ありませんでしたが)ユニファではテクノロジーで保育を変えていく仲間を大募集中です。少しでも興味を持たれた方はぜひ声をかけてください!

【AI系技術サーバサイドエンジニア】R&Dチームにて機械学習やAIを用いたサービス開発を担う(東京)の採用情報 | ユニファ株式会社