2017-12-26 11 views
0

ich Tensorflow bin mit einem CNN zu machen, die Bilder klassifizieren. Ich habe eine images.txt-Datei, die eine Liste der .jpg Dateien zusammen mit ihren entsprechenden Etiketten enthält, mit folgendem Format:Lesen von Bilddaten eine TXT-Datei mit Dateinamen enthalten

image1.jpg,4 
image2.jpg,3 
image3.jpg,2 

ich eine Funktion geschrieben haben, der die .txt Datei öffnet und iterativ die Daten der Bilder lesen mit Kissen:

data = [] 
labels = [] 

def preprocess(): 
    with open('images.txt') as f: 
     for line in f: 
      // Did some string processing to get path of the image 

      img = Image.open(path) 
      arr = np.array(img.getdata(), dtype=np.int8) 
      data.append(arr) 

ich bin nicht sicher, ob die natürlichen Geschwindigkeit dieses Verfahrens, aber es scheint ziemlich langsam. Ich muss ungefähr 5000 Bilder lesen (d. H. images.txt enthält ungefähr 5000 Zeilen), und es dauert ungefähr 60 Sekunden, um diese Funktion zu beenden.

Könnte vielleicht jemand etwas Licht in diese und lassen Sie mich wissen, was seine Leistung zu tun zu verbessern? Vielen Dank.

Antwort

1

Die optimierte Art und Weise, dies zu tun ist Tensorflow für alles tun zu verwenden.

Es gibt eine einfache Möglichkeit, dies zu tun:

# load csv content 
csv_path = tf.train.string_input_producer(['images.txt']) 
textReader = tf.TextLineReader() 
_, csv_content = textReader.read(csv_path) 
im_name, label = tf.decode_csv(csv_content, record_defaults=[[""], [0]]) 

# load images 
im_content = tf.read_file(im_name) 
image = tf.image.decode_jpeg(im_content, channels=3) 
# preprocess your input image (scale, subtract mean, resize, ...) 

# make batches 
bs = 32 
im_batch, lb_batch = tf.train.batch([image, label], batch_size=bs) 

Auf diese Weise Sie Tensorflow verwenden die CSV zu lesen, die Bilder und die Etiketten und erstellen Chargen Größe 32.

Sie können Verwenden Sie einfach im_batch und lb_batch als Eingabe und Ziele in Ihrem Netzwerk.

+0

Danke, aber wenn ich die Genauigkeit bin Überprüfung von meinen Vorhersagen, diese Zeile '' 'train_accuracy = Genauigkeit.eval (feed_dict = {x: Stapel [0], y_: Stapel [1], keep_prob: 1.0})' '' erzeugt einen Fehler: '' 'TypeError: The Der Wert eines Feeds darf kein tf.Tensor-Objekt sein. Zu den zulässigen Feed-Werten gehören Python-Skalare, Strings, Listen, numpy ndarrays oder TensorHandles. '' 'Wie löse ich das? – ccying

+0

Sie müssen es nicht als Werte für Platzhalter verwenden. Sie sind bereits Teil der Grafik, daher müssen Sie nichts füttern. Lesen Sie diese Anleitung zum besseren Verständnis: https://www.tensorflow.org/api_guides/python/reading_data – nessuno

0

Verwenden neuer Datensatz API (als Teil der TF Version 1.4 freigegeben)
gesamten Prozess zu beschleunigen

Schritt aus CSV-Dateien zum Lesen:

1) Lesen Sie die CSV-Datei Name
2) Create TextLineDataset durch Angabe der CSV-Datei Name
3) Erstellen Sie die Parse-Funktion für die Decodierung und machen Sie keine Vorverarbeitung in den Eingabedaten
4) Erstellen Batching, wiederholen (keine Epoche) und shufflin g Verwenden des in den vorherigen Schritten erstellten Datensatzes
5) Erstellen Sie den Iterator, um die erforderlichen Eingaben als Stapel abzurufen (d. h. Mini-Batch)

Eg Code:

from matplotlib.image import imread 
def input_model_function(): 
    csv_filename =['images.txt'] 
    dataset = tf.data.TextLineDataset(csv_filename) 
    dataset = dataset.map(_parse_function) 
    dataset = dataset.batch(20)# you can use any number of batching 
    iterator = dataset.make_one_shot_iterator() 
    sess = tf.Session() 
    batch_images, batch_labels = sess.run(iterator.get_next()) 
return {'x':batch_images}, batch_labels 

def _parse_function(line): 
    image, labels= tf.decode_csv(line,record_defaults=[[""], [0]]) 
    # Decode the raw bytes so it becomes a tensor with type. 
    image = imread(image)# give full path name of image 
return image, labels 

Schließlich Eingang Datensatz in Modell batched (erstellt keine Pre-Made Estimator oder benutzerdefinierten Estimator API)

Verwandte Themen