【发布时间】:2020-06-02 09:15:12
【问题描述】:
我的环境:
ubuntu 18.04
rtx 2080ti
cuda 10.1
node v12.16.3
tfjs 1.7.4
保存的模型是efficientdet-d0,
推理步骤在inference step
js解析图片数据,我把img.png转换成img.jpg,save_model的结果和saved_model result一样
将 saved_model 转换为 tfjs_graph_model 的命令是
tensorflowjs_converter --input_format=tf_saved_model /tmp/saved_model ~/DATA/http_models/specDetection/
我的测试代码是
var tfc = require("@tensorflow/tfjs-converter");
var tf = require("@tensorflow/tfjs-core");
var jpeg_js = require("jpeg-js");
var fs = require("fs");
async function loadModel() {
var modelUrl = "http://localhost:8000/model.json"
var model = await tfc.loadGraphModel(modelUrl);
return model;
}
async function detect() {
var model = await loadModel();
var img = fs.readFileSync("~/SRC/automl_test/efficientdet/img.jpg");
const input = jpeg_js.decode(img,{useTArray:true,formatAsRGBA:false});
const batched = tf.tidy(() => {
const img = tf.browser.fromPixels(input);
// Reshape to a single-element batch so we can pass it to executeAsync.
return img.expandDims(0);
});
const result = await model.executeAsync({'image_arrays:0':batched},['detections:0']);
console.log(result);
}
detect();
当使用我的测试代码检测 img.jpg 中的对象时,没有检测到 --- 结果的大小为 0
我该怎么做才能解决这个问题?
感谢您的任何提示
编辑:
代码1:
var img = fs.readFileSync("~/DATA/http_models/specDetection/test.jpg");
var dataJpegJs = jpeg_js.decode(img,{useTArray:true,formatAsRGBA:false})
var batched = tf.browser.fromPixels({data:dataJpegJs.data, width: dataJpegJs.width, height:dataJpegJs.height},3);
batched = batched.slice([0,0,0],[-1,-1,3]);
var result = await model.executeAsync({'image_arrays:0':batched.expandDims(0)},['detections:0']);
result = tf.slice(result,[0,0,1],[1,-1,4]);
代码2:
var img = fs.readFileSync("~/DATA/http_models/specDetection/test.jpg");
var dataJpegJs = jpeg_js.decode(img,{useTArray:true,formatAsRGBA:true})
var batched = tf.browser.fromPixels({data:dataJpegJs.data, width: dataJpegJs.width, height:dataJpegJs.height},4);
batched = batched.slice([0,0,0],[-1,-1,3]);
var result = await model.executeAsync({'image_arrays:0':batched.expandDims(0)},['detections:0']);
result = tf.slice(result,[0,0,1],[1,-1,4]);
代码 1 得到了错误的结果,而代码 2 得到了正确的结果。 代码 2 使用 formatAsRGBA:true 解码 jpg,并在 tf.browser.fromPixels 中设置 numChannels=4。 jpeg-js 必须将 jpg 解码为 RGBA 才能正常工作。 我认为这是 jpeg-js 的错误。或者我不熟悉 jpg 编码?
【问题讨论】:
-
你确定你在这两种情况下都做同样的预处理吗?
-
感谢您的回复。我使用@edkeveked 代码,它可以工作
标签: tensorflow object-detection tensorflow.js