如何使用图像从 Nodejs 调用 tensorflow_model_server
How to call tensorflow_model_server from Nodejs, with an image
这是我的服务模型的元数据
"metadata": {"signature_def": {
"signature_def": {
"serving_default": {
"inputs": {
"vgg16_input": {
"dtype": "DT_FLOAT",
"tensor_shape": {
"dim": [
{
"size": "-1",
"name": ""
},
{
"size": "224",
"name": ""
},
{
"size": "224",
"name": ""
},
{
"size": "3",
"name": ""
}
],
"unknown_rank": false
},
"name": "serving_default_vgg16_input:0"
}
}...
遗憾的是我不知道如何从 NodeJs 与它对话。如何将本地图像转换为有效的 224,224,3 DT_FLOAT 张量 ...
在python中,我可以用这段代码来做,但我想要nodejs版本
import numpy as np
import requests
from keras.preprocessing import image
image_path = './data/black/fhb2l97vdi8qc0rt5ow3.jpg'
img = image.img_to_array(image.load_img(image_path, target_size=(224, 224))) / 255.
img = img.astype('float16')
payload = {
"instances": [{'vgg16_input': img.tolist()}]
}
r = requests.post('http://ip:port/v1/models/color:predict', json=payload)
print(r.content)
到目前为止我的代码
var request = require('request');
var fs = require('fs');
var myImg = __dirname + '/../tensorflow2/data/black/0a13y2gtunswi8ox4bjf.jpg';
var options = {
method: 'POST',
url: `http://ip:port/v1/models/color:predict`,
json:{
instances: [{'vgg16_input': ??????}]
}
};
request(options, function (err, resp, body) {
if (err)
cb(err);
console.log(body);
});
也许我可以使用 tensorflowjs 的一些功能...
图像必须作为浮点列表列表传入JSON(pixel 是 3 RGB values 的列表,行是像素的列表,图像是行[=29的列表=]).
我们需要解码 JPEG 图像并调整其大小。使用 npm install sharp
.
安装 sharp 包
图片准备如下:
const fs = require('fs');
const sharp = require('sharp');
function imgToJson(buffer) {
var decoded = [];
var h;
var w;
var line;
var pixel;
var b = 0;
for (h = 0; h < 224; h++) {
var line = [];
for (w = 0; w < 224; w++) {
var pixel = [];
pixel.push(buffer[b++] / 255.0); /* r */
pixel.push(buffer[b++] / 255.0); /* g */
pixel.push(buffer[b++] / 255.0); /* b */
line.push(pixel);
}
decoded.push(line);
}
return decoded;
}
async function prepare_image(imagePath) {
var jpegData = fs.readFileSync(imagePath); /* for example sake synchronous */
const buffer = await sharp(jpegData).resize(224, 224).raw().toBuffer();
return imgToJson(buffer);
}
prepare_image
的结果是将来返回表示图像的浮点列表列表。最后一步是执行请求:
var request = require('request');
async function perform_request(imagePath) {
var decoded = await prepare_image(imagePath);
var options = {
method: 'POST',
url: 'http://ip:port/v1/models/color:predict',
json: {
instances: [{'vgg16_input': decoded}]
}
};
request(options, function (err, resp, body) {
if (err)
cb(err);
console.log(body);
});
}
perform_request("image.jpeg");
这是我的服务模型的元数据
"metadata": {"signature_def": {
"signature_def": {
"serving_default": {
"inputs": {
"vgg16_input": {
"dtype": "DT_FLOAT",
"tensor_shape": {
"dim": [
{
"size": "-1",
"name": ""
},
{
"size": "224",
"name": ""
},
{
"size": "224",
"name": ""
},
{
"size": "3",
"name": ""
}
],
"unknown_rank": false
},
"name": "serving_default_vgg16_input:0"
}
}...
遗憾的是我不知道如何从 NodeJs 与它对话。如何将本地图像转换为有效的 224,224,3 DT_FLOAT 张量 ...
在python中,我可以用这段代码来做,但我想要nodejs版本
import numpy as np
import requests
from keras.preprocessing import image
image_path = './data/black/fhb2l97vdi8qc0rt5ow3.jpg'
img = image.img_to_array(image.load_img(image_path, target_size=(224, 224))) / 255.
img = img.astype('float16')
payload = {
"instances": [{'vgg16_input': img.tolist()}]
}
r = requests.post('http://ip:port/v1/models/color:predict', json=payload)
print(r.content)
到目前为止我的代码
var request = require('request');
var fs = require('fs');
var myImg = __dirname + '/../tensorflow2/data/black/0a13y2gtunswi8ox4bjf.jpg';
var options = {
method: 'POST',
url: `http://ip:port/v1/models/color:predict`,
json:{
instances: [{'vgg16_input': ??????}]
}
};
request(options, function (err, resp, body) {
if (err)
cb(err);
console.log(body);
});
也许我可以使用 tensorflowjs 的一些功能...
图像必须作为浮点列表列表传入JSON(pixel 是 3 RGB values 的列表,行是像素的列表,图像是行[=29的列表=]).
我们需要解码 JPEG 图像并调整其大小。使用 npm install sharp
.
图片准备如下:
const fs = require('fs');
const sharp = require('sharp');
function imgToJson(buffer) {
var decoded = [];
var h;
var w;
var line;
var pixel;
var b = 0;
for (h = 0; h < 224; h++) {
var line = [];
for (w = 0; w < 224; w++) {
var pixel = [];
pixel.push(buffer[b++] / 255.0); /* r */
pixel.push(buffer[b++] / 255.0); /* g */
pixel.push(buffer[b++] / 255.0); /* b */
line.push(pixel);
}
decoded.push(line);
}
return decoded;
}
async function prepare_image(imagePath) {
var jpegData = fs.readFileSync(imagePath); /* for example sake synchronous */
const buffer = await sharp(jpegData).resize(224, 224).raw().toBuffer();
return imgToJson(buffer);
}
prepare_image
的结果是将来返回表示图像的浮点列表列表。最后一步是执行请求:
var request = require('request');
async function perform_request(imagePath) {
var decoded = await prepare_image(imagePath);
var options = {
method: 'POST',
url: 'http://ip:port/v1/models/color:predict',
json: {
instances: [{'vgg16_input': decoded}]
}
};
request(options, function (err, resp, body) {
if (err)
cb(err);
console.log(body);
});
}
perform_request("image.jpeg");