2017-08-21 1 views
1

J'utilise un modèle reste api pour faire la demande suivante:Comment obtenir la valeur désirée de cette demande?

def predict(path): 
    with open(path) as img: 
      res = vr.classify(images_file=img, threshold=0, classifier_ids=['food']) 
      print res 

Quand je lance mon script je reçois:

{u'images': [{u'image': u'/tacos.jpg', u'classifiers': [{u'classes': [{u'score': 0.0495783, u'class': u'pizza'}, {u'score': 0.553117, u'class': u'tacos'}], u'classifier_id': u'food', u'name': u'food-test'}]}], u'custom_classes': 2, u'images_processed': 1} 

Cependant, je voudrais obtenir juste la classe avec une valeur plus élevée que suit:

this is the corresponding class: tacos 

Je voudrais donc apprécier le soutien de modifier ma fonction afin d'obtenir la sortie désirée

Répondre

1

Qu'en est-il de l'utilisation de la fonction python-native sorted, obtenant le plus haut valeur par identifiant de classificateur? L'utilisation (trop) grands noms d'objets de manière à être clair, et en évitant le code golf, vous pouvez le faire comme suit

def predict(path): 
    with open(path) as img: 
     res = vr.classify(images_file=img, threshold=0, classifier_ids=['food']) 

     dict_of_higher_value_per_ = {} # in order to record and reuse values sooner or later. 
     for image in res['images']: 
      for classifier in image['classifiers']: 
       classes  = classifier['classes'] 
       classifier_id = classifier['classifier_id'] 
       sorted_scores = sorted(classes, 
             key=lambda class_:class_['score'], 
             reverse=True) 
       best_match = sorted_scores[0] # which corresponds to the best score since elements are sorted. 
       dict_of_higher_value_per_[classifier_id] = best_match 

       print "Classifier '{cid}' says this is the corresponding class: {class}".format(cid=classifier_id, 
                           **best_match) 

qui imprime

Classifier 'food' says this is the corresponding class: tacos 
+1

merci beaucoup pour le soutien que j'apprécie vraiment ce – neo33

1

Ceci est un dictionnaire, donc vous pouvez simplement parcourir les 'classes' et trouver le meilleur score. Clause de non-responsabilité: Je ne suis pas un utilisateur de python2 ou de watson.

Pour accéder aux classes

res['images'][0]['classifiers'][0]['classes'] 

Alors pour itérer les classes ...

highest_class = ['', 0] 
for class in res['images'][0]['classifiers'][0]['classes']: 
    if class['score'] > highest_class[1]: 
     highest_class = [class['class'], [class['score'] 
print "this is the corresponding class: " + highest_class[0] 

Maintenant, bien sûr, si vous avez plus de 1 classificateurs, vous devrez avoir un autre outside for loop pour itérer dans les classificateurs (si vous avez besoin de cette fonctionnalité)

+0

Si vous downvoted ma réponse, Pourrais-je avoir une explication pourquoi? – xNinjaKittyx