es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo usar from_tensor_slices correctamente en imágenes de resonancia magnética?

Estoy trabajando con imágenes de resonancia magnética (MRI) y me gustaría usar slices de tensors para preprocesar las rutas de acceso, pero no sé cómo usarlos correctamente. A continuación se presentan mi código, el mensaje de error y el enlace para el conjunto de datos:

Primero, reorganizo mis datos. 484 imágenes y 484 etiquetas.

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)

Luego, la función para cargar 1 ejemplo (uso nibabel para cargar archivos 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

Después, intenté usar slices de tensors.

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)

Y surge el error: TypeError: stat: path should be string, bytes, os.PathLike or integer, not Tensor

¿Qué puede estar mal y cómo puedo solucionarlo?

Enlace del conjunto de datos: https://drive.google.com/drive/folders/1HqEgzS8BV2c7xYNrZdEAnrHk7osJJ–2 (Tarea 1 – Tumor cerebral)

Por favor, avísame si necesitas más información.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que la entrada a la función nib.load en la función load_one_sample debe ser una cadena o un objeto similar a un camino, pero en su lugar es un objeto Tensor. Esto se debe a que se pasaron las rutas como objetos Tensor en la función from_tensor_slices.

    Una manera de solucionar esto es modificar la función load_one_sample para convertir los objetos Tensor nuevamente a cadenas antes de pasarlos a la función nib.load. Aquí hay una versión actualizada de la función:

    def load_one_sample(image_path, label_path):
    
      image_path = image_path.numpy().decode('utf-8')
      label_path = label_path.numpy().decode('utf-8')
    
      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
    

    En esta versión, se usa el método numpy() para acceder al valor de cadena subyacente del objeto Tensor, y se usa el método decode para convertir la cadena de bytes en una cadena regular.

    Con esta modificación, la función from_tensor_slices ahora debería funcionar correctamente:

    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)
    

    Tenga en cuenta que esto supone que las rutas en image_paths y label_paths son rutas válidas a los archivos de imagen y etiqueta. Si las rutas son incorrectas, la función nib.load aún generará un error.

Comments are closed.