From 733fbc9bea4d59c1b06a9b1463bdb50956084873 Mon Sep 17 00:00:00 2001 From: s47700 <s47700@bht-berlin.de> Date: Tue, 26 Mar 2024 14:15:23 +0100 Subject: [PATCH] Upload New File --- test/TEST_MODEL_with_DATASET_1_.py | 182 +++++++++++++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 test/TEST_MODEL_with_DATASET_1_.py diff --git a/test/TEST_MODEL_with_DATASET_1_.py b/test/TEST_MODEL_with_DATASET_1_.py new file mode 100644 index 0000000..2dc5873 --- /dev/null +++ b/test/TEST_MODEL_with_DATASET_1_.py @@ -0,0 +1,182 @@ +import torch +import torchvision +import torchvision.transforms as transforms +import torch.nn as nn + + + +import os +import sys +import numpy as np +import time +import yaml +import cv2 +import matplotlib.pyplot as plt + +""" +Author: Jenö Faist, Paul Judis +Refernces: LFI-3 cnn.py +""" + +""" +This File for Testing a Trained Model with the Kegal "Early detection of 3D printing issues" Set +Link to Original Dataset: https://www.kaggle.com/datasets/gauravduttakiit/early-detection-of-3d-printing-issues?select=train +Wearning: The Test Dataset for what ever reason is not labeled +so pleas use this Modified Kegal Dataset with the Labeld Test Dataset Labeled by Hand. +Link to the Test Dataset Labeled: ??? TODO ??? + +Because the Test Dataset was hand labeled there is a MANUAL_MODE so that you can MANUAL specifice +by pressing "f" if the current image is a file print or not ! +MANUAL_MODE is Perfered because probably the Test Dataset was labeled porley be hand. +""" + +if __name__ == '__main__': + + """ + Setting up from where to load the Dataset and Model ! + """ + absolutepath = os.path.dirname(__file__) + test_set_PATH = absolutepath+'/DATASETS/early_3D_Kegel_SET/test' + model_save_PATH = absolutepath+'/COMPLETE_MODELS/3D_DEC_MODEL_MIXR18_18E_64B.pt' + MANUAL_MODE = True + + #Consol + print("STARTING CNN TESTING") + print("--------------------") + print("Cuda Version: " + torch.version.cuda) + print("Cuda: "+str(torch.cuda.is_available())) + print("GPU: "+str(torch.cuda.get_device_name())) + print("MANUAL_MODE: "+str(MANUAL_MODE)) + print("--------------------") + print("Loading Model...") + + + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + + """ + Specifing which Model we using for testing the Data this! + THIS MUST BE CHANGED DEPENDING OF WHICH MODEL YOU ARE USING !!! + """ + + model = torchvision.models.resnet18(weights='DEFAULT') + num_ftrs = model.fc.in_features + model.fc = nn.Linear(num_ftrs, 2) + + + """ + Loading Model and Dataset if possible else the programm stops + """ + + try: + model.load_state_dict(torch.load(model_save_PATH),strict=False) + model.eval() + print("[✓] Model Loaded [✓]") + except: + print("[!?] No Model Found [?!]") + exit(1) + + model.eval() + model = model.to(device) + + print("Loading Test Dataset") # Console + + transform = transforms.Compose([ + transforms.ToTensor(), + transforms.Resize((256,256)), + ]) + + test_dataset = None + try: + test_dataset = torchvision.datasets.ImageFolder( + root=test_set_PATH, + transform=transform + ) + print("[✓] Test Dataset Loaded [✓]") # Console + except: + print("[!?] Test Dataset couldn't be loaded [?!]") # Console + exit(1) + + print("--------------------") # Console + + running_accrucay = 0 + count = 0 + + + data_loader = torch.utils.data.DataLoader(test_dataset, batch_size=1, shuffle=False, num_workers=0) + len_test_set = len(data_loader) + + with torch.no_grad(): + + for batch_idx, (inputs, labels) in enumerate(data_loader): + count +=1 + """ + Compute current Network Output for the current Image + """ + img = (inputs[0].squeeze()).numpy() + inputs = inputs.to(device) + labels = labels.to(device) + + outputs = model(inputs) + _, preds = torch.max(outputs, 1) + + """ + MANUAL_MODE shows the current Image and you can press "f" to say if the current image is a failed print or + not (not when f not pressed), this is compared to the network output to specifice accurarcy! + ELSE normal labeling of the Test Dataset is used to calculate accuracy + """ + if(MANUAL_MODE): + + norm_image = cv2.normalize(img, None, alpha = 0, beta = 255, norm_type = cv2.NORM_MINMAX, dtype = cv2.CV_64F) + + norm_image = norm_image.astype(np.uint8) + norm_image = np.transpose(norm_image, (1, 2, 0)) + + + cv2.imshow('TEST MODEL PRESS "F" TO MARK AS FAIL',norm_image) + k =cv2.waitKey(20) + + FAILED_PRINT = False + + if(k==ord("f")): + FAILED_PRINT = True + + if(preds[0].item() == 1 and FAILED_PRINT): + running_accrucay +=1 + elif(preds[0].item() == 0 and not FAILED_PRINT): + running_accrucay +=1 + + """ + JUST FOR VISUALS + """ + + sym = "NO" + sym_2 = "NO" + if(preds[0].item() == 1): + sym = "YES" + if FAILED_PRINT: + sym_2 = "YES" + + + sys.stdout.write("\033[K") + #DEBUG + # " NETWORK VALUES: " + str(outputs[0][0].item())+","+str(outputs[0][1].item()) + print("CNN FAIL DETECTED: " + sym + " USER FAIL DETECTED: " + sym_2 + " CURRENT ACCURACY: "+str(int(100*(running_accrucay/count)))+"%", end='\r') + else: + if(labels == preds[0].item()): + running_accrucay += 1 + sys.stdout.write("\033[K") + print("Testing Image "+str(batch_idx)+"/"+str(len_test_set)+" CURRENT ACCURACY: "+str(int(100*(running_accrucay/count)))+"%", end='\r') + +sys.stdout.write("\033[K") +print("TESTING FINISHED ACCURACY: "+str(int(100*(running_accrucay/count)))+"%", end='\r') + + + + + + + + + + + -- GitLab