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

MATHGRAM

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

python: chainerを使って化物語キャラを認識させるよ! 〜part2 画像の縮小&水増し〜

python 機械学習 画像処理

はい、part2は画像の大きさ縮小と水増しでございます。

-- 目次 --

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

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


chainerに放り込む前に画像の大きさを揃えておきます。
今回は50*50の大きさに揃えております。
32*32とかの方がいいのかな?ちょっとまだ最適な大きさとかわからないからとりあえず。

また深層学習には大量の画像が必要なわけで、part1で切り取った画像だけではちょっと心細いわけです。
ということで、回転やらノイズやらでサンプリングした画像を増殖させます。

openCVでもいいのですが、PIL(python image library)がわかりやすかったので今回はPILを使いました。

画像の縮小

以下がpythonコード

# -*- coding:utf-8 -*-

from PIL import Image
import os

imgNames = os.listdir("/Users/path/to/dir")#画像が保存されてるディレクトリへのpath

def readImg(imgName):
    try: #tryを使ってエラーでプログラムが止まっちゃうのを回避します。
        img_src = Image.open("/Users/path/to/dir/"+ imgName)#pathは上で設定したのと同じ場所です。
        print("read img!")#動いていることを確認するために書きましたがなくても全然OKです
    except: #ゴミを読み込んだらこれちゃうで!って言います。
        print("{} is not image file!".format(imgName))
        img_src = 1
    return img_src

for imgName in imgNames:
    img_src = readImg(imgName)
    if img_src == 1:continue
    else:
        resizedImg = img_src.resize((50,50)) #
        resizedImg.save("50_50_"+imgName)#名前は長くなっちゃうけど仕方ない。
        print(imgName+" is done!")

これで切り出した画像が50*50の大きさになりました。
こいつにさらに回転をかけて、画像を増殖させます。

画像の回転

上のプログラムと結構似ているので、コメントは書いてません。
難しいコードでは全くないので問題はないはず。

# -*- coding: utf-8 -*-

from PIL import Image
import os

def readImg(imgName):
    try:
        img_src = Image.open("/Users/path/to/dir/" + imgName)
        print("read img!")
    except:
        print("{} is not image file!".format(imgName))
        img_src = 1
    return img_src


def spinImg(imgNames):
    for imgName in imgNames:
        img_src = readImg(imgName)
        if img_src == 1:continue
        else:
            #上下反転
            tmp = img_src.transpose(Image.FLIP_TOP_BOTTOM)
            tmp.save("flipTB_" + imgName)
            #90度回転
            tmp = img_src.transpose(Image.ROTATE_90)
            tmp.save("spin90_" + imgName)
            #270度回転
            tmp = img_src.transpose(Image.ROTATE_270)
            tmp.save("spin270_" + imgName)
            #左右反転
            tmp = img_src.transpose(Image.FLIP_LEFT_RIGHT)
            tmp.save("flipLR_" + imgName)
            print("{} is done!".format(imgName))

if __name__ == '__main__':

    #read imgs names
    imgNames = os.listdir("/Users/path/to/dir")#画像が保存されてるディレクトリへのpathを書きます
    print(imgNames)
    spinImg(imgNames)

得られた画像たち

f:id:ket-30:20160317230705p:plain
変態だらけ・・・

こんなんなら忍で2値分類作ればよかったわ・・・

以上でpart2を終わります。
次回はデータセットの作成ですね。
訓練データとテストデータに分けるプログラムを書いていきます。

-- 目次 --

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

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

p.s. あかん、眠い。