【Aidemy成果物】嵐のメンバーの画像認識アプリを作ってみた!

私は今、Aidemy Premium Planという、未経験者が3か月で機械学習、ディープラーニング、データ分析、AIアプリ開発まで最先端技術を幅広く学べるオンライン学習サービスで勉強しています。

そして、AIアプリ開発コースにおいて、成果物として画像認識アプリの自主制作に取り組んでいます。

私が製作しているアプリは、『嵐のメンバーでいうと誰似?』というアプリです。顔画像をアップロードすると、嵐のメンバーで最も似ているメンバーを教えてくれるというアプリです。

と〜げ

完成品は、Herokuで公開しています(http://arashiapp.herokuapp.com/読み込みに時間かかります

製作の大きな流れはこんな感じ。

  • 学習用の画像の収集
  • 嵐メンバーの学習
  • Flaskでアプリ作成

今回は、Aidemyの成果物として製作した『嵐のメンバーでいうと誰似?』のアプリ製作の流れを紹介します。

と〜げ

初心者がはじめて作ったものなので、改善すべきところはたくさんあることをご了承ください。私と同じような初心者の参考になればと思います。

※書いているうちに誰に向けて書いているのかわからなくなっていきました。読みづらいでしょうがお我慢を!いつかリライトします。

学習用の画像の収集

画像収集方法

嵐のメンバー(櫻井翔、二宮和也、松本潤、相葉雅紀、大野智)の顔画像を収集します。方法としては以下2つ。

  • Bing Image Search APIを使って収集
  • 嵐の動画をスクリーンショットして収集

Bing Image Search APIは、Microsoft Azureに登録して使います。詳しくはこちらの記事(関連記事【Bing Image Search API v7】学習用の画像を収集してみた!)にまとめています。

メンバー1人につき750枚くらいの画像を取得できます。でも、すべての画像が顔画像ではないので、実質350枚くらいです。

Bing Image Search APIだけでは、十分な数ではないので、嵐のYoutube動画からスクリーンショットで350枚ほど取得します。CMのメイキング動画が、画質も良く、正面の顔も多くて、スクリーンショットしやすいのでおすすめです。嵐のような国民的スターは各メンバー単体でCMに出演しているので動画はたくさんありました。

スクリーンショットでも300 ~ 350枚ほど取得しました。

顔検出

学習用の画像を収集しましたが、顔部分以外も写っている画像もあるので、顔部分だけの画像にしてやる必要があります。このように全身の画像を、顔部分の画像にする処理を行います。

OpenCVというライブラリを使って顔検出をして、顔部分だけの画像を生成します。また、64 x 64にリサイズします。その方法についてはこちらの記事(関連記事OpenCVのカスケード分類器で顔検出をしてみた!)にまとめました。

こんな感じで顔部分だけの画像にできました。

うまく顔検出できなかった画像もあり、結果として、各メンバーに付き、600枚ほどの顔画像となりました。

画像の水増し

学習用の画像は、各メンバーに付き1000枚はほしいと思っていたので、600枚では足りません。なので、画像の左右反転をして水増しを行いました。

水増しをした結果、以下の画像数を得ました。とりあえず、1000枚を超えたのでOKとしましょう。

  • 櫻井翔 :1198枚
  • 二宮和也:1278枚
  • 松本潤 :1270枚
  • 相葉雅紀:1308枚
  • 大野智 :1151枚

水増しについては、こちらのサイト(参考サイト機械学習のデータセット画像枚数を増やす方法)が参考になりそうです。今度水増しするときはこのサイトの方法を参考にしてみようかと思います。

嵐メンバーの学習

学習モデル作成

では、嵐のメンバー5人の5分類のモデルを作成します。

VGG16モデルを使って転移学習します。VGG以降のモデルは256層の全結合モデルと結合します。modelの16層目までをVGGモデルとします。Flaskのアプリで使うため、モデルの保存もします。

また、学習はGoogle ColaboratoryのGPU環境で行いました。Google Colaboratoryは、Jupyter Notebookをベースとした、Googleの仮想マシン上で動くPython実行環境です。無料で、Googleアカウントさえあれば、すぐにコードを実行することができます。学習に使用する画像はGoogle Driveに保存して、Driveをマウントして読み込みます。

Google Colaboratoryを使用には、これらサイトを参考にしました。参考サイト1Google Colaboratoryの無料GPU環境を使ってみた参考サイト2COLABORATORYとGOOGLE ドライブをマウントする方法

と〜げ

Google ColaboratoryのGPU環境は、めっちゃはやいです!学習には絶対使うべきだと思います。

コードは以下。

学習結果

こちらが、トレインデータ(acc)の正解率、テストデータ(val_acc)の正解率の学習経過です。epochは50です。正解率は以下値くらいに収束しています。

  • 訓練データ(acc)の正解率     :0.99
  • テストデータ(val_acc)の正解率:0.92

今回は、アプリ作成までの一連の流れを完成させることが目的だったため、テストデータの正解率が80%を越えればOKくらいの気持ちでした。なので、テストデータ(val_acc)の正解率:0.92は思ったり良い値でした。

さらに、正解率を高くするには、トレインデータをより多くしてモデルをより汎化するべきかと思います。画像の水増しをもう少ししてみるといいでしょう。また、VGG以外の転移学習も試してみるとか。

と〜げ

後日、分類に失敗した画像についてなぜ失敗したのかを考えてみました。こちらの記事(【Aidemy成果物】画像分類モデルの分類失敗の原因とは?)で紹介しています。

Flaskでアプリ作成

では、学習結果を使って、Flaskでアプリという形にしていきます。

以下のようなディレクトリ構造でファイルを用意します。

  • arashi_flask.py
  • haarcascade_frontalface_alt.xml(カスケードファイル)
  • model.h5(保存した学習モデル)
  • フォルダ:static
    • stylesheet.css
  • フォルダ:templates
    • index.html

まず、arashi_flask.pyのコードは以下。アップロードした画像を顔部分画像にして、学習済みモデルを適用しています。

index.htmlは以下。

<!DOCTYPE html>
<html lang=”ja”>
<head>
<metacharset=”UTF-8″>
<metaname=”viewport”content=”width=device-width, initial-scale=1.0″>
<metahttp-equiv=”X-UA-Compatible”content=”ie=edge”>
<title>嵐いうと誰似?</title>
<linkrel=”stylesheet”href=”./static/stylesheet.css”>
</head>
<body>
<header>
<imgclass=”header_img”src=”https://aidemy.net/logo-white.8748c46e.svg”alt=”Aidemy”>
<aclass=”header-logo”href=”#”>嵐でいうと誰似?</a>
</header>
<divclass=”main”>
<h2>送信された画像が嵐のメンバーでいうと誰に似ているかを教えます</h2>
<p>正面の顔が写った画像を送信してください</p>
<formmethod=”POST”enctype=”multipart/form-data”>
<inputclass=”file_choose”type=”file”name=”file”>
<inputclass=”btn”value=”submit!”type=”submit”>
</form>
<p>{{message}}</p>
<imgclass=”img_upload”src=”{{img_path}}”>
<pclass=”answer”>{{answer}}</p>
</div>
<!– <footer>
<p>&copy; 2019 Aidemy, inc.</p>
</footer> –>
</body>
</html>

stylesheet.cssは以下。

見た目はこんな感じです。

デザインなど改良の余地はめちゃくちゃありますが、とりあえず、今回は最低限のレベルということでOKとします。

と〜げ

後日、デザインを修正しました。少しはマシになったかと。。。アプリへ

アプリを使ってみる

嵐メンバー

では、アプリを使ってみましょう。『ファイル選択』から画像を選択して、『submit』します。ここでは、大野君の画像をアップロードすると、「大野智 似です」と表示されます。

model.predictの結果は、以下。左から、[櫻井, 二宮, 松本, 相葉, 大野]。

[7.4453908e-11 4.1521353e-10 6.1165552e-11 1.9962483e-10 1.0000000e+00]

本人なので、大野君の値が1となっていて圧倒的に大野君になっています。

もし、顔検出が出来なかった場合、以下のように表示されます。

似ている芸能人

次に、嵐のメンバーに似ていると言われている芸能人で試してみます。こちらのサイト(【嵐】似ている芸能人のまとめ【ももクロZ】)を参考にしました。

これら芸能人画像をアプリに適用した結果は以下。

二宮和也似の芸能人

  • 仲里依紗:櫻井翔

    [櫻井 二宮 松本 相葉 大野] =[0.5107762  0.01505077 0.13981612 0.313571   0.02078576]

  • 松山ケンイチ:相葉雅紀
    [櫻井 二宮 松本 相葉 大野]
    =[0.00303103 0.00627475 0.2531969  0.73511577 0.00238156]

大野智似の芸能人

  • 堂本光一:櫻井翔

    [櫻井 二宮 松本 相葉 大野] =[5.8953154e-01 4.4004153e-04 4.0801790e-01 1.2503696e-03 7.6013181e-04]

相葉雅紀似の芸能人

  • 酒井学:相葉雅紀

    [櫻井 二宮 松本 相葉 大野] =[1.7485344e-07 7.9392179e-05 1.8631461e-06 9.9991310e-01 5.4307243e-06]

  • 城みちる:相葉雅紀

    [櫻井 二宮 松本 相葉 大野] =[7.0883907e-05 1.2234449e-04 3.6961914e-03 9.9595803e-01 1.5261795e-04]

松本潤似の芸能人

  • 水嶋ヒロ:松本潤

    [櫻井 二宮 松本 相葉 大野] =[9.5253235e-05 6.4770742e-05 9.9957150e-01 1.5181383e-04 1.1666931e-04]

  • さかなクン:大野智
    [櫻井 二宮 松本 相葉 大野] =[0.22862583 0.23267555 0.11417166 0.11142252 0.31310448]

 全体的には、似ていると言われる芸能人とアプリの結果はあまり一致しませんでした。

しかし、相葉君に似ていると言われる酒井学と城みちるは、アプリの結果と一致します。また、mode.predictの結果もほぼ1という結果でした。相葉君って、嵐のメンバーの中では少し特徴的な顔立ちなので、認識しやすいのかなと思います。

と〜げ

ちなみに、私の顔は、大野智似でした。

[櫻井 二宮 松本 相葉 大野]=[0.00920011 0.05016714 0.00840535 0.07149067 0.8607368 ]

アプリ完成までの道のりとかかった時間

最後に、未経験の私がどのような道のりで、このアプリを完成させたかを簡単に紹介しときます。

Aidemy Premium PlanのAIアプリ開発コースで、python、numpy 、機械学習などのカリキュラムを68時間ほど受講した後に、画像認識アプリの製作に取り掛かりました。

アプリ製作にかかった時間は、47.5時間です。日数は10日間です。内訳はこんな感じ。

  • 画像収集:27.53時間
    • 画像収集:17.86時間
    • 顔検出:4.77時間
    • 水増し:4.9時間
  • 学習:12,97時間
    • モデル作成:10.67時間
    • Google環境構築:2.3時間
  • Flaskアプリ製作:6.97時間

※この他にブログを書くのに7時間ほど使っています。

画像収集に一番時間がかかるとチューターの方に言われていました。結果はその通りで、製作時間の半分以上が、画像収集でした。基本的にこちらのサイト(参考サイトKerasでアニメ 「けいおん!」を画像認識させてみた)を参考に製作しました。

と〜げ

未経験の状態から、25日間、学習時間115時間で、一応、アプリを作成できました。めでたし。めでたし。

1 COMMENT

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です