CNNでキルミーベイベーのアレをそこそこの精度で予測する

はい、昨日から徹夜でDeep Learningで遊んでおります。

YouTubeでNNC (Neural Network Console) の実践動画を見ていくうちに「これ、アレいけるんじゃないか?」と思い立ってやってみたのが今回の企画です。

キルミーベイベーの「アレ」とは?

機械学習にある程度理解があってなおかつアニメファンという極端に狭い範囲の層の方ならもしかしたら知っているかもしれませんが、その昔、円盤(BD1巻)が686枚しか売れなかったキルミーベイベーというアニメがありました。

で、公式がそれをネタにしてそれと同じ枚数のTwitterアイコンをWebで公開しました。それが、以下です。

これが

  • そこそこの量のまとまった画像データであること
  • 一部を除いて登場人物の顔写真であること
  • いい感じにカテゴリ分けできそうなこと
  • これら全ての画像が128px四方でデータ加工の必要がないこと

といった諸々の要素が一部の技術者にウケて、度々機械学習の格好のネタになっていたのです。

私もまだDeep Learning周りの知識が浅かった時期にこの画像判別に取り組んだことがあったのですがロクな精度にならず断念していたため、せっかくなのでこの機会にリベンジしようと思いました。

データ収集

このサイトから一つひとつ手作業でDLしていてはお話にならないのでChromeの拡張機能のImage DownloaderというのをEdgeに入れて落としました。

ラベル付け

手動です。

やすな、ソーニャ、やすな&ソーニャ、あぎり、没キャラ(という名前のキャラだそうです)、それ以外という6つに分けました。それぞれ適当な半角英数のサブフォルダを切って、そこに突っ込みます。

当然データ数もそれによってまちまちで、私の場合、

やすな336
ソーニャ178
やすな&ソーニャ41
あぎり42
没キャラ10
それ以外79

になりました。

CSV作成

NNCは規定の形式のCSVファイルでないとデータを読み取ってくれないので、それを作ります。

それぞれ以下のように変更しました。

Source Dirカテゴリ分けした画像ディレクトリ
Output DirCSVを出力するディレクトリ
Output Width128
Output Height128
Output File 1ファイル名は適当、Ratioは90
Output File 2ファイル名は適当、Ratioは10

Output Dirに画像データの焼き直しと2つのCSVファイルが自動で生成されます。

プロジェクト作成

ニューラルネットワークをキビキビ作ります。

CNNはLeNetをベースとして手を入れました。

畳み込みユニット

畳み込みは使い回すのでユニット化します。ConvUnitという名前で新規Networkを作ります。

引数ConvMapsはConvolutionのOutMapsにバインドします。OutMapsのパラメータを *ConvMaps にすればOKです。デフォルトはPIntの16。

Main

全体図です。

最初のImageAugmentationは画像の水増しをやってます。パラメータは以下の通り。

倍率を1~1.5倍、アス比を1.3倍、左右逆転。これらを、恐らくランダムにかけているんではないかと思います。定かじゃなくてすみません。

水増ししたら畳み込みを3回やって、Affine→ReLUを2回、Sofmaxにかけて、多クラス交差エントロピーで評価。

CUDAとはいえ8年前のマシンではこれくらいが限界ですね。。。

結 果 発 表

Accuracy: 0.8840

想像以上の大健闘。

ちなみにラベルですが、最も精度の良かった3と4がソーニャとやすな、次点の0と5があぎりとやすな&ソーニャ、精度60%の2がそれ以外で、1は没キャラでした。データが少なすぎて評価データに入ってませんでしたね、すみません。

とまぁこんな感じで、データ集めの大変さ、要求HWスペックの高さは依然として課題かなと思うところですが、それでも聞いてやってみるとDeep Learningってこんな簡単にできるものなのかとちょっとびっくりしました。

今後はもっと実用的な取り組みができたらなと思います。

参考サイト

コメントを残す

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