2015-12-09 22 views
22

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).

+0

Anatra di gomma: durante il googleing su "CNN addestrato su ImageNet", ho trovato questo: http://www.vlfeat.org/matconvnet/pretrained/ – Herbert

+1

Ho potuto compilare ed eseguire questa rete sul mio laptop -, e usare il webcam per identificare/classificare le immagini github.com/sermanet/OverFeat –

risposta

18

Il team TensorFlow ha recentemente rilasciato una profonda CNN addestrata sul set di dati ImageNet. È possibile scaricare lo script che recupera i dati (compreso il grafico del modello e i pesi addestrati) da here. Lo Image Recognition tutorial associato contiene ulteriori dettagli sul modello.

Mentre il modello corrente non è specificamente confezionato per essere utilizzato in una successiva fase di addestramento, è possibile esplorare la modifica dello script per riutilizzare parti del modello e pesi addestrati nella propria rete.

+0

Questo sembra fantastico, quando lo faccio funzionare accetterò :) classify_image suggerisce che si traduce in un'etichetta. Voglio un vettore di funzionalità, dal momento che le mie etichette non sono quelle di ImageNet. – Herbert

+4

Uso di questi commenti come da registro: presupponendo di usare 'softmax_tensor = sess.graph.get_tensor_by_name ('pool_3: 0')' invece di 'softmax_tensor = sess.graph.get_tensor_by_name ('softmax: 0')' per ottenere funzionalità. – Herbert

+0

Ho notato che il 'feed_dict' di questa particolare rete ha un' 'DecodeJpeg/contents: 0'' (penso che questo sia definito nel file 'classify_image_graph_def.pb'), sapresti come trovare le possibili configurazioni di feed_dict sono possibili? Posso anche lanciare un array numpy con l'immagine lì dentro? – Herbert

Problemi correlati