관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

합성곱 신경망 7 - 위성 이미지 분류 2 : 데이터 증강 및 ResNet 사전 학습 모델 본문

인공지능/딥러닝

합성곱 신경망 7 - 위성 이미지 분류 2 : 데이터 증강 및 ResNet 사전 학습 모델

huenuri 2024. 10. 29. 12:00

이어서 위성 이미지 분류 학습을 진행해 보겠다.


 

 

 

 

데이터 증강(Data Augmentation)

앞서 배운 과대적합을 해소하는 기법인 배치 정규화, Dropout 등을 적용했음에도 과대적합이 발생하였다. 이미지 분류 문제에서 관대적합을 해소하고, 모델의 일반화된 Robust한 성능을 확보하는 기법으로 데이터 증강 기법을 소개한다.

이미지 데이터에 여러 가지 변형을 주어 훈련 데이터의 다양성을 확보하는 방식으로, 모델이 새로운 데이터에 대한 예측력을 강화하도록 하는 개념이다.

먼저 EuroSAT 데이터셋 중에서 하나의 샘플 이미지를 선택하여 시각화한다.

 

 

 

샘플 이미지에 변화를 주기 전과 후의 이미지를 비교할 수 있는 시각화 함수를 정의한다.

 

 

 

tf.image 모듈의 flip_left_right 함수를 사용하여 이미지를 좌우 방향으로 뒤집는 방법이다.

 

 

flip_up_down 함수를 사용하여 이미지를 상하 방향으로 뒤집는 방법이다.

 

 

 

ror90 함수를 사용하면 이미지를 반시계  방향으로 90도 회전한다.

 

 

 

transpose 함수는 이미지 텐서 행렬의 행과 열의 위치를 바꿔 준다(행렬의 도치).

 

 

 

central_crop 함수는 이미지의 중심에서 일정 부분을 잘라래는 방법을 구현한다.

 

 

 

먼저 resize_with_crop_or_pad 함수를 사용하여, 원본 이미지의 크기를 키운다. 여기에 random_crop 함수를 사용하고 이미지를 원본 크기와 같게 자르면 원본 이미지가 상하좌우 랜덤한 방향으로 시프트 이동한다.

 

 

 

이미지 밝기를 직접 조정할 수도 있다.

 

 

 

이미지의 채도를 변경하는 방법이다.

 

 

 

이미지의 대비(contrast)를 조정할 수도 있다.

 

 

 

앞서 다룬 여러 기법 중에서 몇 가지를 선택하여 데이터 증강 및 전처리를 수행하는 data_augmentation 사용자 함수를 정의한다. 이미지 증강 효과에 랜덤성을 부여기 위해 tf.image 모듈에서 지원하는 함수 중에서 random_으로 시작하는 함수를 적용했다. map 함수로 원본 데이터셋에 적용하고, shuffle 함수와 batch 함수 등을 적용하여 미니 배치로 만들어 준다.

 

 

 

 

 

모델 인스턴스를 생성하고, 컴파일을 거쳐 50 epoch 동안 훈련한다. 데이터 증강을 하기 전과 모델의 성능 자체는 큰 차이가 없다.

 

 

 

 

손실함수와 정확도를 그래프로 그려보면, 훈련 셋과 검증 셋에 대한 손실함수는 50 epoch 동안 계속 줄어들고 정확도는 조금씩 우상향 하면서 개선되고 있다. 즉, 과대적합 문제가 상당히 해소된 것을 알 수 있다.


 

 

 

 

ResNet 사전 학습 모델

이번에는 ResNet 모델을 활용해서 위성 이미지를 분류한다. 이미지넷 경진대회에서 우승한 모델로서 우수한 성능을 갖는다. 사전에 방대한 이미지로 훈련을 받은 딥러닝 모델의 구조와 가중치를 그대로 가져오고, 모델의 끝단에 위치하는 Top 층에 위성 이미지를 분류할 수 있는 최종 분류기를 추가하는 방식으로 모델을 구성한다. 이런 방식으로 딥러닝 모델을 구성하는 것을 전이 학습이라고 부른다.

 

다음 코드와 같이 케라스에서 모델 인스턴스를 직접 불러올 수 있다. 우리는 예제에서 ResNet50V2 버전을 사용한다. 우리가 사용할 위성 이미지의 크기가 (64, 64, 3)이므로 input_shape 속성에 지정한다.

가장 중요한 옵션은 include_top  = False로 지정하는 것이다. 기존 ResNet 모델의 Top 층을 이미지넷 경진 대회에 맞는 분류기이미르 False로 지정하여 Top 층을 제거해 주는 것이다. 제거된 부분에 우리가 해결하려는 문제에 맞는 최종 분류기를 대체해서 추가하게 된다.

 

이 코드도 오류가 있어서 책과는 다르게 작성해 보았다.

 

 

구조도가 굉장히 길지만 모두 올려보았다. 주피터 노트북이라면 이런 식의 내용을 올리는 것 할 수 없었겠지만 구글 코랩이니까 가능하다. 이전 주피터 노트북보다도 코랩으로 하는 것이 훨씬 더 편해졌다.

 

 

NUM_CLASSES 변수는 위성 이미지의 클래스 레이블 개수인 10을 값으로 가지고 있다. 최종적으로 10개 클래스에 대한 다중 분류를 할 수 있도록 Dense 레이어의 노드 개수와 softmax 활성화 함수를 지정한다.

 

이 코드 역시 책과 다르게 수정했다.

 

 

 

모델을 컴파일하고 50 epoch 동안 훈련한다.

 

 

 

그래프를 보면 훈련 초기부터 검층 셋에 대한 정확도가 80%를 넘어선다. 즉, 사전 학습 모델은 ResNet 모델의 가중치를 그대로 사용하기 때문에 새로운 데이터인 위성 이미지가 입력되어도 이미지로부터 피처(특징)를 빠르게 추출하는 것으로 볼 수 있다.


 

 

 

학습을 마치고

이렇게 해서 위성 이미지 분류 학습을 모두 마쳤다. 생각했던 것만큼 시간이 많이 걸리지 않아서 1시에는 책 학습을 마치고 예상했던 대로 수업을 들을 수 있을 것 같다. 오늘은 오후에 일정이 있으니 공부를 일찍 끝내야 한다. 

다음 포스트에서 개 고양이 분류 하는 것도 공부해 볼 것이다.