スポンサーリンク

「TensorFlow/Keras」で画像データを水増し(輝度調整・水平垂直移動)する方法ご紹介。〜 Object Detection API 〜

TensorFlow
スポンサーリンク

今回の記事はTensorFlowとKerasで画像データを水増し(輝度調整・移動)する方法をご紹介する内容です。訓練データ拡張で必要な処理なため是非興味がある方は参考にして見て下さい。

スポンサーリンク

画像データを水増しする対象

画像に関しては私は非常口でしたが皆さんは任意の画像でやっていただいても構いません。
画像のpathに注意して置き換ええればコード上は変になりませんので。

では画像の水増し方法に関してご紹介します。

TensorFlowとKerasで画像を水増し(輝度調整・水平垂直移動)

逆向き等にすると文字ですので判別できなくなってしまいます。そのため下記2点の方法が水増し方法の最適解です。この辺りは対象別に決定する必要がありますが、下記2点はどの対象に関しても問題なく良い作用をすると思います。

・輝度の調整による画像の水増し
・水平、垂直移動での画像の水増し。

輝度の調整による画像の水増し

import tensorflow as tf
import tensorflow.image
import os
import glob
from PIL import Image
import numpy as np

img_dir = glob.glob('/exit/*.jpg')
#画像の読み込み

height = 300
width = 400
#画像のサイズを指定
i = 0
for name in img_dir:
    
    count = name.split(".")[0].split("/exit/exit")[1]
    #画像を保存する際に仕様している番号
    load_img = tf.read_file(name)
    #画像の読み込み
    img = tf.image.decode_jpeg(load_img, channels=3)
    #画像の調整
    for i in range(1,5):

        before_img = tf.image.adjust_brightness(img, delta=0.0625 + 0.0625*i)
        #画像の輝度を指定して変更する
        #before_img = tf.image.random_brightness(image,max_delta,seed=None)
        #ランダムに画像の輝度変更する

        with tf.Session() as sess:
            coord = tf.train.Coordinator()
            threads = tf.train.start_queue_runners(coord=coord)
            img = sess.run(before_img)

            Image.fromarray(np.uint8(img)).save('/exit/brit/exit' + str(count) + '_' + str(i) + '.jpg')
        i = i + 1
            #画像の保存先を指定

コードの説明ですが、まずtfにて画像データの読み込み、adjust_brightnessかrandum_brightnessで画像の輝度を直接変更できる。
すごく便利です。その後tfのgraph等を利用するclassのSession()を通して出力している。
こちら参考にした公式コードでもSession()を通しており、抜くとerrorになったのでつける必要があり。その後PILモジュールImageのclassにてnumpy形式で出力された配列を画像として保存。
豆知識ですがtfのSession()を抜けてでてきた配列はnumpy形式になっているようです。

輝度の調節は下記ページに具体例があり大体の値を自身で決めてfor文で振り分けてます。tfでの画像の変更方法が下記ページには纏められていたので気になる方は他のやつも試してください。
私のコードのbefore_imgの行を変更すれば修正した画像を保存できるはずです。

輝度調節参考:https://gcbgarden.com/2018/02/20/data-augmentation-tf/

水平、垂直移動、微小角の回転での画像の水増し。

from tensorflow.keras.preprocessing import image
import numpy as np
from PIL import Image
import glob


img_dir = glob.glob('/exit/*.jpg')
#img_dirに今回水増しする画像のリストを格納

def make_generator(num):#ImageDatageneratorの仕様作成関数
    global datagen
    if num == 0:
        #縦移動
        datagen = image.ImageDataGenerator(height_shift_range=0.5)
    elif num == 1:
        #横移動
        datagen = image.ImageDataGenerator(width_shift_range=0.3)
    elif num == 2:
        #回転
        datagen = image.ImageDataGenerator(rotation_range=20)

for make_number in range(3):
    for img_l in img_dir:
        img = image.load_img(img_l)
        img = np.array(img)
        
        make_generator(make_number)#ImageDatageneratorの仕様作成関数

        # ミニバッチを生成する Python ジェネレーターを作成する。
        x = img[np.newaxis]  #  (Height, Width, Channels)  -> (1, Height, Width, Channels) 
        gen = datagen.flow(x, batch_size=1)  # 1枚しかないので、ミニバッチ数は1

        for i in range(5):
            batches = next(gen)  # (NumBatches, Height, Width, Channels) の4次元データを返す。
            # 画像として表示するため、3次元データにし、float から uint8 にキャストする。
            gen_img = batches[0].astype(np.uint8)

            im = Image.fromarray(gen_img)
            #np.save('exit/generate_zurasu/exit' + str(i) + '.jpg',gen_img)

            im.save('exit/generate_zurasu/exit' + str(y) + '_' + str(i) + '.jpg')

始めに画像の読み込み。
datagenが作成するImagegeneratorなので一気に3段階を行ってしまうため関数に。
そのほかはnumpy画像の読みこみと保存等を行っているのみです。

では今回の記事は以上です。他にも多数の機械学習関連の記事を記載しているので是非興味があれば参考にして見て下さい。

本記事を読んでいただき感謝です。サイトを訪れていただいた方はプログラミング勉強中かと思いますのでプログラミング勉強のコツを合わせてご紹介。

スポンサーリンク
スポンサーリンク
スポンサーリンク

ブログに関しては500円程度かかりますが、それ以外は無料です。知識の吸収と並行してアウトプットは非常に効率が良いです。テックアカデミーに関しては講座レベルが高いにも関わらず、無料体験や人気口座も大幅値下げがあるので、重点的に学びたいものを無料体験してみてください。

転職時にも、エンジニアからテックアカデミー・Paizaは認知度が高いので、未経験入社採用を行う際履歴書で目に留まります。特にPaizaのスキルレベルA・SなどはIT業界でも評価されます。

テックアカデミー・Paizaの無料登録ができる期間中にぜひご利用してみてください。私も活用経験ありです。

TensorFlow
スポンサーリンク
スポンサーリンク
ともぶろぐ

コメント

  1. […] 【Python】pythonのtensorflowで文字検知と文字認識②-1(輝度の調節/水平垂直移… […]

  2. […] ・TensorFlowとObject Detection APIの実行環境を構築  DockerでTensorFlow、Object Detection API実行環境構築方法・画像の整理(これは自身の好きな画像にする場合は適宜コード置き換えてください。)  自身の物体検知させたい画像を選択してください。・画像の水増し(必要な場合)  画像の輝度調整、水平垂直移動方法・アノテーション作業  アノテーション作業とは、アノテーション自動化・転移学習  転移学習方法、TFRecord形式のデータを転移学習する方法・TensorFlow学習グラフ(.pb)をTensorFlowLite形式(.tflite)に変換  pbからtfliteへの変換方法・googleテンプレートの指定箇所に自作モデルを置き換える  Object Detection APIに自作学習モデルを入れ込む方法・Xcodeにてbuild  カメラ関連アプリの実機テスト方法、 […]

  3. […] 【Python】pythonのtensorflowで文字検知と文字認識②-1(輝度の調節/水平垂直移… […]

  4. […] 【Python】pythonのtensorflowで文字検知と文字認識②-1(輝度の調節/水平垂直移… […]

  5. […] 【Python】tf.Kerasで画像を水増しする方法。(水平移動・回転など) 【Python】PythonのopenCVで画像の水増しを行う方法。 【Python】pythonのtensorflowで文字検知と文字認識②-1(輝度の調節/水平垂直移… […]

  6. […] 【Python】pythonのtensorflowで文字検知と文字認識②-1(輝度の調節/水平垂直移… […]

タイトルとURLをコピーしました