通过本地主机将火炬张量或图像作为 JSON 发送到另一个应用程序
send torch tensor or image via localhost as JSON to another app
我有一个加载了生成器模型的基本 Flask 服务器。我正在通过 JSON 发送一个输入向量,它正在命中生成器,生成器吐出一个预测。这行得通。然后我想将此图像(我愿意将其作为我可以在另一端重建的任何类型的数据发送)发送到同一台机器上的另一个应用程序 运行。据我所知,最好将图像编码为 base64,但我的所有尝试都失败了。任何指导表示赞赏。
@app.route("/json", methods=['GET', 'POST', 'PUT'])
def getjsondata():
if request.method=='POST':
print("received POST")
data = request.get_json()
#print(format(data['z']))
jzf = [float(i) for i in data['z']]
jzft = torch.FloatTensor(jzf)
jzftr = jzft.reshape([1, 512])
z = jzftr.cuda()
c = None # class labels (not used in this example)
trunc = 1
img = G(z, c, trunc)
img = (img.permute(0, 2, 3, 1) * 127.5 + 128).clamp(0, 255).to(torch.uint8)
# now what?
我设法解决了。 Python Flask 服务器看起来像这样并期望接收一个 JSON 对象,其中包含一个由 512 个浮点数组成的 Z 数组和一个浮点数的截断。
from flask import Flask, jsonify, request, send_file # initialize our Flask application
import json
from flask_cors import CORS
import base64
from torchvision import transforms
import dnnlib
import torch
import PIL.Image
from io import BytesIO
from datetime import datetime
import legacy
device = torch.device('cuda')
with dnnlib.util.open_url("snapshot.pkl") as f:
G = legacy.load_network_pkl(f)['G_ema'].to(device) # type: ignore
app = Flask(__name__)
CORS(app)
@app.route("/test", methods=['GET', 'POST', 'PUT'])
def test():
return "OK"
@app.route("/query", methods=['GET', 'POST', 'PUT'])
def getjsondata():
if request.method=='POST':
# print("received POST")
data = request.get_json()
#print(format(data['z']))
jzf = [float(i) for i in data['z']]
jzft = torch.FloatTensor(jzf)
jzftr = jzft.reshape([1, 512])
z = jzftr.cuda()
c = None # class labels (not used in this example)
trunc = data['truncation']
img = G(z, c, trunc)
#img = (img.permute(0, 2, 3, 1) * 127.5 + 128).clamp(0, 255).to(torch.uint8)
img = (img * 127.5 + 128).clamp(0, 255).to(torch.uint8)
# turn into PIL image
pil_img = transforms.ToPILImage()(img[0]).convert("RGB")
#pil_img = PIL.Image.fromarray(img[0].cpu().numpy(), 'RGB')
# SAVING...
#fn = datetime.today().strftime('%Y-%m-%d-%H:%M:%S')
#pil_img.save('saved_images/' + fn + '.jpg')
response = serve_pil_image64(pil_img)
response.headers.add('Access-Control-Allow-Origin', '*')
# response.headers.add('Content-Transfer-Encoding', 'base64')
return response
return 'OK'
def serve_pil_image64(pil_img):
img_io = BytesIO()
pil_img.save(img_io, 'JPEG', quality=70)
img_str = base64.b64encode(img_io.getvalue()).decode("utf-8")
return jsonify({'status': True, 'image': img_str})
if __name__ == '__main__':
app.run(host='localhost', port=9000, debug=True)
就目前而言,我正在从一个简单的 JavaScript/HTML 站点发送上述 JSON 数组。然后它会监听响应,也是 JSON.
// construct an HTTP request
var xhr = new XMLHttpRequest();
// upon successful completion of request...
xhr.onreadystatechange = function() {
if (xhr.readyState == XMLHttpRequest.DONE) {
var json = JSON.parse(xhr.responseText);
// console.log(json);
document.getElementById("image_output").src = "data:image/jpeg;base64," + json.image;
}
}
xhr.open("POST", "http://localhost:9000/json");
xhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
我有一个加载了生成器模型的基本 Flask 服务器。我正在通过 JSON 发送一个输入向量,它正在命中生成器,生成器吐出一个预测。这行得通。然后我想将此图像(我愿意将其作为我可以在另一端重建的任何类型的数据发送)发送到同一台机器上的另一个应用程序 运行。据我所知,最好将图像编码为 base64,但我的所有尝试都失败了。任何指导表示赞赏。
@app.route("/json", methods=['GET', 'POST', 'PUT'])
def getjsondata():
if request.method=='POST':
print("received POST")
data = request.get_json()
#print(format(data['z']))
jzf = [float(i) for i in data['z']]
jzft = torch.FloatTensor(jzf)
jzftr = jzft.reshape([1, 512])
z = jzftr.cuda()
c = None # class labels (not used in this example)
trunc = 1
img = G(z, c, trunc)
img = (img.permute(0, 2, 3, 1) * 127.5 + 128).clamp(0, 255).to(torch.uint8)
# now what?
我设法解决了。 Python Flask 服务器看起来像这样并期望接收一个 JSON 对象,其中包含一个由 512 个浮点数组成的 Z 数组和一个浮点数的截断。
from flask import Flask, jsonify, request, send_file # initialize our Flask application
import json
from flask_cors import CORS
import base64
from torchvision import transforms
import dnnlib
import torch
import PIL.Image
from io import BytesIO
from datetime import datetime
import legacy
device = torch.device('cuda')
with dnnlib.util.open_url("snapshot.pkl") as f:
G = legacy.load_network_pkl(f)['G_ema'].to(device) # type: ignore
app = Flask(__name__)
CORS(app)
@app.route("/test", methods=['GET', 'POST', 'PUT'])
def test():
return "OK"
@app.route("/query", methods=['GET', 'POST', 'PUT'])
def getjsondata():
if request.method=='POST':
# print("received POST")
data = request.get_json()
#print(format(data['z']))
jzf = [float(i) for i in data['z']]
jzft = torch.FloatTensor(jzf)
jzftr = jzft.reshape([1, 512])
z = jzftr.cuda()
c = None # class labels (not used in this example)
trunc = data['truncation']
img = G(z, c, trunc)
#img = (img.permute(0, 2, 3, 1) * 127.5 + 128).clamp(0, 255).to(torch.uint8)
img = (img * 127.5 + 128).clamp(0, 255).to(torch.uint8)
# turn into PIL image
pil_img = transforms.ToPILImage()(img[0]).convert("RGB")
#pil_img = PIL.Image.fromarray(img[0].cpu().numpy(), 'RGB')
# SAVING...
#fn = datetime.today().strftime('%Y-%m-%d-%H:%M:%S')
#pil_img.save('saved_images/' + fn + '.jpg')
response = serve_pil_image64(pil_img)
response.headers.add('Access-Control-Allow-Origin', '*')
# response.headers.add('Content-Transfer-Encoding', 'base64')
return response
return 'OK'
def serve_pil_image64(pil_img):
img_io = BytesIO()
pil_img.save(img_io, 'JPEG', quality=70)
img_str = base64.b64encode(img_io.getvalue()).decode("utf-8")
return jsonify({'status': True, 'image': img_str})
if __name__ == '__main__':
app.run(host='localhost', port=9000, debug=True)
就目前而言,我正在从一个简单的 JavaScript/HTML 站点发送上述 JSON 数组。然后它会监听响应,也是 JSON.
// construct an HTTP request
var xhr = new XMLHttpRequest();
// upon successful completion of request...
xhr.onreadystatechange = function() {
if (xhr.readyState == XMLHttpRequest.DONE) {
var json = JSON.parse(xhr.responseText);
// console.log(json);
document.getElementById("image_output").src = "data:image/jpeg;base64," + json.image;
}
}
xhr.open("POST", "http://localhost:9000/json");
xhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');