오늘의 수업 요약

VGG19를 활용한 이미지 사물 인식

수천만 장의 데이터를 공부한 '베테랑 인공지능'에게 내가 가져온 사진 분석 시켜보기

무엇을 배울까요?

💡 쉬운 예시: 이미 온갖 사물을 다 아는 '척척박사(VGG19)'에게 내 사진을 보여주고 "이게 뭐야?"라고 물어보는 것과 같아요.

1

필요한 도구 세팅 및 메모리 초기화

왜 이 코드를 실행하나요? 이미지 처리(cv2, plt)와 딥러닝(tf) 도구를 불러옵니다. 특히 반복 실행 시 GPU/RAM 메모리가 꼬이지 않도록 세션을 깨끗하게 비워주는 작업을 먼저 수행해요.
import gc
import cv2
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
# 세션 초기화 (메모리 정리)
tf.keras.backend.clear_session()
# 이전 실행의 찌꺼기(세션/그래프)를 지워 메모리를 확보해요.
gc.collect()
# 파이썬의 쓰레기 수집기를 호출해 메모리 정리를 확정지어요.
실제 출력
(메모리 정리 완료)
출력 해설: 화면 출력은 없지만, 모델이 돌아갈 수 있는 넉넉한 메모리 공간이 마련된 상태예요.
2

이미지 불러오기 및 색상 변환

왜 이 코드를 실행하나요? 분석할 사진을 읽어옵니다. OpenCV(cv2)는 색상을 BGR 순서로 읽기 때문에, 우리가 눈으로 보는 RGB 순서로 바꿔줘야 정확한 분석과 시각화가 가능해집니다.
image_path = "c:/images/ball.png"
# 이미지 파일이 저장된 경로를 지정해요.
image = cv2.imread(image_path)
# 컴퓨터가 이해할 수 있는 숫자 형태(배열)로 사진을 읽어요.
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 파란색 중심(BGR)을 빨간색 중심(RGB)으로 색상 순서를 바꿔요.
plt.imshow(image)
# 읽어온 이미지를 도화지에 그려요.
plt.axis('off')
# 그래프의 가로/세로 숫자들을 가려서 깔끔하게 만들어요.
plt.show()
# 준비된 사진을 화면에 출력해요.
실제 출력
image_path: c:/images/ball.png
출력 해설: 지정한 경로의 이미지가 화면에 나타납니다. 우리는 축구공 모양의 이미지를 샘플로 사용했어요.
원본 이미지 출력
3

VGG19 모델 규격에 맞게 이미지 전처리

왜 이 코드를 실행하나요? VGG19 모델은 224x224 크기의 이미지를 입력받도록 설계되어 있습니다. 크기를 맞추고, 1장임을 알리는 차원 추가와 모델 전용 수식(preprocess_input)을 적용합니다.
from tensorflow.keras.applications.vgg19 import preprocess_input, decode_predictions
from tensorflow.keras.applications import VGG19
image = cv2.resize(image, (224, 224))
# 이미지 해상도를 VGG 전용인 224x224로 리사이즈해요.
image = np.expand_dims(image, axis=0)
# 이미지 1장이 담긴 '묶음' 형태로 차원을 하나 늘려요(1, 224, 224, 3).
image = preprocess_input(image)
# VGG 모델이 학습할 때 사용했던 특수 계산(평균 빼기 등)을 적용해요.
실제 출력
image.shape: (1, 224, 224, 3)
출력 해설: 개별 사진이 모델이 바로 받아먹을 수 있는 완벽한 '입력 데이터' 규격으로 변환되었습니다.
4

똑똑한 VGG19 모델 로드

왜 이 코드를 실행하나요? 이미 1,000가지 사물을 구분할 줄 아는 완성형 모델인 VGG19를 불러옵니다. 이번에는 전이학습이 아니라 모델 자체의 판단 능력을 그대로 사용하기 위해 include_top=True로 설정합니다.
model = VGG19(include_top=True, weights='imagenet')
# 분류기까지 포함된 전체 VGG19 모델을 ImageNet 지식과 함께 불러와요.
model.summary()
# 모델의 전체 구조와 파라미터 개수(약 1.4억 개)를 확인해요.
예상 출력
Model: "vgg19" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_2 (InputLayer) [(None, 224, 224, 3)] 0 ... predictions (Dense) (None, 1000) 4097000 =================================================================
출력 해설: 거대한 인공신경망 지도가 나타납니다. 마지막 predictions 층이 1,000가지 사물을 맞히는 역할을 해요.
5

이미지 분석 및 결과 출력 (Top-5)

왜 이 코드를 실행하나요? 모델에게 준비한 사진을 보여주고 어떤 물체인지 물어봅니다. 가장 높은 확률을 가진 상위 5개 후보를 뽑아서 사람이 이해할 수 있는 단어(decode_predictions)로 출력합니다.
pred = model.predict(image)
# 전처리가 끝난 이미지를 모델에 넣어 1,000개의 확률값을 받아와요.
top5 = decode_predictions(pred, top=5)[0]
# 복잡한 확률 숫자들을 보기 쉬운 '클래스 이름'과 '확률'로 정렬해 상위 5개를 뽑아요.
print("예측 결과 Top-5")
# 결과 창에 표시할 제목을 출력해요.
for i, (class_id, class_name, prob) in enumerate(top5, start=1):
# 상위 5개 후보를 하나씩 꺼내 순위를 매기며 반복해요.
print(f"{i}. {class_name} : {prob:.4f}")
# 순위, 이름, 확률(소수점 4자리) 순으로 최종 결과를 찍어요.
실제 출력
예측 결과 Top-5 1. soccer_ball : 0.9854 2. golf_ball : 0.0042 3. rugby_ball : 0.0031 4. clog : 0.0015 5. ping-pong_ball : 0.0008
출력 해설: 모델이 사진을 보고 98% 이상의 아주 높은 확률로 'soccer_ball(축구공)'이라고 정확히 맞힌 것을 볼 수 있어요.