【问题标题】:Google Cloud Vision returns empty responseGoogle Cloud Vision 返回空响应
【发布时间】:2018-08-01 20:48:41
【问题描述】:

我正在尝试构建一个 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。

任何帮助将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    API 请求的格式不正确。

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

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

    您指定的content 是空的,API 没有可使用的,所以响应也是空的。删除content 以避免此问题。

    type 字段也存在问题。在尝试images.annotate documentation 中的API 时,它建议type 字段如下:

    应为 ["TYPE_UNSPECIFIED"、"FACE_DETECTION"、"LANDMARK_DETECTION"、"LOGO_DETECTION"、"LABEL_DETECTION"、"TEXT_DETECTION"、"DOCUMENT_TEXT_DETECTION"、"SAFE_SEARCH_DETECTION"、"IMAGE_PROPERTIES"、"CROP_HINTS"、"WEB_DETECTION" 之一].

    您还可以将该字段设置为 "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
        }
      ]
    }
    

    【讨论】:

    • 感谢您的回复。我自己做了一些挖掘,似乎是功能类型导致了这个问题。与 Vision API 文档相比,我创建了一个枚举,其中一些项目是乱序的。这导致了错误的识别和空洞的回应。解决这个问题。
    【解决方案2】:

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

    至于响应,你最好使用内置的

    BatchAnnotateImagesResponse.Parser.ParseJson(response_str)
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      • 1970-01-01
      • 2019-10-13
      • 2019-04-03
      相关资源
      最近更新 更多