プログラミングの芽

面白そうな技術を使って、楽しいことやりたい

【Python】画像を90度ずつ回転させて学習データの水増しをする

画像を機械学習にかける際、学習対象物をさまざまな方向、角度から撮影されたものを使うことで汎用性の高いモデルが期待できます。
極論いえば、自分でカメラを使って撮影しまくるのが良いのですが、そんなことはしてられないです。
そのため、学習に使う画像の水増し手法として今回は90度ずつ回転させた画像を生成するコードを残しておきます。

機械学習における画像水増しの注意ですが、時には回転や左右反転などをしたことによって学習の劣化に繋がるケースもあります。
その辺調べれば出ますのでご留意願います。
私は今回、小銭画像の水増しを行うので左右反転は不適切だと判断して行いません。
左右反転されてる小銭なんて存在しませんからね。

今回は大量の画像(ここでは600枚)に対して、1枚を90度・180度・270度と回転させた計4枚に水増しする事を目的とします。
f:id:atarms:20190129220439p:plain:w300

必要なもの

import os
import cv2
import re
import numpy as np


フォルダ内の画像パスを配列に入れる

path = "./"
files = []
img_path = []
for x in os.listdir(path):
    if os.path.isfile(path + x):
        files.append(x) 
        
for y in files:
    if(y[-4:] == '.jpg'): 
        img_path.append(y)  
        
img_path2 = []
for x in img_path:
    m = re.search("[0-9]+", x)
    tuple = (m.group(), x)
    img_path2.append(tuple)
img_path2.sort(key = lambda x: (int(x[0])))

for x in img_path2:
    img_path.append(x[1])
img_path = [x[1] for x in img_path2]

img_path = np.array(img_path)

参考
yさんのまったりブログ: Python: ファイル名の番号でソートする
Python3でlistのソート | New Domains

画像を読み込んで90度、180度、270度回転させてそれぞれの画像を保存する。

cnt = img_path.shape[0]

for i in range(cnt):
    img = cv2.imread("./"+img_path[i])

    edit_img = np.rot90(img, k=-1)
    cv2.imwrite('./90_coin{0}.jpg'.format(i), edit_img)
    edit_img = np.rot90(edit_img, k=-1)
    cv2.imwrite('./180_coin{0}.jpg'.format(i), edit_img)
    edit_img = np.rot90(edit_img, k=-1)
    cv2.imwrite('./270_coin{0}.jpg'.format(i), edit_img)


以上です。

追記

cnt = img_path.shape[0]

#img = []
for i in range(cnt):
    img = cv2.imread("./"+img_path[i])
    
    edit_img = np.rot90(img, k=-1)
    cv2.imwrite('./coin{0}.jpg'.format(cnt+i), edit_img)
    edit_img = np.rot90(edit_img, k=-1)
    cv2.imwrite('./coin{0}.jpg'.format(cnt+cnt+i), edit_img)
    edit_img = np.rot90(edit_img, k=-1)
    cv2.imwrite('./coin{0}.jpg'.format(cnt+cnt+cnt+i), edit_img)

画像回転部分のプログラムに関して、ファイル名について書き換えました。
今回の私の目的だと別のファイル名を振り分けると不都合が生じました。
このプログラムで処理すれば、加工前画像の通し番号に続けたファイル名で保存できます。