2016-06-29 22 views
10

TLDR:複数の画像予測に再学習開始V3を使用する方法を理解できません。テンソルフローの編集V3 retraining-example.py複数の分類のため

こんにちは親友:)私は数日間、多くのstackoverflow投稿とドキュメントを検索しましたが、私はこの質問に対する答えを見つけることができませんでした。これに関する助けを大いに感謝します!

私は新しい絵にtensorflow inceptionV3モデルを再訓練している、そしてhttps://www.tensorflow.org/versions/r0.9/how_tos/image_retraining/index.htmlでの指示に従って、次のコマンドを使用して、新しい画像上で動作することができます:

bazel build tensorflow/examples/label_image:label_image && \ 
bazel-bin/tensorflow/examples/label_image/label_image \ 
--graph=/tmp/output_graph.pb --labels=/tmp/output_labels.txt \ 
--output_layer=final_result \ 
--image= IMAGE_DIRECTORY_TO_CLASSIFY 

はしかし、私は複数を分類する必要があります(データセットのような)イメージを作成し、それを行う方法に真剣に取り組んでいます。私は再訓練モデルを使用する方法について

https://github.com/eldor4do/Tensorflow-Examples/blob/master/retraining-example.py

で次の例を見つけたが、再び、それは複数の分類のためにそれを変更する方法の詳細に大きくまばらです。

私はMNISTのチュートリアルから収集したものから、sess.run()オブジェクトにfeed_dictを入力する必要がありますが、このコンテキストで実装する方法を理解できないため、そこにはまっていました。

ご協力いただければ幸いです。 :)

EDIT:一部の機能が削除されます。

は、いくつかの変更をStyrkeのスクリプトを実行し、私はこれはスクリプトである。この

[email protected]:~/git$ python tensorflowMassPred.py I 
     tensorflow/stream_executor/dso_loader.cc:108] successfully opened 
     CUDA library libcublas.so locally I 
     tensorflow/stream_executor/dso_loader.cc:108] successfully opened 
     CUDA library libcudnn.so locally I 
     tensorflow/stream_executor/dso_loader.cc:108] successfully opened 
     CUDA library libcufft.so locally I 
     tensorflow/stream_executor/dso_loader.cc:108] successfully opened 
     CUDA library libcuda.so locally I 
     tensorflow/stream_executor/dso_loader.cc:108] successfully opened 
     CUDA library libcurand.so locally 
     /home/waffle/anaconda3/lib/python3.5/site-packages/tensorflow/python/ops/array_ops.py:1197: 
     VisibleDeprecationWarning: converting an array with ndim > 0 to an 
     index will result in an error in the future 
     result_shape.insert(dim, 1) I 
     tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:924] successful 
     NUMA node read from SysFS had negative value (-1), but there must be 
     at least one NUMA node, so returning NUMA node zero I 
     tensorflow/core/common_runtime/gpu/gpu_init.cc:102] Found device 0 
     with properties: name: GeForce GTX 660 major: 3 minor: 0 
     memoryClockRate (GHz) 1.0975 pciBusID 0000:01:00.0 Total memory: 
     2.00GiB Free memory: 1.78GiB I tensorflow/core/common_runtime/gpu/gpu_init.cc:126] DMA: 0 I 
     tensorflow/core/common_runtime/gpu/gpu_init.cc:136] 0: Y I 
     tensorflow/core/common_runtime/gpu/gpu_device.cc:806] Creating 
     TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 660, pci 
     bus id: 0000:01:00.0) W tensorflow/core/framework/op_def_util.cc:332] 
     Op BatchNormWithGlobalNormalization is deprecated. It will cease to 
     work in GraphDef version 9. Use tf.nn.batch_normalization(). E 
     tensorflow/core/common_runtime/executor.cc:334] Executor failed to 
     create kernel. Invalid argument: NodeDef mentions attr 'T' not in 
     Op<name=MaxPool; signature=input:float -> output:float; 
     attr=ksize:list(int),min=4; attr=strides:list(int),min=4; 
     attr=padding:string,allowed=["SAME", "VALID"]; 
     attr=data_format:string,default="NHWC",allowed=["NHWC", "NCHW"]>; 
     NodeDef: pool = MaxPool[T=DT_FLOAT, data_format="NHWC", ksize=[1, 3, 
     3, 1], padding="VALID", strides=[1, 2, 2, 1], 
     _device="/job:localhost/replica:0/task:0/gpu:0"](pool/control_dependency) 
     [[Node: pool = MaxPool[T=DT_FLOAT, data_format="NHWC", ksize=[1, 3, 
     3, 1], padding="VALID", strides=[1, 2, 2, 1], 
     _device="/job:localhost/replica:0/task:0/gpu:0"](pool/control_dependency)]] 
     Traceback (most recent call last): File 
     "/home/waffle/anaconda3/lib/python3.5/site-packages/tensorflow/python/client/session.py", 
     line 715, in _do_call 
      return fn(*args) File "/home/waffle/anaconda3/lib/python3.5/site-packages/tensorflow/python/client/session.py", 
     line 697, in _run_fn 
      status, run_metadata) File "/home/waffle/anaconda3/lib/python3.5/contextlib.py", line 66, in 
     __exit__ 
      next(self.gen) File "/home/waffle/anaconda3/lib/python3.5/site-packages/tensorflow/python/framework/errors.py", 
     line 450, in raise_exception_on_not_ok_status 
      pywrap_tensorflow.TF_GetCode(status)) tensorflow.python.framework.errors.InvalidArgumentError: NodeDef 
     mentions attr 'T' not in Op<name=MaxPool; signature=input:float -> 
     output:float; attr=ksize:list(int),min=4; 
     attr=strides:list(int),min=4; attr=padding:string,allowed=["SAME", 
     "VALID"]; attr=data_format:string,default="NHWC",allowed=["NHWC", 
     "NCHW"]>; NodeDef: pool = MaxPool[T=DT_FLOAT, data_format="NHWC", 
     ksize=[1, 3, 3, 1], padding="VALID", strides=[1, 2, 2, 1], 
     _device="/job:localhost/replica:0/task:0/gpu:0"](pool/control_dependency) 
     [[Node: pool = MaxPool[T=DT_FLOAT, data_format="NHWC", ksize=[1, 3, 
     3, 1], padding="VALID", strides=[1, 2, 2, 1], 
     _device="/job:localhost/replica:0/task:0/gpu:0"](pool/control_dependency)]] 

     During handling of the above exception, another exception occurred: 

     Traceback (most recent call last): File "tensorflowMassPred.py", 
     line 116, in <module> 
      run_inference_on_image() File "tensorflowMassPred.py", line 98, in run_inference_on_image 
      {'DecodeJpeg/contents:0': image_data}) File "/home/waffle/anaconda3/lib/python3.5/site-packages/tensorflow/python/client/session.py", 
     line 372, in run 
      run_metadata_ptr) File "/home/waffle/anaconda3/lib/python3.5/site-packages/tensorflow/python/client/session.py", 
     line 636, in _run 
      feed_dict_string, options, run_metadata) File "/home/waffle/anaconda3/lib/python3.5/site-packages/tensorflow/python/client/session.py", 
     line 708, in _do_run 
      target_list, options, run_metadata) File "/home/waffle/anaconda3/lib/python3.5/site-packages/tensorflow/python/client/session.py", 
     line 728, in _do_call 
      raise type(e)(node_def, op, message) tensorflow.python.framework.errors.InvalidArgumentError: NodeDef 
     mentions attr 'T' not in Op<name=MaxPool; signature=input:float -> 
     output:float; attr=ksize:list(int),min=4; 
     attr=strides:list(int),min=4; attr=padding:string,allowed=["SAME", 
     "VALID"]; attr=data_format:string,default="NHWC",allowed=["NHWC", 
     "NCHW"]>; NodeDef: pool = MaxPool[T=DT_FLOAT, data_format="NHWC", 
     ksize=[1, 3, 3, 1], padding="VALID", strides=[1, 2, 2, 1], 
     _device="/job:localhost/replica:0/task:0/gpu:0"](pool/control_dependency) 
     [[Node: pool = MaxPool[T=DT_FLOAT, data_format="NHWC", ksize=[1, 3, 
     3, 1], padding="VALID", strides=[1, 2, 2, 1], 
     _device="/job:localhost/replica:0/task:0/gpu:0"](pool/control_dependency)]] 
     Caused by op 'pool', defined at: File "tensorflowMassPred.py", line 
     116, in <module> 
      run_inference_on_image() File "tensorflowMassPred.py", line 87, in run_inference_on_image 
      create_graph() File "tensorflowMassPred.py", line 68, in create_graph 
      _ = tf.import_graph_def(graph_def, name='') File "/home/waffle/anaconda3/lib/python3.5/site-packages/tensorflow/python/framework/importer.py", 
     line 274, in import_graph_def 
      op_def=op_def) File "/home/waffle/anaconda3/lib/python3.5/site-packages/tensorflow/python/framework/ops.py", 
     line 2260, in create_op 
      original_op=self._default_original_op, op_def=op_def) File "/home/waffle/anaconda3/lib/python3.5/site-packages/tensorflow/python/framework/ops.py", 
     line 1230, in __init__ 
      self._traceback = _extract_stack() 

を得ました。

だからあなたのリンクスクリプトを見て
import os 
import numpy as np 
import tensorflow as tf 
os.chdir('tensorflow/') #if need to run in the tensorflow directory 
import csv,os 
import pandas as pd 
import glob 

imagePath = '../_images_processed/test' 
modelFullPath = '/tmp/output_graph.pb' 
labelsFullPath = '/tmp/output_labels.txt' 

# FILE NAME TO SAVE TO. 
SAVE_TO_CSV = 'tensorflowPred.csv' 


def makeCSV(): 
    global SAVE_TO_CSV 
    with open(SAVE_TO_CSV,'w') as f: 
     writer = csv.writer(f) 
     writer.writerow(['id','label']) 


def makeUniqueDic(): 
    global SAVE_TO_CSV 
    df = pd.read_csv(SAVE_TO_CSV) 
    doneID = df['id'] 
    unique = doneID.unique() 
    uniqueDic = {str(key):'' for key in unique} #for faster lookup 
    return uniqueDic 


def create_graph(): 
    """Creates a graph from saved GraphDef file and returns a saver.""" 
    # Creates graph from saved graph_def.pb. 
    with tf.gfile.FastGFile(modelFullPath, 'rb') as f: 
     graph_def = tf.GraphDef() 
     graph_def.ParseFromString(f.read()) 
     _ = tf.import_graph_def(graph_def, name='') 


def run_inference_on_image(): 
    answer = [] 
    global imagePath 
    if not tf.gfile.IsDirectory(imagePath): 
     tf.logging.fatal('imagePath directory does not exist %s', imagePath) 
     return answer 

    if not os.path.exists(SAVE_TO_CSV): 
     makeCSV() 

    files = glob.glob(imagePath+'/*.jpg') 
    uniqueDic = makeUniqueDic()   
    # Get a list of all files in imagePath directory 
    #image_list = tf.gfile.ListDirectory(imagePath) 

    # Creates graph from saved GraphDef. 
    create_graph() 

    with tf.Session() as sess: 

     softmax_tensor = sess.graph.get_tensor_by_name('final_result:0') 

     for pic in files: 
      name = getNamePicture(pic) 
      if name not in uniqueDic: 
       image_data = tf.gfile.FastGFile(pic, 'rb').read() 
       predictions = sess.run(softmax_tensor, 
            {'DecodeJpeg/contents:0': image_data}) 
       predictions = np.squeeze(predictions) 

       top_k = predictions.argsort()[-5:][::-1] # Getting top 5 predictions 
       f = open(labelsFullPath, 'rb') 
       lines = f.readlines() 
       labels = [str(w).replace("\n", "") for w in lines] 
#   for node_id in top_k: 
#    human_string = labels[node_id] 
#    score = predictions[node_id] 
#    print('%s (score = %.5f)' % (human_string, score)) 
       pred = labels[top_k[0]] 
       with open(SAVE_TO_CSV,'a') as f: 
        writer = csv.writer(f) 
        writer.writerow([name,pred]) 
    return answer 

if __name__ == '__main__': 
    run_inference_on_image() 

答えて

4

image_data = tf.gfile.FastGFile(imagePath, 'rb').read() 
image_dataはそれが以前に数行をロードしています、あなたがモデルにフィードする新しいイメージで、このスニペット内

with tf.Session() as sess: 

    softmax_tensor = sess.graph.get_tensor_by_name('final_result:0') 
    predictions = sess.run(softmax_tensor, 
          {'DecodeJpeg/contents:0': image_data}) 
    predictions = np.squeeze(predictions) 

    top_k = predictions.argsort()[-5:][::-1] # Getting top 5 predictions 

私の本能は、run_inference_on_imageをパラメータとしてimagePathを受け入れるように変更し、os.listdirと0を使用することですあなたのデータセットの各イメージでそれを行うには、が必要です。

+0

こんにちは、お返事ありがとうございます!申し訳ありませんが、私はあなたが意味することを理解していません。すべての写真をロードしてから、sess.run()をループすると言っていますか? – Wboy

+0

これは素晴らしい方法です。 :D – struct

+0

残念ながら、それは私が探しているものではありません。通常のクラシファイア(xgboostなど)に1行ずつフィッティングするのに似ていて、非常に遅い(8k画像では31時間かかる)。私はfeed_dictと分類子にX画像全体をフィードし、ワンショットですべての画像の予測を出力するソリューションを探しています。 – Wboy

5

raw jpegデータは、decode_jpegオペレーションに直接入力されているように見えますが、これは一度に1つの画像だけを入力として受け取ります。一度に複数の画像を処理するには、おそらくさらにdecode_jpeg opsを定義する必要があります。それが可能な場合、私は現在どのように知りません。

次のベストは、おそらくすべての画像をループでTensorFlowセッション内で1つずつ分類することです。こうすることで、グラフを再読み込みしたり、分類したい画像ごとに新しいTFセッションを開始したりするのを避けることができます。両方を行う必要がある場合は、かなり時間がかかります。

ここでは、imagePath変数で指定されたディレクトリ内のすべてのイメージを分類するように、run_inference_on_image()関数の定義を変更しました。私はこのコードをテストしていないので、修正が必要な小さな問題があるかもしれません。

def run_inference_on_image(): 
    answer = [] 

    if not tf.gfile.IsDirectory(imagePath): 
     tf.logging.fatal('imagePath directory does not exist %s', imagePath) 
     return answer 

    # Get a list of all files in imagePath directory 
    image_list = tf.gfile.ListDirectory(imagePath) 

    # Creates graph from saved GraphDef. 
    create_graph() 

    with tf.Session() as sess: 

     softmax_tensor = sess.graph.get_tensor_by_name('final_result:0') 

     for i in image_list: 
      image_data = tf.gfile.FastGFile(i, 'rb').read() 
      predictions = sess.run(softmax_tensor, 
            {'DecodeJpeg/contents:0': image_data}) 
      predictions = np.squeeze(predictions) 

      top_k = predictions.argsort()[-5:][::-1] # Getting top 5 predictions 
      f = open(labelsFullPath, 'rb') 
      lines = f.readlines() 
      labels = [str(w).replace("\n", "") for w in lines] 
      for node_id in top_k: 
       human_string = labels[node_id] 
       score = predictions[node_id] 
       print('%s (score = %.5f)' % (human_string, score)) 

      answer.append(labels[top_k[0]]) 
    return answer 
+0

こんにちは、お返事ありがとうございます - 私はこのスクリプトを実行するいくつかの問題がある、私は私の答えを更新しました。もしあなたがもう一度手助けできれば素晴らしいだろう! :) – Wboy

+0

@Wboyあなたの新しい問題に関連すると思われる[TensorFlowの問題](https://github.com/tensorflow/tensorflow/issues/1528)があります。 – Styrke

+0

まだ解決していませんが、終了する前に賞金を授与します:) – Wboy

0

私は同じ問題がありました。私はすべての可能な解決策に続き、最終的に私のために働くものを見つけました。このエラーは、モデルを再トレーニングするために使用されるTensorflowのバージョンが、使用されているバージョンと異なる場合に発生します。

解決策は、Tensorflowを最新バージョンに更新することです。私はpipを使ってTensorflowをインストールしていたので、次のコマンドを実行するだけでした。

sudo pip install tensorflow --upgrade 

これは完璧に機能しました。

関連する問題