2 단계 : 데이터셋 준비 및 모델 학습
이미지 분류 모델(개와 고양이 판별)을 구축하기 위해 전처리된 데이터를 학습 가능한 형태로 구성하고, 모델을 설계 및 학습시키는 과정을 진행해야 합니다.
1. 데이터셋 준비
전처리된 이미지를 모델 학습에 사용할 수 있도록 데이터셋을 구성합니다. 이 과정에서는 데이터를 학습(training), 검증(validation), 테스트(test) 세트로 나누고, 필요에 따라 데이터 증강(data augmentation)을 적용합니다. 폴더를 구성 합니다,
1) 데이터 분할:
Kaggle Cats vs Dogs 데이터셋을 예로 들면, 전체 데이터를 학습(80%), 검증(10%), 테스트(10%)로 나눕니다.
TensorFlow의 ImageDataGenerator 또는 PyTorch의 DataLoader를 사용하면 편리합니다.
2) 레이블 생성:
이미지 파일 이름이나 폴더 구조를 기반으로 레이블(예: "cat" = 0, "dog" = 1)을 생성합니다.
3) 데이터 증강:
모델의 일반화 성능을 높이기 위해 회전, 뒤집기, 크롭, 밝기 조정 등의 증강 기법을 적용합니다.
TensorFlow의 ImageDataGenerator 또는 PyTorch의 transforms를 사용합니다.
4) 데이터 로더 생성:
배치 단위로 데이터를 모델에 공급하기 위해 데이터 로더를 설정합니다.
예시 코드 (TensorFlow/Keras 사용):
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# 데이터 경로
TRAIN_DIR = r"C:\02python\dataset\train"
VALID_DIR = r"C:\02python\dataset\validation"
# 데이터 증강 설정
train_datagen = ImageDataGenerator(
rescale=1./255, # 정규화
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest'
)
valid_datagen = ImageDataGenerator(rescale=1./255) # 검증 데이터는 증강 없이 정규화만
# 데이터 로더
train_generator = train_datagen.flow_from_directory(
TRAIN_DIR,
target_size=(224, 224),
batch_size=32,
class_mode='binary' # 개/고양이 이진 분류
)
validation_generator = valid_datagen.flow_from_directory(
VALID_DIR,
target_size=(224, 224),
batch_size=32,
class_mode='binary'
)
2. 모델 학습
이미지를 분류하는 똑똑한 컴퓨터 프로그램(모델) 을 만들 때, 방법은 크게 두 가지가 있습니다.
- 처음부터 직접 모델을 만드는 방법 (CNN 직접 설계)
- 아무것도 모르는 상태에서 새로 뇌를 만드는 겁니다.
- 시간이 오래 걸리고, 데이터도 많이 필요합니다.
- 하지만 내가 원하는 구조로 자유롭게 만들 수 있습니다.
- 사전 학습된 모델을 가져와서 쓰는 방법 (전이 학습)
- 이미 다른 사람이 큰 데이터(예: ImageNet = 천만 장 이상의 사진 모음)로 잘 훈련시켜 놓은 똑똑한 모델을 빌려오는 겁니다.
- 예: ResNet50, MobileNetV2, VGG16 같은 모델들이 대표적 입니다.
- 이 모델들은 이미 ‘개, 고양이, 자동차, 사람’ 같은 걸 잘 구분할 줄 알압니다.
- 그래서 우리 데이터(예: 고양이 vs 개 사진)만 조금 더 훈련시키면 훨씬 빨리, 성능도 좋게 결과가 나옵니다..
★ "CNN 처음부터 만들기" = 새로 뇌를 설계 → 시간 오래 걸림, 성능 보장 어려움
★ "전이 학습 사용하기" = 이미 잘 훈련된 뇌 빌려오기 → 빠르고 성능 좋음
ResNet50, MobileNetV2, VGG16은 무료 인가?
- 구글, 페이스북, 옥스퍼드 같은 연구기관/기업에서 공개한 모델이라서,
- TensorFlow, PyTorch 같은 라이브러리에서 바로 불러와 사용할 수 있고, 무료로 제공됩니다.
- 연구/개인 프로젝트/상업적 활용까지 자유롭게 쓸 수 있어요. (라이선스도 오픈소스 계열)
참고 : VGG16 / ResNet50 / MobileNetV2 비교
| 모델 이름 |
특징 | 장점 | 단점 | 적합한 경우 |
| VGG16 (2014) | 16개의 층(layer)로 구성된 단순하고 직관적인 CNN 구조 | - 구조가 단순해서 이해하기 쉬움- 학습 아이디어 입문용으로 좋음 | - 파라미터 수가 많아(약 1.38억 개) → 모델 크기 크고 속도 느림- 최신 모델보다 성능 낮음 | - 학습 구조를 이해하고 싶을 때- GPU 메모리 충분할 때 |
| ResNet50 (2015) | 50개의 층으로 구성, Residual Block(잔차 연결) 사용 | - 깊은 신경망도 안정적으로 학습 가능- ImageNet 대회 우승 모델 계열- 성능과 효율성의 균형 | - VGG보다 구조가 복잡- 모바일/임베디드 환경에는 무거울 수 있음 | - 일반적인 이미지 분류 프로젝트- 높은 정확도 필요할 때 |
| MobileNetV2 (2018) | 경량화 모델, Depthwise Separable Convolution 사용 | - 모델 크기 작고 빠름- 모바일·임베디드 장치에서도 동작 가능 | - ResNet만큼 높은 정확도는 아님- 복잡한 이미지 분류에서는 성능 제한 | - 스마트폰/IoT 장치에서 실시간 추론 필요할 때- 속도·경량화 중요할 때 |
- VGG16 → 옛날 모델, 단순하지만 무겁고 느림 (공부용·기초용).
- ResNet50 → 정확도와 안정성이 뛰어난 “표준 모델” (많이 사용됨).
- MobileNetV2 → 가볍고 빠른 모델 (실시간/모바일에 적합).
이 모델들은( VGG16 / ResNet50 / MobileNetV2 ) ImageNet이라는 아주 큰 데이터셋(1,000종류, 1,400만 장 이미지)으로 이미 학습되어 있습니다. 그래서 처음부터 사람, 고양이, 개, 자동차, 비행기, 꽃, 음식, 가전제품 등 1,000가지 카테고리를 구분할 수 있습니.
엘레베이터를 구성하는 부품들을 구분할 수 있나요?
ResNet50, MobileNetV2, VGG16 같은 사전 학습된 모델은, 그대로는 엘리베이터 부품을 정확히 구분하지 못해요. *ImageNet 데이터셋(1,000종류 일상 사물)**로 학습 되어 있습니다. 즉 엘리베이터 부품은 학습되어 있지 않습니다. 엘리베이터 도어, 모터, 로프, 제어판 같은 전문 산업 부품은 ImageNet에 포함되어 있지 않습니다.
어떻게 하면 구분할 수 있을까요?
👉 전이 학습(Transfer Learning)을 활용하면 가능합니다.
모델을( VGG16 / ResNet50 / MobileNetV2 ) 학습 시킵니다.
1) 엘리베이터 부품 사진 데이터셋을 직접 모읍니다.
예: 도어, 버튼 패널, 모터, 로프, 제어반, 안전장치 등.
2) 사전 학습된 모델(ResNet50 등)을 불러옵니다.
이 모델은 사진에서 형태, 질감, 색깔 같은 특징을 잘 뽑아내는 능력이 이미 있어요.
3) 마지막 분류 층만 교체해서, 우리가 준비한 부품 종류(예: 5가지, 10가지)로 새로 학습시킵니다.
데이터는 보통 클래스당 수백 장 이상이 필요하지만,
증강(Augmentation) 기법을 쓰면 적은 데이터로도 성능을 높일 수 있습니다.
1) 전이 학습 설정:
- 사전 학습된 모델의 가중치를 고정(freeze)하고, 마지막 몇 개 레이어만 학습 가능하도록 설정합니다.
- 최종 출력층을 이진 분류(개/고양이)에 맞게 수정합니다.
2) 커스텀 모델(선택):
전이 학습 대신 간단한 CNN을 설계할 수도 있습니다(예: Conv2D, MaxPooling, Dense 레이어 조합).
예시 코드 (ResNet50 전이 학습):
from tensorflow.keras.applications import ResNet50
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, GlobalAveragePooling2D
# 사전 학습된 ResNet50 모델 로드
base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
# 기존 레이어 고정
base_model.trainable = False
# 커스텀 출력층 추가
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(128, activation='relu')(x)
predictions = Dense(1, activation='sigmoid')(x) # 이진 분류
# 최종 모델
model = Model(inputs=base_model.input, outputs=predictions)
# 모델 컴파일
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
by korealionkk@gmail.com

'업무 자동화 > python & CAD' 카테고리의 다른 글
| 개 와 고양이 이미지를 분류 하기 #3 (1) | 2025.08.29 |
|---|---|
| Qt Designer] 시그널(Signal)과 슬롯(Slot) (0) | 2025.08.29 |
| 개 와 고양이 이미지를 분류 하기 #1 (1) | 2025.08.27 |
| Qt Designer] Hello ! (4) | 2025.08.26 |
| Qt Designer] 시작 (2) | 2025.08.26 |