Python 画像認識:機械学習AI(自作サンプル)でラブライブ虹ヶ咲キャラを顔認識【OpenCV,Keras,ディープラーニング,ラズパイ】

前回、前々回に続き、AI(機械学習、ディープラーニング)プログラミングの記事です。これまで、開発工数を見積もりする予測AIについて記してきましたが、中々堅い話だったかなと。

次は、趣味全開でいきます!
今回ご紹介するAIは「アニメキャラの顔認識AI」です!

AIで人物、キャラクターの画像認識や、顔検出したりする記事はよく見かけますね。自分が一番面白いと思ったものは、アイドル(3次元)の顔検出を行うAIプログラムですね。

機械学習で乃木坂46を顏分類してみた - Aidemy Blog

顔のあたりを赤い四角で囲って人物名を併記するものです。これを自分の好きなアイドル(2次元)でやってみたい!というわけで、↑で公開されているプログラムを参考に、Raspberry Pi上でAIプログラム(Pythonサンプル)を作ってみました。

顔認識するアイドルキャラは、本ブログでも度々取り上げてるラブライブ!のスクールアイドルです!

AIプログラム概要


ラブライブ!のソーシャルゲーム「スクールアイドルフェスティバル ALL STARS」、通称「スクスタ」に登場するスクールアイドルの顔を学習させ、ゲーム画像(スクリーンショット)中から彼女たちの顔を検出、キャラ名を表示するAI(Python)プログラムです。


スクールアイドルフェスティバル ALL STARS ゲーム画像

スクスタのプレイヤーの方には言うまでもないですが、このゲームにはμ's、Aqours、虹ヶ咲学園スクールアイドル同好会という、3つのスクールアイドルグループが登場します。それぞれ9人の神レベルで可愛いメンバーが所属しており、合計27人!

全員の顔を検出できれば完璧ですが、さすがにそこまでに必要な学習データを集めるのは、骨が折れるのでまずは3人に絞ってやってみます。

今回の3人は、ゲームの中心となる虹ヶ咲から以下のメンバーを選びました!理由は自分の虹ヶ咲推しトップ3だから(笑)

・上原歩夢
・中須かすみ
・優木せつ菜

ちなみに、ラブライブ!の顔認識ネタでは、既に取り組まれていた方がいらっしゃいます。画像認識ライブラリであるOpenCVを使ったアニメ顔検出のやり方など参考になります。

Deep Learningでラブライブ!キャラを識別する - christinaの備忘録

深層学習でラブライブサンシャインのキャラクター顔認識をしてみた part1(学習データの作成) - MSBOOKS


本記事で公開しているプログラムも、PythonやOpenCVを用いますが、AIのモデルについては、以下の仕様としています。

・機械学習ライブラリとして、Kerasを使用
・CIFAR-10 画像データセット向けのAIモデル(9層畳み込みネットワーク)を使用


プログラム開発環境等の詳細を以下に記します。

開発環境


■ハードウェア

Raspberry Pi 3 Model B


■OS

Raspbian GNU/Linux 9.11 (stretch)


■プログラミング言語、主なライブラリとバージョン

・Python 2.7.13 ※Python3系では3.5.3で動作確認できています。
・OpenCV 2.4.9.1
・Keras 2.1.5
・numpy 1.12.1
・theano 1.0.1
・matplotlib 2.0.0


Raspberry Pi でAI環境を開発する際には、↓の書籍が参考になります。


プログラム


GitHubにサンプルプログラムを公開します。

https://github.com/kotetsu99/animeface_recognition


■顔認識の大まかな流れ

(1) 各キャラが映っているゲーム画像(スクリーンショット)をそれぞれ10枚以上用意

(2) 画像処理ライブラリOpenCVを用いて、顔画像を抽出

(3) 抽出した顔画像をAI(Keras)に学習

(4) テスト画像に対して、OpenCVで顔画像を抽出

(5) (4)の顔画像に対しAIでキャラを識別

(6) (5)の結果をテスト画像に表記


■各プログラムの概要

(1) 01-face_detection.py: 顔検出プログラム
・ゲーム画像からキャラの顔を検出して、顔画像ファイルをディレクトリに保存。

(2) 02-cnn_face_train.py: 顔学習プログラム
・(1)で生成した顔画像をAIに学習させ、予測モデルを生成。

(3) 03-cnn_face_recognition.py: 顔認識プログラム
・(2)で生成した予測モデルを使って、テスト画像に対して顔認識を実行。

(4) lbpcascade_animeface.xml: アニメ顔検出 カスケード分類器
・(1)(3)のプログラムで使用。以下のサイトで公開されているものをお借りしました。スクスタのCG顔にもちゃんと反応してくれましたね。すごい。
OpenCVによるアニメ顔検出ならlbpcascade_animeface.xml - デー

(5) dataset: 画像データセット保存ディレクトリ
・01-org: 学習に使用するゲーム画像(スクリーンショット)ファイル保存先
・02-face: 01-orgから検出した顔画像ファイル保存先
・03-test: 顔認識テストに使用するゲーム画像(スクリーンショット)ファイル保存先
・04-rec: 03-test配下の画像に対する顔認識結果の画像ファイル保存先

(6) model: 予測モデル保存ディレクトリ

プログラム使用方法


(1)データセットの準備

キャラの映ったゲーム画像(スクリーンショット)を以下のフォルダに保存します。

・dataset/01-org/Ayumu   →上原歩夢の画像を複数保存
・dataset/01-org/Kasumi   →中須かすみの画像を複数保存
・dataset/01-org/Setsuna  →優木せつ菜の画像を複数保存

画像は↓のように、キャラ一人が映ってるスクリーンショットがいいかなと。


スクールアイドルフェスティバル ALL STARS ゲーム画像

(2)顔検出プログラムを実行

以下のコマンドを実行します。

$ python 01-face_detection.py

先ほどのdataset/01-org 配下の画像から、dataset/02-face 配下にある以下のサブディレクトリに、検出された顔画像が保存されます。

・dataset/02-face/Ayumu   →上原歩夢の顔画像
・dataset/02-face/Kasumi   →中須かすみの顔画像
・dataset/02-face/Setsuna  →優木せつ菜の顔画像

face配下のサブディレクトリはキャラクター名とします。このディレクトリ名は、AIで定義される顔ラベルとしてそのまま使用されます。


(3)顔学習プログラムの実行

以下のコマンドを実行します。

$ python 02-cnn_face_train.py model/face_model.h5

dataset/02-face 配下にある顔画像を学習し、顔予測モデル(face_model.h5)を生成します。マシンのスペックによりますが、学習時間がかなりかかります。以下のように、バックグラウンド実行することをおすすめします。

$ nohup python 02-cnn_face_train.py model/face_model.h5 &

バックグラウンドで画像学習処理が進みます。進捗状況は、nohup.outファイルに出力されるので、以下のコマンドで確認できます。

$ tail -f nohup.out

学習終了後、予測モデルの学習過程(損失関数の推移)を記した、以下のグラフ図ファイルが出力されます。

・cnn_face_train_figure.png


(4)テストデータセットの準備

顔認識させたいキャラが映ったテスト用のゲーム画像(スクリーンショット)を以下のフォルダに格納。

・dataset/03-test
→上原歩夢、中須かすみ、優木せつ菜が映っている画像を保存


(5)顔認識プログラムの実行

以下のコマンドを実行します。

$ python 03-cnn_face_recognition.py model/face_model.h5

dataset/03-test 配下にある画像に対し、顔予測モデルを使用して顔認識を実行します。
顔認識結果は以下のフォルダに保存されます。

・dataset/04-rec


実行結果


テスト画像に対する、顔認識結果を示します。テスト画像は、3人でプレイしたMV (NO EXIT ORION)の一場面です。



見事に3人の顔を認識できていますね!

場面によっては、顔検出サイズを変更したり、学習させるスクリーンショット画像およびAIのトレーニング回数を増やさないと、見落としや誤認識がでるかもしれませんが、初めにしてはいい感触です。

今回は、3人ですが各キャラの画像ファイルと対応するディレクトリを

dataset/01-org/Ayumu
dataset/01-org/Kasumi
dataset/01-org/Setsuna
dataset/01-org/Karin
dataset/01-org/Ai
dataset/01-org/Shizuku
dataset/01-org/Kanata
dataset/01-org/Ema
dataset/01-org/Rina
・・・

という感じに、増やせば、9人でも27人でも識別できるようになると思います。
かなり根気がいると思いますが、いずれやってみたいなと。

GitHubにあげたプログラムの解説は以下に記しています。
https://nine-num-98.blogspot.com/2019/12/ai-lovelive-02.html

【2020/12/24 追記】アニメ版の虹ヶ咲メンバーで本AIを試してみました。
https://nine-num-98.blogspot.com/2020/12/anigasaki-ai-01.html

ご参考になれば幸いです。

スポンサーリンク