web-dev-qa-db-fra.com

Extraire des fonctionnalités à l'aide de CNN pré-formé (Tensorflow)

Le Deep Learning a été appliqué avec succès sur plusieurs grands ensembles de données pour la classification d'une poignée de classes (chats, chiens, voitures, avions, etc.), avec des performances battant des descripteurs plus simples comme des sacs de fonctionnalités sur SIFT, des histogrammes de couleurs, etc.

Néanmoins, la formation d'un tel réseau nécessite beaucoup de données par classe et beaucoup de temps de formation. Cependant, très souvent, on ne dispose pas de suffisamment de données ou veut simplement avoir une idée de la capacité d'un réseau de neurones convolutionnels, avant de consacrer du temps à la conception et à la formation d'un tel appareil et à la collecte des données de formation.

Dans ce cas particulier, il pourrait être idéal d'avoir un réseau configuré et formé à l'aide d'un ensemble de données de référence utilisé par les publications de pointe, et de simplement l'appliquer à certains ensembles de données que vous pourriez avoir comme extracteur de fonctionnalités.

Il en résulte un ensemble de fonctionnalités pour chaque image, que l'on pourrait alimenter à une méthode de classification classique comme les SVM, la régression logistique, les réseaux de neurones, etc.

En particulier, lorsque l'on n'a pas suffisamment de données pour former le CNN, je peux m'attendre à ce que cela surpasse un pipeline où le CNN a été formé sur quelques échantillons.

Je regardais les tutoriels tensorflow, mais ils semblent toujours avoir une phase de formation/test claire. Je n'ai pas pu trouver un fichier pickle (ou similaire) avec un extracteur de fonctionnalités CNN préconfiguré.

Mes questions sont les suivantes: existe-t-il de tels réseaux pré-formés et où puis-je les trouver? Alternativement: cette approche a-t-elle un sens? Où pourrais-je trouver un poids CNN +?

MODIFIER W.r.t. @ commentaire de john J'ai essayé d'utiliser 'DecodeJpeg:0' et 'DecodeJpeg/contents:0' et vérifié les sorties, qui sont différentes (: 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())

La différence absolue maximale est donc 1.27649, et en général tous les éléments diffèrent (d'autant plus que la valeur moyenne de arr0 et arr1 se situe entre 0 et 0,5).

Je m'attendrais également à ce que 'DecodeJpeg:0' a besoin d'une chaîne jpeg, pas d'un tableau numpy, sinon le nom contient 'Jpeg'. @john: Pourriez-vous indiquer à quel point vous êtes sûr de votre commentaire?

Je suppose donc que je ne suis pas sûr de ce qui est quoi, car je m'attendrais à ce qu'un réseau de neurones formé soit déterministe (mais tout au plus chaotique).

23
Herbert

L'équipe TensorFlow a récemment publié un CNN approfondi formé sur l'ensemble de données ImageNet. Vous pouvez télécharger le script qui récupère les données (y compris le graphique du modèle et les poids formés) à partir de ici . Le didacticiel de reconnaissance d'image associé contient plus de détails sur le modèle.

Bien que le modèle actuel ne soit pas spécifiquement conditionné pour être utilisé dans une étape de formation ultérieure, vous pouvez envisager de modifier le script pour réutiliser des parties du modèle et les poids formés dans votre propre réseau.

18
mrry