본문 바로가기
  • You find inspiration to create your own path !
업무 자동화/python & CAD

개 와 고양이 이미지를 분류 하기 #2

by ToolBOX01 2025. 8. 28.
반응형

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. 모델 학습

이미지를 분류하는 똑똑한 컴퓨터 프로그램(모델) 을 만들 때, 방법은 크게 두 가지가 있습니다.

  1. 처음부터 직접 모델을 만드는 방법 (CNN 직접 설계)
    • 아무것도 모르는 상태에서 새로 뇌를 만드는 겁니다.
    • 시간이 오래 걸리고, 데이터도 많이 필요합니다.
    • 하지만 내가 원하는 구조로 자유롭게 만들 수 있습니다.
  2. 사전 학습된 모델을 가져와서 쓰는 방법 (전이 학습)
    • 이미 다른 사람이 큰 데이터(예: 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




반응형