【问题标题】:How to send Base64 image to Google Cloud Vision API label detection in Ruby?如何将 Base64 图像发送到 Ruby 中的 Google Cloud Vision API 标签检测?
【发布时间】:2017-12-16 07:59:16
【问题描述】:

您好,我正在用 Ruby 构建一个程序来为网页上的图像生成 alt 属性。我正在抓取图像的页面,然后将它们的 src(即 URL)发送到 google-cloud-vision 以进行标签检测和其他 Cloud Vision 方法。每张图像大约需要 2-6 秒。我想知道是否有任何方法可以减少响应时间。我首先使用 TinyPNG 来压缩图像。 Cloud Vision 稍微快了一点,但压缩所需的时间超过了改进。如何提高响应时间?我会列出一些想法。

1) 由于我们向 Google Cloud 发送 URL,Google Cloud 需要一些时间才能收到来自 img_src 的响应,然后才能分析图像。发送 base64 编码的图像更快吗?发送(或真正让 Google 接收)图片的最快形式是什么?

cloud_vision = Google::Cloud::Vision.new project: PROJECT_ID
@vision = cloud_vision.image(@file_name)
@vision.labels #or @vision.web, etc.

2) 我当前的标签检测代码。第一个问题:发送 JSON 请求是否比在 Google Cloud 项目上调用 Ruby(标签或 Web)方法更快?如果是这样,我应该限制响应吗?置信度分数低于 0.6 的标签似乎没有多大帮助。这会加快图像记录/处理时间吗?

欢迎就如何加快 Cloud Vision 的响应时间提出任何建议。

【问题讨论】:

  • 请对提供的答案留下反馈。它对你有用吗?如果不是,为什么?
  • 您最好将图像保存到文件然后发送——ruby Cloud Vision 库有方法。如果您将图像作为 String 对象发送,您会为它消耗 RAM,如果 Net::HTTP 库无论如何都会将有效负载转换为临时文件(如果它足够大),我不会感到惊讶。

标签: ruby google-app-engine web-scraping google-cloud-vision


【解决方案1】:

TL;DR - 您可以利用 Cloud Vision 注释 API 中的批处理支持。

加长版

Google Cloud Vision API 支持在对 images:annotate API 的一次调用中批量处理多个请求。还有these limits which are enforced for Cloud Vision

  • 每个请求最多 16 张图片
  • 每张图片最多 4 MB
  • 最大总请求大小为 8 MB。

您可以通过一次批处理 16 个来减少请求数量(假设您没有超出请求中的任何图像大小限制):

#!/usr/bin/env ruby

require "google/cloud/vision"

image_paths = [
  ...
  "./wakeupcat.jpg",
  "./cat_meme_1.jpg",
  "./cat_meme_2.jpg",
  ...
]

vision = Google::Cloud::Vision.new
length = image_paths.length

start = 0
request_count = 0
while start < length do
  last = [start + 15, length - 1].min
  current_image_paths = image_paths[start..last]
  printf "Sending %d images in the request. start: %d last: %d\n", current_image_paths.length, start, last
  result = vision.annotate *current_image_paths, labels: 1
  printf "Result: %s\n", result
  start += 16
  request_count += 1
end

printf "Made %d requests\n", request_count

【讨论】:

    【解决方案2】:

    所以您使用 Ruby 从页面上抓取一些图像,然后将图像发送给 Google,是吗?

    为什么你可能不想对图像进行base64编码:

    • 无头抓取变得更加网络密集。您必须下载图像才能对其进行处理。
    • 现在您还需要担心添加 base64 编码过程
    • 如果您不只是将图像保存在内存中,则可能存在存储问题(如果您这样做,调试会变得更具挑战性

    为什么您可能想要对图像进行 base64 编码:

    • 图片不可公开访问
    • 无论如何您都必须存储图像

    一旦您权衡了选择,如果您仍想将图像转换为 base64,您可以这样做:

    require 'base64'
    Base64.encode(image_binary)
    

    真的就是这么简单。

    但是如何以二进制形式获取该图像?

    require 'curb'
    # This line is an example and is not intended to be valid
    img_binary = Curl::Easy.perform("http://www.imgur.com/sample_image.png").body_str
    

    如何将其发送给 Google?

    Google 在这里对此过程进行了非常可靠的描述:Make a Vision API Request in JSON

    如果你不能点击它(或者懒得点击它),我在这里提供了一个请求正文的零上下文复制和粘贴:

    request_body_json = {
      "requests":[
        {
          "image":{
            "content":"/9j/7QBEUGhvdG9...image contents...eYxxxzj/Coa6Bax//Z"
          },
          "features":[
            {
              "type":"LABEL_DETECTION",
              "maxResults":1
            }
          ]
        }
      ]
    }
    

    所以现在我们知道请求在正文中应该是什么样子了。如果您已经在 POST 请求中发送 img_src,那么就这么简单:

    require 'base64'
    require 'curb'
    requests = []
    for image in array_of_image_urls
      img_binary = Curl::Easy.perform(image).body_str
      image_in_base64 = Base64.encode(image_binary)
      requests << { "image" => { "content" : image_in_base64 }, "imageContext" => "<OPTIONAL: SEE REFERENCE LINK>", "features" => [ {"type" => "LABEL_DETECTION", "maxResults" => 1 }]}
    end
    
    # Now just POST requests.to_json with your Authorization and such (You did read the reference right?)
    

    根据需要使用散列格式和值。这是总体思路,当您的问题非常模糊时,这是我能给您的最好的。

    【讨论】:

    • 感谢您的冗长解释。真的很感激;我只关心速度。对图像进行 base64 编码是没有意义的。由于我已经打开了带有图像的网页,因此似乎可以更快地进行编码,将其转换为字符串,这样 Google 就不必打开该页面。无论如何,我已经修改了我原来的帖子。非常感谢您的想法。
    • @aaronbnb 你想让谷歌尽可能快地做 alt-tags 是吗?那么为什么要让他们的服务在图像上获取 IO?在 Base64 中发送图像是图像,服务不必自己获取图像。这可能不是一个很大的改进,但它会有所作为。 ruby 库只是向 google 发送格式化的请求。在它上面使用手动 JSON 没有任何改进。限制标签可能不是一个有效的策略,因为我不知道图像处理器是如何工作的,但我假设限制标签只会限制你返回的输出。
    猜你喜欢
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多