顔認識(TensorFlow)でiOSアプリを作ってみた〜真田丸編〜(ShanonAdventCalendar2016・1日目)

このエントリーをはてなブックマークに追加
この記事はShanonAdventCalendar2016・1日目の記事です。

こんにちわ。ishikawaです。
弊社Adventカレンダー1日目の担当になりました。何をやろうか考えた時、この1年妄想の中で育ててきたアプリを実際に形にしてみようと考えました。

機械学習やDeepLearningの知識がゼロな文系出身エンジニアがTensorFlowを使って、これまた業務で触ることのないiOSアプリを一から作っています。

そんな感じなので、技術的な詳しい内容は説明していません。
(代わりに参考にしたサイトのURLを載せておきます)
この記事は軽い気持ちで読み進めて頂ければと思います。



背景

開発中に画面デザインやスタイルで悩んだことありませんか?
デザイナーがいれば、こういった問題は生じないかもしれませんが、既存システムのちょっとした改修だと、エンジニアがデザインも一緒に考えながらなおすという場面があるかもしれません。また自作アプリを作る時も悩みますよね。。

もちろん、開発エンジニアもUI/UXを学ぶ必要があるとは思いますが、デザイナーの経験と知識と感によるところも多く、本業としていない人がやると路頭に迷うことも多いと思います。

私もその一人で、最終的に行き着いたところは
「UIなんてなくなってしまえばいい」これでした(笑)

UIがないと言うと少し語弊がありますが、フォームやボタンのない、音声や画像入出力だけで動作するアプリを作ってみたいと思い、実際に作ってみることにしました。



参考にしたサイト

TensorFlowによるももクロメンバー顔認識
大変、大変お世話になりました(汗)

画像認識をやろうと思い立ち、いざ深層学習やTensorFlowの本を幾つか購入したのですが、数式だらけでさっぱりどうしていいかわからなくなりました。
画像認識のフェーズはとてつもなくハードルが高く、ファーストバージョンとしてはこちらのコードをそのまま真似て作ることにしました。(ありがとうございます!)



題材

画像認識で画像を集めて学習させようとした時、大量に学習データw集める必要があります。参考としたサイトの記事では好きなアイドルの顔画像を集めていました。私もやるなら、自分の好きな人の画像がいいと思い、今はまっているNHK大河ドラマ「真田丸」から以下の出演者たちの画像をWebより収集して学習させることにしました。


好きな登場人物であると同時に、Webの画像検索で枚数を集めやすい人を選びました。
(本人ではなく、その人に関連する人物の方が多く検索に引っかかってしまう人も多かったです。)



アプリの構成

アプリの構成は以下のとおりです。


①携帯のカメラ越しに人物の顔を検出する
②検出した顔画像をサーバに問い合わせする
③サーバからの回答をもとに人物が特定できたら、その人に関連する動画を表示する
(今回は、携帯とサーバの通信をローカル環境(LAN)内の接続で確認しています)


環境

  • OS X El Caption
  • Python 2.7.10
  • Xcode 8.1
  • Swift 3.0



手順

サーバ側

①画像を集める

Webから上記出演者の顔画像を収集します。Pythonスクリプトを作成し、bing画像検索で50枚ずつダウンロードし、5名×500枚程度集めました。

②画像から顔を抽出&選別

収集した画像から、学習データとして顔っぽい部分を抽出(OpenCV使用)します。
画像を回転させて、顔っぽい部分を抽出しますが、抽出結果は本物の顔とそうじゃないものが混ざっているため、その後本人かどうか一つ一つ目で確認しながら選別する必要がありました。選別した結果、それぞれだいたい400枚程度になりました。

③学習(顔画像を訓練)

訓練データとして、3人の画像を半分ずつ(200枚程度)を使用して、ランダムに120枚の画像を取り出し、データを拡張(水増し)を行った上で学習モデルの入力とします。これを2,000ステップほど学習を繰り返しました。

本来なら、最低でも10,000ステップ以上は繰り返さないといけないようですが、学習していった結果、2,000ステップ実行した段階で、精度がある程度出たため学習を打ち切りました。
(合っているのか不安になる、怪しいグラフ・・・)


    携帯アプリ側

    ①カメラを起動&顔を検出
    顔の検出はiOS5から追加されたCIDetector使って行います。顔を検出した際に範囲を四角の赤い枠で囲むようにしました。
    参考:意外に簡単?swiftで動的にカメラ内の顔を検出して処理する(CIDetector)


    ②顔画像をサーバに問い合わせ

    検出した顔画像を使って、サーバに問い合わせします。サーバ側ではすでに学習済みのモデルを使用し、画像判定を行います。

    参考:Swift+PHPでiOSから画像をアップロードする


    ③人物が特定できたらその人物の関連動画を再生(youtubeより)

    サーバから結果が戻り、人物が特定できたら、その人物に関する動画を再生するようにしました。

    信繁(堺雅人さん)なら真田丸のテーマソング、信之(大泉洋さん)なら犬伏のシーンといったように各登場人物の特に印象に残っているシーンを動画再生するようにしました。
    (個人的にテーマソングがお気に入りなので、信繁は特別仕様です)


    作ったもの



    実を言うと、これは何回かやってうまくいったものアップしています。
    というのも、携帯アプリ側の顔検出がうまくいかない場合が多く、顔じゃない部分や不鮮明な画像をサーバに送信してしまっていました。この辺はもっと改良すべき点だと思います。


    感想

    アプリを実際に作ってみて

    画像を入力とした場合、入力範囲がどこまでなのか、何をいつ入力としたのかをユーザに知らせる必要があると強く感じました。顔を認識した時の赤い四角い枠は当初なかったのですが、後から付け加えています。

    フォームやボタンがない場合、そういったユーザが体感するものも意識しながら作る必要があり、また違った形でのインターフェースデザインが必要になってくるんだなと改めて知ることができました。

    これから

    まだまだアプリとしては完成形にはほど遠いですが、妄想していたものを実際に動くものとして実現できたのはとても楽しかったです。自分以外の人に触ってもらえるよう、引き続き、改良を重ねていこうと思っています。

    では、2日目にバトンタッチです〜





    次の記事
    « Prev Post
    前の記事
    Next Post »
    Related Posts Plugin for WordPress, Blogger...