今回の記事は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画像の読みこみと保存等を行っているのみです。
では今回の記事は以上です。他にも多数の機械学習関連の記事を記載しているので是非興味があれば参考にして見て下さい。
コメント
[…] 【Python】pythonのtensorflowで文字検知と文字認識②-1(輝度の調節/水平垂直移… […]
[…] ・TensorFlowとObject Detection APIの実行環境を構築 DockerでTensorFlow、Object Detection API実行環境構築方法・画像の整理(これは自身の好きな画像にする場合は適宜コード置き換えてください。) 自身の物体検知させたい画像を選択してください。・画像の水増し(必要な場合) 画像の輝度調整、水平垂直移動方法・アノテーション作業 アノテーション作業とは、アノテーション自動化・転移学習 転移学習方法、TFRecord形式のデータを転移学習する方法・TensorFlow学習グラフ(.pb)をTensorFlowLite形式(.tflite)に変換 pbからtfliteへの変換方法・googleテンプレートの指定箇所に自作モデルを置き換える Object Detection APIに自作学習モデルを入れ込む方法・Xcodeにてbuild カメラ関連アプリの実機テスト方法、 […]
[…] 【Python】pythonのtensorflowで文字検知と文字認識②-1(輝度の調節/水平垂直移… […]
[…] 【Python】pythonのtensorflowで文字検知と文字認識②-1(輝度の調節/水平垂直移… […]
[…] 【Python】tf.Kerasで画像を水増しする方法。(水平移動・回転など) 【Python】PythonのopenCVで画像の水増しを行う方法。 【Python】pythonのtensorflowで文字検知と文字認識②-1(輝度の調節/水平垂直移… […]
[…] 【Python】pythonのtensorflowで文字検知と文字認識②-1(輝度の調節/水平垂直移… […]