Обучение данным Dicom не удалось с помощью pytorch

#pytorch #tensor #dataloader #medical-imaging #nifti

Вопрос:

У меня проблема с обучением моделей Pytorch. Я пытаюсь обучить свою модель Pytorch, используя данные dicom и nifti GT, Однако размер файла веса смехотворно мал, потому что обучение модели не выполняется нормально.

Я использовал сетевую модель Unet

Я думаю, что есть проблема с загрузчиком данных. Но я не могу это исправить…

Я был бы признателен, если бы вы могли мне помочь.

Формат файла необработанного изображения-dicom, а формат изображения GT-nifti

в моем даталодере

 def __getitem__(self, index):  image_path = self.image_paths[index]  image_GT_path = image_path[:8] '_' image_path[8:12] '.nii'  GT_path = self.GT_paths   image_GT_path   ds = dcmread(self.root image_path)  image = ds.pixel_array.astype(np.float32)  image = torch.from_numpy(image.transpose(0,1)/255)  image = image.unsqueeze(0)   GT = nib.load(GT_path)  GT = GT.get_fdata(dtype=np.float32)  print(GT.shape)  GT = torch.from_numpy(GT.transpose(0,1))  GT = GT.unsqueeze(0)   return image, GT, image_path  

и Код поезда-это

 for epoch in range(self.num_epochs):   self.unet.train(True)  epoch_loss = 0  for i, (images, GT,empty) in enumerate(tqdm(self.train_loader)):  # GT : Ground Truth   images = images.to(self.device)  GT = GT.to(self.device)    # SR : Segmentation Result  SR = self.unet(images)  SR_probs = torch.sigmoid(SR)   SR_flat = SR_probs.view(SR_probs.size(0),-1)   GT_flat = GT.view(GT.size(0),-1)  loss =self.criterion(SR_flat,GT_flat)   # self.criterion=DiceLoss() #BCE not use  # loss = self.criterion(GT,SR_probs)  epoch_loss  = loss.item()  train_losses.append(loss.item())  # Backprop   optimize  self.reset_grad()  loss.backward()  self.optimizer.step()  

Комментарии:

1. Вы уверены, что ваши изображения dicom 8-битные? пожалуйста, проверьте их динамический диапазон.

2. Мое изображение dicom 16-битное, а nifti такая же @Shai

3. @mano они, почему ты делишься на 255 (=2^8-1) , а 656535 (=2^16-1) не ?

4. вычитаете ли вы среднее значение из ваших входных изображений? вы выполняете какую-либо нормализацию входных данных? дополнения?

5. @Shai На самом деле, dicom-это 12 бит, но это 16 бит. и нормализация в диапазоне от 0 до 1

Ответ №1:

В зависимости от того, какой модальности ваши изображения, это может быть связано с тем, что данные изображения не преобразуются в правильные, клинически значимые, независимые от машины/поставщика единицы измерения до любой нормализации ML-обучения 0-1.

Как правило, в файлах dicom фактические значения необработанных данных не таковы — они нуждаются в обработке…

Например, если вы пытаетесь тренироваться на данных компьютерной томографии, то единицами измерения, на которых вы должны пытаться тренировать свою модель, являются числа Хаундсфилда (HU). (Погуглите об этом, CT и dicom, чтобы получить некоторую информацию).

Однако необработанные данные CT dicom могут быть небольшими или большими конечными, вероятно, потребуется применить коррекцию наклона/перехвата, а также, возможно, потребуется применить таблицы поиска для преобразования их в числа HU. …ie может стать сложным и запутанным. (снова немного погуглите …у вас, по крайней мере, должно быть немного информации об этом, если вы пытаетесь что-то сделать с форматами медицинских изображений).

Я не уверен, как обрабатывать данные nifti, однако, к счастью, для файлов dicom, использующих pydicom, это преобразование может быть выполнено для вас библиотекой, используя (обычно) вызов pydicom.pixel_data_handlers.util.apply_modality_lut :

  dcm = pydicom.dcmread(my_ct_dicom_file) data_in_HU = pydicom.pixel_data_handlers.util.apply_voi_lut(  dcm.pixel_array,  dcm )