ローリングコンバットピッチなう!

AIとか仮想化とかペーパークラフトとか

機械学習用に顔写真を決まったサイズで切り出し、グレイスケールに変換する

[technology]機械学習データ作成用顔写真切り出しスクリプト

最近DCGAN等の実験のため、ネットから落とした写真から顔の部分だけOpenCVで切り出し、更にグレイスケール化してから保存するScriptを作りました。
顔写真を集めるのに、集合写真から纏めて切り出すが楽なのでこのようにしています。

たいしたスクリプトではないですがgithubに公開しておきます。

環境はpython3.6 + OpenCV 3.4.1 + Pillow 5.1.0です。
自分はanaconda3で作成したpython3.6の仮想環境にOpenCVをインストールしました。

github.com

デフォルトは200x200でアスペクト比とかは一切考慮せずに切り出します。
顔検出は完全にOpenCVに依存しているので、傾いた顔とかはあまりうまく切り出せなかったりします。

スクリプト先頭付近にある
opencv_dir
OpenCVインストールパス名を設定してください。ここを環境に合わせて書き換える必要があります。

多分左右に10度づつとか元画像を回転させてから切り出しチャレンジすると切り出せる画像が増えたりすると思いますが、そこまではやっていません。

後、強制的にグレイスケールにしてますが、たいしたスクリプトではないのでカラーにしたい方は自分でスクリプトいじって下さい。

変換コードのメインパートは以下の様な感じで超シンプルです。

for f in os.listdir(input_dir):
    image_path = os.path.join(input_dir,f)
    print('Processing '+image_path)
    image_pil = Image.open(image_path).convert('L')
    image = np.array(image_pil, 'uint8')
    image_h,image_w = image.shape

    faces = faceCascade.detectMultiScale(image)

    for (x,y,w,h) in faces:
        roi = cv2.resize(image[y: y + h, x: x + w], (img_w, img_h), interpolation=cv2.INTER_LINEAR)
        out_image_path = os.path.join(output_dir,make_outfname())
        print(' Writing '+out_image_path)
        cv2.imwrite(out_image_path,roi)


ちなみに、まだgitコマンドの使い方が暗記できません...毎回ググッてコピペ...
後、自分で使う時はスクリプト上のinput,outputディレクトリ名をエディタで直接いじっていたのですが、ちゃんと引数解析する様しました。
これだけのコードでもそこそこ時間かかっちゃいますね...
一度汎用化しちゃえば後は楽なのですが、自分だけで使っていると他の実験が優先になって、なかなかキレイにできません。
pythonでこれまで仕事、プライベート含めて結構スクリプト書いたけど、argparseの使い方を初めて勉強したという...


先週からディープラーニングを少し離れてJubatusのお勉強しようと思ってDocker hubから丸ごと引っ張るところまではやったのですが、やる気が少し消失中です。
今週中にはやる気復活させてJubatusのチュートリアルでも動かすつもりです。その後はディープラーニングに戻ってRNNとかLSTMの実験かな。ちょっとづつ覚えていこうと思います。