tenssor flowの下のピクチャーの標準化の関数per_イメージ.イメージスタンダデリゼーションの使い方


実験環境:windows 7,anconda 3(Python 3.5),tenssor flow(gpu/cpu)
関数紹介:標準化処理は、異なる特徴が同じスケールを持つことができる。
このように,勾配降下法を用いてパラメータを学習する場合,異なる特徴がパラメータに及ぼす影響度は同じである。
tf.image.per_イメージ.イメージstandartization(image)は、この関数の演算過程は全体の画像を標準化し(正規化ではない)、神経ネットワークの訓練を加速する。
主に次のような操作があります。stddevでは、xは画像のRGB 3チャネルの画素値であり、meanはそれぞれ3チャネルの画素の平均値であり、adjused_stddev=max(stddev、1.0/sqrt(image.NumElements()))))))。
stddevは3チャネルの画素の標準偏差であり、image.NumElements()は3チャネルのそれぞれの画素数を計算する。
実験コード:

import tensorflow as tf
import matplotlib.image as img
import matplotlib.pyplot as plt
import numpy as np
sess = tf.InteractiveSession()
image = img.imread('D:/Documents/Pictures/logo7.jpg')
shape = tf.shape(image).eval()
h,w = shape[0],shape[1]
standardization_image = tf.image.per_image_standardization(image)#   

fig = plt.figure()
fig1 = plt.figure()
ax = fig.add_subplot(111)
ax.set_title('orginal image')
ax.imshow(image)
ax1 = fig1.add_subplot(311)
ax1.set_title('original hist')
ax1.hist(sess.run(tf.reshape(image,[h*w,-1])))
ax1 = fig1.add_subplot(313)
ax1.set_title('standardization hist')
ax1.hist(sess.run(tf.reshape(standardization_image,[h*w,-1])))
plt.ion()
plt.show()
実験結果:
2枚のhist図は、それぞれ原図と標準化されたRGBの画素値分布図であり、画像の画素値の大きさを一つの範囲に限定するだけで、画素値の分布が変化することが見られる。

補足の知識:tenssorflowは単一の画像を実行してと模型をロードする時注意する問題
モデルの保存ロードについて:
実験をする場合、基本的にはセーブ関数とレスター関数を使って十分に使います。この髪はモデルのパラメータだけをロードしてモデルをロードしないことを意味します。
現在のプログラムはモデルの構造を見つけることができます。

saver = tf.train.Saver()#  saver      
with tf.Session() as sess:
 for i in range(train_step):
 #.....    
 if i%100 == 0 && i!= 0:#     100       ,      5 ,    5          
  saver.save(sess,str(i)+"_"+'model.ckpt',global_step=i)
得られたファイルは以下の通りです。
一つのフォルダには、checkpointファイルと、一連の異なるトレーニング段階のモデルファイルがあります。

ckeckpointファイルはエディタの中に置いて開けてみてもいいです。中には各段階でモデルを保存する情報が記録されています。また、最近訓練したチェックポイントも記録されています。
ckptファイルはモデルパラメータです。indexファイルは一般的に使えません。
モデルを読み込む時に、一つのsaverがrestore関数を呼び出せばいいと宣言しました。多くのブログに書いてあるのは最近のチェックポイントを加えたモデルです。このように追加したモデルは全部最後のトレーニングの結果です。固定されたモデルをロードしたいです。直接にモデルのパラメータ名の文字列をパラメータに書いてください。次のような手順です。

saver = tf.train.Saver()
with tf.Session() as sess:
 saver.restore(sess, "step_1497batch_64model.ckpt-1497")#       
このようにパラメータをSessionにロードします。データがあれば、直接に詰め込んで計算することができます。
枚の画像を実行:
一枚の画像を実行する方法の流れは大体次の通りです。まずopencvまたはImageを使って、numpyを使って画像を読み、numpyのarray形式に保存します。
次に画像をopencvを用いて前処理することができる。そして処理後のarrayをfeed_を使います。dictの方式はtenssor flowのplacceholderに入力します。ここでは、2つの点に注意してください。単独で次の方法を使用して、tensorをnumpyに変換してから処理してください。画像出力を確認したいなら、検証段階では、このようにすることを強く要求しません。できるだけfeed_uを使用してください。理由は後で説明します。
numpy_img=sess.run[img]舲はテナントをnumpyに変換する。
ここで注意したいのは、あなたの画像が1チャンネルの画像、すなわち階調図である場合、あなたが得たnumpyは2次元マトリックスであり、opencvで読み込んだ画像をshpeに出力すると(424,512)のような形になり、それぞれ行と列を表しますが、モデルの中では常にbatchとチャンネル数が必要です。したがって、画像をpython opencvライブラリのreshpe関数を使用して、4次元の行列に変換する必要があります。
cv_img=cv_img.reshpe(1,cv_img.shop[0],cv_img.sharpe[1],1)菗cv_[img]Opencvで読んだ写真です。
ネットワークに入力するプレースホルダは以下のように設定されています。
[img]raw=tf.plocholder(dtype=tf.float 32,shop=[1,512,424,1],name='input')
テスト:
自分のデータセットを使用する場合、通常はtfracordsとして作成されます。トレーニングやテストの過程で、tfracordsファイルを読み込む必要があります。ここで注意してください。tfrecordsファイルを読み込む関数をサイクルの中に入れないでください。このファイルを外に置いてください。訓練やテストのデータは全部同じです。Lossは一つの値に固定されます。
これは、tfrecordsが読み取っている間に画像情報を一つの列に入れて読み取っているためであり、普通の関数として呼び出さないで、tenssorflowの考え方に従って、それをノードと見なしているからである。

def read_data(tfrecords_file, batch_size, image_size):#  tfrecords  
 filename_queue = tf.train.string_input_producer([tfrecords_file])
 reader = tf.TFRecordReader()
 _, serialized_example = reader.read(filename_queue)
 
 img_features = tf.parse_single_example(
  serialized_example,
 features={
 'label': tf.FixedLenFeature([], tf.int64),
 'image_raw': tf.FixedLenFeature([], tf.string),
  })
 image = tf.decode_raw(img_features['image_raw'], tf.float32)
 min_after_dequeue = 1000
 image = tf.reshape(image, [image_size, image_size,1])
 image = tf.image.resize_images(image, (32,32),method=3)#   32×32
 image = tf.image.per_image_standardization(image)#     
 label = tf.cast(img_features['label'], tf.int32)  
 capacity = min_after_dequeue + 3 * batch_size  
 image_batch, label_batch = tf.train.shuffle_batch([image, label],
       min_after_dequeue = min_after_dequeue)
 return image_batch, tf.one_hot(label_batch,6)#       one_hot  

#             tensor ,     !
read_image_batch,read_label_batch = read_data('train_data\\tfrecord\\TrainC6_95972.tfrecords',batch_size,120)
枚の写真を実行している問題に戻って、直接にあるtenssorに対してsess.run()を行って、図の計算後のタイプを得て、つまり私達のpythonの中でよくあるタイプです。
sess.runを使うdict=「...」で得られた計算結果と直接にsess.runを使うのはどう違いますか?
一つの循環実験を使ってもいいです。サイクル中に停止せずにsess.runを呼び出すのは毎回図にノードを追加するのに相当します。sess.runを使用します。dict={}は図中の開始位置にデータを追加します。
その結果、sess.run()をそのまま使うと運転が遅くなり、sess.run(feed_)を使うようになります。dict={}走るぞ!
なぜこれを持ち出しますか?
上にあるリロードdataにはこの3行の関数があります。

image = tf.reshape(image, [image_size, image_size,1])# opencv reshape    
image = tf.image.resize_images(image, (32,32),method=3)#   32×32, opencv resize    ,             
image = tf.image.per_image_standardization(image)#     
訓練されたモデルをネットワークノードとしてシステムに追加するには、得られたデータは、トレーニングデータと同じ処理を経た画像、すなわち、元の画像に対して上の処理を経なければならない。他のライブラリを使用すると結果が合わなくなりやすいので、訓練データ処理時と同じ関数を使用したほうがいいです。
上の関数を普通の関数として使うと、他の画像の前処理ができなくなります。まず、テンソルをnumpyタイプに変えなければなりません。問題が来たら、numpyタイプになりたいです。sess.run()を呼び出します。もしモデルをインターフェースのために使うと、ずっとsess.runを使っています。効率が遅くなります。最後にカードが死にます。
なぜなら、あなたはtenssorflowの関数をノードとして呼び出さず、普通の関数として呼び出されたからです。
解決方法は順番通りに来て、得られるnumpyデータを先に処理して、sess.runを使います。dict)はplacholderに入力し、図の順番で一歩ずつ実行すればいいです。
次の手順のように

with tf.name_scope('inputs'):
 img_raw = tf.placeholder(dtype=tf.float32, shape=[1,120, 120, 1], name='input')#    
 keep_prob = tf.placeholder(tf.float32,name='keep_prob')

with tf.name_scope('preprocess'):#        ,        
 img_120 = tf.reshape(img_raw, [120, 120,1])
 img_norm = tf.cast(img_120, "float32") / 256
 img_32 = tf.image.resize_images(img_norm, (32,32),method=3)
 img_std = tf.image.per_image_standardization(img_32)
 img = tf.reshape(img_std, [1,32, 32,1])

with tf.name_scope('output'):#       
 output = MyNet(img,keep_prob,n_cls)

ans = tf.argmax(tf.nn.softmax(output),1)#         

init = tf.global_variables_initializer()

saver = tf.train.Saver()


if __name__ == '__main__':

 with tf.Session() as sess:

 sess.run(init)
 saver.restore(sess, "step_1497batch_64model.ckpt-1497")#    
 index = 0
 path = "buffer\\"
 
 while True:
  f = path + str(index)+'.jpg'# 0.jpg、1.jpg、2.jpg.....   
  if os.path.exists(f):
  cv_img = cv.imread(f,0)
  cv_img = OneImgPrepro(cv_img)
  cv_img = cv_img.reshape(1,cv_img.shape[0],cv_img.shape[1],1)#  reshape placeholder    
  clas = ans.eval(feed_dict={img_raw:cv_img,keep_prob:1})#feed    !

  print(clas)#    
  
  index += 1
以上のこのtenssorflowの下のピクチャーの標準化の関数per_イメージ.イメージstandarizationの使い方は小編集が皆さんに提供した内容を全部共有しています。参考にしていただければと思います。よろしくお願いします。