9

Ich möchte Googles Tensorflow verwenden, um ähnliche Bilder zu einem Eingabebild zurückzugeben.Tensorflow zurück ähnliche Bilder

Ich habe Tensorflow von http://www.tensorflow.org (mit PIP-Installation - Pip und Python 2.7) auf Ubuntu14.04 auf einer virtuellen Maschine CPU installiert.

Ich habe das trainierte Modell Inception-V3 (Anfang-2015-12-05.tgz) von http://download.tensorflow.org/models/image/imagenet/inception-2015-12-05.tgz heruntergeladen, die auf IMAGEnet großen Visual Recognition Herausforderung unter Verwendung der Daten von 2012 trainiert, aber ich denke, dass es sowohl das neuronale Netz hat und der Klassifizierer darin (als Aufgabe war es, die Kategorie vorherzusagen). Ich habe auch die Datei classify_image.py heruntergeladen, die ein Bild in 1 der 1000 Klassen im Modell klassifiziert.

Also ich habe ein zufälliges Bild image.jpg, dass ich laufen, um das Modell zu testen. wenn ich den Befehl ausführen:

python /home/amit/classify_image.py --image_file=/home/amit/image.jpg 

Ich erhalte den folgenden Ausgang: (Klassifizierung erfolgt über softmax)

I tensorflow/core/common_runtime/local_device.cc:40] Local device intra op parallelism threads: 3 
I tensorflow/core/common_runtime/direct_session.cc:58] Direct session inter op parallelism threads: 3 
trench coat (score = 0.62218) 
overskirt (score = 0.18911) 
cloak (score = 0.07508) 
velvet (score = 0.02383) 
hoopskirt, crinoline (score = 0.01286) 

nun an Hand die Aufgabe ist es, Bilder zu finden, die auf das Eingangsbild ähnlich sind (image.jpg) aus einer Datenbank mit 60.000 Bildern (jpg-Format und in einem Ordner unter/home/amit/images). Ich glaube, dass dies getan werden kann, indem die endgültige Klassifizierungsschicht aus dem Modell inception-v3 entfernt wird und der Merkmalsatz des Eingabebildes verwendet wird, um den Kosinusabstand von dem Merkmal zu finden, das alle 60.000 Bilder gesetzt hat, und wir können die Bilder mit weniger Abstand zurückgeben (cos 0 = 1)

Bitte schlagen Sie mir den Weg für dieses Problem vor und wie mache ich das mit Python API.

+0

Ich habe ein paar Lösungen im Kopf, aber ich würde das Problem mehr verstehen mag. Ich nehme an, dass Sie versuchen, alle "Trenchcoats" in den 60.000 Bildern zu finden. Wenn das der Fall ist, können Sie einfach alle 60.000 Bilder durch Inception ausführen, die Bilder extrahieren, bei denen "Trenchcoat" als Top 5 angezeigt wird (fügen Sie einen Schwellenwert hinzu, wenn Sie möchten), und Sie sind fertig. Antwortet das? – jkschin

+0

Danke für die Hilfe. Aber die Sache ist die Bilddatei image.jpg oben ist eigentlich ein Saree, und ich möchte nicht auf die 1000 Klassen im Modell beschränkt werden. Auch wenn ich eine Möglichkeit finde, neue Klassen hinzuzufügen, wird es ein sehr breiter Klassifikator sein und die Beschriftung von Bildern wird eine mühsame Aufgabe sein. Also dachte ich daran, die Klassifizierungsschicht aus dem trainierten Modell zu entfernen und dann den Merkmalsvektor zu verwenden, um die nächsten Bilder zu berechnen. –

+2

Rechts. Die Problemstellung lautet also: "Wie kann ich bei 60.000 Bildern alle Sarees mit einer modifizierten Version von Inception zusammenfassen?". – jkschin

Antwort

7

Ich denke, dass ich eine Antwort auf meine Frage gefunden:

In der Datei classify_image.py, die das Bildmodell unter Verwendung der vorge trainiert klassifiziert (NN + Sichter), habe ich die unten genannten Änderungen (Erklärungen mit #ADDED neben ihnen geschrieben):

def run_inference_on_image(image): 
    """Runs inference on an image. 
    Args: 
    image: Image file name. 
    Returns: 
    Nothing 
    """ 
    if not gfile.Exists(image): 
    tf.logging.fatal('File does not exist %s', image) 
    image_data = gfile.FastGFile(image, 'rb').read() 

    # Creates graph from saved GraphDef. 
    create_graph() 

with tf.Session() as sess: 
# Some useful tensors: 
# 'softmax:0': A tensor containing the normalized prediction across 
# 1000 labels. 
# 'pool_3:0': A tensor containing the next-to-last layer containing 2048 
# float description of the image. 
# 'DecodeJpeg/contents:0': A tensor containing a string providing JPEG 
# encoding of the image. 
# Runs the softmax tensor by feeding the image_data as input to the graph. 
softmax_tensor = sess.graph.get_tensor_by_name('softmax:0') 
feature_tensor = sess.graph.get_tensor_by_name('pool_3:0') #ADDED 
predictions = sess.run(softmax_tensor, 
         {'DecodeJpeg/contents:0': image_data}) 
predictions = np.squeeze(predictions) 
feature_set = sess.run(feature_tensor, 
         {'DecodeJpeg/contents:0': image_data}) #ADDED 
feature_set = np.squeeze(feature_set) #ADDED 
print(feature_set) #ADDED 
# Creates node ID --> English string lookup. 
node_lookup = NodeLookup() 

top_k = predictions.argsort()[-FLAGS.num_top_predictions:][::-1] 
for node_id in top_k: 
    human_string = node_lookup.id_to_string(node_id) 
    score = predictions[node_id] 
    print('%s (score = %.5f)' % (human_string, score)) 

lief ich den pool_3: 0 Tensor durch im image_data es füttern. Bitte lassen Sie mich wissen, wenn ich einen Fehler mache. Wenn das richtig ist, glaube ich, dass wir diesen Tensor für weitere Berechnungen verwenden können.

+0

Wie hat das für Sie geklappt? – jjinking

+1

Ich holte den Pool3-Feature-Set für alle meine 50000 Bilder und dann berechnete ich Cosinus-Abstand mit dem Feature-Set und Rest der Bilder des Eingangsbilds. Es zeigt relevante Ergebnisse, aber die Farbe ist nicht so relevant. –

+0

Hey @AmitMadan, ich frage mich, wie du die "Feature Set" -Daten für all die '50K-Bilder' verwaltet hast? Hast du 'Lucene' benutzt? Oder hast du etwas anderes gemacht? – oak

2

Tensorflow hat jetzt ein schönes Tutorial, wie die Aktivierungen vor der endgültigen Schicht zu erhalten und eine neue Klassifizierung Schicht mit verschiedenen Kategorien umschulen: https://www.tensorflow.org/versions/master/how_tos/image_retraining/

Der Beispielcode :

In Ihrem Fall, ja, können Sie die Aktivierungen von pool_3 die Schicht unter der softmax-Schicht (oder die sogenannten Engpässe) bekommen und sie an andere Operationen als senden Eingang:

retrain imagenet

Schließlich ähnliche Bilder zu finden, ich glaube sehr relevante Darstellung zur Bildsuche nicht IMAGEnet der Engpass Aktivierungen sind. Sie könnten in Erwägung ziehen, ein Autoencoder-Netzwerk mit direkten Bildeingaben zu verwenden.

autoencoder