ニートがプログラミングするブログ(はてな出張所)

ニートがプログラミングするブログです。今は主にコンピュータビジョンに関することをやっています。

トレーニングデータ数と正解率との関係

今回はトレーニングデータ数と正解率との関係を調べました。
使用したデータはsugyanさんのアイドルデータセットです。
このデータセットは40人のアイドルの画像がそれぞれ180枚あります。
ここでは150枚をトレーニングに使う画像、30枚をテスト用の画像としました。
トレーニング・テストの手法はHOGを使った(たぶん)オリジナルの方法で、前回のものを少し改善しました。
ただし、pythonで作った簡易版なのでC++で作ったオリジナル版には数%ですが劣ります。
ここで使用した手法は後日詳しいやり方を書こうと思います。

トレーニングデータ数を一人当たり1、5、10、30、60、90、120、150枚と変えたときの正解率を示したものが下の図になります。
ただし、トレーニングに使用した画像は反転したものも含めるので上記の2倍の枚数となります。
またテスト画像は30枚で固定しています。
あたりまえかもしれませんが、データ数を増やしたほうが正解率が上がります。
ただし、30枚の時点でほぼ9割なので40クラス問題の場合にはそれほど多くのものは必要ないのかもしれません。
あくまで40クラス問題でなので、100クラスや1000クラス問題となればトレーニングデータ数は150枚でも足りないのかもしれません。

 

f:id:suzuichiblog:20160908180916p:plain

 

ちなみにトレーニングデータ150枚を使い、OpenCV付属の顔認識手法のEigenFaceやFisherFace、LBPHで試した結果、正解率はそれぞれ40%、61%、49%でした。
ただし、画像は32x32と小さいサイズです。
なぜこんなに小さいかというと、あまり大きい画像だとトレーニングに時間がかかるからです。
例えば32x32ならば20~30分程度でトレーニングとテストが終わりますが、100x100の画像にすると3時間経ってもトレーニングが終わりませんでした。(面倒になったので途中で停止させました。)
ちなみにpythonの簡易版ですが私の手法ではトレーニングが30分程度、40人x30枚=1200枚のテストが120秒程度で終わります。
(今回使用したデータセットは既に顔検出と顔の位置あわせが済んでいるため、ここではこれらのステップを飛ばしています。そのため実践的にはもう少し時間がかかるかもしれません。)

感想としては、トレーニング手法の改善ももちろん大事ですがデータ数も大事だと思いました。
そのため最近は画像を生成する手法であるDCGANに注目しています。
例えば、アイドルの顔画像を生成したりアニメのキャラクターの顔を生成したりするものがあります。
私もDeepでもConvolutionalでもないただのGenerative Adversarial Networksっぽい物を作りました。
試しで作ったので識別器も生成器も1層のニューラルネットなのでGANもどきと呼んでいましたが、さすがにそんなのではうまく行きませんでした。
なぜうまくいかなかったことをわざわざ書いたかといえば、GANもどき→がんもどき→おでんの具みたいというネタを書きたかったからです。
それはさておき、例えばある人のトレーニング画像が無表情の1枚しかなくても、他の人の画像に笑顔のものがあれば、そこからある人の笑顔の画像を作り出せたらデータ数に困ることが無くて便利そうだなと思います。
そんなわけで、今後はデータを生成する手法にも注目していきたいと思いました。