20250213 commit: To added list to Dataset Script
This commit is contained in:
parent
bb1ab2b541
commit
c9d9e7882e
BIN
Calculate_Process/__pycache__/Calculate.cpython-311.pyc
Normal file
BIN
Calculate_Process/__pycache__/Calculate.cpython-311.pyc
Normal file
Binary file not shown.
BIN
Calculate_Process/__pycache__/__init__.cpython-311.pyc
Normal file
BIN
Calculate_Process/__pycache__/__init__.cpython-311.pyc
Normal file
Binary file not shown.
|
|
@ -1,8 +1,8 @@
|
||||||
from Read_and_process_image.ReadAndProcess import Read_image_and_Process_image
|
from Read_and_process_image.ReadAndProcess import Read_image_and_Process_image
|
||||||
from _validation.ValidationTheEnterData import validation_the_enter_data
|
from _validation.ValidationTheEnterData import validation_the_enter_data
|
||||||
from Load_process.file_processing import Process_File
|
from Load_process.file_processing import Process_File
|
||||||
from keras.preprocessing.image import ImageDataGenerator
|
|
||||||
from Load_process.LoadData import Load_Data_Prepare
|
from Load_process.LoadData import Load_Data_Prepare
|
||||||
|
from torchvision import transforms
|
||||||
|
|
||||||
class Image_generator():
|
class Image_generator():
|
||||||
'''製作資料強化'''
|
'''製作資料強化'''
|
||||||
|
|
@ -155,47 +155,35 @@ class Image_generator():
|
||||||
dtype : 生成數組使用的數據類型。
|
dtype : 生成數組使用的數據類型。
|
||||||
'''
|
'''
|
||||||
if judge == 1:
|
if judge == 1:
|
||||||
datagen = ImageDataGenerator(
|
return transforms.Compose([
|
||||||
rotation_range=30, # 旋轉影像
|
transforms.RandomRotation(30),
|
||||||
width_shift_range=0.1, # 圖像隨機水平移動,位移距離為圖像長度乘以參數(0.1)
|
transforms.RandomResizedCrop(224, scale=(0.8, 1.0)),
|
||||||
height_shift_range=0.1, # 圖像隨機垂直移動,位移距離為圖像長度乘以參數(0.1)
|
transforms.RandomHorizontalFlip(),
|
||||||
zoom_range=0.2, # 隨機縮放範圍,[lower, upper] = [1-zoom_range, 1+zoom_range]
|
transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),
|
||||||
horizontal_flip=False, # 水平翻轉
|
])
|
||||||
vertical_flip=False, # 垂直翻轉
|
elif judge == 2:
|
||||||
fill_mode='nearest' # 在旋轉或平移造成空隙時,則空隙補常數
|
return transforms.Compose([
|
||||||
)
|
transforms.RandomRotation(180),
|
||||||
if judge == 2:
|
transforms.RandomResizedCrop(224, scale=(0.7, 1.0)),
|
||||||
datagen = ImageDataGenerator(
|
transforms.RandomHorizontalFlip(),
|
||||||
rotation_range=180,
|
transforms.RandomVerticalFlip(),
|
||||||
width_shift_range=0.2,
|
])
|
||||||
height_shift_range=0.1,
|
elif judge == 3:
|
||||||
zoom_range=0.1,
|
return transforms.Compose([
|
||||||
horizontal_flip=True,
|
transforms.RandomRotation(45),
|
||||||
vertical_flip=True,
|
transforms.RandomResizedCrop(224, scale=(0.9, 1.0)),
|
||||||
fill_mode='nearest'
|
transforms.RandomAffine(degrees=20, shear=0.2),
|
||||||
)
|
transforms.ColorJitter(brightness=0.2, contrast=0.2),
|
||||||
if judge == 3:
|
transforms.RandomHorizontalFlip(),
|
||||||
datagen = ImageDataGenerator(
|
])
|
||||||
rotation_range=45, # 旋轉影像
|
elif judge == 4:
|
||||||
width_shift_range=0.02, # 圖像隨機水平移動,位移距離為圖像長度乘以參數(0.1)
|
return transforms.Compose([
|
||||||
height_shift_range=0.02, # 圖像隨機垂直移動,位移距離為圖像長度乘以參數(0.1)
|
transforms.RandomRotation(50),
|
||||||
shear_range = 0.02,
|
transforms.RandomResizedCrop(224, scale=(0.75, 1.0)),
|
||||||
zoom_range=0.02, # 隨機縮放範圍,[lower, upper] = [1-zoom_range, 1+zoom_range]
|
transforms.RandomAffine(degrees=30, shear=0.25),
|
||||||
horizontal_flip = True,
|
transforms.ColorJitter(brightness=0.3, contrast=0.3, saturation=0.3, hue=0.2),
|
||||||
fill_mode = "reflect"
|
transforms.RandomHorizontalFlip(),
|
||||||
)
|
transforms.RandomVerticalFlip(),
|
||||||
|
])
|
||||||
if judge == 4: # 第二份paper的資料強化
|
else:
|
||||||
datagen = ImageDataGenerator(
|
return transforms.ToTensor() # 將數值歸一化到[0, 1]之間
|
||||||
rotation_range=50, # 旋轉影像
|
|
||||||
width_shift_range=0.2, # 圖像隨機水平移動,位移距離為圖像長度乘以參數(0.1)
|
|
||||||
height_shift_range=0.2, # 圖像隨機垂直移動,位移距離為圖像長度乘以參數(0.1)
|
|
||||||
shear_range = 0.25,
|
|
||||||
zoom_range=0.1, # 隨機縮放範圍,[lower, upper] = [1-zoom_range, 1+zoom_range]
|
|
||||||
channel_shift_range = 20 # 隨機通道轉換的範圍
|
|
||||||
)
|
|
||||||
|
|
||||||
if judge == 5: # 第一份paper的資料強化
|
|
||||||
datagen = ImageDataGenerator(rescale = 1 / 255)
|
|
||||||
|
|
||||||
return datagen
|
|
||||||
BIN
Image_Process/__pycache__/Image_Generator.cpython-311.pyc
Normal file
BIN
Image_Process/__pycache__/Image_Generator.cpython-311.pyc
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -47,3 +47,7 @@ class Process_File():
|
||||||
modelfiles = self.Make_Save_Root(File_Name + ".txt", model_dir) # 將檔案名稱及路徑字串合併成完整路徑
|
modelfiles = self.Make_Save_Root(File_Name + ".txt", model_dir) # 將檔案名稱及路徑字串合併成完整路徑
|
||||||
with open(modelfiles, mode = 'a') as file:
|
with open(modelfiles, mode = 'a') as file:
|
||||||
file.write(content)
|
file.write(content)
|
||||||
|
|
||||||
|
def Save_PIL_File(self, FileName, save_root, image): # 存CSV檔
|
||||||
|
save_root = self.Make_Save_Root(FileName, save_root)
|
||||||
|
image.save(save_root)
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
from torch import nn
|
from torch import nn
|
||||||
from torch.nn import functional
|
from torch.nn import functional
|
||||||
|
import torch
|
||||||
|
|
||||||
|
|
||||||
class Entropy_Loss(nn.Module):
|
class Entropy_Loss(nn.Module):
|
||||||
|
|
@ -9,7 +10,10 @@ class Entropy_Loss(nn.Module):
|
||||||
def forward(self, outputs, labels):
|
def forward(self, outputs, labels):
|
||||||
# 範例: 使用均方誤差作為損失計算
|
# 範例: 使用均方誤差作為損失計算
|
||||||
# outputs = torch.argmax(outputs, 1)
|
# outputs = torch.argmax(outputs, 1)
|
||||||
# outputs = outputs.float()
|
outputs = outputs.float()
|
||||||
|
|
||||||
|
# input shape has a question
|
||||||
|
# print(f"Label result: {labels}, result: {outputs}")
|
||||||
labels = labels.float()
|
labels = labels.float()
|
||||||
loss = functional.binary_cross_entropy(outputs, labels)
|
loss = functional.binary_cross_entropy(outputs[0], labels)
|
||||||
return loss
|
return loss
|
||||||
BIN
Model_Loss/__pycache__/Loss.cpython-311.pyc
Normal file
BIN
Model_Loss/__pycache__/Loss.cpython-311.pyc
Normal file
Binary file not shown.
|
|
@ -1,5 +1,6 @@
|
||||||
import cv2
|
import cv2
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
import torch
|
||||||
|
|
||||||
class Read_image_and_Process_image:
|
class Read_image_and_Process_image:
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -1,6 +1,20 @@
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
from sklearn.preprocessing import OneHotEncoder
|
|
||||||
from torch.nn import functional
|
from torch.nn import functional
|
||||||
|
import torch
|
||||||
|
from torch.utils.data import Dataset, DataLoader
|
||||||
|
|
||||||
|
class ListDataset(Dataset):
|
||||||
|
def __init__(self, data_list, labels_list):
|
||||||
|
self.data = data_list
|
||||||
|
self.labels = labels_list
|
||||||
|
|
||||||
|
def __len__(self):
|
||||||
|
return len(self.data)
|
||||||
|
|
||||||
|
def __getitem__(self, idx):
|
||||||
|
sample = self.data[idx]
|
||||||
|
label = self.labels[idx]
|
||||||
|
return sample, label
|
||||||
|
|
||||||
class Tool:
|
class Tool:
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
|
|
@ -48,17 +62,23 @@ class Tool:
|
||||||
self.__Normal_ImageGenerator_Data_Root = "../Dataset/Training/Normal_ImageGenerator"
|
self.__Normal_ImageGenerator_Data_Root = "../Dataset/Training/Normal_ImageGenerator"
|
||||||
self.__Comprehensive_Generator_Root = "../Dataset/Training/Comprehensive_ImageGenerator"
|
self.__Comprehensive_Generator_Root = "../Dataset/Training/Comprehensive_ImageGenerator"
|
||||||
|
|
||||||
def Set_OneHotEncording(self, content, Number_Of_Classes):
|
def Set_OneHotEncording(self, content):
|
||||||
OneHot_labels = functional.one_hot(content, Number_Of_Classes)
|
Counter = []
|
||||||
return OneHot_labels
|
for i in range(len(content)):
|
||||||
|
Counter.append(i)
|
||||||
|
|
||||||
|
Counter = torch.tensor(Counter)
|
||||||
|
|
||||||
|
self.__OneHot_Encording = functional.one_hot(Counter, len(content))
|
||||||
|
pass
|
||||||
|
|
||||||
|
def Set_Data_To_DataSet(self, Datas : list, Labels : list, Batch_Size : int):
|
||||||
|
# 創建 Dataset
|
||||||
|
dataset = ListDataset(Datas, Labels)
|
||||||
|
|
||||||
|
return DataLoader(dataset = dataset, batch_size = Batch_Size, shuffle=True, num_workers = 0, pin_memory=True)
|
||||||
|
|
||||||
|
|
||||||
def Set_Zips(self, Datas, Labels, Address_Name):
|
|
||||||
if Address_Name == "Training":
|
|
||||||
self.Training_Zip = zip(Datas, Labels)
|
|
||||||
if Address_Name == "Validation":
|
|
||||||
self.Validation_Zip = zip(Datas, Labels)
|
|
||||||
if Address_Name == "Testing":
|
|
||||||
self.Testing_Zip = zip(Datas, Labels)
|
|
||||||
|
|
||||||
def Get_Data_Label(self):
|
def Get_Data_Label(self):
|
||||||
'''
|
'''
|
||||||
|
|
|
||||||
Binary file not shown.
BIN
Training_Tools/__pycache__/Tools.cpython-311.pyc
Normal file
BIN
Training_Tools/__pycache__/Tools.cpython-311.pyc
Normal file
Binary file not shown.
Binary file not shown.
BIN
Training_Tools/__pycache__/__init__.cpython-311.pyc
Normal file
BIN
Training_Tools/__pycache__/__init__.cpython-311.pyc
Normal file
Binary file not shown.
Binary file not shown.
|
|
@ -50,7 +50,7 @@ def call_back(model_name, index, optimizer):
|
||||||
|
|
||||||
model_dir = '../Result/save_the_best_model/' + model_name
|
model_dir = '../Result/save_the_best_model/' + model_name
|
||||||
File.JudgeRoot_MakeDir(model_dir)
|
File.JudgeRoot_MakeDir(model_dir)
|
||||||
modelfiles = File.Make_Save_Root('best_model( ' + str(datetime.date.today()) + " )-" + str(index) + ".weights.h5", model_dir)
|
modelfiles = File.Make_Save_Root('best_model( ' + str(datetime.date.today()) + " )-" + str(index) + ".weights.pt", model_dir)
|
||||||
|
|
||||||
# model_mckp = ModelCheckpoint(modelfiles, monitor='val_loss', save_best_only=True, save_weights_only = True, mode='auto')
|
# model_mckp = ModelCheckpoint(modelfiles, monitor='val_loss', save_best_only=True, save_weights_only = True, mode='auto')
|
||||||
|
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
|
|
@ -4,7 +4,7 @@ import torch
|
||||||
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
|
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
|
||||||
from torchmetrics.functional import auroc
|
from torchmetrics.functional import auroc
|
||||||
import torch.optim as optim
|
import torch.optim as optim
|
||||||
|
import numpy as np
|
||||||
from all_models_tools.all_model_tools import call_back
|
from all_models_tools.all_model_tools import call_back
|
||||||
from Model_Loss.Loss import Entropy_Loss
|
from Model_Loss.Loss import Entropy_Loss
|
||||||
|
|
||||||
|
|
@ -21,6 +21,10 @@ class All_Step:
|
||||||
self.Epoch = Epoch
|
self.Epoch = Epoch
|
||||||
self.Number_Of_Classes = Number_Of_Classes
|
self.Number_Of_Classes = Number_Of_Classes
|
||||||
|
|
||||||
|
self.Training_Data_Length = len(list(zip(*Training_Data_And_Label))[1])
|
||||||
|
self.Testing_Data_Length = len(list(zip(*Test_Data_And_Label))[1])
|
||||||
|
self.Validation_Data_Length = len(list(zip(*Validation_Data_And_Label))[1])
|
||||||
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def Training_Step(self, model_name, counter):
|
def Training_Step(self, model_name, counter):
|
||||||
|
|
@ -34,42 +38,45 @@ class All_Step:
|
||||||
train_accuracies = []
|
train_accuracies = []
|
||||||
val_accuracies = []
|
val_accuracies = []
|
||||||
|
|
||||||
for epoch in range(self.Epoch):
|
for epoch in range(self.Epoch): # 訓練迴圈
|
||||||
self.Model.train()
|
self.Model.train() # 開始訓練
|
||||||
running_loss = 0.0
|
running_loss = 0.0
|
||||||
all_train_preds = []
|
all_train_preds = []
|
||||||
all_train_labels = []
|
all_train_labels = []
|
||||||
|
|
||||||
epoch_iterator = tqdm(self.Training_Data_And_Label, desc= "Training (Epoch %d)" % epoch)
|
epoch_iterator = tqdm(self.Training_Data_And_Label, desc= "Training (Epoch %d)" % epoch) # 使用進度條
|
||||||
|
|
||||||
|
|
||||||
for inputs, labels in epoch_iterator:
|
for inputs, labels in epoch_iterator:
|
||||||
# labels = np.reshape(labels, (int(labels.shape[0]), 1))
|
# print(inputs.shape)
|
||||||
inputs, OneHot_labels = inputs.to(self.device), OneHot_labels.to(self.device)
|
# 輸入的維度為3維 但模型要的是4維 所以要再多加一維
|
||||||
# inputs, labels = inputs.cuda(), labels.cuda()
|
inputs = np.expand_dims(inputs, axis = 0)
|
||||||
|
# print(inputs.shape)
|
||||||
|
inputs, labels = torch.tensor(inputs).to(self.device), torch.tensor(labels).to(self.device)
|
||||||
|
|
||||||
Optimizer.zero_grad()
|
Optimizer.zero_grad()
|
||||||
outputs = self.Model(inputs)
|
outputs = self.Model(inputs)
|
||||||
loss = criterion(outputs, OneHot_labels)
|
loss = criterion(outputs, labels)
|
||||||
loss.backward()
|
loss.backward()
|
||||||
Optimizer.step()
|
Optimizer.step()
|
||||||
running_loss += loss.item()
|
running_loss += loss.item()
|
||||||
|
|
||||||
# 收集訓練預測和標籤
|
# 收集訓練預測和標籤
|
||||||
_, preds = torch.max(outputs, 1)
|
_, preds = torch.max(outputs, 1)
|
||||||
all_train_preds.extend(preds.cpu().numpy())
|
labels = np.argmax(labels.cpu().numpy())
|
||||||
all_train_labels.extend(labels.cpu().numpy())
|
# all_train_preds.extend(preds.cpu().numpy())
|
||||||
|
# all_train_labels.extend(labels.cpu().numpy())
|
||||||
|
|
||||||
Training_Loss = running_loss/len(self.Training_Data_And_Label)
|
all_train_preds.append(preds.cpu().numpy())
|
||||||
|
all_train_labels.append(labels)
|
||||||
|
|
||||||
# all_train_labels = torch.FloatTensor(all_train_labels)
|
Training_Loss = running_loss / self.Training_Data_Length
|
||||||
# all_train_labels = torch.argmax(all_train_labels, 1)
|
|
||||||
train_accuracy = accuracy_score(all_train_labels, all_train_preds)
|
train_accuracy = accuracy_score(all_train_labels, all_train_preds)
|
||||||
|
|
||||||
train_losses.append(Training_Loss)
|
train_losses.append(Training_Loss)
|
||||||
train_accuracies.append(train_accuracy)
|
train_accuracies.append(train_accuracy)
|
||||||
|
|
||||||
print(f"Epoch [{epoch+1}/{self.epoch}], Loss: {Training_Loss:.4f}, Accuracy: {train_accuracy:0.2f}", end = ' ')
|
print(f"Epoch [{epoch+1}/{self.Epoch}], Loss: {Training_Loss:.4f}, Accuracy: {train_accuracy:0.2f}", end = ' ')
|
||||||
|
|
||||||
self.Model.eval()
|
self.Model.eval()
|
||||||
val_loss = 0.0
|
val_loss = 0.0
|
||||||
|
|
@ -78,24 +85,30 @@ class All_Step:
|
||||||
|
|
||||||
with torch.no_grad():
|
with torch.no_grad():
|
||||||
for inputs, labels in self.Validation_Data_And_Label:
|
for inputs, labels in self.Validation_Data_And_Label:
|
||||||
inputs, OneHot_labels = inputs.to(self.device), labels.to(self.device)
|
inputs = np.expand_dims(inputs, axis = 0)
|
||||||
|
inputs, labels = torch.tensor(inputs).to(self.device), torch.tensor(labels).to(self.device)
|
||||||
|
|
||||||
outputs = self.Model(inputs)
|
outputs = self.Model(inputs)
|
||||||
loss = criterion(outputs, OneHot_labels)
|
loss = criterion(outputs, labels)
|
||||||
val_loss += loss.item()
|
val_loss += loss.item()
|
||||||
|
|
||||||
# 驗證預測與標籤
|
# 驗證預測與標籤
|
||||||
_, preds = torch.max(outputs, 1)
|
_, preds = torch.max(outputs, 1)
|
||||||
all_val_preds.extend(preds.cpu().numpy())
|
labels = np.argmax(labels.cpu().numpy())
|
||||||
all_val_labels.extend(labels.cpu().numpy())
|
|
||||||
|
# all_val_preds.extend(preds.cpu().numpy())
|
||||||
|
# all_val_labels.extend(labels.cpu().numpy())a
|
||||||
|
|
||||||
|
all_val_preds.append(preds.cpu().numpy())
|
||||||
|
all_val_labels.append(labels)
|
||||||
|
|
||||||
# 計算驗證損失與準確率
|
# 計算驗證損失與準確率
|
||||||
val_loss /= len(list(self.Validation_Data_And_Label))
|
val_loss /= self.Validation_Data_Length
|
||||||
val_accuracy = accuracy_score(all_val_labels, all_val_preds)
|
val_accuracy = accuracy_score(all_val_labels, all_val_preds)
|
||||||
|
|
||||||
val_losses.append(val_loss)
|
val_losses.append(val_loss)
|
||||||
val_accuracies.append(val_accuracy)
|
val_accuracies.append(val_accuracy)
|
||||||
print(f"Epoch [{epoch+1}/{self.epoch}], Loss: {val_loss:.4f}, Accuracy: {val_accuracy:0.2f}")
|
print(f"Val_loss: {val_loss:.4f}, Val_accuracy: {val_accuracy:0.2f}")
|
||||||
|
|
||||||
early_stopping(val_loss, self.Model, model_path)
|
early_stopping(val_loss, self.Model, model_path)
|
||||||
if early_stopping.early_stop:
|
if early_stopping.early_stop:
|
||||||
|
|
@ -114,18 +127,25 @@ class All_Step:
|
||||||
loss = 0.0
|
loss = 0.0
|
||||||
with torch.no_grad():
|
with torch.no_grad():
|
||||||
for images, labels in self.Test_Data_And_Label:
|
for images, labels in self.Test_Data_And_Label:
|
||||||
images, OneHot_labels = images.to(self.device), OneHot_labels.to(self.device)
|
images = np.expand_dims(images, axis = 0)
|
||||||
|
images, labels = torch.tensor(images).to(self.device), torch.tensor(labels).to(self.device)
|
||||||
|
|
||||||
outputs = cnn_model(images)
|
outputs = cnn_model(images)
|
||||||
_, predicted = torch.max(outputs, 1)
|
|
||||||
Predict_Label.extend(predicted.cpu().numpy())
|
|
||||||
True_Label.extend(labels.cpu().numpy())
|
|
||||||
|
|
||||||
loss /= len(self.Test_Data_And_Label)
|
_, predicted = torch.max(outputs, 1)
|
||||||
|
labels = np.argmax(labels.cpu().numpy())
|
||||||
|
|
||||||
|
Predict_Label.append(predicted.cpu().numpy())
|
||||||
|
True_Label.append(labels)
|
||||||
|
|
||||||
|
# Predict_Label.extend(predicted.cpu().numpy())
|
||||||
|
# True_Label.extend(labels.cpu().numpy())
|
||||||
|
|
||||||
|
loss /= self.Testing_Data_Length
|
||||||
|
|
||||||
accuracy = accuracy_score(True_Label, Predict_Label)
|
accuracy = accuracy_score(True_Label, Predict_Label)
|
||||||
precision = precision_score(True_Label, Predict_Label)
|
precision = precision_score(True_Label, Predict_Label)
|
||||||
recall = recall_score(True_Label, Predict_Label)
|
recall = recall_score(True_Label, Predict_Label)
|
||||||
AUC = auroc(True_Label, Predict_Label, task = ["Stomatch_Cancer", "Normal"])
|
AUC = auroc(True_Label, Predict_Label, task = "binary")
|
||||||
f1 = f1_score(True_Label, Predict_Label)
|
f1 = f1_score(True_Label, Predict_Label)
|
||||||
return loss, accuracy, precision, recall, AUC, f1, True_Label, Predict_Label
|
return loss, accuracy, precision, recall, AUC, f1, True_Label, Predict_Label
|
||||||
BIN
experiments/__pycache__/Model_All_Step.cpython-311.pyc
Normal file
BIN
experiments/__pycache__/Model_All_Step.cpython-311.pyc
Normal file
Binary file not shown.
Binary file not shown.
BIN
experiments/__pycache__/pytorch_Model.cpython-311.pyc
Normal file
BIN
experiments/__pycache__/pytorch_Model.cpython-311.pyc
Normal file
Binary file not shown.
|
|
@ -5,11 +5,10 @@ from Load_process.Load_Indepentend import Load_Indepentend_Data
|
||||||
from _validation.ValidationTheEnterData import validation_the_enter_data
|
from _validation.ValidationTheEnterData import validation_the_enter_data
|
||||||
from Load_process.file_processing import Process_File
|
from Load_process.file_processing import Process_File
|
||||||
from merge_class.merge import merge
|
from merge_class.merge import merge
|
||||||
from draw_tools.Grad_cam import Grad_CAM
|
|
||||||
from sklearn.metrics import confusion_matrix
|
from sklearn.metrics import confusion_matrix
|
||||||
from experiments.pytorch_Model import ModifiedXception
|
from experiments.pytorch_Model import ModifiedXception
|
||||||
from Image_Process.Image_Generator import Image_generator
|
from Image_Process.Image_Generator import Image_generator
|
||||||
from Model_All_Step import All_Step
|
from experiments.Model_All_Step import All_Step
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import torch
|
import torch
|
||||||
|
|
@ -51,11 +50,11 @@ class experiments():
|
||||||
self.validation_obj = validation_the_enter_data() # 呼叫驗證物件
|
self.validation_obj = validation_the_enter_data() # 呼叫驗證物件
|
||||||
self.cut_image = Load_Indepentend_Data(self.Topic_Tool.Get_Data_Label(), self.Topic_Tool.Get_OneHot_Encording_Label()) # 呼叫切割影像物件
|
self.cut_image = Load_Indepentend_Data(self.Topic_Tool.Get_Data_Label(), self.Topic_Tool.Get_OneHot_Encording_Label()) # 呼叫切割影像物件
|
||||||
self.image_processing = Read_image_and_Process_image()
|
self.image_processing = Read_image_and_Process_image()
|
||||||
|
self.ImageGenerator = Image_generator("", "")
|
||||||
self.merge = merge()
|
self.merge = merge()
|
||||||
|
|
||||||
self.model_name = "Xception" # 取名,告訴我我是用哪個模型(可能是預處理模型/自己設計的模型)
|
self.model_name = "Xception" # 取名,告訴我我是用哪個模型(可能是預處理模型/自己設計的模型)
|
||||||
self.experiment_name = "Xception Skin to train Normal stomach cancer"
|
self.experiment_name = "Xception Skin to train Normal stomach cancer"
|
||||||
# self.file_name = "Remove background of Chickenpox with normal image"
|
|
||||||
self.generator_batch_size = 50
|
self.generator_batch_size = 50
|
||||||
self.epoch = 10000
|
self.epoch = 10000
|
||||||
self.train_batch_size = 128
|
self.train_batch_size = 128
|
||||||
|
|
@ -82,9 +81,14 @@ class experiments():
|
||||||
# 將處理好的test Data 與 Validation Data 丟給這個物件的變數
|
# 將處理好的test Data 與 Validation Data 丟給這個物件的變數
|
||||||
self.test, self.test_label = self.cut_image.test, self.cut_image.test_label
|
self.test, self.test_label = self.cut_image.test, self.cut_image.test_label
|
||||||
self.validation, self.validation_label = self.cut_image.validation, self.cut_image.validation_label
|
self.validation, self.validation_label = self.cut_image.validation, self.cut_image.validation_label
|
||||||
self.Topic_Tool.Set_Zips(train, train_label, "Training")
|
|
||||||
self.Topic_Tool.Set_Zips(self.test, self.test_label, "Testing")
|
train = self.Preprocess_Image_Data(train)
|
||||||
self.Topic_Tool.Set_Zips(self.validation, self.validation_label, "Validation")
|
self.test = self.Preprocess_Image_Data(self.test)
|
||||||
|
self.validation = self.Preprocess_Image_Data(self.validation)
|
||||||
|
|
||||||
|
self.Topic_Tool.Set_Data_To_DataSet(train, train_label, "Training")
|
||||||
|
self.Topic_Tool.Set_Data_To_DataSet(self.test, self.test_label, "Testing")
|
||||||
|
self.Topic_Tool.Set_Data_To_DataSet(self.validation, self.validation_label, "Validation")
|
||||||
|
|
||||||
self.Training_Zip, self.Testing_Zip, self.Validation_Zip = self.Topic_Tool.Get_Zip()
|
self.Training_Zip, self.Testing_Zip, self.Validation_Zip = self.Topic_Tool.Get_Zip()
|
||||||
|
|
||||||
|
|
@ -114,7 +118,7 @@ class experiments():
|
||||||
|
|
||||||
def construct_model(self):
|
def construct_model(self):
|
||||||
'''決定我這次訓練要用哪個model'''
|
'''決定我這次訓練要用哪個model'''
|
||||||
cnn_model = ModifiedXception()
|
cnn_model = ModifiedXception(self.Number_Of_Classes)
|
||||||
|
|
||||||
if torch.cuda.device_count() > 1:
|
if torch.cuda.device_count() > 1:
|
||||||
cnn_model = nn.DataParallel(cnn_model)
|
cnn_model = nn.DataParallel(cnn_model)
|
||||||
|
|
@ -122,6 +126,20 @@ class experiments():
|
||||||
cnn_model = cnn_model.to(self.device)
|
cnn_model = cnn_model.to(self.device)
|
||||||
return cnn_model
|
return cnn_model
|
||||||
|
|
||||||
|
def Preprocess_Image_Data(self, Image_Datas):
|
||||||
|
transform = self.ImageGenerator.Generator_Content(5)
|
||||||
|
|
||||||
|
Transform_Image = []
|
||||||
|
for Image in Image_Datas:
|
||||||
|
Image = transform(Image)
|
||||||
|
Transform_Image.append(Image)
|
||||||
|
|
||||||
|
# Transform_Image.append(self.ImageGenerator._apply_transform(transform, Image))
|
||||||
|
Transform_Image = torch.tensor(np.array(Transform_Image))
|
||||||
|
print(Transform_Image.shape)
|
||||||
|
return Transform_Image
|
||||||
|
|
||||||
|
|
||||||
def record_matrix_image(self, True_Labels, Predict_Labels, model_name, index):
|
def record_matrix_image(self, True_Labels, Predict_Labels, model_name, index):
|
||||||
'''劃出混淆矩陣(熱力圖)'''
|
'''劃出混淆矩陣(熱力圖)'''
|
||||||
# 計算混淆矩陣
|
# 計算混淆矩陣
|
||||||
|
|
|
||||||
|
|
@ -2,30 +2,49 @@ import torch
|
||||||
import torch.nn as nn
|
import torch.nn as nn
|
||||||
import torch.optim as optim
|
import torch.optim as optim
|
||||||
import torchvision.transforms as transforms
|
import torchvision.transforms as transforms
|
||||||
|
from torchvision import models
|
||||||
import timm
|
import timm
|
||||||
|
|
||||||
|
|
||||||
class ModifiedXception(nn.Module):
|
class ModifiedXception(nn.Module):
|
||||||
def __init__(self):
|
def __init__(self, num_classes):
|
||||||
super(ModifiedXception, self).__init__()
|
super(ModifiedXception, self).__init__()
|
||||||
|
|
||||||
# 加載 Xception 預訓練模型,去掉最後一層 (fc 層)
|
# 加載 Xception 預訓練模型,去掉最後一層 (fc 層)
|
||||||
self.base_model = timm.create_model('xception', pretrained=True)
|
self.base_model = timm.create_model(
|
||||||
self.base_model.fc = nn.Identity() # 移除原來的 fully connected 層
|
'xception',
|
||||||
|
pretrained=True,
|
||||||
|
features_only=True, # 只保留特徵提取部分
|
||||||
|
out_indices=[3] # 選擇特徵層索引(根據模型結構)
|
||||||
|
)
|
||||||
|
|
||||||
# 新增全局平均池化層、隱藏層和輸出層
|
# 自定義分類頭
|
||||||
self.global_avg_pool = nn.AdaptiveAvgPool2d(1) # 全局平均池化
|
self.custom_head = nn.Sequential(
|
||||||
self.hidden_layer = nn.Linear(2048, 1370) # 隱藏層,輸入大小取決於 Xception 的輸出大小
|
nn.AdaptiveAvgPool2d(1), # Global Average Pooling,
|
||||||
self.output_layer = nn.Linear(1370, 2) # 輸出層,依據分類數目設定
|
nn.Flatten(),
|
||||||
|
nn.Linear(728, 368), # Xception 輸出特徵維度為2048
|
||||||
|
nn.ReLU(), # 可選激活函數
|
||||||
|
nn.Linear(368, num_classes),
|
||||||
|
nn.Sigmoid()
|
||||||
|
)
|
||||||
|
|
||||||
# 激活函數與 dropout
|
# self.base_model.fc = nn.Identity() # 移除原來的 fully connected 層
|
||||||
self.relu = nn.ReLU()
|
|
||||||
self.dropout = nn.Dropout(0.6)
|
# # 新增全局平均池化層、隱藏層和輸出層
|
||||||
|
# self.global_avg_pool = nn.AdaptiveAvgPool2d(1) # 全局平均池化
|
||||||
|
# self.hidden_layer = nn.Linear(2048, 1370) # 隱藏層,輸入大小取決於 Xception 的輸出大小
|
||||||
|
# self.output_layer = nn.Linear(1370, 2) # 輸出層,依據分類數目設定
|
||||||
|
|
||||||
|
# # 激活函數與 dropout
|
||||||
|
# self.relu = nn.ReLU()
|
||||||
|
# self.dropout = nn.Dropout(0.6)
|
||||||
|
|
||||||
def forward(self, x):
|
def forward(self, x):
|
||||||
x = self.base_model(x) # Xception 主體
|
x = self.base_model(x) # Xception 主體
|
||||||
x = self.global_avg_pool(x) # 全局平均池化
|
x = x[0]
|
||||||
x = self.relu(self.hidden_layer(x)) # 隱藏層 + ReLU
|
output = self.custom_head(x)
|
||||||
x = self.dropout(x) # Dropout
|
# x = self.global_avg_pool(x) # 全局平均池化
|
||||||
x = self.output_layer(x) # 輸出層
|
# x = self.relu(self.hidden_layer(x)) # 隱藏層 + ReLU
|
||||||
return x
|
# x = self.dropout(x) # Dropout
|
||||||
|
# x = self.output_layer(x) # 輸出層
|
||||||
|
return output
|
||||||
|
|
|
||||||
48
main.py
48
main.py
|
|
@ -2,7 +2,7 @@ from experiments.experiment import experiments
|
||||||
from Image_Process.load_and_ImageGenerator import Load_ImageGenerator
|
from Image_Process.load_and_ImageGenerator import Load_ImageGenerator
|
||||||
from Read_and_process_image.ReadAndProcess import Read_image_and_Process_image
|
from Read_and_process_image.ReadAndProcess import Read_image_and_Process_image
|
||||||
from Training_Tools.Tools import Tool
|
from Training_Tools.Tools import Tool
|
||||||
from model_data_processing.processing import shuffle_data
|
from model_data_processing.processing import shuffle_data, Balance_Process
|
||||||
from Load_process.LoadData import Load_Data_Prepare
|
from Load_process.LoadData import Load_Data_Prepare
|
||||||
from Calculate_Process.Calculate import Calculate
|
from Calculate_Process.Calculate import Calculate
|
||||||
from merge_class.merge import merge
|
from merge_class.merge import merge
|
||||||
|
|
@ -32,11 +32,11 @@ if __name__ == "__main__":
|
||||||
tool.Set_OneHotEncording(Labels)
|
tool.Set_OneHotEncording(Labels)
|
||||||
Encording_Label = tool.Get_OneHot_Encording_Label()
|
Encording_Label = tool.Get_OneHot_Encording_Label()
|
||||||
Label_Length = len(Labels)
|
Label_Length = len(Labels)
|
||||||
|
Classification = 2 # 分類數量
|
||||||
|
|
||||||
Gneerator_size = 0
|
|
||||||
Prepare = Load_Data_Prepare()
|
Prepare = Load_Data_Prepare()
|
||||||
loading_data = Load_ImageGenerator(Trainig_Root, Testing_Root, Validation_Root, Generator_Root, Labels)
|
loading_data = Load_ImageGenerator(Trainig_Root, Testing_Root, Validation_Root, Generator_Root, Labels)
|
||||||
experiment = experiments(tool, Status)
|
experiment = experiments(tool, Classification, Status)
|
||||||
image_processing = Read_image_and_Process_image()
|
image_processing = Read_image_and_Process_image()
|
||||||
Merge = merge()
|
Merge = merge()
|
||||||
Calculate_Tool = Calculate()
|
Calculate_Tool = Calculate()
|
||||||
|
|
@ -46,37 +46,32 @@ if __name__ == "__main__":
|
||||||
for i in range(0, counter, 1): # 做規定次數的訓練
|
for i in range(0, counter, 1): # 做規定次數的訓練
|
||||||
# 讀取資料
|
# 讀取資料
|
||||||
Data_Dict_Data = loading_data.process_main(Label_Length)
|
Data_Dict_Data = loading_data.process_main(Label_Length)
|
||||||
|
Data_Dict_Data, Train_Size = Balance_Process(Data_Dict_Data, Labels)
|
||||||
Data_Dict_Data = shuffle_data(Data_Dict_Data, Labels, 2)
|
|
||||||
tmp = []
|
|
||||||
Train_Size = 0
|
|
||||||
if len(Data_Dict_Data[Labels[0]]) >= len(Data_Dict_Data[Labels[1]]):
|
|
||||||
Train_Size = len(Data_Dict_Data[Labels[1]])
|
|
||||||
for j in range(Train_Size):
|
|
||||||
tmp.append(Data_Dict_Data[Labels[0]][j])
|
|
||||||
Data_Dict_Data[Labels[0]] = tmp
|
|
||||||
else:
|
|
||||||
Train_Size = len(Data_Dict_Data[Labels[0]])
|
|
||||||
for j in range(Train_Size):
|
|
||||||
tmp.append(Data_Dict_Data[Labels[1]][j])
|
|
||||||
Data_Dict_Data[Labels[1]] = tmp
|
|
||||||
|
|
||||||
# 輸出內容
|
# 輸出內容
|
||||||
print("Negative Data有 " + str(len(Data_Dict_Data[Labels[1]])) + " 筆資料")
|
print("每個類別各有 " + str(Train_Size) + " 筆資料")
|
||||||
print("Positive Data有 " + str(len(Data_Dict_Data[Labels[0]])) + " 筆資料")
|
total = 0
|
||||||
print("總共有 " + str(len(Data_Dict_Data[Labels[0]]) + len(Data_Dict_Data[Labels[1]])) + " 筆資料")
|
for j in range(Label_Length):
|
||||||
|
total += Train_Size
|
||||||
|
print("總共有 " + str(total) + " 筆資料")
|
||||||
|
|
||||||
# 做出跟資料相同數量的Label
|
# 做出跟資料相同數量的Label
|
||||||
Negative_Num = image_processing.make_label_list(Train_Size, Encording_Label[1])
|
Classes = []
|
||||||
Positive_Num = image_processing.make_label_list(Train_Size, Encording_Label[0])
|
for encording in Encording_Label:
|
||||||
|
Classes.append(image_processing.make_label_list(Train_Size, encording))
|
||||||
|
|
||||||
# 將資料做成Dict的資料型態
|
# 將資料做成Dict的資料型態
|
||||||
Prepare.Set_Final_Dict_Data(Labels, Data_Dict_Data, [Positive_Num, Negative_Num], 2)
|
Prepare.Set_Final_Dict_Data(Labels, Data_Dict_Data, Classes, Label_Length)
|
||||||
Final_Dict_Data = Prepare.Get_Final_Data_Dict()
|
Final_Dict_Data = Prepare.Get_Final_Data_Dict()
|
||||||
keys = list(Final_Dict_Data.keys())
|
keys = list(Final_Dict_Data.keys())
|
||||||
|
|
||||||
training_data = Merge.merge_all_image_data(Final_Dict_Data[keys[0]], Final_Dict_Data[keys[1]]) # 將訓練資料合併成一個list
|
training_data = Merge.merge_all_image_data(Final_Dict_Data[keys[0]], Final_Dict_Data[keys[1]]) # 將訓練資料合併成一個list
|
||||||
training_label = Merge.merge_all_image_data(Final_Dict_Data[keys[2]], Final_Dict_Data[keys[3]]) #將訓練資料的label合併成一個label的list
|
for i in range(2, Label_Length):
|
||||||
|
training_data = Merge.merge_all_image_data(training_data, Final_Dict_Data[keys[i]]) # 將訓練資料合併成一個list
|
||||||
|
|
||||||
|
training_label = Merge.merge_all_image_data(Final_Dict_Data[keys[Label_Length]], Final_Dict_Data[keys[Label_Length + 1]]) #將訓練資料的label合併成一個label的list
|
||||||
|
for i in range(Label_Length + 2, 2 * Label_Length):
|
||||||
|
training_label = Merge.merge_all_image_data(training_label, Final_Dict_Data[keys[i]]) # 將訓練資料合併成一個list
|
||||||
|
|
||||||
start = time.time()
|
start = time.time()
|
||||||
trains_Data_Image = image_processing.Data_Augmentation_Image(training_data) # 多執行續讀檔
|
trains_Data_Image = image_processing.Data_Augmentation_Image(training_data) # 多執行續讀檔
|
||||||
|
|
@ -85,7 +80,10 @@ if __name__ == "__main__":
|
||||||
|
|
||||||
print(len(training_data))
|
print(len(training_data))
|
||||||
training_data, train_label = image_processing.image_data_processing(training_data, train_label) # 將讀出來的檔做正規化。降label轉成numpy array 格式
|
training_data, train_label = image_processing.image_data_processing(training_data, train_label) # 將讀出來的檔做正規化。降label轉成numpy array 格式
|
||||||
training_data = image_processing.normalization(training_data)
|
# training_data = image_processing.normalization(training_data)
|
||||||
|
# training_data = training_data.permute(0, 3, 1, 2)
|
||||||
|
|
||||||
|
print(training_data.shape)
|
||||||
|
|
||||||
end = time.time()
|
end = time.time()
|
||||||
print("\n\n\n讀取訓練資料(70000)執行時間:%f 秒\n\n" % (end - start))
|
print("\n\n\n讀取訓練資料(70000)執行時間:%f 秒\n\n" % (end - start))
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
|
|
@ -37,3 +37,16 @@ def shuffle_data(image, label, mode = 1):
|
||||||
random.shuffle(shuffle_image[Label])
|
random.shuffle(shuffle_image[Label])
|
||||||
|
|
||||||
return shuffle_image
|
return shuffle_image
|
||||||
|
|
||||||
|
def Balance_Process(Data_Content, Labels):
|
||||||
|
Data_Dict_Data = shuffle_data(Data_Content, Labels, 2)
|
||||||
|
Train_Size = 0
|
||||||
|
|
||||||
|
Train_Size = min(len(Data_Dict_Data[Labels[0]]), len(Data_Dict_Data[Labels[1]]))
|
||||||
|
for i in range(1, len(Labels) - 1):
|
||||||
|
Train_Size = min(Train_Size, len(Data_Dict_Data[Labels[i + 1]]))
|
||||||
|
|
||||||
|
for i in range(len(Labels)):
|
||||||
|
Data_Dict_Data[Labels[i]] = Data_Dict_Data[Labels[i]][0 : Train_Size]
|
||||||
|
|
||||||
|
return Data_Dict_Data, Train_Size
|
||||||
83
testing.py
83
testing.py
|
|
@ -1,35 +1,64 @@
|
||||||
import paramiko
|
# import paramiko
|
||||||
from scp import SCPClient
|
# from scp import SCPClient
|
||||||
import os
|
# import os
|
||||||
import pexpect
|
# import pexpect
|
||||||
|
|
||||||
# def createSSHClient(server, port, user, password):
|
# # def createSSHClient(server, port, user, password):
|
||||||
# client = paramiko.SSHClient()
|
# # client = paramiko.SSHClient()
|
||||||
# client.load_system_host_keys()
|
# # client.load_system_host_keys()
|
||||||
# client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
|
# # client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
|
||||||
# client.connect(server, port, user, password)
|
# # client.connect(server, port, user, password)
|
||||||
|
|
||||||
# return client
|
# # return client
|
||||||
|
|
||||||
# ssh = createSSHClient("10.1.29.28", 31931, "root", "whitekirin")
|
# # ssh = createSSHClient("10.1.29.28", 31931, "root", "whitekirin")
|
||||||
|
|
||||||
# # os.mkdir("Original_ResNet101V2_with_NPC_Augmentation_Image")
|
# # # os.mkdir("Original_ResNet101V2_with_NPC_Augmentation_Image")
|
||||||
# # with open("Original_ResNet101V2_with_NPC_Augmentation_Image_train3.txt", "w") as file:
|
# # # with open("Original_ResNet101V2_with_NPC_Augmentation_Image_train3.txt", "w") as file:
|
||||||
# # pass
|
# # # pass
|
||||||
|
|
||||||
# with SCPClient(ssh.get_transport()) as scp:
|
# # with SCPClient(ssh.get_transport()) as scp:
|
||||||
# scp.get("/mnt/c/張晉嘉/stomach_cancer/Original_ResNet101V2_with_NPC_Augmentation_Image_train3.txt", "/raid/whitekirin/stomach_cancer/Model_result/save_the_train_result(2024-10-05)/Original_ResNet101V2_with_NPC_Augmentation_Image_train3.txt")
|
# # scp.get("/mnt/c/張晉嘉/stomach_cancer/Original_ResNet101V2_with_NPC_Augmentation_Image_train3.txt", "/raid/whitekirin/stomach_cancer/Model_result/save_the_train_result(2024-10-05)/Original_ResNet101V2_with_NPC_Augmentation_Image_train3.txt")
|
||||||
|
|
||||||
def upload(port, filename, user, ip, dst_path):
|
# def upload(port, filename, user, ip, dst_path):
|
||||||
cmdline = "scp %s -r %s %s@%s:%s" % (port, filename, user, ip, dst_path)
|
# cmdline = "scp %s -r %s %s@%s:%s" % (port, filename, user, ip, dst_path)
|
||||||
|
|
||||||
try:
|
# try:
|
||||||
child = pexpect.spawn(cmdline)
|
# child = pexpect.spawn(cmdline)
|
||||||
child.expect("whitekirin109316118")
|
# child.expect("whitekirin109316118")
|
||||||
child.sendline()
|
# child.sendline()
|
||||||
child.expect(pexpect.EOF)
|
# child.expect(pexpect.EOF)
|
||||||
print("file upload Finish")
|
# print("file upload Finish")
|
||||||
except Exception as e:
|
# except Exception as e:
|
||||||
print("upload faild: ", e)
|
# print("upload faild: ", e)
|
||||||
|
|
||||||
upload(2222, "/raid/whitekirin/stomach_cancer/Model_result/save_the_train_result(2024-10-05)", "whitekirin", "203.64.84.39", "/mnt/c/張晉嘉/stomach_cancer")
|
# upload(2222, "/raid/whitekirin/stomach_cancer/Model_result/save_the_train_result(2024-10-05)", "whitekirin", "203.64.84.39", "/mnt/c/張晉嘉/stomach_cancer")
|
||||||
|
|
||||||
|
from torch.utils.data import Dataset
|
||||||
|
from torch.utils.data import Subset, DataLoader
|
||||||
|
|
||||||
|
class ListDataset(Dataset):
|
||||||
|
def __init__(self, data_list, labels_list):
|
||||||
|
self.data = data_list
|
||||||
|
self.labels = labels_list
|
||||||
|
|
||||||
|
def __len__(self):
|
||||||
|
return len(self.data)
|
||||||
|
|
||||||
|
def __getitem__(self, idx):
|
||||||
|
sample = self.data[idx]
|
||||||
|
label = self.labels[idx]
|
||||||
|
return sample, label
|
||||||
|
|
||||||
|
# 示例數據
|
||||||
|
data_list = ["image1.jpg", "image2.jpg", "image3.jpg"]
|
||||||
|
labels_list = [0, 1, 0]
|
||||||
|
|
||||||
|
# 創建 Dataset
|
||||||
|
dataset = ListDataset(data_list, labels_list)
|
||||||
|
|
||||||
|
# 測試
|
||||||
|
# print(type(dataset[0])) # ('image1.jpg', 0)
|
||||||
|
|
||||||
|
dataloader = DataLoader(dataset = dataset, batch_size = 1, shuffle=True, num_workers = 0, pin_memory=True)
|
||||||
|
print(dataloader)
|
||||||
Loading…
Reference in New Issue
Block a user