Google Cloud Vision返回空响应

时间:2018-08-01 20:48:41

标签: c# google-api google-cloud-vision

我正在尝试构建一个C#库,该库将用作一组Google API的包装。使用Google Vision API时,我发现该API对于某些查询返回了空的响应集。例如,当我尝试在car.png上运行FACE_ANNOTATION时,我得到的响应是:

{
  "responses": [
    {}
  ]
}

我已经消除了所有基本问题,例如将图像存储在Google Cloud存储桶中,图像的公共访问权限,有效的API密钥以及从Google API仪表板启用API。

下面是我发出请求的代码段:

httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

// The API address to which we will make the HTTP POST query
String request_query = "v1/images:annotate?" + $"key={APIKey}";
HttpResponseMessage response = await httpClient.PostAsJsonAsync(request_query, imageRequests);

Stream stream = await response.Content.ReadAsStreamAsync();
StreamReader streamReader = new StreamReader(stream);
String response_str = streamReader.ReadToEnd();        
Console.WriteLine(response_str);

if (response.IsSuccessStatusCode) {
    try {
        imageResponseList = JsonConvert.DeserializeObject<AnnotateImageResponseList>(response_str);

     } catch (JsonSerializationException e) {
         Debug.WriteLine(e.StackTrace);
     }
}

这是发送到API的请求正文(在我上面的代码中称为imageRequests):

{
  "requests": [
    {
      "image":
       {
         "content":"",
         "source":
         {
           "imageUri":"gs://<google_cloud_bucket>/car.png"
         }
       },
       "features":[
         {
           "type":0,
           "maxResults":100,
           "model":"builtin/stable"
         } 
       ],
       "imageContext":null
    }
  ]
}

现在,我知道已经有一个C#客户端可以直接使用,但是我正在从事的项目需要我通过HTTP请求访问REST API。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

您尝试执行的操作API请求格式错误。

您正在指定contentsource字段。 Vision API images.annotate documentation指定:

  

如果为图像同时提供内容和来源,则内容优先,并用于执行图像注释请求。

您指定的content为空,API没有任何作用,因此响应也为空。删除content可以避免此问题。

type字段也有问题。在images.annotate documentation中尝试使用API​​时,建议在类型字段中输入以下内容:

  

期望以下其中一项:[“ TYPE_UNSPECIFIED”,“ FACE_DETECTION”,“ LANDMARK_DETECTION”,“ LOGO_DETECTION”,“ LABEL_DETECTION”,“ TEXT_DETECTION”,“ DOCUMENT_TEXT_DETECTION”,“ SAFE_SEARCH_DETECTION”,“ IMAGE_PROPERTIS”,“ ]。

您还可以将字段设置为类似"type": "0""type": 0的位置,以指向期望值数组上的特定位置,但是我认为其他选项更具描述性。 0的值等于"TYPE_UNESPECIFIED",它也会产生一个空答案。

此请求对我有用:

{
  "requests": [
    {
      "image": {
        "source": {
          "imageUri": "gs://<google_cloud_bucket>/car.png"
        }
      },
      "features": [
        {
          "type": "FACE_DETECTION",
          "maxResults": 100,
          "model": "builtin/stable"
        }
      ],
      "imageContext": null
    }
  ]
}

答案 1 :(得分:0)

请求json可以从BatchAnnotateImagesRequest对象进行序列化(.ToString()就足够了。)

对于响应,最好使用内置的

BatchAnnotateImagesResponse.Parser.ParseJson(response_str)

希望这会有所帮助。