2017-06-22 1 views
3

J'essaie de créer un modèle ML Core à partir de Places205 - GoogLeNet, comme décrit par Apple here.La conversion du modèle ML Core échoue avec "Impossible de déduire le nom et les dimensions de l'entrée"

Je ne veux pas utiliser le modèle ready-made par Apple, alors je suis le modèle original de ce lien: https://developer.apple.com/machine-learning/model-details/Places205-GoogLeNet.txt

Comme par session WWDC d'Apple, nous pouvons convertir ce modèle en utilisant Coremltools. Dans leur session, nous ne savons pas quel IDE ils utilisent pour le codage Python mais actuellement j'utilise Pycharm pour le codage Python. En utilisant le lien vers le modèle, nous pouvons obtenir deux choses .caffemodel et .prototext. J'ai essayé de convertir ces utilisant coremltools et reçu l'erreur suivante:

RuntimeError: Unable to infer input name and dimensions. Please provide a .prototxt file with 'Input' layer and dimensions defined. 

Donc, si les modèles donnés d'Apple ne convertissez pas alors comment nous pouvons dire autre modèle open source va fonctionner?

Vous pouvez voir ma base de code dans la capture d'écran ci-jointe.

Comment cette erreur peut-elle être réparée?

enter image description here

+2

Vous n'utilisez probablement pas le bon fichier .prototxt. Généralement, il y en a un appelé xxx_deploy.prototxt. Utilisez celui-là à la place. –

+0

Mais je l'ai eu du site d'Apple. Ils ont créé leur modèle à partir de là, alors comment ça devrait être faux? J'ai obtenu des fichiers de ce lien - http://places.csail.mit.edu/model/googlenet_places205.tar.gz –

+0

J'ai utilisé "deploy_places205.protxt", ce n'est pas l'extension avec ".prototext" mais cette fois cela fonctionne et compile avec succès. Merci @MatthijsHollemans pour vos contributions. Je vais chercher plus dans ce jusqu'à la création de mon propre modèle. –

Répondre

4

Il ressemble à Matthijs résolu votre problème de base avec son commentaire ci-dessus, mais je peux développer que pour les futurs qui rencontrent ce avec d'autres modèles. Lors de la conversion d'un modèle Caffe en fichier .mlmodel à l'aide de coremltools d'Apple, le convertisseur d'Apple prend à la fois le binaire .caffemodel (contenant la structure du modèle et les poids), ainsi qu'une description du modèle .prototxt basée sur le texte (qui peut avoir un peu plus de contexte que le .caffemodel fait).

Souvent, les modèles formés Caffe auront quelques différents fichiers .prototxt avec eux (deploy.prototxt, solver.prototxt, train.prototxt), et que vous voulez généralement utiliser la deploy.prototxt (ou prototxt du même nom).

Même si vous le faites, vous pouvez toujours rencontrer une erreur à propos de coremltools étant "Impossible de déduire le nom d'entrée et les dimensions". Les modèles Caffe n'ont pas d'obligation explicite d'indiquer les dimensions d'entrée que le modèle va accepter, donc coremltools essaie de déduire cela à partir de quelques sources différentes. Si ces sources sont manquantes, vous devrez peut-être les éditer dans le fichier .prototxt.

Dans ce qui précède lié deploy_places205.protxt, cette taille d'entrée est spécifiée par le code suivant en haut du fichier:

input: "data" 
input_dim: 10 
input_dim: 3 
input_dim: 224 
input_dim: 224 

mais vous pouvez aussi voir ce qui suit dans une de ces descriptions .prototxt:

input: "data" 
input_shape { 
    dim: 1 
    dim: 3 
    dim: 227 
    dim: 227 
} 

Si vous avez un fichier .prototxt qui manque ce pour son entrée, vous pouvez ajouter une ou l'autre de droite ci-dessus avant la première layer { instance dans le fichier. Les dimensions sont, dans l'ordre: taille du lot (ignorée par Core ML), canaux de couleur, largeur de l'image, hauteur de l'image. Vous pouvez les ajuster pour correspondre à ce que le réseau attend.

Vous devrez peut-être également vérifier que "données" est la couche d'entrée utilisée par le modèle, recherchez donc la première instance layer { et vérifiez qu'elle indique bottom: "data" à l'intérieur.Si le nom de la couche est différent, vous devrez peut-être le modifier ici ou dans le nom de la couche de données.

Vous pouvez également avoir besoin de définir le nom de votre couche de données dans le convertisseur coremltools pour vous assurer qu'il prend le bon. Pour référence, voici le petit script Python que j'utilise pour convertir un modèle comme celui-ci:

import coremltools 

coreml_model = coremltools.converters.caffe.convert(('mymodel.caffemodel', 'deploy.prototxt'), 
                image_input_names = "data", 
                is_bgr = True, 
                class_labels='labels.txt' 
                ) 


coreml_model.save('MyModel.mlmodel') 
+1

Merci brad Larson pour une réponse plus détaillée. Si nous n'avons pas de labels.txt alors coremltools fonctionne? J'ai essayé de convertir un modèle de caffe - https://github.com/yahoo/open_nsfw, et ils n'ont aucune étiquette. J'ai eu du succès pour créer mon .mlmodel. Mais cela ne fonctionne pas dans Xcode. Y a-t-il des exigences spécifiques pour cela? –

+0

@AmritTrivedi - Je ne crois pas que vous ayez besoin des étiquettes, elles servent simplement à mapper les sorties numériques aux étiquettes de texte. Vous pouvez faire cela vous-même plus tard (sachant que la classe 0 est "chien", la classe 1 est "chat", ou peu importe). Le modèle NSFW est binaire, il n'y a donc pas besoin d'étiquettes. –

+0

J'essaie de convertir: http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel en utilisant https://github.com/BVLC/caffe/blob/master/models/bvlc_reference_caffenet/deploy.prototxt en utilisant ce code : coreml_model = coremltools.converters.caffe.convert (('bvlc_reference_caffenet.caffemodel', 'deploy.prototxt')) –