Python
tips
機械学習
深層学習
TensorFlow

畳み込みニューラルネットワーク(CNN)の訓練データを作成するツールを作ってみた - ②画像の水増し

More than 1 year has passed since last update.

はじめに

  • 前回に続いて、今回は画像の水増しを行います。
  • 正方形のリサイズの前でも後でもどちらでも良いのですが、私は正方形リサイズの後に実行しました。
  • ちょっと、面倒くさくて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()

実行結果

tf.random_crop

0_crop_1640.jpg

1_crop_1640.jpg

2_crop_1640.jpg

3_crop_1640.jpg

tf.image.random_flip_left_right

flip_left_right_1640.jpg

tf.image.random_contrast

contrast_1640.jpg

tf.image.per_image_standardization

whitening_1640.jpg