やること
小松菜奈とあいみょんは、どこか似ています。
異論のある方も多いでしょうが、「顔が似ている美人&イケメン芸能人ランキング」でも堂々の三位に入っているのですから、世間的には「似ている」ことになっているのです。
そこで、画像分類タスクに対する転移学習の方法(TRANSFER LEARNING FOR COMPUTER VISION TUTORIAL)の実践編として、小松菜奈とあいみょんを識別するモデルを作っていきます。やっていることはこのチュートリアル通り(データ拡張の仕方に回転を加え、切り取り方を変えたくらい)なので、学習部分の詳細なコードはここでは省きます。
データ収集
教師データとなる画像の収集にはicrawlerを用います。
pip install icrawler
from icrawler.builtin import BingImageCrawler
crawler = BingImageCrawler(storage={'root_dir': "nana"})
crawler.crawl(keyword="小松菜奈 顔写真", max_num=1200,min_size=(256,256))
ただし、この方法では複数人写った画像、別人の画像も入ってしまうので、手作業でそれを排除し、また顔が画像の中心にないものについてはスクリーンショットで修正したものに置き換えます。
こうして、小松菜奈、あいみょんの画像をそれぞれ(訓練用:192枚,検証用:30枚)用意しました。
学習の実行
訓練済みモデルresnet18をロードし、最後の全結合層を新しいものに取り替えてファインチューニングします。30エポック学習を繰り返すと、検証用データでの精度が最大で0.88ほどになりました。
顔検出による改善
さて、ここからどうやって改善していけばよいでしょうか。
まず、クロールした顔写真の中には、顔がアップで写っていないものも多くあり、それらを放置していました。手作業でこれ以上修正するのは大変なので、dlibを用いて顔検出をし、適当に切り出して訓練データを洗練させていきました。(参考:広瀬アリスさんとマーティン選手(ロッテ)は本当に似ているのか?)
顔検出ができなかった画像については無視されているため、訓練用のデータ数はそれぞれ140程度に減りましたが、顔がアップになっているため、識別はしやすくなっていると思われます。前と同様に30epoch学習させると以下のようになりました。
accuracyは0.917と微増しましたが、思ったほどの改善ではありませんでした。また、epoch10付近から既に学習が停滞しているように見えます。
データ拡張の仕方を変えたり(切り取り方にランダム性を持たせる、明度・彩度・コントラストを変動させる)、最適化アルゴリズムを変えたりしましたが、さらなる改善はできないままGPUが使用制限を迎えてしまったので、今日はここまでとします。見込みのありそうな工夫があったら教えてください!
おすすめ記事
おまけ
注:金属バット友保