[CV 10] VGG16 모델을 이용한 이미지 분류 2 - 기본 모델 + 증식O 데이터

방선생·2025년 3월 2일
0

Computer Vision

목록 보기
10/16

데이터 증식(augmentation)

  • 의미 : 원본 이미지에 인위적인 변화를 주어 학습 데이터의 양을 늘린다, 과대적합 방지
  • 증식의 방법
    • 회전(rotation)
    • 이동(shift),
    • 밀림(shearing)
    • 확대/축소(zoom)
    • 상하좌우 반전(flip) 등

데이터 증식 - 회전(rotation)

  • 일반적으로 20도나 30도 범위에서 이미지를 회전


데이터 증식 - 이동(shift)

  • 이미지를 수평 또는 수직으로 평행 이동


데이터 증식 - 확대/축소(zoom)

  • 일반적으로 10% ~ 30% 범위에서 이미지를 확대하거나 축소


데이터 증식 - 밀림(shear)

  • 이미지를 강제로 찌그러뜨림


데이터 증식 - 반전(flip)

  • 이미지를 상하 또는 좌우로 90도 회전 시키기



tensorflow.keras에서 제공하는 데이터 증식과 관련된 유용한 함수들

  • ImageDataGenerator() : 하이퍼파라미터 설정을 통해서 데이터 증식 방식에 대해서 설정
    • train_datagen = ImageDataGenerator(하이퍼파라미터)
    • val_datagen = ImageDataGenerator(rescale=1./255) → 데이터 증식(x)

  • flow_from_directory() : ImageDataGenerator() 함수에 데이터 공급
    • train_generator = train_datagen.flow_from_directory(path, target_size , batch_size, class_mode)

  • fit() : 학습 진행
    • model.fit(train_generator, epochs, validation_data, callbacks)


tensorflow.keras.callbacks

  • 딥러닝 학습 시 종료 조건이나 모델 저장 조건 등을 사용자가 원하는 대로 설정할 수 있도록 클래스와 매서드를 제공하는 모듈

  • EarlyStopping 클래스
    • 학습의 상태를 더 이상 개선시키지 못할 경우 학습을 강제로 종료 시킬 수 있는 기능을 제공

    • 사용방법
      • early_stop = tf.keras.callbacks.EarlyStopping(monitor='val_loss’, verbose=1, patience=5)

    • 매개 변수
      • monitor : 학습 상태 판단의 기준, 예) ‘val_loss’을 입력할 경우, val_loss가 더 이상 감소하지 않을 경우에 작동
      • verbose : 학습의 진행 사항 표시 여부 결정, 학습의 진행 사항을 표시할 경우 verbose=1
      • patience : 학습 상태가 개선 되지 않을 경우 참아주는 횟수


  • ModelCheckpoint 클래스
    • 학습된 모델을 저장할 때 저장 조건을 사용자가 원하는 대로 설정할 수 있는 기능 제공

    • 사용방법
      • checkpoint = tf.keras.callbacks.ModelCheckpoint(filepath=file_path, monitor=‘val_loss’, verbose=1, save_best_only=True)

    • 매개 변수
      • file_path : 모델 저장 경로
      • monitor : 모델을 저장할 때의 기준
      • save_best_only : True 인 경우, monitor 되고 있는 값을 기준으로 가장 좋은 값으로 모델이 저장. False인 경우, 매 epoch마다 모델 저장 (model0, model1, model2....)



[CV 9]코드에서 이어서 진행됩니다

VGG16 모델 (기본 모델 + 데이터 증식 O) Code 1 (모델 생성)

# 재구성 모델 정의 하기

# 출력 unit 설정
units = 2

# 모델 생성
model2 = tf.keras.Sequential()
model2.add(base_model)
model2.add(tf.keras.layers.Flatten())
model2.add(tf.keras.layers.Dense(units=256, activation='relu'))
model2.add(tf.keras.layers.Dense(units, activation='softmax'))

# 추가사항
model2.build(input_shape=(None, 224, 224, 3))

# 모델 구조 확인
model2.summary()
# optimizer 재설정
optimizer = tf.keras.optimizers.Adam(learning_rate=0.0001)

# 모델 컴파일
model2.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])

VGG16 모델 (기본 모델 + 데이터 증식 O) Code 2 (이미지 데이터 증식)

# imageDataGenerator() 함수 > 데이터 증식 조건 설정

# 학습용 이미지 증식 조건 설정
train_datagen2 = tf.keras.preprocessing.image.ImageDataGenerator(
    rescale=1/255,
    rotation_range=30,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    vertical_flip=True
)

# 검증용 이미지 생성 조건설정 > 데이터 증식(X) + scaling(Normalization) 적용
val_datagen2 = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1/255)

test_datagen2 = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1/255)
# ImageDataGenerator() 함수와 flow_from_directory() 함수를 사용, 입력 데이터 생성

# 학습용 데이터 생성
train_generator2 = train_datagen2.flow_from_directory(directory=train_path,
                                                      batch_size=60,
                                                      target_size=(224,224),
                                                      class_mode='categorical')

# 검증용 데이터 생성
val_generator2 = val_datagen2.flow_from_directory(directory=val_path,
                                                  batch_size=60,
                                                  target_size=(224,224),
                                                  class_mode='categorical')

# 평가용 데이터 생성
test_generator2 = test_datagen2.flow_from_directory(directory=test_path,
                                                    batch_size=10,
                                                    target_size=(224,224),
                                                    class_mode='categorical')
# 생성되는 데이터와 정답 레이블 확인

# 결과물 생성
images, labels = next(train_generator2)

# 생성된 이미지 배열 모양 확인
print(images.shape)

print('-'*80)

# 정답 레이블 확인
print(labels)

VGG16 모델 (기본 모델 + 데이터 증식 O) Code 3 (모델 학습 및 평가)

# 조기 종료 설정
early_stop = tf.keras.callbacks.EarlyStopping(
    monitor='val_loss',
    patience=3
)

# 학습 진행
model2.fit(train_generator2,
           epochs=100,
           callbacks=[early_stop],
           validation_data=val_generator2)
# model.evaluate() 함수 사용
score = model2.evaluate(test_generator2)

# 결과 확인
print(f'평가용 데이터에 대한 평균 loss : {score[0]}')
print('-'*80)
print(f'평가용 데이터에 대한 평균 accuracy : {score[1]}')








참고 자료

tf.keras.preprocessing.image.imagedatagenerator 공식 문서

profile
AI & Robotics

0개의 댓글