2016-02-26 15 views
3

У меня есть Lua код, который загружает изображение из URL с помощью luasocket:Преобразование двоичных данных в факеле Тензор в Lua

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 

Для того, чтобы прочитать это изображение в тензор факела, я сохранить его в формате 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) 

Спасибо!

ответ

3

См. image.decompressJPG.

Сначала вам нужно упаковать строку body внутри ByteTensor. Это можно сделать, построив этот тензор с помощью storage, который может установить его содержимое с помощью string(str).

+0

Спасибо. Это правильный ответ. – siavashk

0

Одним из возможных решений является использование графики.

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, изображение было повреждено.