次に、作りたいアプリケーションに一歩近づけるため、実際のコスプレ写真を対象に何か機械学習をしてみることにしました。 コスプレ画像といえば Cure WorldCosplay というサービスが有名です。 このサービスを眺めながらとりあえず何かできないか考えてみました。
コスプレ写真に対して作品名やキャラ名などのラベルはついていますが、おそらくデータ量も多くないし、特徴もそんなにはっきり出てくるような気がしません。1 なにか使えないかと調べていたら、どうやらCureにはユーザの国籍別で画像が取得できるというのを発見しました。 これならそこそこたくさんのデータがあるので、コスプレ写真から国籍推定するAIを作ってみようと思いました。
雑なプログラムを書き、日本人 / 中国人 / ブラジル人 のコスプレ画像を取得します。 この3つを選んだ理由は、ブラジル人は明らかに顔が濃いので分類しやすいだろう、日本人と中国人は似ているのでAIも判定が難しいんじゃないか、と予想したからです。 日本人と中国人は6000枚、ブラジル人は3000枚のサムネイル画像をあつめました。
きりぼっと が画像の分類(ごはんの写真を判定)をしているので、どのようにやっているか聞いたところ、Keras をつかって VGG16 から 転移学習 してるという回答が得られました。 ソースコードも公開されていました。 そのようなキーワードでググると、VGG16を転移学習させて「まどか☆マギカ」のキャラを見分ける というQiitaの記事も見つかりました。
転移学習というものを使うと、既存のモデルを派生させて、新たに特定のデータを学習させることができるようです。 具体的に、VGG16は様々な物体を検出できるモデルのようですが、最初の方の層で縦線や横線の検出などの地味な作業をやって、そこで得られた情報から、後の方の層で「様々な物体」の検出を行うようです。 このうち後の方の層だけカスタマイズし、「様々な物体」を「俺が分類したい物体」に置き換えてしまうらしいのです。
2つのコードを見比べながら実装していきます。 最終的にはQiita記事の方のほぼコピペになりました2。 取得できた画像のうち、それぞれ約1000枚を検証用の画像に、残りをトレーニング用の画像にしました。
実際に実行してみると大事件が発生しました。 3分くらいで コンピュータが突然シャットダウン するのです。 ほぼコピペなのでおそらくハードウェア的な問題だろうと推測し、問題の切り分けをします。
まずMemtestを走らせたけど全く問題なし。 次にGPUを使わずCPUだけで学習を回してみました。 ところがこれは、 CPUでの学習があまりに遅く 有効な結果を得られませんでした。GPUだと3分くらいで到達する進捗になかなか到達しないのです。 1時間ほど回しても落ちはしなかったので、GPU原因説の可能性がちょっと高まった程度の評価をしました。
次はGPUですが、GPUは 買い換えると非常に高価 なので、先にGPUと密接に関わる 電源 を交換することにしました。 もともと電源は長く使うとヘタっていくもので、実際に5年くらい使っていたものなので最初から怪しんでいた部分でした。 そもそも何Wの電源を積んでいたかも忘れるくらい長い年月が経っています。 そこで、80 Plus Titanium という最高品質ランクの800W電源3を購入し乗せ替えてみました。 これが大正解だったらしく、3分の壁を突破し、平然と最後まで走りきりました。 とはいえ、学習結果としては全く精度が出ていなかったので、 このあと学習精度を上げるための様々な試みをすることになります。
転移学習が非常に便利なのは理解したのですが、全く知識のない人が転移学習やVGG16という単語に行き着くにはどうしたら良いのでしょう。 そして、VGG16が実際にどんなことをやっているのか、他のモデルとなにが違うのか、画像まわりの学習になら何でも応用できるのか、音声だったら何を使えば良いのか、など、そういった情報はどうやって探せば良いのかわかりません。