CNN, ResNet, VGG16을 활용한 손가락 이미지 데이터셋 분류(2)

khkwon_0712·2023년 2월 9일
0

기존에는 CNN을 활용한 이미지 분류를 진행하였다면, 이번에는 전이학습을 통한 미세 조정 과정을 거친 모델 학습을 진행한다. Keras가 제공하는 여러 모델들 중 이미지 분류에 가장 많이 활용되는 것은 ResNet, VGG16 모델이다. 우선 ResNet 모델에 대하여 알아보자.

ResNet 모델이란?

VGG 모델을 뼈대로 활용하여 더 깊은 신경망을 확보하는 방식의 모델이다.

사전 훈련된 ResNet이란 모델을 업로드하고, 여기에 Dense 층을 추가하여 모델을 변형하는 방식이다.

1. ResNet 모델 업로드하기

이미지 증강까지의 과정은 CNN 모델 학습 과정과 동일하다

RN50_2 = tf.keras.applications.resnet_v2.ResNet50V2(weights="imagenet",
                                          include_top=False, 
                                          input_shape=(128, 128, 3))

RN50_2.trainable = False # 이미 학습된 가중치만을 사용

include_top을 False로 설정하면 이미지의 크기와 상관없이 이미 만들어진 레이어가 RN50_2라는 변수에 담기게 된다. 반대로 True인 경우에는 크기가 (128, 128, 3)으로 제한된다.

2. 모델 제작

model = models.Sequential(name="ResNet50v2_RT")
model.add(RN50_2)

model.add(layers.Flatten())
model.add(layers.Dense(512, activation = 'relu'))
model.add(layers.Dense(5, activation = 'softmax'))

model.summary()

앞서 RN50_2 변수에 저장한 모델을 활용하여 모델을 다시 제작한다. 추가로 Dense layer를 추가하는 과정을 거쳐서 이미지 학습에 활용할 모델을 최종 완성하였다.

3. 모델 학습

from tensorflow.keras import optimizers

model.compile(loss = 'categorical_crossentropy',
              optimizer = optimizers.Adam(learning_rate = 0.00005),
              metrics = ['accuracy'])
%%time

history = model.fit(train_generator,
                       steps_per_epoch = train_df.shape[0]//75,
                       epochs = 15,
                       validation_data = validation_generator,
                       validation_steps = test_df.shape[0]//75)
Epoch 1/15
27/27 [============] - 72s 3s/step - loss: 1.4445 - accuracy: 0.7175 - val_loss: 0.1741 - val_accuracy: 0.9333
Epoch 2/15
27/27 [============] - 70s 3s/step - loss: 0.2361 - accuracy: 0.9215 - val_loss: 0.1731 - val_accuracy: 0.9511
Epoch 3/15
27/27 [============] - 70s 3s/step - loss: 0.1459 - accuracy: 0.9432 - val_loss: 0.1441 - val_accuracy: 0.9467
.
.
.
Epoch 15/15
27/27 [============] - 74s 3s/step - loss: 0.0634 - accuracy: 0.9807 - val_loss: 0.0688 - val_accuracy: 0.9911
CPU times: total: 1h 2min 38s
Wall time: 18min 48s

4. 결과 시각화 및 검증

정확도 면에서는 CNN과 마찬가지로 99%를 상회하는 높은 수치를 보였다. 다만 학습 시간은 약 5분 정도 늦는 결과가 나타났다.

# Test 데이터셋으로 성능 확인하기

test_datagen = ImageDataGenerator(rescale = 1./255)
test_generator = test_datagen.flow_from_dataframe(test_df,
                                                  x_col='Filepath',
                                                  y_col='Label',
                                                  target_size=(128, 128),
                                                  batch_size=75)
                                                  
loss, accuracy = model.evaluate(test_generator)

print('Loss = {:.5f}'.format(loss))
print('Accuracy = {:.5f}'.format(accuracy))
Found 250 validated image filenames belonging to 5 classes.

4/4 [==============] - 8s 2s/step - loss: 0.0076 - accuracy: 1.0000
Loss = 0.00758
Accuracy = 1.00000

마지막으로 모델 저장하면서 끝👍

model.save('ResNet_test.h5')

다음 포스팅은 VGG16을 활용한 모델 학습에 대하여 알아볼 예정이다.

github 주소 : https://github.com/Kihoon-Kwon/multiclass_ImageClassification.git

profile
꾸준하게 😊

0개의 댓글