python - 使用自定义文件格式创建 TensorFlow 数据集
问题描述
我正在尝试创建一个 tf.data.Dataset,其中文件名映射到深度图像。我的图像保存为原始二进制文件,每个文件 320*240*4 字节。图像为 320x240 像素,4 个字节代表一个像素。
我无法弄清楚如何创建一个解析函数,它将采用 tf.Tensor 文件名,并返回一个 (240, 320) tf.Tensor 包含我的图像。
这是我尝试过的。
import tensorflow as tf
import numpy as np
import struct
import math
from os import listdir
class Dataset:
def __init__(self):
filenames = ["./depthframes/" + f for f in listdir("./depthframes/")]
self._dataset = tf.data.Dataset.from_tensor_slices(filenames).map(Dataset._parse)
@staticmethod
def _parse(filename):
img = DepthImage(filename)
return img.frame
class DepthImage:
def __init__(self, path):
self.rows, self.cols = 240, 320
self.f = open(path, 'rb')
self.frame = []
self.get_frame()
def _get_frame(self):
for row in range(self.rows):
tmp_row = []
for col in range(self.cols):
tmp_row.append([struct.unpack('i', self.f.read(4))[0], ])
tmp_row = [[0, ] if math.isnan(i[0]) else list(map(int, i)) for i in tmp_row]
self.frame.append(tmp_row)
def get_frame(self):
self._get_frame()
self.frame = tf.convert_to_tensor(np.array(self.frame).reshape(240, 320))
if __name__ == "__main__":
Dataset()
我的错误如下:
File "C:/Users/gcper/Code/STEM/msrdailyact3d.py", line 23, in __init__
self.f = open(path, 'rb')
TypeError: expected str, bytes or os.PathLike object, not Tensor
解决方案
根据@kvsih 的建议,以下解决方案有效。
self._dataset = tf.data.Dataset.from_tensor_slices(filenames)\
.map(lambda name: tf.py_func(self._parse, [name], tf.int32))
此外,get_frame
不能返回张量。self._parse
必须返回一个tf.int32
,如上面的 lambda 中所定义。以下代码替换get_frame
def get_frame(self):
self._get_frame()
self.frame = np.array(self.frame).reshape(240, 320)
推荐阅读
- php - 为什么 Semantic-Ui 弹出窗口不起作用?
- javascript - 同名的 Ajax 文件下载
- c++ - 对“WinMain@16”的未定义引用(Visual Studio 代码)
- python - 尽管使用全局关键字访问函数内的变量,但仍出错
- swift - SwiftUI:为表单中的单元格设置动画
- pkcs#11 - 如何通过 SUNPKCS 提供商从 hsm 获取 al 别名?
- python - 与 VISA 的设备通信在 Python 中工作,但在 C++ 中不工作
- apk - 安装前如何知道apk版本?
- python - 嗨,当我运行以下代码时,我的计数为 0,为什么,我希望它显示文件中的行数
- php - 我想生成一个常规数组