Deep Learning è stato applicato con successo su diversi set di dati di grandi dimensioni per la classificazione di una manciata di classi (gatti, cani, automobili, piani, ecc.), Con prestazioni che battono descrittori più semplici come Sacchi di funzionalità su SIFT, istogrammi colore, ecc.Estrarre le funzionalità utilizzando CNN pre-addestrato (Tensorflow)
Tuttavia, la formazione di una tale rete richiede molti dati per classe e molto tempo di formazione. Tuttavia, molto spesso non si hanno dati sufficienti o si vuole solo avere un'idea di quanto una rete neurale convoluzionale possa fare, prima di passare il tempo a progettare e addestrare un dispositivo del genere e raccogliere i dati di addestramento.
In questo caso particolare, potrebbe essere ideale avere una rete configurata e addestrata utilizzando alcuni set di dati di riferimento utilizzati dalle pubblicazioni all'avanguardia e applicarla semplicemente a un insieme di dati che potrebbe essere una funzione estrattore.
Questo si traduce in una serie di funzionalità per ogni immagine, che si potrebbe nutrire per un metodo di classificazione classica come la SVM di, regressione logistica, le reti neurali, ecc
In particolare, quando uno non ha dati sufficienti per la formazione la CNN, mi aspetto che questo superi le prestazioni di un gasdotto in cui la CNN è stata addestrata su pochi campioni.
Stavo guardando i tutorial di tensorflow, ma sembra che abbiano sempre una chiara fase di addestramento/test. Non sono riuscito a trovare un file pickle (o simile) con un estrattore di funzionalità CNN preconfigurato.
Le mie domande sono: esistono reti pre-addestrate e dove posso trovarle. In alternativa: questo approccio ha senso? Dove posso trovare un CNN + pesi?
MODIFICA W.r.t. commento di @ John I provato utilizzando 'DecodeJpeg:0'
e 'DecodeJpeg/contents:0'
e controllato le uscite, che sono differenti (: 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())
Quindi la differenza massima assoluta è 1.27649
, e in generale tutti gli elementi sono molto diverse (in particolare poiché la media valore di arr0
e arr1
si trova tra 0 e 0,5).
Inoltre, mi aspetto che 'DecodeJpeg:0'
abbia bisogno di una stringa jpeg, non di un array numpy, perché altrimenti il nome contiene "Jpeg". @john: Puoi precisare in che modo sei sicuro del tuo commento?
Quindi immagino di non essere sicuro di cosa sia, poiché mi aspetto che una rete neurale addestrata sia deterministica (ma al massimo caotica).
Anatra di gomma: durante il googleing su "CNN addestrato su ImageNet", ho trovato questo: http://www.vlfeat.org/matconvnet/pretrained/ – Herbert
Ho potuto compilare ed eseguire questa rete sul mio laptop -, e usare il webcam per identificare/classificare le immagini github.com/sermanet/OverFeat –