Cargar conjunto de datos de imágenes 3D
Estoy enfrentando algunos problemas para escribir la función getitem() en mi clase de conjunto de datos. Estoy trabajando en un conjunto de datos de resonancia magnética (3D). Cada archivo consta de 160 cortes en formato DICOM. He transformado los archivos DICOM en formato PNG.
La estructura de los archivos se ve así: “/content/drive/MyDrive/mris/9114036/11288003”
Dentro del último directorio se encuentran los 160 cortes en 2D. Las etiquetas están en un archivo .csv con dos columnas, una con la identificación (por ejemplo, 9114036 en la ruta anterior) y la otra con la calificación.
El código que intenté ejecutar fue:
class MyDataset(Dataset):
def __init__(self, csv_file, root_dir, transform = None):
self.labels_df = pd.read_csv(csv_file, sep = ';')
self.root_dir = root_dir
self.transform = transform
def __len__(self):
return len(self.labels_df)
def __getitem__(self, idx):
if torch.is_tensor(idx):
idx = idx.tolist()
img_name = os.path.join(self.root_dir,str(self.labels_df.iloc[idx,0]))
image = io.imread(img_name, plugin='matplotlib')
grade = self.labels_df.iloc[idx, 1]
sample = {'image': image, 'grade': grade}
if self.transform:
sample = self.transform(sample)
return sample
El error que obtuve cuando intenté acceder a una muestra del conjunto de datos fue:
/usr/local/lib/python3.7/dist-packages/PIL/Image.py in open(fp, mode)
2841
2842 if filename: ->
2843 fp = builtins.open(filename, "rb")
2844 exclusive_fp = True
2845 IsADirectoryError: [Errno 21] Es un directorio: '/content/drive/MyDrive/mris/9114036'
lo cual parece lógico.
Intenté usar os.walk
para acceder al directorio 11288003 donde se encuentran las imágenes, pero no funcionó. Lo más probable es que mi enfoque en general esté equivocado.
¿Alguien sabe cómo escribir una clase de conjunto de datos para la naturaleza 3D de mis datos? ¿Debería usar otra transformación para los archivos DICOM en primer lugar?
davy.ai
Parece que el problema está en la forma en que estás accediendo al archivo de imagen dentro del directorio. Actualmente estás intentando abrir el directorio como una imagen, por eso estás obteniendo el error “IsADirectoryError: [Errno 21] Is a directory” porque los directorios no se pueden abrir como imágenes.
Para acceder a los archivos PNG individuales dentro del directorio, puedes usar el módulo
glob
para crear una lista de todas las rutas de archivos PNG y luego abrir el archivo específico basado en la variableidx
. Aquí tienes una versión actualizada de tu función__getitem__()
:Este código utiliza el módulo
glob
para obtener una lista de todos los archivos PNG en el directorio, y luego lee cada archivo utilizando la funciónio.imread()
. La lista resultante de tensores de imagen 2D se apila a lo largo de la primera dimensión para crear un tensor 3D. Finalmente, se crea el diccionario de la muestra con el tensor de imagen 3D y la etiqueta.En cuanto a preprocesar tus archivos DICOM, es difícil decir sin más información sobre tu conjunto de datos y lo que deseas lograr. Sin embargo, vale la pena mencionar que los archivos DICOM a menudo contienen metadatos que pueden proporcionar información importante sobre la exploración, como el ID del paciente, la fecha de la exploración y el tipo de exploración, que pueden ser útiles para ciertos análisis.Si decides trabajar directamente con archivos DICOM, puedes considerar utilizar una biblioteca como
pydicom
para leer y preprocesar los archivos. Alternativamente, si conviertes tus archivos DICOM a PNG, puedes considerar aplicar pasos adicionales de preprocesamiento, como la normalización, recorte o cambio de tamaño de las imágenes a un tamaño consistente.