はじめに
- 前回に続いて、今回は画像の水増しを行います。
- 正方形のリサイズの前でも後でもどちらでも良いのですが、私は正方形リサイズの後に実行しました。
- ちょっと、面倒くさくてTODO残してますが、問題なく実行できるはずです。
- 難しいことを記述していないので適度にファイル名や設定値を変えていただければと思います。
- この設定の場合ですと、約1000枚で7倍まで増やすことができます。ただ、私のマシンで実行時間は3時間半ほどかかりました。
プログラム
pad.py
# !/usr/local/bin/python3
# !-*- coding: utf-8 -*-
import argparse
import os
import tensorflow as tf
from PIL import Image
import numpy as np
import shutil
def padImages(input_dir, output_dir):
files = os.listdir(input_dir)
for file in files:
name, ext = os.path.splitext(file)
if ext != '.jpg':
print('[' + file + ']: 不正なファイルが含まれています。')
if '_' not in file:
img = tf.read_file(os.path.join(input_dir, file))
img = tf.image.decode_jpeg(img, channels=3)
height, width = 250, 250
crop_img = tf.random_crop(img, [height, width, 3])
flip_left_right_img = tf.image.random_flip_left_right(img)
# 正方形リサイズ後の場合、黒か白に寄せられてしまうため使えない。
# brightness_img = tf.image.random_brightness(img, max_delta=63)
contrast_img = tf.image.random_contrast(img, lower=0.2, upper=1.8)
whitening_img = tf.image.per_image_standardization(img)
with tf.Session() as sess:
for i in range(4):
padded_img = sess.run(crop_img)
Image.fromarray(np.uint8(padded_img)).save(
os.path.join(
output_dir,
str(i) + '_crop_' + file
)
)
padded_img = sess.run(flip_left_right_img)
Image.fromarray(np.uint8(padded_img)).save(
os.path.join(
output_dir,
'flip_left_right_' + file
)
)
# padded_img = sess.run(brightness_img)
#
# Image.fromarray(np.uint8(padded_img)).save(
# os.path.join(
# output_dir,
# 'brightness_' + file
# )
# )
padded_img = sess.run(contrast_img)
Image.fromarray(np.uint8(padded_img)).save(
os.path.join(
output_dir,
'contrast_' + file
)
)
padded_img = sess.run(whitening_img)
Image.fromarray(np.uint8(padded_img)).save(
os.path.join(
output_dir,
'whitening_' + file
)
)
shutil.copyfile(
os.path.join(input_dir, file),
os.path.join(output_dir, file)
)
def main():
# @TODO: tensorflowの引数関数に変更してもよい
parser = argparse.ArgumentParser()
parser.add_argument('--input_dir', default='original')
parser.add_argument('--output_dir', default='paded')
args = parser.parse_args()
padImages(args.input_dir, args.output_dir)
if __name__ == '__main__':
main()