首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将Base64图像发送到标签检测?

如何将Base64图像发送到标签检测?
EN

Stack Overflow用户
提问于 2017-07-12 04:21:07
回答 2查看 4.2K关注 0票数 3

嗨,我正在用Ruby构建一个程序,为网页上的图像生成alt属性。我正在抓取图像的页面,然后将它们的src (换句话说,是一个URL )发送到google云视觉,用于标签检测和其他云视觉方法。每幅图像大约需要2-6秒。我想知道是否有办法缩短响应时间。我首先使用TinyPNG来压缩图像。云视觉( Cloud )速度稍快,但压缩所需时间超过了改进。如何提高响应时间?我会列举一些想法。

1)由于我们要向Google发送一个URL,所以Google需要时间才能收到响应,即来自img_src的响应,然后它才能对图像进行分析。发送base64编码的图像更快吗?用什么最快的方式发送(或者说真的是谷歌接收到的)图像?

代码语言:javascript
复制
cloud_vision = Google::Cloud::Vision.new project: PROJECT_ID
@vision = cloud_vision.image(@file_name)
@vision.labels #or @vision.web, etc.

2)我目前的标签检测代码。第一个问题:在上发送JSON请求比调用Ruby (label或web)方法更快吗?如果是的话,我是否应该限制回应?得分低于0.6的标签似乎没有多大帮助。这样会加快图像检索/处理时间吗?

开放的任何建议,如何加快响应时间从云视觉。

EN

回答 2

Stack Overflow用户

发布于 2017-07-16 08:40:14

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

较长版本

Google支持在对API接口的单个调用中批处理多个请求。还有这些限制是用于云视觉的

  • 每次请求最多16张图像
  • 每幅图像最多4MB
  • 最多8 MB的总请求大小。

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

代码语言:javascript
复制
#!/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
EN

Stack Overflow用户

发布于 2017-07-12 05:01:25

所以你用Ruby从页面上抓取一些图像,然后把图像发送到Google,对吗?

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

  • 无头抓取变得更加网络密集。您必须下载图像,然后处理它。
  • 现在,您还必须担心添加base64编码过程。
  • 如果您不只是将映像保存在内存中(如果这样做,调试就会变得更具有挑战性),可能会引起存储问题。

为什么要对图像进行base64编码:

  • 该图像不可公开访问。
  • 无论如何,你必须保存图像。

一旦您权衡了这些选择,如果您仍然希望将图像输入到base64中,下面是您如何做到的:

代码语言:javascript
复制
require 'base64'
Base64.encode(image_binary)

这真的很容易。

但是我怎样才能得到二进制图像呢?

代码语言:javascript
复制
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在这里有一个非常扎实的流程:使用JSON发出Vision请求

如果您不能点击它(或者太懒了),我在这里提供了请求主体在其API中应该是什么样子的零上下文副本和粘贴:

代码语言:javascript
复制
request_body_json = {
  "requests":[
    {
      "image":{
        "content":"/9j/7QBEUGhvdG9...image contents...eYxxxzj/Coa6Bax//Z"
      },
      "features":[
        {
          "type":"LABEL_DETECTION",
          "maxResults":1
        }
      ]
    }
  ]
}

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

代码语言:javascript
复制
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?)

按需要播放哈希格式和值。当你的问题非常含糊的时候,这就是我能给你的最好的想法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45048382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档