딥러닝을 사용해서 10가지 동물 사진 분류하기



📍 딥러닝 동물 사진 분류하기




📌 구글 드라이브와 colab







Python
# 현재 작업 디렉터리 확인
!pwd
# /content로 나올 것임

# 작업 디렉터리 변경
%cd "./drive/MyDrive/+ colab 파일을 만든 경로를 적어주세요" #사용자마다 경로가 다름



📌 라이브러리 import


Python
# 라이브러리 로딩
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

from tqdm import tqdm # 진행률을 시각화해주는 도구 (파이썬에서 몇 번 반복했는지 쉽게 볼 수 있음)
from tensorflow.keras.utils import image_dataset_from_directory # 폴더에서 이미지를 불러오는 도구

# 훈련/평가용 데이터 분리 함수
from sklearn.model_selection import train_test_split # 훈련/평가용 데이터 분리 함수

# 이미지 특징을 추출하는 도구
from tensorflow.keras.applications import InceptionV3 # 이미지 특징을 추출하는 도구

# 신경망 모델 import
from tensorflow.keras.models import Sequential # 딥러닝 모델의 뼈대
from tensorflow.keras.layers import Dense # 뉴런의 묶음을 표현하는 클래스 뉴런을 이용해서 모델을 만들 때 성능은 좋지만 최대한 가볍게 만들어야 함
from tensorflow.keras.callbacks import EarlyStopping # 조기학습 중단 비효율로 시간을 낭비하지 않게 함
from tensorflow.keras.callbacks import ModelCheckpoint # 모델자동 저장 과대 적합을 피하기 위해 미리 자동으로 저장

# 예측과 평가
from tensorflow.keras.models import load_model # hdf5 포맷의 모델파이를 로딩하는 함수
from sklearn.metrics import classification_report # 분류 평가 지표 확인 함수



📌 데이터 로딩


Python
total_data = image_dataset_from_directory(
    directory = "./data/animal_sample/small/", # 읽어들일 경로 지정
    labels = "inferred", # 폴더명을 인식해서 정답으로 붙여준다.
    label_mode = "categorical", # 다중 분류 형태로 인식 > 정답 포맷도 다중 분류용 포맷으로 설정
    color_mode = "rgb", # 컬러사진 설정
    image_size = (224,224) # 이미지 크기 리사이징
)

# 32개씩(배치 사이즈) 데이터 읽기
# 배치 사이즈 : 효율적인 메모리 관리를 위해 데이터를 작은 크기로 나누어 관리하는 개념
for img, label in tqdm(total_data.as_numpy_iterator()) :
  X_data.append(img) # 훈련 데이터
  y_data.append(label) # 정답 데이터


# 리스트에 32개씩 담긴 데이터를 하나의 numpy로 통합
X_numpy = np.concatenate(X_data)
y_numpy = np.concatenate(y_data)
X_numpy.shape, y_numpy.shape





kaggle에서 데이터 가져오기


📌 훈련/평가 데이터 분리


Python
X_train,X_test,y_train,y_test = train_test_split(X_numpy, y_numpy, # 훈련용 X, 정답용 y 
                                                 test_size=0.2, # 80:20 비율로 나눔
                                                 random_state=1219) # 랜덤 프리셋(아무 값이나 가능)
                                                 
# 훈련용 데이터 shape 확인
X_train.shape, y_train.shape

# 평가용 데이터 shape 확인
X_test.shape, y_test.shape                                                



📌 이미지 전처리


Python
ImageEmbedding = InceptionV3(
    include_top = False, 
    weights="imagenet",
    input_shape=(224,224,3), # 이미지 특징을 추출할 데이터의 크기(모양)
    pooling='avg'
)



📌 모델 설계


Python
animal_model = Sequential() # 뼈대 생성
animal_model.add(ImageEmbedding) # 이미지 특징추출 도구 연결
animal_model.add(Dense(units=128, activation='relu')) # Dense -> 뉴런의 묶음 units에 숫자 바꿔도 됨
animal_model.add(Dense(units=256, activation='relu')) # Dense -> 뉴런의 묶음 원하는 만큼 뉴런 생성
animal_model.add(Dense(units=128, activation='relu')) # Dense -> 뉴런의 묶음 활성화 함수(relu)
animal_model.add(Dense(units=10, activation='softmax')) # 마지막 뉴런의 수는 y 종류의 수와 같아야 함

# 모델의 요약정보 확인
animal_model.summary()



Python
animal_model.compile(loss="categorical_crossentropy", # 모델의 잘못된 정도(오차)를 측정하는 도구
                     optimizer="adam", # 모델 최적화 도구 -> 경사하강법 알고리즘
                     metrics=['accuracy'] # 모델의 평가 지표
                     )
                     
early = EarlyStopping(monitor="val_accuracy", # 모델의 성능을 판단하기 위해 모니터링할 척도
                      patience=5) # 성능 개선 여부를 지켜볼 epoch 횟수(인내심 횟수)
                      
model_path = "./animal_model/animal-{epoch:02d}-{val_accuracy:.2f}.hdf5" # 모델이 저장될 경로 및 파일 이름
mdckp = ModelCheckpoint(filepath = model_path, # 파일 경로 연결
                        save_best_only=True, # 모델의 성능이 최고점을 돌파할 때만 저장
                        monitor="val_accuracy") # 모델의 성능을 판단하기 위해 모니터링할 척도                      




📌 모델 학습


Python
h = animal_model.fit(X_train, y_train, # 훈련용 문제, 훈련용 정답
                     validation_split = 0.2, # 검증 데이터 비율 설정
                     epochs=100, # 학습 반복 횟수 설정
                     callbacks=[early,mdckp], # 조기학습 중단, 모델 자동 저장 적용
                     batch_size=16) # 한 번에 RAM 메모리에 적재되는 데이터 수 (기본값 : 32)



📌 test데이터 예측 및 모델 평가


Python
# best 모델 로딩
best_animal_model = load_model("./animal_model/animal-16-0.76.hdf5")

# 모델에게 테스트 데이터 예측시키기
pre = best_animal_model.predict(X_test)

# 분류는 항상 확률을 먼저 예측
# 클래스 번호를 보고 싶으면 argmax를 이용
print(pd.Series(pre[0]))
print(np.argmax(pre[0]))



Python
print(total_data.class_names)
# ['butterfly', 'cat', 'chicken', 'cow', 'dog', 'elephant', 'horse', 'sheep', 'spider', 'squirrel']

plt.imshow(X_test[0].astype("int64"))




Python
# 분류 평가 지표 확인
# 재현율 실제 나비 중에서 recall 만큼 정답(recall)
# 정밀도 나비라고 예측한 것 중에서 실제로 정답(precision)
# support 각 종류마다 사진의 수
# f1-score 불균형한 데이터에서 예측을 잘하는지 평가 지표 
print(classification_report(y_test.argmax(axis=1),
                                   pre.argmax(axis=1)))






AI로 연예인 닮은꼴 예측 프로그램을 만들어보자!