Tensorflowjs - 将 4d 张量重塑/切片成图像
Posted
技术标签:
【中文标题】Tensorflowjs - 将 4d 张量重塑/切片成图像【英文标题】:Tensorflowjs - Reshape/slice 4d tensor into image 【发布时间】:2022-01-18 05:02:15 【问题描述】:我正在尝试将样式转换应用于网络摄像头捕获。我正在阅读我之前在 python 中训练并转换为 TFjs 的冻结模型。输出张量的形状和秩如下:
当我尝试应用 tf.browser.toPixels 时,此函数的最后一行出现问题
function predictWebcam()
tf.tidy(() =>
loadmodel().then(model=>
//let tensor= model.predict(tf.expandDims(tf.browser.fromPixels(video)));
let tensor= model.predict(tf.browser.fromPixels(video, 3).toFloat().div(tf.scalar(255)).expandDims());
console.log('shape', tensor.shape);
console.log('rank', tensor.rank);
tf.browser.toPixels(tensor, resultImage);
);
);
我收到此错误。我不知道如何重塑或修改张量以从中获取图像:
未捕获(承诺)错误:toPixels 仅支持 2 或 3 阶张量,获得 4 阶。 也许我必须将 tensor_to_image 函数从 python 复制到 javascript,如the example in the website。
提前致谢!
【问题讨论】:
【参考方案1】:假设你的张量是[1, 15, 20, 512]
您可以通过运行删除任何值为 1 的暗淡(与您通过运行 expandDims
添加的暗淡相同)
const squeezed = tf.squeeze(tensor)
这会给你[15, 20, 512]
的形状
但这仍然没有意义 - 这里的 width
、height
和 channels
(例如 rgb)是什么?
我认为模型结果需要额外的后处理,而不是图像。
【讨论】:
想我必须把这个 python 函数翻译成 js: def tensor_to_image(tensor): tensor = tensor*255 tensor = np.array(tensor, dtype=np.uint8) if np.ndim(tensor )>3: assert tensor.shape[0] == 1 tensor = tensor[0] return PIL.Image.fromarray(tensor) 我正在关注这个文档:tensorflow.org/tutorials/generative/… 第一部分很简单:tf.squeeze(tensor).mul(255).cast('int32')
,但我不知道PIL.image.fromArray()
做了什么——它是一个外部函数,不是 TF 的一部分。
想想剩下的就是把if条件翻译成js了。尝试使用 dataSync() 但未能创建图像。如果 np.ndim(tensor)>3: 断言 tensor.shape[0] == 1 张量 = tensor[0]
我写的都涵盖了这些,但是那个张量看起来不像图像。以上是关于Tensorflowjs - 将 4d 张量重塑/切片成图像的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Mat 重塑为张量以在 C++ 中的深度神经网络中使用?
在 NumPy 中将 4D 数组重塑为 2D 数组背后的直觉和想法