我有Lua代码,可以使用luasocket从url下载图像:
local http = require('socket.http')
local image = require('image')
image_url = 'https://www.somedomain.com/someimage.jpg'
local body, code = http.request(image_url) -- body has jpg binary data
if not body then error(code) end -- check for errors
为了将此图像读入Torch张量,我将其保存在jpg文件中并使用image.load
读取:
-- open a file in binary mode to store the image
local f = assert(io.open('./temp.jpg', 'wb'))
f:write(body)
f:close()
tensor = image.load('temp.jpg')
有没有办法直接将二进制jpg数据转换为火炬张量,而无需从硬盘驱动器进行写入和读取?像这样:
tensor = CovertBinaryDataToTorchTensor(body)
谢谢!
参见image.decompressJPG。
你只需要先把你的body
字符串打包在一个字节张量中。这可以通过使用存储构造此张量来完成,该存储可以使用string(str)设置他的内容。
一个潜在的解决方案是使用graphicsmagick。
local gm = require 'graphicsmagick'
local img = gm.Image()
local ok = pcall(img.fromString, img, body)
img = img:toTensor('float', 'RGB', 'DHW')
我在 https://github.com/clementfarabet/graphicsmagick/blob/master/test/corrupt.lua 中找到了这个例子,我知道
local body, code = http.request(image_url)
将以字符串形式返回body
。而且,显然,如果pcall
返回 false,则图像已损坏。