2016-02-26 1 views
3

J'ai le code Lua qui télécharge une image à partir d'une URL à l'aide d'un luasocket:Convertir des données binaires à la flamme Tensor dans 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 

Pour lire cette image dans un tenseur de la flamme, je l'enregistrer dans un jpg fichier et le lire à l'aide 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') 

est-il un moyen de convertir les données binaires jpg à un tenseur de la torche directement sans faire une lecture à partir et-écriture sur le disque dur? Quelque chose comme:

tensor = CovertBinaryDataToTorchTensor(body) 

Merci!

Répondre

3

Voir image.decompressJPG.

Il vous suffit d'emballer votre chaîne body à l'intérieur d'un ByteTensor. Cela peut être fait en construisant ce tenseur avec un storage qui peut définir son contenu avec string(str).

+0

Merci. C'est la bonne réponse. – siavashk

0

Une solution possible consiste à utiliser graphicsmagick.

local gm = require 'graphicsmagick' 
local img = gm.Image() 
local ok = pcall(img.fromString, img, body) 
img = img:toTensor('float', 'RGB', 'DHW') 

Je trouve cet exemple dans https://github.com/clementfarabet/graphicsmagick/blob/master/test/corrupt.lua et je sais que

local body, code = http.request(image_url) 

retournera body comme une chaîne. Et, évidemment, si pcall renvoie false, l'image était corrompue.