2

Ich habe ein geschultes Modell (CNN) in der Google Cloud Platform bereitgestellt, von dem ich Vorhersagen mithilfe der Python-Clientbibliothek oder des Befehls gcloud erhalten kann.Google Cloud Machine Learning-API DotNet-Client - Vorhersageanforderung fehlgeschlagen

ich jetzt versuchen, den Dot Net Client v1.25 (https://github.com/google/google-api-dotnet-client/tree/v1.25.0) zu verwenden, um Vorhersagen zu erhalten, aber die Anforderung fehlschlägt mit {"error": "Missing "instances" field in request body."} obwohl die JSON ich das Senden bin von der Form ist:

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

Ich kann die Bibliothek verwenden, um eine Liste der verfügbaren Modelle mit der List() Methode zu erhalten.

-Code lautet wie folgt:

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 
     } 
    } 
} 

Jede geschätzt Hilfe, danke.

+0

https://cloud.google.com/ml-engine/reference/rest/v1/projects/predict schlagen Base64-codierten Daten durch ein JSON Objekt ersetzt werden muss, mit einem einzelnen Attribut namens 'b64'. Also müssen Sie vielleicht verwenden: {"Instanzen": [{"image": {"b64": ""}, "Schlüssel": "1"}]} – Chris

+0

Ich sehe einen feinen Unterschied im Vergleich zur Python-Version (https://cloud.google.com/ml-engine/docs/how-tos/online-predict#requesting_predictions), aber ich kenne die .net-Bibliothek nicht gut genug, um sie mit Sicherheit zu beheben. Der Unterschied ist, dass HttpBody in Python nicht verwendet wird. Stattdessen etwas wie service.Projects.Predict (body = json, name = "projects/mein_projekt/models/my_model/versions/V1"). Auch hier kann ich nicht garantieren, dass das funktioniert, aber ich bin mir ziemlich sicher, dass das Problem der HttpBody ist. – rhaertel80

+0

Bitte folgen Sie den Anweisungen hier: https://googlecloudplatform.github.io/google-cloud-dotnet/docs/faq.html#how-can-i-trace-requests-and-responses-in-rest-based-apis um die HTTP-Anforderungsheader und den Hauptteil auszugeben. Dann poste hier den Dump. –

Antwort

0

Dies ist ein bekanntes Problem.

zwei Umgehungen in github gezeigt issue#1068