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

# はじめに

- [前回](https://qiita.com/neriai/items/5e9ee66e7bd676057ed3)に続いて、今回は画像の水増しを行います。
- 正方形のリサイズの前でも後でもどちらでも良いのですが、私は正方形リサイズの後に実行しました。
- ちょっと、面倒くさくてTODO残してますが、問題なく実行できるはずです。
- 難しいことを記述していないので適度にファイル名や設定値を変えていただければと思います。
- この設定の場合ですと、約1000枚で７倍まで増やすことができます。ただ、私のマシンで実行時間は３時間半ほどかかりました。

# プログラム

```py: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](https://qiita-image-store.s3.amazonaws.com/0/90598/6782ff02-4c86-06b4-aae0-6da96ee22cd7.jpeg)

![1_crop_1640.jpg](https://qiita-image-store.s3.amazonaws.com/0/90598/5fcc2f21-f88f-9877-a611-b87a70e9d442.jpeg)

![2_crop_1640.jpg](https://qiita-image-store.s3.amazonaws.com/0/90598/1a002a2d-b9d3-3f68-6cad-102c8e4e8bc6.jpeg)

![3_crop_1640.jpg](https://qiita-image-store.s3.amazonaws.com/0/90598/99a0ee42-55e3-1d90-5ef9-c7c67e1633d1.jpeg)

## tf.image.random_flip_left_right

![flip_left_right_1640.jpg](https://qiita-image-store.s3.amazonaws.com/0/90598/bfe1a164-d1a3-1926-1131-7eab28a42d46.jpeg)

## tf.image.random_contrast

![contrast_1640.jpg](https://qiita-image-store.s3.amazonaws.com/0/90598/b2e3e65c-e51f-580a-6b7c-16d17e79581c.jpeg)

## tf.image.per_image_standardization

![whitening_1640.jpg](https://qiita-image-store.s3.amazonaws.com/0/90598/0e4f920c-bad7-68d9-1b31-387ec983fe9d.jpeg)