#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 )