CNN 42 - Rank-1 및 Rank-5 정확도 구현을 통한 분류 모델 성능 평가 with Keras

김성빈·2024년 5월 31일
0

Modern Computer Vision

목록 보기
92/117

Keras에서 사전 훈련된 모델을 사용하여 1위 및 5위 정확도를 획득

먼저 사전 교육된 ImageNet 모델 MobileNetV2를 로드

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()

imageNet Class 다운로드 및 폴더 이동

# 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}%'

Rank-5 Accuracy

getScore(all_top_classes, ground_truth, 5)

Get Rank-1 Accuracy

getScore(all_top_classes, ground_truth, 1)

Get Rank-10 Accuracy

getScore(all_top_classes, ground_truth, 10)

결론

PyTorch 결과

  • Rank-1 Accuracy: 77%
  • Rank-5 Accuracy: 88%
  • Rank-10 Accuracy: 100%

Keras 결과

  • Rank-1 Accuracy: 55.56%
  • Rank-5 Accuracy: 77.78%
  • Rank-10 Accuracy: 77.78%

PyTorch 모델이 Keras 모델보다 전반적으로 더 높은 정확도를 보인다.

특히 Rank-1 및 Rank-5 정확도에서 PyTorch 모델이 더 우수한 성능을 보여준다.

PyTorch 모델은 Rank-10 정확도에서 모든 테스트 이미지에 대해 올바른 클래스를 포함하는 반면, Keras 모델은 그렇지 못했다.

이는 모델 학습 방법, 데이터 전처리 방식, 혹은 모델 자체의 구조적 차이로 인한 것일 수 있다.

PyTorch와 Keras는 각각의 장점이 있으므로,

특정 작업에 대해 어느 프레임 워크가 더 적합한지에 대한

경험을 쌓아가야 할 것같다.

profile
감사합니다. https://www.youtube.com/channel/UCxlkiu9_aWijoD7BannNM7w

0개의 댓글