嗨,我正在用Ruby构建一个程序,为网页上的图像生成alt属性。我正在抓取图像的页面,然后将它们的src (换句话说,是一个URL )发送到google云视觉,用于标签检测和其他云视觉方法。每幅图像大约需要2-6秒。我想知道是否有办法缩短响应时间。我首先使用TinyPNG来压缩图像。云视觉( Cloud )速度稍快,但压缩所需时间超过了改进。如何提高响应时间?我会列举一些想法。
1)由于我们要向Google发送一个URL,所以Google需要时间才能收到响应,即来自img_src的响应,然后它才能对图像进行分析。发送base64编码的图像更快吗?用什么最快的方式发送(或者说真的是谷歌接收到的)图像?
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的标签似乎没有多大帮助。这样会加快图像检索/处理时间吗?
开放的任何建议,如何加快响应时间从云视觉。
发布于 2017-07-16 08:40:14
TL;DR -您可以利用云视觉注释API中的批处理支持。
较长版本
Google支持在对API接口的单个调用中批处理多个请求。还有这些限制是用于云视觉的
您可以通过一次批处理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发布于 2017-07-12 05:01:25
所以你用Ruby从页面上抓取一些图像,然后把图像发送到Google,对吗?
为什么您可能不想对图像进行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在这里有一个非常扎实的流程:使用JSON发出Vision请求。
如果您不能点击它(或者太懒了),我在这里提供了请求主体在其API中应该是什么样子的零上下文副本和粘贴:
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?)按需要播放哈希格式和值。当你的问题非常含糊的时候,这就是我能给你的最好的想法。
https://stackoverflow.com/questions/45048382
复制相似问题