Python
OpenCV
機械学習
顔検出

アニメ顔を半自動で抽出するスクリプトを作ってみた

はじめに

趣味でアニメキャラの自動識別をやってみたのですが、学習用に元画像から顔を切り抜く作業が大変で
人力でやると時間がかかるし、かと言って自動識別だと誤検出があるので、
その中間をとって、自動識別のアシストのもと半自動で行うものを作ったので公開します。

Github に上げているので、気に入った方は煮るなり焼くなりして自由に弄って下さい。
ガバガバ英語の説明つきです。
https://github.com/YankeeDeltaBravo225/AnimeFaceExtractHelper

たぶん、既にどこかの誰かがやっている気がしますが、詳しい使い方まで書いたのは多分自分だけのはず・・・

以下のような画像から
InputImages.png

このように顔部分だけを切り出します。
ExtractedImages.png

説明用の画像は全て girlysozai.com さんの素材をお借りしました。

準備

以下のものが必要です。

Python3

Anacondaを使うのが無難だと思います。
参考:
Anaconda で Python 環境をインストールする

Open CV

参考:
[Python]PythonでOpenCVを使う (基本編)

lbpcascade_animeface

https://github.com/nagadomi/lbpcascade_animeface
ダウンロード後、私のスクリプトと同じディレクトリに置きます。
FileLocation.png

使い方

第1引数が元画像の入ったディレクトリ、第2引数が出力先のディレクトリです。
出力先ディレクトリは無かった場合、作ります。
既にあった場合、ファイルが上書きされるので注意。

python AnimeFaceExtractHelper.py <input directory> <output directory>

こちらを実行すると、元画像ディレクトリにある画像一枚一枚に対して、
lbpcascade_animeface で顔検出を行い、結果を白枠で表示します。
SelectionWindow_0.png

青枠になっている所は現在選択されている箇所で、他のところを選択したい場合、キーボードの右キーか左キーで切り替わります。
SelectionWindow_1.png

Enterキーで青枠の領域を切り抜いて保存し、次の画像に進みます。
ESCキーを押した場合、保存せずに次の画像に進みます。

なお、キーコード定義は以下ですが、環境によって異なると思いますので適宜調整してください。

KEY_ENTER   = 0xD
KEY_ESC     = 0x1B
KEY_L_ARROW = 0x250000
KEY_R_ARROW = 0x270000

lbpcascade_animefaceでの検出に失敗した場合、以下の様に上記で説明した白と青の枠は出ません。
SelectionWindow_2.png

その際は、マウス入力で選択してください。
なお、検出成功時もマウス入力で範囲を変えることができます。

入力範囲が正方形でない場合、枠は赤く表示され、この状態でEnterを押しても保存されません。
SelectionWindow_3.png

正方形になるよう領域を調整すると、枠が青色に変化します。
SelectionWindow_4.png

この状態であれば、Enterを押した際に青枠内が保存されます。

参考文献

以下を参考にさせていただきました。

【入門者向け解説】openCV顔検出の仕組と実践(detectMultiScale)
OpenCV3とPython3を使った物体追跡(マウスで指定した特徴点をLucas-Kanade法で追跡する)