카테고리 없음
Classification Inference Example Code
Cuoong
2022. 7. 6. 08:05
import numpy as np
import tensorflow as tf
from keras.callbacks import EarlyStopping, ModelCheckpoint, ReduceLROnPlateau
import datetime
from keras.models import Model,load_model
import os
import cv2
from keras.applications.efficientnet import EfficientNetB3
import shutil
def createFolder(directory):
try:
if not os.path.exists(directory):
os.makedirs(directory)
except OSError:
print ('Error: Creating directory. ' + directory)
########################################## 경로 지정 & Parameter 설정 ##########################################
test_path = r'D:\ADC_POC\Training_Dataset_ADC_TEST'
SAVEPATH = r"D:\ADC_POC\Training_Dataset_ADC_RESULT"
clist = os.listdir(test_path) ## class list
weight_save_path = r'D:\ADC_POC\Training_Dataset_ADC_RESULT'
weight_name = 'weight'
weight_monitor = 'val_acc' ## 'val_loss' or 'val_acc' or 'acc' or 'loss' 중 선택
img_size = (100,100)
batch_size = 32
################################################################################################################
Data Load ### -> Train 폴더와 Test 폴더가 같은 Class 구조를 가지고 있어야 합니다. 아닐 경우 직접 PIL나 CV모듈(CV의 경우 rgb->bgr로 변형 꼭!)로 불러 와줍니다.
from keras.preprocessing.image import ImageDataGenerator
from keras.applications.efficientnet import preprocess_input
idg = ImageDataGenerator(preprocessing_function=preprocess_input)
test_generator = idg.flow_from_directory(directory=test_path, target_size=img_size, batch_size=batch_size, shuffle=False)
print(test_generator.class_indices)
Load Model
test_generator.reset()
model = load_model(weight_save_path+"\\"+weight_name+'.h5')
predict = model.predict(test_generator)
predict = np.argmax(predict, axis=1)
score = 0
reverse_classindices = dict(map(reversed,test_generator.class_indices.items()))
for i in range(len(test_generator.classes)) :
target_filePath = test_generator.filenames[i].split("\\")
target_className = target_filePath[0]
target_filename = target_filePath[1]
predict_className = reverse_classindices[predict[i]]
createFolder(SAVEPATH + "\\" + target_className + "\\" + predict_className)
shutil.copy(test_path+"\\"+test_generator.filenames[i], SAVEPATH + "\\" + target_className + "\\" + predict_className + "\\" + target_filename)
if predict[i] == test_generator.classes[i] :
score += 1/len(test_generator.classes)
print(f'Accuracy : {score*100}%')
CSV 파일 쓰기
import pandas as pd
num_class = len(test_generator.class_indices)
confusion_Matrix = np.zeros((num_class,num_class), dtype='uint8')
for i in range(test_generator.n) :
oper_code = test_generator.classes[i]
pred_code = predict[i]
confusion_Matrix[oper_code, pred_code] += 1
class_indices = test_generator.class_indices.keys()
result_df = pd.DataFrame(confusion_Matrix, index=class_indices, columns=class_indices)
print(result_df)
result_df.to_csv(SAVEPATH + "\\ConfustionMatrix.csv")