2

J'ai un modèle CNN (Training Model) déployé dans Google Cloud Platform, à partir duquel je peux obtenir des prédictions en utilisant la bibliothèque client Python ou la commande gcloud.API Google Cloud Machine Learning Dot Net Client - Prédire la requête

Je suis maintenant en train d'utiliser le v1.25 client Dot Net (https://github.com/google/google-api-dotnet-client/tree/v1.25.0) pour obtenir des prédictions, mais la demande ne parvient pas à {"error": "Missing "instances" field in request body."} même si le JSON j'envoie est de la forme:

{"instances": [{"image":<base64ImageData>, "key":"1"}]} 

Je peux utiliser la bibliothèque pour obtenir une liste des modèles disponibles en utilisant la méthode List().

code

est la suivante:

using System; 
using System.Text; 
using Google.Apis.Auth.OAuth2; 
using System.IO; 
using Google.Apis.Services; 
using Google.Apis.CloudMachineLearningEngine.v1beta1.Data; 
using Newtonsoft.Json; 

namespace GoogleCloudTesting 
{ 
    Class Program 
    { 
     static void Main(string[] args) 
     { 
      GoogleCredential credential = GoogleCredential.GetApplicationDefaultAsync().Result; 

      var service = new Google.Apis.CloudMachineLearningEngine.v1beta1.CloudMachineLearningEngineService(
       new BaseClientService.Initializer() 
       { 
        HttpClientInitializer = credential, 
        ApplicationName = "Testing" 
       } 
      ); 

      string jsonImagesPath = @"c:\path\to\images.json"; // {"instances": [{"image":<base64imagedata>, "key":"1"}]} 
      string json = File.ReadAllText(jsonImagesPath); 

      var request = new GoogleCloudMlV1beta1PredictRequest 
      { 
       HttpBody = new GoogleApiHttpBody { Data = json } 
      }; 

      var predictRequest = service.Projects.Predict(request, "projects/my_project/models/my_model/versions/V1"); 
      var result = predictRequest.Execute(); 
      Console.WriteLine(result.Data); // null 
     } 
    } 
} 

Toute aide appréciée, merci.

+0

https://cloud.google.com/ml-engine/reference/rest/v1/projects/predict qu'indiquent les données codées en base64 doit être remplacé par un objet JSON avec un seul attribut nommé 'b64'. Alors peut-être vous devez utiliser: {"instances": [{"image": {"b64": ""}, "key": "1"}]} – Chris

+0

Je vois une différence subtile par rapport à la version Python (https://cloud.google.com/ml-engine/docs/how-tos/online-predict#requesting_predictions), mais je ne connais pas assez la librairie .net pour la résoudre avec certitude. La différence est que HttpBody n'est pas utilisé en Python. Au lieu de cela, quelque chose de plus comme service.Projects.Predict (body = json, name = "projets/my_project/models/my_model/versions/V1"). Encore une fois, je ne peux pas garantir exactement que cela fonctionnera, mais je suis assez sûr que le problème est le HttpBody. – rhaertel80

+0

Veuillez suivre les instructions ici: https://googlecloudplatform.github.io/google-cloud-dotnet/docs/faq.html#how-can-i-trace-requests-and-responses-in-rest-based-apis pour vider les en-têtes et le corps de la requête HTTP. Ensuite, postez la décharge ici. –

Répondre

0

Ceci est un problème connu.

sont présentés deux contournements dans github issue#1068