首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >火炬视觉模型中DICOM文件的数据上传

火炬视觉模型中DICOM文件的数据上传
EN

Stack Overflow用户
提问于 2021-02-23 00:04:05
回答 1查看 538关注 0票数 0

如果这个问题太基本,我很抱歉,但是我才刚刚开始使用PyTorch (和Python)。

我试着一步一步地遵循下面的说明:https://pytorch.org/tutorials/beginner/finetuning_torchvision_models_tutorial.html

但是,我正在使用一些DICOM文件,这些文件保存在两个目录中( that /NOCANCER)。我用拆分文件夹将它们分开,以便将其结构化以用于ImageFolder数据集(如本教程中所做的)。

我知道我只需要加载从DICOM文件中提取的pixel_arrays,并且我编写了一些帮助函数:

pixel_array;

  • do

  • 读取.dcm文件的所有路径;

  • 读取它们并提取少量的预处理。下面是帮助函数的轮廓:

代码语言:javascript
复制
import os
import pydicom
import cv2
import numpy as np 
   
   
def createListFiles(dirName):
   print("Fetching all the files in the data directory...")
   lstFilesDCM =[]
   for root, dir, fileList in os.walk(dirName):
       for filename in fileList:
            if ".dcm" in filename.lower():
               lstFilesDCM.append(os.path.join( root , filename))
   return lstFilesDCM
   
def castHeight(list):
   lstHeight = []
   min_height = 0        
   for filenameDCM in list:
       readfile = pydicom.read_file(filenameDCM)
       lstHeight.append(readfile.pixel_array.shape[0])
       min_height = np.min(lstHeight)   
   return  min_height
   
   
def castWidth(list):
   lstWidth = []
   min_Width = 0
   for filenameDCM in list:
       readfile = pydicom.read_file(filenameDCM)
       lstWidth.append(readfile.pixel_array.shape[1])
       min_Width = np.min(lstWidth)   
   return  min_Width
  
   
def Preproc1(listDCM):
   new_height, new_width = castHeight(listDCM), castWidth(listDCM)
   ConstPixelDims = (len(listDCM), int(new_height), int(new_width)) 
       
   ArrayDCM = np.zeros(ConstPixelDims, dtype=np.float32)
       
   ## loop through all the DICOM files
   for filenameDCM in listDCM:    
       ## read the file
       ds = pydicom.read_file(filenameDCM)
           
       mx0 = ds.pixel_array
           
       ## Standardisation 
       imgb = mx0.astype('float32')
       imgb_stand = (imgb - imgb.mean(axis=(0, 1), keepdims=True)) / imgb.std(axis=(0, 1), keepdims=True)
           
       ## Normalisation 
       imgb_norm = cv2.normalize(imgb_stand, None, 0, 1, cv2.NORM_MINMAX)        
           
       ## we make sure that data is saved as a data_array as a numpy array
       data = np.array(imgb_norm)
   
   
       ## we save it into ArrayDicom and resize it based 'ConstPixelDims' 
       ArrayDCM[listDCM.index(filenameDCM), :, :] =  cv2.resize(data, (int(new_width), int(new_height)), interpolation = cv2.INTER_CUBIC)
       
   return ArrayDCM

那么,现在,我如何告诉数据采集器加载数据,考虑到它是为了标签的目的而使用的结构,但是只有在对其进行提取和预处理之后?我在文档中引用了教程中的“加载数据”部分,即:

代码语言:javascript
复制
# Create training and validation datasets
image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x), data_transforms[x]) for x in ['train', 'val']}
# Create training and validation dataloaders
dataloaders_dict = {x: torch.utils.data.DataLoader(image_datasets[x], batch_size=batch_size, shuffle=True, num_workers=4) for x in ['train', 'val']}

如果这有任何意义的话,是否有可能在以下几个方面做些什么

代码语言:javascript
复制
image_datasets = {x: datasets.ImageFolder(Preproc1(os.path.join(data_dir, x)), data_transforms[x]) for x in ['train', 'val']}

另外,我的另一个问题是:当教程建议做一个transforms.Normalize时,在我的预处理中做一个规范化步骤值得吗?

我真的很抱歉这听起来很模糊,我已经试着解决这个问题好几个星期了,但我无法解决。

EN

回答 1

Stack Overflow用户

发布于 2021-02-23 06:27:05

听起来,实现自己的custom Dataset会更好。实际上,我认为最好在读取模型的图像之前将规范化和其他内容推迟到应用的转换中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66325217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档