Deep Learning wurde erfolgreich auf mehrere große Datensätze für die Klassifizierung einer Handvoll Klassen (Katzen, Hunde, Autos, Flugzeuge, etc.), mit Leistungen schlagen einfachere Deskriptoren wie Taschen von Features über SIFT, Farbhistogramme etc.Extrahieren Funktionen mit vortrainiert (Tensorflow) CNN
Dennoch erfordert das Training eines solchen Netzwerkes eine Menge Daten pro Klasse und viel Trainingszeit. Allerdings hat man oft nicht genug Daten oder möchte nur eine Vorstellung davon bekommen, wie gut ein konvolutionelles neuronales Netzwerk funktioniert, bevor man Zeit benötigt, um ein solches Gerät zu entwerfen und zu trainieren und die Trainingsdaten zu sammeln.
In diesem speziellen Fall ist es möglicherweise ideal, ein Netzwerk mit einigen Benchmark-Datensätzen zu konfigurieren und zu trainieren, die von den hochmodernen Veröffentlichungen verwendet werden, und es einfach auf einige Datensätze anzuwenden, die Sie als Funktion haben könnten Extraktor.
Daraus ergibt sich eine Reihe von Features für jedes Bild, das man zu einem klassischen Klassifikationsverfahren wie SVM ist, logistische Regression, neuronale Netze speisen könnte, usw.
Insbesondere dann, wenn man nicht genügend Daten zu trainieren der CNN, ich kann erwarten, dass dies eine Pipeline übertrifft, in der der CNN an wenigen Proben trainiert wurde.
Ich habe mir die Tensorflow-Tutorials angesehen, aber sie scheinen immer eine klare Trainings-/Testphase zu haben. Ich konnte keine Pickle-Datei (oder ähnliches) mit einem vorkonfigurierten CNN-Feature-Extraktor finden.
Meine Fragen sind: Sind solche vortrainierten Netzwerke vorhanden und wo finde ich sie? Alternativ: Macht dieser Ansatz Sinn? Wo kann ich CNN + Gewichte finden?
BEARBEITEN W.r.t. @ John Kommentar habe ich versucht, 'DecodeJpeg:0'
und 'DecodeJpeg/contents:0'
und überprüft die Ausgänge verwenden, die unterschiedlich sind (: S)
import cv2, requests, numpy
import tensorflow.python.platform
import tensorflow as tf
response = requests.get('https://i.stack.imgur.com/LIW6C.jpg?s=328&g=1')
data = numpy.asarray(bytearray(response.content), dtype=np.uint8)
image = cv2.imdecode(data,-1)
compression_worked, jpeg_data = cv2.imencode('.jpeg', image)
if not compression_worked:
raise Exception("Failure when compressing image to jpeg format in opencv library")
jpeg_data = jpeg_data.tostring()
with open('./deep_learning_models/inception-v3/classify_image_graph_def.pb', 'rb') as graph_file:
graph_def = tf.GraphDef()
graph_def.ParseFromString(graph_file.read())
tf.import_graph_def(graph_def, name='')
with tf.Session() as sess:
softmax_tensor = sess.graph.get_tensor_by_name('pool_3:0')
arr0 = numpy.squeeze(sess.run(
softmax_tensor,
{'DecodeJpeg:0': image}
))
arr1 = numpy.squeeze(sess.run(
softmax_tensor,
{'DecodeJpeg/contents:0': jpeg_data}
))
print(numpy.abs(arr0 - arr1).max())
So ist die maximale absolute Differenz 1.27649
, und alle Elemente im Allgemeinen unterscheiden sich (vor allem seit dem Durchschnitt Wert der arr0
und arr1
selbst liegt zwischen 0 - 0,5).
Ich würde auch erwarten, dass 'DecodeJpeg:0'
braucht eine jpeg-Zeichenfolge, kein numpy Array, warum sonst enthält der Name 'Jpeg'. @John: Könnten Sie sagen, wie Sie sicher über Ihren Kommentar sind?
Also ich bin mir nicht sicher, was ist was, wie ich erwarten würde, dass ein trainiertes neuronales Netzwerk deterministisch (aber höchstens chaotisch) ist.
Rubber duck: wenn googeln auf "CNN trainiert auf ImageNet", fand ich das: http://www.vlfeat.org/matconvnet/pretrained/ – Herbert
Ich konnte dieses Netzwerk auf meinem Laptop kompilieren und ausführen - und das verwenden Webcam zum Identifizieren/Klassifizieren von Bildern github.com/sermanet/OverFeat –