pytorch MRI腦瘤檢測

nameless_233發表於2023-03-11

讀取資料

#reading the images
tumor = []
path = 'D:\\data\\Tumor_detection\\archive\\brain_tumor_dataset\\yes\\*.jpg'#*表示所有
for f in glob.iglob(path):#遍歷所有的yes圖片
    img = cv2.imread(f)
    img = cv2.resize(img, (128, 128))#相當於reshape改變圖片大小
    b, g, r = cv2.split(img)#分割為單獨的通道
    img = cv2.merge([r, g, b])#改變通道順序
    tumor.append(img)

healthy = []
path = 'D:\\data\\Tumor_detection\\archive\\brain_tumor_dataset\\no\\*.jpg'#*表示所有
for f in glob.iglob(path):#遍歷所有的yes圖片
    img = cv2.imread(f)
    img = cv2.resize(img, (128, 128))#類似於reshape改變圖片大小
    b, g, r = cv2.split(img)#分割為單獨的通道
    img = cv2.merge([r, g, b])#改變通道順序
    healthy.append(img)

#our images
#改變資料形式
tumor = np.array(tumor, dtype=np.float32)
healthy = np.array(healthy, dtype=np.float32)
print(tumor.shape)#(154, 128, 128, 3)154表示154張圖, 128 rows, 128 columns
print(healthy.shape)#(91, 128, 128, 3)91表示91張圖, 128 rows, 128 columns
All = np.concatenate((healthy, tumor))
print(All.shape)#(245, 128, 128, 3)

Brain MRI 視覺化

  • 顯示一張圖片
plt.imshow(healthy[0])
plt.show()
  • 取隨機數
np.random.choice(5, 3)#[0, 5)中隨機選3個int, e.g.[1 3 0]
  • 定義一個隨機取圖片的函式
def plot_random(healthy, tumor, num=5):
    #隨機返回5張healthy和tumor
    healthy_imgs = healthy[np.random.choice(healthy.shape[0], 5, replace=False)]
    tumor_imgs = tumor[np.random.choice(tumor.shape[0], 5, replace=False)]

    plt.figure(figsize=(16, 9))#fix size
    #顯示healthy
    for i in range(num):
        plt.subplot(1, num, i+1)
        plt.title('healthy')
        plt.imshow(healthy_imgs[i])
    # 開啟顯示的圖片
    plt.show()
    ##顯示tumor
    for i in range(num):
        plt.subplot(1, num, i+1)
        plt.title('tumor')
        plt.imshow(tumor_imgs[i])
    #開啟顯示的圖片
    plt.show()

plot_random(healthy=healthy, tumor=tumor)

繼承抽象類Dataset, Overriding getitem, len, add

  • getitem: 透過index檢索資料集的特定資料
  • len: 得到資料集的長度
  • add: 兩個資料集相加

構造一個簡單的用於陣列的類

class MRI(Dataset):
    def __init__(self, scores):
        self.x = scores
    def __getitem__(self, index):
        return self.x[index]
    def __len__(self):
        return len(self.x)

s1 = [1, 2, 3, 4]
d1 = MRI(s1)#s1代入建構函式中的scores
print(d1.x)#[1, 2, 3, 4]
print(d1[2])#自動呼叫getitem, 輸出3

s2 = [100, 200, 300, 400]
d2 = MRI(s2)
#會自動呼叫父類中的__add__
d = d1 + d2

自定義用於MRI的dataset類

class MRI(Dataset):
    def __init__(self):
        # reading the images
        tumor = []
        path = 'D:\\data\\Tumor_detection\\archive\\brain_tumor_dataset\\yes\\*.jpg'  # *表示所有
        for f in glob.iglob(path):  # 遍歷所有的yes圖片
            img = cv2.imread(f)
            img = cv2.resize(img, (128, 128))  # 相當於reshape改變圖片大小
            b, g, r = cv2.split(img)  # 分割為單獨的通道
            img = cv2.merge([r, g, b])  # 改變通道順序
            tumor.append(img)

        healthy = []
        path = 'D:\\data\\Tumor_detection\\archive\\brain_tumor_dataset\\no\\*.jpg'  # *表示所有
        for f in glob.iglob(path):  # 遍歷所有的yes圖片
            img = cv2.imread(f)
            img = cv2.resize(img, (128, 128))  # 相當於reshape改變圖片大小
            b, g, r = cv2.split(img)  # 分割為單獨的通道
            img = cv2.merge([r, g, b])  # 改變通道順序
            healthy.append(img)

        # our images
        # 改變資料形式
        tumor = np.array(tumor, dtype=np.float32)
        healthy = np.array(healthy, dtype=np.float32)

        # our labels
        tumor_label = np.ones(tumor.shape[0], dtype=np.float32)  # tumor的label用1, 這裡生成一堆1; tumor.shape[0]表示有多少張tumor圖片
        healthy_label = np.zeros(healthy.shape[0], dtype=np.float32)  # healthy的label用0, 這裡生成一堆0

        #定義例項變數; 並且連線
        #在第0軸連線: e.g.(100, 512, 512, 3)和(200, 512, 512, 3)-->(300, 512, 512, 3)最後得到300張圖片[第0軸是圖片數量]
        self.images = np.concatenate((tumor, healthy), axis=0)
        self.labels = np.concatenate((tumor_label, healthy_label))


    def __len__(self):
        return self.images.shape[0]#在定義類時例項變數都要加self;這裡返回有多少張圖
    #不僅返回image, 也要返回label; 這裡返回一個包含兩者的字典
    def __getitem__(self, index):


        #不僅要返回對應的圖片, 也要返回label
        sample = {'image': self.images[index], 'label': self.labels[index]}
        return sample

    def normalize(self):
        self.images = self.images/255.0#255是np.max(mri)

mri = MRI()
print(len(mri))
print(mri.__getitem__(5)['image'])#列印圖片的矩陣
print(mri.__getitem__(5)['image'].shape)#(128, 128, 3)寬128高128通道3
print(mri.__getitem__(5)['label'])#列印label值

相關文章