来自 Google Vision API 的空响应,图像存储在 Google Cloud Storage 中

Empty response from Google Vision API with an image stored in Google Cloud Storage

我正在尝试使用云视觉 API,我能够成功发出请求,但我的响应返回为空,即使 API 文档中提供了测试图像。

请求正文:

const imagePath = `gs://[bucket_name]/faulkner.jpg`;
const requestObject = {
  requests: [
    {
      image: {
        source: {
          gcsImageUri: imagePath
        }
      },
      features:[
        {
          type: 'LABEL_DETECTION',
          maxResults: 100
        }
      ]
    }
  ]
};

faulkner.jpg

响应正文:

{
  "responses": [{}]
}

我什至尝试过使用云 API 控制台并复制请求字段,但这也行不通

const apiKey = 'myAPIKey';
const fields = `fields=responses(labelAnnotations)&`;
const visionAPI = `https://vision.googleapis.com/v1/images:annotate?${fields}key=${apiKey}`;

如有任何帮助,我们将不胜感激。

您是否使用适当的令牌执行 OAuth2。要将 Vision API 与 gCS 图像一起使用,我们不能只使用 API 键。

您是否尝试过使用 oauth2 访问密钥发出请求?如果您有 gcloud 工具,有一种快速而简单的方法可以在命令行上进行测试:

  • Create and download a service account json key
  • 设置 gcloud 以使用该服务帐户:

    gcloud auth activate-service-account --key-file <service-account-file.json>
    
  • 使用 gcloud auth print-access-token 获取访问令牌并使用它执行 curl 请求:

    curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        -H "content-type: application/json" \
        --data-binary '{"requests": [{"image": {"source": {"gcs_image_uri": "gs://your-bucket/your-object.jpg"}}, "features":  [{"type": "LABEL_DETECTION", "maxResults": 100}]}]}' \
        "https://vision.googleapis.com/v1/images:annotate?alt=json"
    

不过,对于生产用途,您需要明确使用 oauth2 flow 来获取您的访问令牌,因为它们是短暂的并且需要刷新。

我遇到了这个问题,这对我有用...

  1. 您不需要 OAuth,只需要一个 API 密钥。

这是我做错了...

在我的 HTTP 调用中,我需要将我的请求包装在一个新的对象文字中,如

{data: requestBody }

澄清一下,

// My old call
HTTP.call("POST", "https://vision.googleapis.com/v1/images:annotate?key=myAPIKey", requestBody, myCallback);

// To my new call
HTTP.call("POST", "https://vision.googleapis.com/v1/images:annotate?key=myAPIKey", {data: requestBody}, myCallback);

// reqeustBody example

{
  "requests":
    [
      {
        "features":
          [
            {
              "type": "LABEL_DETECTION"
            } 
          ],
        "image":
          {
            "source":
              {
                "gcsImageUri": "gs://myBucketNameHere/myDemoImageNameHere.jpg"
              }
          }
      }
    ]
  }

注意:需要做的几件事。

  1. 图像在您的 Google 云平台存储桶中。
  2. 调用中的图像名称与存储中的名称完全一致。
  3. 图像必须有可检测的东西,即如果使用 FACE_DETECTION,图像必须有人脸。
  4. Google 云平台存储 中的图像必须 选中才能公开共享

我正在对名为 demo-image.jpg 的图像使用与上面完全相同的调用,现在我包装了 requestBody 后一切正常。