Keras에서 사전 훈련된 모델을 사용하여 1위 및 5위 정확도를 획득
먼저 사전 교육된 ImageNet 모델 MobileNetV2를 로드
# Load our pre-trained MobileNetV2 Model
from tensorflow.keras.applications.mobilenet_v2 import MobileNetV2
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.mobilenet_v2 import preprocess_input, decode_predictions
import numpy as np
model = MobileNetV2(weights='imagenet')
model.summary()
# Get the imageNet Class label names and test images
!wget https://moderncomputervision.s3.eu-west-2.amazonaws.com/imagesDLCV.zip
!unzip imagesDLCV.zip
!rm -rf ./images/class1/.DS_Store
import cv2
from os import listdir
from os.path import isfile, join
# Get images located in ./images folder
mypath = "./images/class1/"
file_names = [f for f in listdir(mypath) if isfile(join(mypath, f))]
file_names
import matplotlib.pyplot as plt
# Figure를 생성합니다. 크기는 16x16입니다.
fig = plt.figure(figsize=(16,16))
all_top_classes = []
# 이미지 파일들을 루프 돌며 분류기를 통해 예측을 수행합니다.
for (i, file) in enumerate(file_names):
# 이미지를 로드하고 크기를 224x224로 변경합니다.
img = image.load_img(mypath + file, target_size=(224, 224))
# 이미지를 배열로 변환합니다.
x = image.img_to_array(img)
# 배열의 차원을 확장하여 배치 크기를 추가합니다.
x = np.expand_dims(x, axis=0)
# 입력 전처리를 수행합니다.
x = preprocess_input(x)
# OpenCV를 사용하여 이미지를 로드합니다.
img2 = cv2.imread(mypath + file)
# 이미지를 리사이즈합니다 (현재 주석 처리됨).
# imageL = cv2.resize(img2, None, fx=.5, fy=.5, interpolation = cv2.INTER_CUBIC)
# 예측을 수행합니다.
preds = model.predict(x)
# 상위 10개의 예측 결과를 디코딩합니다.
predictions = decode_predictions(preds, top=10)[0]
# 상위 클래스 이름을 저장합니다.
all_top_classes.append([x[1] for x in predictions])
# 이미지를 플롯합니다.
sub = fig.add_subplot(len(file_names), 1, i + 1)
sub.set_title(f'Predicted {str(predictions)}')
plt.axis('off')
plt.imshow(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB))
# 플롯을 보여줍니다.
plt.show()
def getScore(all_top_classes, ground_truth, N):
# Calcuate rank-N score
in_labels = 0
for (i,labels) in enumerate(all_top_classes):
if ground_truth[i] in labels[:N]:
in_labels += 1
return f'Rank-{N} Accuracy = {in_labels/len(all_top_classes)*100:.2f}%'
getScore(all_top_classes, ground_truth, 5)
getScore(all_top_classes, ground_truth, 1)
getScore(all_top_classes, ground_truth, 10)
PyTorch 결과
Keras 결과
PyTorch 모델이 Keras 모델보다 전반적으로 더 높은 정확도를 보인다.
특히 Rank-1 및 Rank-5 정확도에서 PyTorch 모델이 더 우수한 성능을 보여준다.
PyTorch 모델은 Rank-10 정확도에서 모든 테스트 이미지에 대해 올바른 클래스를 포함하는 반면, Keras 모델은 그렇지 못했다.
이는 모델 학습 방법, 데이터 전처리 방식, 혹은 모델 자체의 구조적 차이로 인한 것일 수 있다.
PyTorch와 Keras는 각각의 장점이 있으므로,
특정 작업에 대해 어느 프레임 워크가 더 적합한지에 대한
경험을 쌓아가야 할 것같다.