- 딥러닝 모델을 처음부터 직접 만드는 것도 좋은 방법이지만, 이미 수많은 연구자가 검증하고 성능을 입증한 기존 모델을 가져다 쓰는 것이 훨씬 효율적일 수 있음
기존 모델을 활용하는 방식은 크게 두 가지로 나뉨
- Case 1: 기존 모델의 틀(구조)만 가져다 쓰는 경우
- Case 2: 기존에 **학습된 모델(가중치 포함)**을 가져다 쓰는 경우
- 학습된 모델을 그대로 활용
- 학습된 모델을 새로운 데이터에 맞게 적용 (Fine-Tuning)
- 이러한 검증된 모델들은 paperswithcode.com , kaggle.com, huggingface.co 등에서 찾을 수 있으며, 특히 Keras는 keras.applications 모듈을 통해 Xception, VGG, ResNet, MobileNet 등 다양한 모델을 손쉽게 제공
Part 1. Keras Application 기본 사용법 (ResNet50 예제)
- Keras Application을 이용해 사전 학습된 ResNet50 모델을 불러오고 이미지를 분류하는 기본 예제
- ResNet50이라는 모델을 가져와서 사용 [주석] 가중치(weights)를 가져오고 싶지 않으면 'none'으로 설정
# 필요한 라이브러리 임포트
!wget http://www.personal.psu.edu/afr3/blogs/SIOW/elephant.jpg
from tensorflow.keras.applications.resnet50 import ResNet50
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.resnet50 import preprocess_input, decode_predictions
import numpy as np
# ImageNet으로 사전 학습된 ResNet50 모델 로드
# weights='imagenet' : ImageNet 데이터셋으로 학습된 가중치를 가져옴
model = ResNet50(weights='imagenet')
# 이미지 로드 및 전처리
img_path = 'elephant.jpg'
# ResNet50은 (224, 224) 크기의 입력을 받음
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0) # 배치 차원 추가 (1, 224, 224, 3)
x = preprocess_input(x) # 모델에 맞는 방식으로 이미지 정규화
# 예측 수행
preds = model.predict(x)
# 예측 결과 해석
# decode_predictions: ImageNet 클래스로 변환 (상위 3개 결과 출력)
print('Predicted:', decode_predictions(preds, top=3)[0])
예측 결과:
Predicted: [('n02504013', 'Indian_elephant', 0.82658225), ('n01871265', 'tusker', ...)]
📸 Part 2. 실전 응용: Colab 웹캠으로 실시간 객체 인식
- 학습된 ResNet50 모델을 활용하여 Colab 환경에서 웹캠으로 사진을 찍어 실시간으로 분류하는 응용 예제
[절차]
- 기존의 학습된 ResNet50 모델을 가져옵니다.
- Colab의 Javascript 라이브러리를 이용해 웹캠(스마트폰)에서 이미지를 입력받습니다.
- 입력받은 이미지를 모델로 분류하고 결과를 화면에 보여줍니다.
1. Colab에서 웹캠으로 사진 찍기
- 다음 코드는 Colab에서 웹캠에 접근하여 사진을 찍고 photo.jpg로 저장하는 함수
from IPython.display import display, Javascript
from google.colab.output import eval_js
from base64 import b64decode
def take_photo(filename='photo.jpg', quality=0.8):
js = Javascript('''
async function takePhoto(quality) {
const div = document.createElement('div');
const capture = document.createElement('button');
capture.textContent = 'Capture';
div.appendChild(capture);
const video = document.createElement('video');
video.style.display = 'block';
const stream = await navigator.mediaDevices.getUserMedia({video: true});
document.body.appendChild(div);
div.appendChild(video);
video.srcObject = stream;
await video.play();
// Resize the output to fit the video element.
google.colab.output.setIframeHeight(document.documentElement.scrollHeight, true);
// Wait for Capture to be clicked.
await new Promise((resolve) => capture.onclick = resolve);
const canvas = document.createElement('canvas');
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
canvas.getContext('2d').drawImage(video, 0, 0);
stream.getVideoTracks()[0].stop();
div.remove();
return canvas.toDataURL('image/jpeg', quality);
}
''')
display(js)
data = eval_js('takePhoto({})'.format(quality))
binary = b64decode(data.split(',')[1])
with open(filename, 'wb') as f:
f.write(binary)
return filename
2. 사진 찍고 예측하기
- 위 함수를 실행하여 사진을 찍고, 저장된 이미지로 예측을 수행
from IPython.display import Image
try:
# 1. 웹캠으로 사진 찍기
filename = take_photo()
print('Saved to {}'.format(filename)) [cite: 156]
# 2. 찍은 이미지 보여주기
display(Image(filename))
# 3. Part 1의 코드를 재사용하여 예측 수행 (이 부분은 생략되었으나 동일)
# img = image.load_img(filename, target_size=(224, 224))
# ... (전처리) ...
# preds = model.predict(x)
# print('Predicted:', decode_predictions(preds, top=3)[0])
except Exception as err:
# 웹캠이 없거나 권한을 허용하지 않으면 에러 발생
print(str(err))
결과 예시: (고양이 사진을 찍었을 경우)
- Saved to photo.jpg Predicted: ('n02124075', 'Egyptian_cat', 0.7297629) ('n02123159', 'tiger_cat', 0.14424737), ('n02123045', 'tabby', 0.107179...
⚙️ Part 3. Keras 모델 활용 심화: 5가지 주요 시나리오
- Keras Application 모델은 weights와 include_top 매개변수 설정을 통해 다양하게 활용할 수 있음
1. 시나리오 1: 학습된 모델 그대로 사용하기
- 설정: weights='imagenet', include_top=True
- 설명: Part 1의 예제와 동일
- ImageNet으로 학습된 가중치와 최종 분류 레이어(Classifier)까지 모두 가져와 사용
- 코드:
model = ResNet50(weights='imagenet', include_top=True)
2. 시나리오 2: 특징 추출기(Feature Extractor)로 사용하기
- 설정: weights='imagenet', include_top=False
- 설명: 모델의 마지막 분류 레이어(Dense layer)를 제외하고, 이미지의 특징(Feature)을 추출하는 부분(Convolutional base)만 가져옴
- 특징 추출기만 재활용(기존의 모델은 특징 추출 결과를 이용해서 분류까지 한 결과를 반환했음)
- 코드: (VGG16 모델 예시)
from keras.applications.vgg16 import VGG16 from keras.preprocessing import image from keras.applications.vgg16 import preprocess_input import numpy as np # include_top=False로 설정하여 마지막 분류 레이어 제외 model = VGG16(weights='imagenet', include_top=False) img_path = 'elephant.jpg' img = image.load_img(img_path, target_size=(224, 224)) x = image.img_to_array(img) x = np.expand_dims(x, axis=0) x = preprocess_input(x) # features는 (1, 7, 7, 512) 형태의 특징 맵이 됨 (분류 결과 X) features = model.predict(x)
3. 시나리오 3: 특정 중간 레이어(Layer) 출력 사용하기
- 설명: 전체 모델을 불러온 뒤, Model 객체를 이용해 입력과 원하는 중간 레이어의 출력을 지정하여 새로운 모델을 만듬
- VGG19 모델을 불러온 뒤, 그 모델의 '중간'까지만 뚝 잘라서 새로운 모델을 만드는 코드
- VGG19의 base_model의 4번째 블록에 pool이라는 "block4_pool" 라는 레이어까지만 뽑아와서 사용함
- 코드: (VGG19 모델 예시)
from keras.applications.vgg19 import VGG19 from keras.preprocessing import image from keras.applications.vgg19 import preprocess_input from keras.models import Model import numpy as np # 1. 원본 VGG19 모델 로드 base_model = VGG19(weights='imagenet') # 2. 'block4_pool' 레이어의 출력을 output으로 하는 새 모델 정의 model = Model(inputs=base_model.input, outputs=base_model.get_layer('block4_pool').output) img_path = 'elephant.jpg' img = image.load_img(img_path, target_size=(224, 224)) x = image.img_to_array(img) x = np.expand_dims(x, axis=0) x = preprocess_input(x) # 'block4_pool' 레이어의 특징 맵을 추출 block4_pool_features = model.predict(x)
4. 시나리오 4: 모든 레이어 출력 한번에 추출하기
- 설명: 모델의 모든 중간 레이어 출력을 리스트로 받아와, 모델이 각 층에서 이미지를 어떻게 인식하는지 시각화하는 데 유용
- model의 레이어를 가져와서 레이어들 output들로 리스트를 만듬
- 하나의 input에 대해서, 각 모든 레이어마다의 출력형태를 output으로 반환 -> 모델이 각층마다 학습되는 걸 시각화해서 볼 수 있음
- 코드:
from keras.models import Model model = VGG19(weights='imagenet') # 예시 모델 # 모든 레이어의 출력을 리스트로 정의 layer_outputs = [layer.output for layer in model.layers] # 입력을 받으면 모든 레이어의 출력을 반환하는 새 모델 생성 activation_model = Model(inputs=model.input, outputs=layer_outputs) # activations = activation_model.predict(x) # x는 전처리된 이미지
5. 시나리오 5: 맞춤형 모델 만들기 (Fine-Tuning)
- 설명: 사전 학습된 모델(Convolutional base) 위에 새로운 분류 레이어를 추가하여 나만의 데이터셋에 맞게 모델을 재학습(미세 조정)하는 가장 일반적인 활용법
Step A: Base 모델 로드 및 커스텀 레이어 추가
- include_top=False로 특징 추출 부분만 불러옴
- 그 위에 GlobalAveragePooling2D, Dense 등 새로운 분류 레이어를 쌓음
- base_model.output (x) : include_top=False이기 때문에 특징의 값이 나옴 [주석] 불러온 InceptionV3 모델의 결과를 내가 만든 레이어를 사용해서 층을 추가하고 model로 정의
from keras.applications.inception_v3 import InceptionV3
from keras.models import Model
from keras.layers import Dense, GlobalAveragePooling2D
from keras import backend as K
# 1. Base 모델 로드 (ImageNet 가중치, 최상단 분류기 제외)
base_model = InceptionV3(weights='imagenet', include_top=False)
# 2. 커스텀 레이어 추가
x = base_model.output
x = GlobalAveragePooling2D()(x) # 특징 맵을 1D 벡터로 변환
x = Dense(1024, activation='relu')(x) # Fully-connected layer
# (예: 200개 클래스로 분류하는 새로운 분류기)
predictions = Dense(200, activation='softmax')(x)
# 3. 새로운 모델 정의
model = Model(inputs=base_model.input, outputs=predictions)
Step B: Base 모델 동결(Freezing) 및 컴파일

- 새로 추가한 레이어(Dense(1024), Dense(200))만 먼저 학습시키기 위해, 사전 학습된 base_model의 가중치가 업데이트되지 않도록 동결(freeze)
- 레이어를 동결시킨 후 모델을 컴파일base_model (여기서는 InceptionV3)의 모든 레이어를 '동결(freeze)'시키는 코드
앞으로 학습(model.fit())을 진행할 때, base model의 가중치(weights)는 절대 업데이트(변경)하지 마
이후에 model.fit을 할때 trainable이 false로 된 파라메터들은 학습되지 않고, 기존의 것을 사용함
# 1. base_model의 모든 레이어를 동결
for layer in base_model.layers:
layer.trainable = False
# 2. 모델 컴파일 (동결 설정 *후*에 컴파일해야 함)
# (Fine-tuning 시에는 'rmsprop' 같은 optimizer가 자주 사용됨)
model.compile(optimizer='rmsprop', loss='categorical_crossentropy')
# 3. 이제 model.fit()을 실행하면 새로 추가한 Dense 레이어들만 학습됨
# model.fit(...)
6. 시나리오 6: 모델 껍데기(구조)만 사용하기
- 설정: weights=None, include_top=True
- 설명: 모델의 검증된 구조(Architecture)만 가져오고 가중치는 무작위로 초기화
- ImageNet 가중치를 사용하지 않고, 완전히 새로운 데이터셋으로 처음부터(from scratch) 모델을 학습시킬 때 사용
'AI(ML & DL)' 카테고리의 다른 글
| [딥러닝] Gradient 및 자동 미분(Autogradient) (0) | 2025.11.11 |
|---|---|
| [딥러닝] 오토인코더와 활용 (0) | 2025.11.04 |
| [딥러닝] 모델 다루기 (Sequential & Functional + Inception Module 실습) (0) | 2025.10.23 |
| [딥러닝] CNN의 역사, Dropout과 Batch Normalization (0) | 2025.10.21 |
| [딥러닝] CNN (0) | 2025.10.16 |