讀取資料
#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值