Tensorflow dataset 'cats_vs_dogs' 이미지 분류

라이브러리 설치

# pip install opencv-python
# pip install tensorflow-datasets==4.6.0
# 'cats_vs_dogs'는 tfds 버전 4.6.0 에서 실행됨

# tfds 최신 버전 에러 해결
# pip install tfds-nightly

 

import cv2
import matplotlib.pyplot as plt

import tensorflow_datasets as tfds
import tensorflow as tf

 

오류 발생시

# URL 변경 오류 시 다시 세팅
setattr(tfds.image_classification.cats_vs_dogs, '_URL',"https://download.microsoft.com/download/3/E/1/3E1C3F21-ECDB-4869-8368-6DEBA77B919F/kagglecatsanddogs_5340.zip")

 

Train set 분리

data_train, ds_info = tfds.load('cats_vs_dogs', split=[tfds.Split.TRAIN], with_info=True)

 

# .take() 는 n개의 샘플이미지를 numpy 배열로 구성된 목록 'image'에 저장
# one['image'].numpy()는 각 요소의 'image'특성에 접근하고 이를 numpy 배열로 변환

images = [one['image'].numpy() for one in data_train[0].take(30)] 
len(images)

 

# 데이터 시각화
plt.imshow(images[12])
plt.axis('off')

 

Resnet50 모델 활용

resnet50_pre = tf.keras.applications.resnet.ResNet50(weights='imagenet', input_shape=(224, 224, 3))
resnet50_pre.summary()

 

  • tf.keras.applications.resnet.ResNet50 모델의 weights 매개변수에는 다음 세 가지 종류의 값이 할당될 수 있습니다
    • 'imagenet': ImageNet 데이터셋에서 사전 학습된 가중치를 사용합니다. 이 옵션을 선택하면 모델이 ImageNet 데이터셋에서 사전 학습된 가중치로 초기화됩니다.
    • None (기본값): 가중치를 무작위로 초기화합니다. 이 경우 모델은 사전 학습된 가중치를 사용하지 않고 무작위로 초기화됩니다.
    • 미리 학습된 가중치 파일의 경로: 사용자가 정의한 다른 가중치 파일을 지정할 수 있습니다. 이 경우에는 해당 파일에서 가중치를 로드하여 모델을 초기화합니다.

예측

from tensorflow.keras.applications.imagenet_utils import decode_predictions

def pred_img(img):
    plt.imshow(img)
    plt.axis('off')
    plt.show()

    # resnet50
    img_resized = cv2.resize(img, (224,224))
    pred = resnet50_pre.predict(img_resized.reshape([1, 224,224, 3]))
    decoded_pred = decode_predictions(pred)

    for i, instance in enumerate(decoded_pred[0]):
        print('{}위: {} ({:.2f}%)'.format(i+1, instance[1], instance[2] * 100))

 

pred_img(images[3])