如何在 MRI 图像上正确使用 from_tensor_slices?
How to use from_tensor_slices properly on MRI images?
我正在处理 MRI 图像,我想使用 from_tensor_slices 来预处理路径,但我不知道如何正确使用它。下面是我的代码、问题消息和数据集的 link。
首先我重新整理了我的数据。 484 张图片和 484 个标签
image_data_path = './drive/MyDrive/Brain Tumour/Task01_BrainTumour/imagesTr/'
label_data_path = './drive/MyDrive/Brain Tumour/Task01_BrainTumour/labelsTr/'
image_paths = [image_data_path + name
for name in os.listdir(image_data_path)
if not name.startswith(".")]
label_paths = [label_data_path + name
for name in os.listdir(label_data_path)
if not name.startswith(".")]
image_paths = sorted(image_paths)
label_paths = sorted(label_paths)
然后,加载1个例子的函数(我用nibabel加载nii文件)
def load_one_sample(image_path, label_path):
image = nib.load(image_path).get_fdata()
image = tf.convert_to_tensor(image, dtype = 'float32')
label = nib.load(label_path).get_fdata()
label = tf.convert_to_tensor(label, dtype = 'uint8')
return image, label
接下来,我尝试使用 from_tensor_slices
image_filenames = tf.constant(image_paths)
label_filenames = tf.constant(label_paths)
dataset = tf.data.Dataset.from_tensor_slices((image_filenames, label_filenames))
all_data = dataset.map(load_one_sample)
错误来了:TypeError: stat: path should be string, bytes, os.PathLike or integer, not Tensor
可能出了什么问题,我该如何解决?
数据link:https://drive.google.com/drive/folders/1HqEgzS8BV2c7xYNrZdEAnrHk7osJJ--2(任务 1 - 脑肿瘤)
如果您需要更多信息,请告诉我。
nib.load
不是 TensorFlow 函数。
如果你想在 tf.data
管道中使用不是 TensorFlow 函数的任何东西,那么你必须使用 tf.py_function
.
包装它
代码:
image_data_path = 'Task01_BrainTumour/imagesTr/'
label_data_path = 'Task01_BrainTumour/labelsTr/'
image_paths = [image_data_path + name
for name in os.listdir(image_data_path)
if not name.startswith(".")]
label_paths = [label_data_path + name
for name in os.listdir(label_data_path)
if not name.startswith(".")]
image_paths = sorted(image_paths)
label_paths = sorted(label_paths)
def load_one_sample(image_path, label_path):
image = nib.load(image_path.numpy().decode()).get_fdata()
image = tf.convert_to_tensor(image, dtype = 'float32')
label = nib.load(label_path.numpy().decode()).get_fdata()
label = tf.convert_to_tensor(label, dtype = 'uint8')
return image, label
def wrapper_load(img_path, label_path):
img, label = tf.py_function(func = load_one_sample, inp = [img_path, label_path], Tout = [tf.float32, tf.uint8])
return img, label
dataset = tf.data.Dataset.from_tensor_slices((image_paths, label_paths)).map(wrapper_load)
错误不是由于 from_tensor_slices
函数引起的,而是由于 nibs.load
需要一个字符串但得到一个张量。
但是,更好的方法是创建 tfrecords 并使用它们来训练模型。
我正在处理 MRI 图像,我想使用 from_tensor_slices 来预处理路径,但我不知道如何正确使用它。下面是我的代码、问题消息和数据集的 link。
首先我重新整理了我的数据。 484 张图片和 484 个标签
image_data_path = './drive/MyDrive/Brain Tumour/Task01_BrainTumour/imagesTr/'
label_data_path = './drive/MyDrive/Brain Tumour/Task01_BrainTumour/labelsTr/'
image_paths = [image_data_path + name
for name in os.listdir(image_data_path)
if not name.startswith(".")]
label_paths = [label_data_path + name
for name in os.listdir(label_data_path)
if not name.startswith(".")]
image_paths = sorted(image_paths)
label_paths = sorted(label_paths)
然后,加载1个例子的函数(我用nibabel加载nii文件)
def load_one_sample(image_path, label_path):
image = nib.load(image_path).get_fdata()
image = tf.convert_to_tensor(image, dtype = 'float32')
label = nib.load(label_path).get_fdata()
label = tf.convert_to_tensor(label, dtype = 'uint8')
return image, label
接下来,我尝试使用 from_tensor_slices
image_filenames = tf.constant(image_paths)
label_filenames = tf.constant(label_paths)
dataset = tf.data.Dataset.from_tensor_slices((image_filenames, label_filenames))
all_data = dataset.map(load_one_sample)
错误来了:TypeError: stat: path should be string, bytes, os.PathLike or integer, not Tensor
可能出了什么问题,我该如何解决?
数据link:https://drive.google.com/drive/folders/1HqEgzS8BV2c7xYNrZdEAnrHk7osJJ--2(任务 1 - 脑肿瘤)
如果您需要更多信息,请告诉我。
nib.load
不是 TensorFlow 函数。
如果你想在 tf.data
管道中使用不是 TensorFlow 函数的任何东西,那么你必须使用 tf.py_function
.
包装它
代码:
image_data_path = 'Task01_BrainTumour/imagesTr/'
label_data_path = 'Task01_BrainTumour/labelsTr/'
image_paths = [image_data_path + name
for name in os.listdir(image_data_path)
if not name.startswith(".")]
label_paths = [label_data_path + name
for name in os.listdir(label_data_path)
if not name.startswith(".")]
image_paths = sorted(image_paths)
label_paths = sorted(label_paths)
def load_one_sample(image_path, label_path):
image = nib.load(image_path.numpy().decode()).get_fdata()
image = tf.convert_to_tensor(image, dtype = 'float32')
label = nib.load(label_path.numpy().decode()).get_fdata()
label = tf.convert_to_tensor(label, dtype = 'uint8')
return image, label
def wrapper_load(img_path, label_path):
img, label = tf.py_function(func = load_one_sample, inp = [img_path, label_path], Tout = [tf.float32, tf.uint8])
return img, label
dataset = tf.data.Dataset.from_tensor_slices((image_paths, label_paths)).map(wrapper_load)
错误不是由于 from_tensor_slices
函数引起的,而是由于 nibs.load
需要一个字符串但得到一个张量。
但是,更好的方法是创建 tfrecords 并使用它们来训练模型。