ユニファ開発者ブログ

ユニファ株式会社プロダクトデベロップメント本部メンバーによるブログです。

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

f:id:unifa_tech:20190124213022j:plain:w200:right R&Dエンジニアの浅野です。息子が乗馬を習っていてレッスンや試合の様子を見る機会があります。馬にはそれぞれクセや個性があり、それを理解しながら見ると「あ、気持ちが高ぶっている馬をよくコントロールしてるな」とか「あそこで左に逃げないように工夫してるな」など奥深さを感じて楽しみが倍増します。そのため誰がどの馬に乗っているのかをその場で知りたいことがよくあるのですが、素人には馬を見分けるのが非常に難しいです。そこで今回は画像分類で大きな力を発揮する深層学習を使って馬を識別してみたいと思います。

指導者や経験豊富な人が見分けるときは全身をみて判断しているのですが、全身を対象にすると鞍やゼッケン、騎乗者などの影響を取り除くためにセグメンテーションを行ったり、様々な姿勢の影響を考慮したりする必要があり難易度が上がるため、よりシンプルな顔認証で識別に挑戦していきます。馬の顔認証というと難しそうなイメージがありますが、サケ(!)で顔認証をやっている人もいるくらいなのできっと大丈夫なはず。

1回の記事に収めると長くなるので3回に分けて書いていきたいと思います。

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

顔検出

人間の顔検出器に関しては学習済みのモデルがいろいろと公開されていますが、馬の顔検出器は見つからなさそうなので自分で作ることにします。下記の図のように、学習の前に正解ラベル付きデータを準備する必要があります。馬の顔検出モデル作成に必要なデータは、馬が写っている画像とそのどこに顔があるかという情報(いわゆるバウンディングボックスの位置)です。とりあえずこれを1,000データほど集めることを目指します。

f:id:unifa_tech:20190124212728j:plain
物体検出モデル作成の流れ

まず、ChromeDriverを使うことで一度にたくさんの画像をスクレイピングできるGoogle Images Downloadを用いて馬が写っている画像を収集します。キーワードをいくつか変えてスクリプトを走らせることで延べ1,500枚ほどの画像が集まりました。

f:id:unifa_tech:20190124224516j:plain:w300:left 次にクレンジングとして、md5の値をチェックして重複画像を省くことで1,250枚に、続いてざっと画像を閲覧しながら馬の顔が写っていないものを削除することで750枚が残りました。これらの画像にLabelImgを使って馬の顔の部分を囲っていきます(左図)。一つの画像に複数の顔が写っていることもあるため、合計で1,193個のラベル付きデータが得られました。

RetinaNetの学習

物体検出の学習のベースとなるモデルとしてRetinaNetを使用します。物体検出の方法は大きく分けてスピード重視のOne Stage系と精度重視のTwo Stage系に分けられます。RetinaNetはOne Stage系でありながらTwo Stage系の良いところを取り入れてスピードと精度の両立を実現したモデルです。実装はKeras RetinaNetを参考に行います。1,193個のデータのうち、約10%の120個をバリデーションデータとし、残りの1073個を学習データとします。RetinaNetのバックボーンはCOCOデータセットで学習済みのResNet50を使用します。バックボーンは重みを固定し、それ以外の部分の重みを学習によって更新させていきました。

f:id:unifa_tech:20190124212823j:plainf:id:unifa_tech:20190124212813j:plain
学習の様子。左:学習時の損失(≒誤差)、右:バリデーションデータでの精度

50エポック学習をまわして損失は順調に下がっていますが、右側のグラフを見ると10エポック以降は過学習になっている感じです。最も汎化性能が良さそうな10エポック終了時点でのモデルを使い、学習に使用していないテストデータに対して顔検出を行った結果の例が下記です。ちゃんと馬の顔検出ができているようですね。データ数が少ないこともあり、時々検出できなかったりしっぽの部分を顔と誤認識したりすることもありますが、趣味用途なので目をつぶりましょう。

f:id:unifa_tech:20190125085435p:plainf:id:unifa_tech:20190125085430p:plain

次回は検出した顔の部分を切り出して識別を行うための分類器を作ります。

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

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

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