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]形状

但这仍然没有意义 - 这里的 widthheightchannels(例如 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++ 中的深度神经网络中使用?

如何将 4D numpy 数组重塑为 3D 数组

在 NumPy 中将 4D 数组重塑为 2D 数组背后的直觉和想法

Pytorch 重塑张量维度

使用张量流服务预测图像-“错误”:“重塑的输入是具有 10000 个值的张量

如何从 resnet 层循环遍历 4D(无,x,y,z)激活张量的 2D 矩阵?