記事一覧

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

OpenCVとCaffeを使用したディープラーニングによるアニメキャラクターの識別


今回はOpenCVとCaffeを使用したディープラーニングでアニメキャラクターを識別してみました。


制作物

「ポケットモンスターX&YZ」(以下ポケモン)に登場する「サトシ」「セレナ」「シトロン」「ユリーカ」「ピカチュウ」を識別する識別器を制作しました。
実際に識別させた際に、識別したキャラクター名、そのキャラクターの識別率、2番目3番目に高い識別率のキャラクター名と識別率の描画もさせました。

図4




開発環境

OS:Ubuntu14.04
CPU:Core i7-4790K
GPU:AMD Radeon R9 M295X 4GB
メモリ:32GB



教師画像の収集

識別対象である「サトシ」「セレナ」「シトロン」「ユリーカ」「ピカチュウ」の画像を収集します。
手作業で収集すると、あまりにも時間がかかってしまうので、OpenCVのカスケードファイル(分類器)を使って自動化させました。
「ピカチュウ」を検出するカスケードファイルは前回作成しましたが、その他の主要キャラクターを検出するカスケードファイルはありませんので、OpenCVによるアニメ顔検出ならlbpcascade_animeface.xml様から人物を検出するカスケードファイルをお借りしました。

具体的な流れはこちら。
①保存してあるポケモンの動画を読み込む
②30フレームごと*1に画像として読み取る
図1

③人物又はピカチュウの顔と思われるものを抽出
図2

④その部分を切り取り、ファイル名を連番で保存
図3

*1 1フレームごとだと同じような顔が抽出されると判断したので今回は30フレームごととしました

上記の流れを実現した教師画像収集用プログラムがこちら。

ポケモンの動画を指定したフォルダに保存しておけば、ここまでの一連の作業を全て自動でやってくれます。

今回私は21個の動画を保存し、プログラムを実行し就寝しました。
起きた時には終わっており13,875枚の画像の抽出、保存に成功していました。



画像の正規化

保存した画像には下記のように明るさが様々なものが存在します。

図5  図6

明るいセレナちゃんもいれば暗いセレナちゃんもいるのです。
この画像ごとの明度のムラを改善し、処理速度の向上を図ります。

今回はImageMagickを使用します。
画像が保存されているディレクトリに移動し、下記のコマンドをコマンドラインで実行します。

実行すると同じような明度になり、ムラが改善されます。

図7  図8



画像の仕分け

集めた画像は今の段階では全てのキャラクターがごちゃ混ぜに入っているだけではなく、全く関係のない画像も抽出、保存されています。
これを各キャラクター+その他の6つのフォルダに仕分けて保存します。
ここで言う各キャラクターの画像がポジティブ画像、その他の画像がネガティブ画像になります。

これもドラッグ&ドロップでひたすらフォルダに仕分けるのは時間がかかります。
かと言って、人間の目で仕分けなければいけない以上、完全な自動化は難しいです。
そこで仕分けを容易にできる簡単なソフトウェアを作りました。

下記がソフトウェアの実行画面になります。

img57.jpg

左側に現在選択中の画像、右側に次選択される画像が表示されます。
キャラクターごとに割り当てられた数字をキーボードから入力するとそれぞれのフォルダに保存されていきます。(サトシ=1, セレナ=2, シトロン=3, ユリーカ=4, その他=0, 戻る=z, 終了=q)

音ゲー感覚で仕分けられてかなり効率よく仕分けることができました。
次の次に選択される画像も表示させればさらに良いかもしれませんね。

一応仕分けソフトのソースコードも貼っておきます。

最終的に下記のように仕分けすることができました。
図9

今回は全ての人の顔と思われるもの、ピカチュウと思われるもの全てを抽出したので、通りすがりの人など関係ない人も抽出対象となりました。その結果、その他が最も多い結果となりました。
最も少ないシトロンですが、おそらくメガネをかけていることが原因で認識し辛かったのだと思われます。



LevelDBデータセットの作成

Caffeで画像を読み込めるようにするためLevelDBに変換します。
LevelDBへの変換スクリプトはSIG2D様のスクリプトをお借りしました。

各画像が入っているフォルダが保存されているディレクトリ(下記の場所)で上記のスクリプトを実行します。
deep.png

実行すると「cifar10_train_leveldb」「cifar_test_leveldb」の2種類のフォルダが生成されます。



平均画像の生成

データに偏りがあると学習の妨げになります。
その分散をならすため、平均画像を生成します。

まず先ほどの「cifar10_train_leveldb」と「cifar10_test_leveldb」の2種類のフォルダを
に移動しておきます。

caffeディレクトリで
とすれば収集した画像から平均画像を生成します。

ちなみに
とすればcaffeの例画像の平均画像がダウンロードできます。



学習器のカスタマイズ

自分の環境に合わせて学習器を最適な設定にします。

「cifar10_quick_train_test.prototxt」と「cifar10_quick.prototxt」のipレイヤーのnum_outputを画像の種類数に応じて変更します。
今回は「サトシ」「セレナ」「シトロン」「ユリーカ」「ピカチュウ」「その他」の6種類なので6に変更します。

さらに「cifar10_quick_train_test.prototxt」のcifarレイヤーのsorceファイル名を~lmdbから~leveldbに書き換え、backendの欄もLMDBからLEVELDBに書き換える。

最後に「cifar10_quick_solver.prototxt」を設定します。
今回は下記のように設定しました。

下記の設定を

次のように設定します。

各設定の意味を記載しておきます。
test_iter
1回の評価を行うために使用するイテレーション数

base_lr
一度に進ませる学習レート

max_iter
学習を行うイテレーション数

snapshot
学習結界を出力する頻度

solver_mode
学習にCPUを使うかGPUを使うか。GPUを使ったほうが遥かに速いですが、NVIDIA社製のGPUでしかできないようなので、今回はCPUを指定しました。



学習の実行

ここまできたら準備完了。実際に学習させてみます。

caffeディレクトリ内で
を実行します。

実行するとターミナルに学習の経過が表示されていきます。

学習器の各種設定が読み込まれて・・・
image20 のコピー

実際に学習が始まります。
image20 のコピー 2



学習結果

学習のログは/tmp フォルダに入っているのでそれをgnuplotを使用しプロットしました。
image21.png

x軸が学習のイテレーション数、y1軸がloss数、y2軸が精度としました。
イテレーション数が増えるにつれてロスが低減しており、学習が進むにつれて精度が上がっていることがわかりますね。



実際に識別してみる

ポケットモンスターの動画を読み込ませて実際に識別させてみます。
動画を読み込み、識別、出力をさせるプログラムを作成します。

下記の流れをプログラムで実現します。
①OpenCVで1フレームずつ動画を読み込む
②人の顔又はピカチュウの顔と思われるものをOpenCVの分類器で検出する。
③検出した画像をCaffeの学習モデルで「サトシ」「セレナ」「シトロン」「ユリーカ」「ピカチュウ」「その他」に識別する。
④「その他」以外であれば、顔の周りに矩形画像を描画する。
⑤矩形画像の上にキャラクターの名前、そのキャラクターである確率を描画し、矩形画像の下に2番目と3番目に高い確率の名前と確立を描画する。
⑥描画された画像を元にOpenCVで動画を作成する。

上記を実現したソースコードがこちら。

そしてプログラムを実行し識別させた結果がこちら。


動画を見ると教師画像が豊富だったセレナが最も誤識別が無く、反対に教師画像が最も不足していたシトロンは誤識別が目立つように思います。
さらに訓練時100%近かった精度ですが、未知のデータ(今回は動画)でテストした時それ以上に誤識別が目立ちましたので、ちょっと過学習気味だったのかもしれません。

改善策として学習器の設定をもう少しいじったり、教師画像の質や量を上げればさらに分類器の精度を向上できると思います。
質の面では画質の良いものを使う、量の面ではアフィン変換やボケやノイズを加えてバリエーションを増やすことが挙げられます。

それでも思ったよりは識別率が良かったので個人的にはこれはこれで満足しています。



最後に

今回はOpenCVとCaffeを使ってアニメのキャラクターを識別させてみました。
ディープラーニングを試せば試すほどディープラーニングの今後の動向が気になります。
機械学習はどこまで進化するのでしょうか、楽しみですね。

その他何か質問や、誤字脱字等ありましたらコメントでお願い致します。

スポンサーサイト

コメント

コメントの投稿

非公開コメント

プロフィール

むらりん

Author:むらりん
学部3年
ピカチュウLOVE

「将来絶対ハゲるよねw」とよく言われます。

累計閲覧者数

最新の人工知能関連のツイート

メールフォーム

名前:
メール:
件名:
本文:

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。