컨벌루션 신경망(CNN)의 훈련 데이터를 작성하는 툴을 만들어 보았다 - ②이미지의 물 증가

소개



  • 지난번 다음에, 이번에는 화상의 물을 늘립니다.
  • 사각형의 리사이즈의 전이나 후에도 어느쪽이든 좋지만, 나는 정사각형의 리사이즈 후에 실행했습니다.
  • 조금, 번거롭고 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











    tf.image.random_flip_left_right





    tf.image.random_contrast





    tf.image.per_image_standardization



    좋은 웹페이지 즐겨찾기