読者です 読者をやめる 読者になる 読者になる

MATHGRAM

主に数学とプログラミング、時々趣味について。

python: chainerを使って化物語キャラを認識させるよ! 〜part1 画像の収集〜

python 機械学習 画像処理

前書きから二日も経ってしまいました。

-- 目次 --

まずは2値分類してみる。

ここから主要キャラの分類

今日寝るまでに2値分類(暦orNOT暦)やることが目標です。

あと学部1年になる時、つまりは約3年前に買ったiMacGPUが入ってることが判明しました。

あん時は何も知らずに買ったのに・・・気づいた時くそうれしかったです。

ってことでGPUも使えるときはガンガン使っていこうかと思います。

挨拶はこの辺に。

画像の収集

収集方法

今回画像を集める方法は、動画からの切り出しです。
せっかくアニメ顔の認識なんだから動画から切り出すのが一番効率が良いだろうと。

スクレイピングなどもやりたいな、とは思っていたのですが、
いづれ自然言語処理系に手を出した時に必ずやるだろうということで、
今回は動画の切り出しを選択しました。あくまで目的はDeepLearning。

anacondaとopenCVについて

一番最初こいつのインストールにすごい時間がかかったのをよく覚えています。
現在はpyenvでpython環境を整備しているのですが、もしopenCVのインストールがうまくいかない場合は、一度pyenvも調べてみるといいかもしれません。

ちなみに僕が本当にお世話になったのが以下のサイト。
www.takunoko.com

ここみればopenCVもサクッと入ると思います。

プログラムコード

本当に申し訳ないのですが、以下のサイトさまが書いているコードのほぼ丸パクリです。
hogehuga.com

# -*- coding: utf-8 -*-
#動画から顔認識した部分をくりぬく

import cv2

#カスケードを取得する。今回はanime_faceをお借りします。
cascade_path = "/Users/path/to/lbpcascade_animeface.xml"

def detectFace(image): #グレースケール化、イコライズ、顔認識を行う関数を作成する
    image_gray = cv2.cvtColor(image, cv2.cv.CV_BGR2GRAY)
    image_gray = cv2.equalizeHist(image_gray)

    cascade = cv2.CascadeClassifier(cascade_path)
    facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=3, minSize=(50, 50))

    print "face rectangle"
    print facerect

    return facerect


### main ###
video_path = "/Users/path/to/video" # 動画の絶対パス
#理由はわかりませんが、ここは絶対パスの方が良さそうです。

cap = cv2.VideoCapture(video_path) #VideoCaptureをcapに保持

framenum = 0
faceframenum = 0 #初期化
color = (255, 255, 255) #白で検出する

while(cap.isOpened()):
    framenum += 1

    ret, image = cap.read()
    if not ret: # if (ret == False): と同じ
        break

    if framenum%50==0: #frameを50枚ごとに認識する 化物語は動きが少ないからね!! フレーム数小さいと同じ画像がいっぱいできちゃうよ!
        facerect = detectFace(image)
        if len(facerect) == 0: continue #認識結果がnullだったら次のframeへ

        for rect in facerect:
            croped = image[rect[1]:rect[1]+rect[3],rect[0]:rect[0]+rect[2]]
            cv2.imwrite("1_" + str(faceframenum) + ".jpg", croped)
            faceframenum += 1

cap.release()

得られた画像たち

f:id:ket-30:20160317222135p:plain
誤認識された顔じゃない画像は、負例としてothersフォルダにぶちこんでます。

まとめ

for文で書き換えて、いろんな動画を一気に切り出そうかとも思ったのですが時間がかかりすぎてしまうので結局ひとつの動画ずつ切り出すことに。
うまくいかなかった時のリスクが高いので・・・
これだとさすがにコードが丸パクリすぎるので、このシリーズが終わって当初の目的が達成できたら戻ってこようと思います。
書き換えて、もうちょい早くできたり改善できたらいいなあ。

-- 目次 --

まずは2値分類してみる。

ここから主要キャラの分類

p.s. はやく学習はじめたひ