ぺんぎんさんのおうち

日記です。たまに日記じゃないこともあります。

学習し、予測(分類)する---それが機械学習!

海に生き、海を守り、海を往く---それがブルーマーメイド!

ハイスクール・フリート 通称"はいふり"
2016年4月に第一話が放送され, 放送終了後も各動画サイトで再放送されたりOVAが発売されたり, 来年にははいふりのゲームが配信されるなど, <ここにそれっぽい言葉が追加されます>


今回はPythonで使用できるオープンソースソフトウェアであるところのChainerを使ってはいふりキャラクターの判別をやっていきます.
はいふりを見たことがある方はご存知かと思いますが, 本編には30を超える女の子たちが登場します. 流石に全員の分類は骨が折れるので艦橋メンバー(主要キャラ)6人とそれ以外, で分類ということにしました.

先に言い訳をしておきますが機械学習について超詳しいというわけではないので所々おかしな部分があります. 許して.
機械学習Hello WorldであるところのMNISTはおそらく多くの人がやってると思います. が, その後何すりゃええんや??ってなる人も少なくないはずです. 僕もそうでした.
データセットはどうやって作るの..?とか, 公式ドキュメント読んでも何もわからんやないかーいと匙を投げた時期もありました. 需要があるようなら今後少しばかりの解説を加えます.
(僕が解説しなくとも皆さん各自でやったほうが効率いいと思いますが..)

Chainerと機械学習

特に説明はしません. 鉞が飛んでくるのは怖いですし僕はファッション機械学習erなので.

はじまり


ふとはいふりが見たくなって, ただ見るだけではつまらないしやるか〜って感じではじまりました.

下準備

さらっと顔画像集めてるツイートを上記にあげましたが, これはOpenCV(&カスケード認識)を使いました.
[参考] OpenCVによるアニメ顔検出

OpenCVを使えば動画をフレーム毎に処理できるので便利です.
各フレームからキャラクターの顔を思われる部分を切り出して保存しているわけですね.
本編見ながらコード書いて切り出してたらいい感じに1話が終わりました.

次は切り出した画像に対してリサイズしていきます.
画像のサイズは一定ではないのでこのままChainerに与えたら泣かれてしまいます.
100*100にしました.


動画から画像を切り出してリサイズした後は分類したいラベル毎にフォルダを作ってそこに画像を投げていきます(ここが辛い).
今回は艦橋メンバー6人+その他を分類したいので

Others ミケちゃん シロちゃん リンちゃん メイちゃん ココちゃん タマちゃん
img0 img1 img2 img3 img4 img5 img6

こんな感じになります. 1枚1枚確認ドラッグ&ドロップで分けていくのは大変なのでコードを書きました.
0を押したらimg0へ1を押したらimg1へ..のように 画像をプレビューしながら0~6をタイプするだけにしました(それでも3500枚ほどあるのでやばい)


分類後です.
頑張りました. 2時間くらいかかりました.

下準備はこれで終わりです. あとはChainerを使ってネットワークを定義して学習させるだけですがその前におさらいしましょう!!

1. 動画から顔部分を取り出した画像を集める

2. 集めた画像をリサイズ(n*nが理想?)

3. リサイズした画像をラベル毎に分類

とりあえず下準備はこれで終わりです.

データセットの取得

学習させる用の画像はあるけれど, これからどうしよう...?と行き詰まったところである記事に出会いました.
chainerのデータセットの作り方
mnistからデータ取ってきてそれがどのような構造をしているのかを確認する事でChainerに渡すためのデータが作れるようになります.
他の機械学習ライブラリでも同じだと思うので覚えておきましょう(誰目線).

超えられない嵐はないんだよ!!

(ここから超適当になります)
下準備も学習・テスト用のデータセット取得もできたので後は学習させるだけです.
"学習させるだけ" Chainerについての説明は避けてるのでこの一言で片付けています.

させました. 以下結果

この時点で90%程度の精度が出ていました.
なかなか良いですね. (良いのか?) 画像数に結構偏りがあったので(タマちゃんがかなり少ない), 反転画像を追加するなど対策する必要があります.

これからどうしよう

1割誤分類はするものの, 概ねちゃんと学習できています.
さらに精度を上げるには画像データセットを増やしたりパラメータを調整したりする必要があります. パラメータに関しては値を変えては学習し..を繰り返さなければなりませんしなによりCPUで戦うには心もとないです. ですのでデータセット増強を目的としましょう.
次は2話から画像を抽出します. また手作業で分類するのかって?

とんでもない. 私たちには強力な分類器があるじゃないですか.

3500枚もの画像を人力で分けるよりは, 9割の精度でも自動化した方が楽です.
誰しもミスはあるのでちゃんと許してあげましょう. 次から間違えなければ良いんです. 間違えて分類されたものをそのままにしておくと学習に悪縁強を及ぼすので, そこは人力でちゃんとしたフォルダに戻してあげます.

以下がはいふり2話までの画像で学習させた結果です.
f:id:ushiromiya3:20171231145139p:plain f:id:ushiromiya3:20171231145322p:plain
どう考察していいかわかりませんが, 少し過学習した感じがします. (少し過学習って変な感じ)

一度データセットを作って学習させれば, それを使って新しくデータを取得し, また更に学習...を繰り返せるようになります. これって素敵なことやないですか.

まとめ

今はエポック数や層の数, いわゆるハイパーパラメータを変えて遊んでいます. 誤分類した画像がある程度集まってきたらそれを使って学習させるなど, 様々な改善手法が考えられますね. 楽しいです.


それでは良いお年を!!ハッピーバースデー僕