주말동안 최종 프로젝트 주제를 선정했다. 프로젝트 주제는 다음과 같다. 아프리카 취약 계층을 위한 엠폭스 감염 여부 진단 모델 개발이다. 사진 판별은 CNN 기술을 사용하였고, 저장한 모델을 바탕으로 어플리케이션을 개발할 예정이다.
일단 코드를 살펴보자. 코드는 총 세 부분으로 나뉜다.
1. 데이터 전처리 및 초기 모델 학습 후 모델 저장
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras import layers, models
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.callbacks import ModelCheckpoint
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import tensorflow as tf
# 데이터셋 경로 설정
train_dir = './Mpox/Fold1/Fold1/Fold1/Train'
validation_dir = './Mpox/Fold1/Fold1/Fold1/Val'
test_dir = './Mpox/Fold1/Fold1/Fold1/Test'
# ImageDataGenerator를 사용하여 이미지 데이터 전처리
train_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest'
)
val_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)
# train 디렉터리 안에 위치한 학습용 Mpox 데이터의 구분
train_generator = train_datagen.flow_from_directory(
directory=train_dir,
target_size=(224, 224), # 이미지 크기 조정
batch_size=32,
class_mode='binary' # 이진 분류
)
# Val 디렉터리 안에 위치한 검증용 Mpox 데이터의 구분
validation_generator = val_datagen.flow_from_directory(
directory=validation_dir,
target_size=(224, 224),
batch_size=32,
class_mode='binary'
)
# test 디렉터리 안에 위치한 테스트용 Mpox 데이터의 구분
test_generator = test_datagen.flow_from_directory(
directory=test_dir,
target_size=(224, 224),
batch_size=32,
class_mode='binary',
shuffle=False # 평가 시에는 섞지 않음
)
# Test generator 생성
test_generator = test_datagen.flow_from_directory(
directory=test_dir,
target_size=(224, 224),
batch_size=32,
class_mode='binary',
shuffle=False # 평가 시에는 섞지 않음
)
# 데이터 전처리
#-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
# 모델 구축
model = models.Sequential([
layers.Conv2D(32, (3, 3), activation='relu', input_shape=(224, 224, 3)),
layers.MaxPooling2D((2, 2)),
layers.Conv2D(64, (3, 3), activation='relu'),
layers.MaxPooling2D((2, 2)),
# layers.Conv2D(128, (3, 3), activation = 'relu'),
# layers.MaxPooling2D((2, 2)),
layers.Flatten(),
layers.Dense(32, activation='relu'),
layers.Dropout(0.5), # 드롭아웃 추가
layers.Dense(16, activation='relu'),
layers.Dense(1, activation='sigmoid')
])
model.compile(loss='binary_crossentropy',
metrics=['accuracy'],optimizer='adam')
model_save_path = 'monkeypox_classification_model.keras'
# 모델 학습 도중 가장 좋은 성능을 보인 모델을 저장
checkpoint = ModelCheckpoint(
filepath=model_save_path,
monitor='val_accuracy', # 검증 정확도를 기준으로 저장
save_best_only=True, # 가장 좋은 성능을 보인 경우만 저장
mode='max',
verbose=1
)
# 모델 학습
history = model.fit(
train_generator,
steps_per_epoch=train_generator.samples // 32,
epochs=100,
validation_data=validation_generator,
validation_steps=validation_generator.samples // 32
)
# 모델 평가
test_loss, test_acc = model.evaluate(test_generator, steps=test_generator.samples // 32)
print(f"Test Accuracy: {test_acc:.2f}")
model.save('monkeypox_classification_model.keras')
2. 향상된 정확도를 위한 학습된 모델 파인튜닝
from tensorflow.keras.applications import ResNet50
from tensorflow.keras import layers, models
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.models import load_model
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# 데이터셋 경로 설정
train_dir = './Mpox/Fold1/Fold1/Fold1/Train'
validation_dir = './Mpox/Fold1/Fold1/Fold1/Val'
test_dir = './Mpox/Fold1/Fold1/Fold1/Test'
# ImageDataGenerator를 사용하여 이미지 데이터 전처리
train_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest'
)
val_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)
# Train generator 생성
train_generator = train_datagen.flow_from_directory(
directory=train_dir,
target_size=(224, 224),
batch_size=32,
class_mode='binary'
)
# Validation generator 생성
validation_generator = val_datagen.flow_from_directory(
directory=validation_dir,
target_size=(224, 224),
batch_size=32,
class_mode='binary'
)
# Test generator 생성
test_generator = test_datagen.flow_from_directory(
directory=test_dir,
target_size=(224, 224),
batch_size=32,
class_mode='binary',
shuffle=False
)
# 1. 이미 학습된 모델 불러오기
base_model = load_model('./monkeypox_classification_model.keras')
# 2. 기존 레이어 동결
base_model.trainable = False
# 3. 새로운 레이어 추가
# 이미 Sequential 모델로 불러온 경우이므로 base_model을 그대로 사용
model = models.Sequential([
base_model,
layers.Dense(512, activation='relu'),
layers.Dropout(0.5),
layers.Dense(1, activation='sigmoid')
])
# 4. 모델 컴파일
model.compile(optimizer=Adam(learning_rate=0.0001), loss='binary_crossentropy', metrics=['accuracy'])
# 5. 기본 학습 수행 (기존 레이어 동결 상태)
history = model.fit(train_generator, epochs=100, validation_data=validation_generator)
# 6. 일부 레이어 동결 해제 및 파인튜닝
base_model.trainable = True
for layer in base_model.layers[:-10]: # 최상위 10개 레이어만 학습 가능하게 설정
layer.trainable = False
# 7. 모델 컴파일 및 재학습
model.compile(optimizer=Adam(learning_rate=0.00001), loss='binary_crossentropy', metrics=['accuracy'])
history_fine_tuning = model.fit(train_generator, epochs=100, validation_data=validation_generator)
# 8. 파인튜닝된 모델 저장 (선택사항)
model.save('fine_tuned_monkeypox_model.keras')
3. 제시된 사진이 엠폭스인지 판별
from tensorflow.keras.models import load_model
import numpy as np
from tensorflow.keras.preprocessing import image
# 이미지를 로드하고 전처리하는 함수.
def load_and_preprocess_image(img_path, target_size=(224, 224)):
img = image.load_img(img_path, target_size=target_size)
img_array = image.img_to_array(img)
img_array = np.expand_dims(img_array, axis=0) # 배치 차원 추가
img_array /= 255.0 # 정규화
return img_array
# 이미지를 분류하는 함수.
def classify_image(model, img_path):
img_array = load_and_preprocess_image(img_path)
prediction = model.predict(img_array)
return 'Monkeypox' if prediction[0][0] >= 0.5 else 'Others'
# 저장된 모델 로드
model = load_model('monkeypox_classification_model.keras')
# 예시 이미지에 대해 예측
image_path = '/content/images.jpg'
result = classify_image(model, image_path)
print(f'The image is classified as: {result}')
위의 코드를 통해 pretrained model이 아닌 새로운 모델을 학습시킨다. 보다 높은 정확도를 위해 파인 튜닝을 진행하는 코드도 추가하였고, 기대하는 만큼 좋은 결과가 나오면 좋겠다.
'ABC부트캠프 데이터 탐험가 과정' 카테고리의 다른 글
[34일차] ABC 부트캠프 최종 프로젝트 기술 구현 (0) | 2024.08.23 |
---|---|
[33일차] ABC 부트캠프 주제 세분화 및 피드백 (0) | 2024.08.20 |
[31일차] ABC 부트캠프 최종 프로젝트 주제 선정 (0) | 2024.08.18 |
[30일차] ABC 부트캠프 IS(정보시스템) 프로젝트 (0) | 2024.08.14 |
[29일차] ABC 부트캠프 기술나눔활동 (0) | 2024.08.13 |