ユニファ開発者ブログスマートフォン用の表示で見るユニファ開発者ブログユニファ株式会社システム開発部メンバーによるブログです。AIR&Dエンジニアの浅野です。息子が乗馬を習っていてレッスンや試合の様子を見る機会があります。馬にはそれぞれクセや個性があり、それを理解しながら見ると「あ、気持ちが高ぶっている馬をよくコントロールしてるな」とか「あそこで左に逃げないように工夫してるな」など奥深さを感じて楽しみが倍増します。そのため誰がどの馬に乗っているのかをその場で知りたいことがよくあるのですが、素人には馬を見分けるのが非常に難しいです。そこで今回は画像分類で大きな力を発揮する深層学習を使って馬を識別してみたいと思います。指導者や経験豊富な人が見分けるときは全身をみて判断しているのですが、全身を対象にすると鞍やゼッケン、騎乗者などの影響を取り除くためにセグメンテーションを行ったり、様々な姿勢の影響を考慮したりする必要があり難易度が上がるため、よりシンプルな顔認証で識別に挑戦していきます。馬の顔認証というと難しそうなイメージがありますが、牛やサケ(!)で顔認証をやっている人もいるくらいなのできっと大丈夫なはず。1回の記事に収めると長くなるので3回に分けて書いていきたいと思います。人間の顔検出器に関しては学習済みのモデルがいろいろと公開されていますが、馬の顔検出器は見つからなさそうなので自分で作ることにします。下記の図のように、学習の前に正解ラベル付きデータを準備する必要があります。馬の顔検出モデル作成に必要なデータは、馬が写っている画像とそのどこに顔があるかという情報(いわゆるバウンディングボックスの位置)です。これを1,000データほど集めることを目指します。Downloadを用いて馬が写っている画像を収集します。キーワードをいくつか変えてスクリプトを走らせることで延べ1,500枚ほどの画像が集まりました。次にクレンジングとして、md5の値をチェックして重複画像を省くことで1,250枚に、続いてざっと画像を閲覧しながら馬の顔が写っていないものを削除することで750枚が残りました。これらの画像にLabelImgを使って馬の顔の部分を囲っていきます(左図)。一つの画像に複数の顔が写っていることもあるため、合計で1,193個のラベル付きデータが得られました。物体検出の学習のベースとなるモデルとしてRetinaNetを使用します。Stage系に分けられます。Stage系の良いところを取り入れてスピードと精度の両立を実現したモデルです。RetinaNetを参考に行います。1,193個のデータのうち、約10%の120個をバリデーションデータとし、残りの1073個を学習データとします。RetinaNetのバックボーンはCOCOデータセットで学習済みのResNet50を使用します。バックボーンは重みを固定し、それ以外の部分の重みを学習によって更新させていきました。左:学習時の損失(≒誤差)、右:バリデーションデータでの精度50エポック学習をまわして損失は順調に下がっていますが、右側のグラフを見ると10エポック以降は過学習になっている感じです。汎化性能が良さそうな10エポック終了時点でのモデルを使い、学習に使用していないテストデータに対して顔検出を行った結果の例が下記です。馬の顔検出ができているようですね。データ数が少ないこともあり、時々検出できなかったりしっぽの部分を顔と誤認識したりすることもありますが、趣味用途なので目をつぶりましょう。次回は検出した顔の部分を切り出して識別を行うための分類器を作ります。保育の世界を変えるエンジニア募集中(今回のブログは保育とは全く関係ありませんでしたが)ユニファではテクノロジーで保育を変えていく仲間を大募集中です。iOSエンジニアをやっていますわたなべと申します。現...2019-03-22深層学習で馬を見分ける(その2)R&Dエンジニアの浅野です。前回の記事で写真から馬の顔を検出す...2018-12-28開発者ブログ二周年&2018年人気記事ランキングみなさまこんにちは、赤沼です。学習済みモデルを使って顔画像のクラスタリングを行うお久しぶりになります、iOSエンジニアのしだです。参加レポートiOSエンジニアのしだです。Detection月別アーカイブスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。