Kerasはfitにいますgeneratorトレーニング方式にイメージラドムを追加します。crop操作


Kerasを使ってフロントエンドとしてネットワークを書く場合、トレーニング画像のサイズが大きいので、tf.random_のようなものが必要です。crop画像を切り取ります。
このために,Kerasでカプセル化されたAPIを検討した。
Data Augmentation(データ拡張)
Data Aumentaとは、以下の方法または他の方法を用いて入力データ量を増加させることを意味する。私たちは画像データをデフォルトにします。
回転&反射変換(Rotation/reflection):ランダム回転画像一定角度;画像の内容の向きを変える。
反転変換(flip):画像を水平または垂直方向に反転させる。
ズーム変換(ズーム):一定の割合で画像を拡大または縮小します。
並進変換(shift):画像面で画像を一定の方法で並進します。
ランダムまたは人為的に定義された方法で、並進範囲と平行移動ステップサイズを指定し、水平または縦方向に平行移動し、画像コンテンツの位置を変更することができます。
スケール変換(scale):画像を指定されたスケール係数に従って拡大または縮小する。あるいはSIFT特徴を参照して思想を抽出し、指定された尺度因子を利用して画像フィルタリングにスケール空間を構築し、画像コンテンツのサイズまたはボケの程度を変更する。
コントラスト変換(contrast):画像のHSV色空間で、彩度SとV輝度成分を変化させ、色調Hを一定に保つ。各画素のS成分とV成分を指数関数演算(指数因子は0.25から4の間)し、光照射変化を増加させる。
ノイズ摂動(noise):画像の各画素RGBをランダム摂動し、一般的な雑音モードは塩コショウ雑音とガウス雑音である。
データ量が少ない場合など、データ拡張でトレーニングデータを増やしたり、フィッティングを防ぐなど、Data Aumentaには多くの利点があります。
ImageData Generator
Kerasでは、ImageData Generatorはデータ拡張を専門に行っています。
from kers.preprocessing.image import ImageData Generator
注:Using TensorFlow backend.
公式の書き方は以下の通りです。

(x_train, y_train), (x_test, y_test) = cifar10.load_data()

datagen = ImageDataGenerator(
 featurewise_center=True,
 ...
 horizontal_flip=True)

# compute quantities required for featurewise normalization
datagen.fit(x_train)

#   fit_generator 【  】    : fits the model on batches with real-time data augmentation
model.fit_generator(datagen.flow(x_train, y_train, batch_size=32),
   steps_per_epoch=len(x_train), epochs=epochs)

#    range   【  】    
for e in range(epochs):
 print 'Epoch', e
 batches = 0
 for x_batch, y_batch in datagen.flow(x_train, y_train, batch_size=32):
 loss = model.train(x_batch, y_batch)
 batches += 1
 if batches >= len(x_train) / 32:
  # we need to break the loop by hand because
  # the generator loops indefinitely
  break

ImageData Generatorのパラメータ説明は公式文書を参照してください。
上記の2つのトレーニング方法の違いは議論されません。公式パッケージのトレーニングセットbatchジェネレータはImageData Generatorオブジェクトのflow方法です。fromdirectory)は、python定義と似たgeneratorを返します。その前のステップでは、データ変換はImageData Generatorオブジェクトのfit方法である。
ランドムcropはImageData Generatorに内蔵されていませんが、パラメータの中にpreprocessingを与えました。functionは、カスタムmy_を利用できます。ランドムcrop関数は、次のように書きます。

def my_random_crop(image):
 random_arr = numpy.random.randint(img_sz-crop_sz+1, size=2)
 y = int(random_arr[0])
 x = int(random_arr[1])
 h = img_crop
 w = img_crop
 image_crop = image[y:y+h, x:x+w, :]
 return image_crop

datagen = ImageDataGenerator(
 featurewise_center=False,
 ・・・
 preprocessing_function=my_random_crop)

datagen.fit(x_train)

fitメソッドの呼び出し時に予め設定した変換をx_に適用します。trainの一枚の図には、画像cropが含まれています。一枚ずつ順次処理するので、一枚の図のcrop位置はランダムです。
トレーニングデータ(x=イメージ、y=クラスlabel)の時はこのように書いて要求を満たしました。
でも(x=イメージ、y=イメージ)にあります。mask)の場合はこの方法は成立しません。画像の片面処理のため、一対(イメージ、イメージアップ)mask)それぞれのcropの位置が一致しない。
公式サイトではイメージとmaskの書き方を同時に変換していますが、提案した案は両方の内蔵関数の変換が一致することを保証します。カスタム関数のランドム変数はランダムです。
fitゲナート
ImageData Generatorとflowの方法は私達のrandomを満たすことができません。crop前処理要求はfit_にあります。generator関数で方法を考えて修正します。
まずその定義を見ます。

def fit_generator(self, generator, samples_per_epoch, nb_epoch,
   verbose=1, callbacks=[],
   validation_data=None, nb_val_samples=None,
   class_weight=None, max_q_size=10, **kwargs):
最初のパラメータgeneratorは、一つの方法に入ることができ、直接にデータセットに入ることもできます。前のdatagen.flow()はKerasパッケージの大量データ着信方法です。
明らかに私達はカスタマイズできます。

def generate_batch_data_random(x, y, batch_size):
 """   batch       """
 total_num = len(x)
 batches = total_num // batch_size
 while (True):
 i = randint(0, batches)
 x_batch = x[i*batch_size:(i+1)*batch_size]
 y_batch = y[i*batch_size:(i+1)*batch_size]
 random_arr = numpy.random.randint(img_sz-crop_sz+1, size=2)
 y_pos = int(random_arr[0])
 x_pos = int(random_arr[1])
 x_crop = x_batch[:, y_pos:y_pos+crop_sz, x_pos:x_pos+crop_sz, :]
 y_crop = y_batch[:, y_pos:y_pos+crop_sz, x_pos:x_pos+crop_sz, :]
 yield (x_crop, y_crop)

このように書くと、私達の同じグループのイメージとmarkの位置が一致するrandomと一致します。crop要求。
注意:
ImageData Generatorに内蔵されているデータ変換方法がないので、データの拡張にもカスタムが必要です。flow(…、shuffle=True)を使用していないので、各ptochのデータを乱用するにはカスタムが必要です。
generatorがカスタマイズする時はデッドサイクルと書きます。各epoch内で、generate_batchdata_ランドムは再起動されません。
補足知識:tenssor flowにおけるランダム裁断関数randomcrop
tf.random_cropはtenssor flowの中のランダムな裁断関数で、使ってピクチャーを裁断することができます。下の写真を使ってランダムに裁断します。サイズは原図の半分です。

実験コードは次の通りです。

import tensorflow as tf
import matplotlib.image as img
import matplotlib.pyplot as plt
sess = tf.InteractiveSession()
image = img.imread('D:/Documents/Pictures/logo3.jpg')

reshaped_image = tf.cast(image,tf.float32)
size = tf.cast(tf.shape(reshaped_image).eval(),tf.int32)
height = sess.run(size[0]//2)
width = sess.run(size[1]//2)
distorted_image = tf.random_crop(reshaped_image,[height,width,3])
print(tf.shape(reshaped_image).eval())
print(tf.shape(distorted_image).eval())

fig = plt.figure()
fig1 = plt.figure()
ax = fig.add_subplot(111)
ax1 = fig1.add_subplot(111)
ax.imshow(sess.run(tf.cast(reshaped_image,tf.uint8)))
ax1.imshow(sess.run(tf.cast(distorted_image,tf.uint8)))
plt.show()
ランダム実験の結果は次の通りです。


以上のこのKerasはfit_にあります。generatorトレーニング方式にイメージラドムを追加します。crop操作は小编から皆さんに提供した内容を全部共有します。参考にしていただければと思います。どうぞよろしくお愿いします。