관리 메뉴

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

합성곱 신경망 6 - 위성 이미지 분류 1 : 데이터셋 로드 및 전처리와 모델 훈련 및 검증 본문

인공지능/딥러닝

합성곱 신경망 6 - 위성 이미지 분류 1 : 데이터셋 로드 및 전처리와 모델 훈련 및 검증

huenuri 2024. 10. 29. 11:14

수학 공부도 마쳤으니 3시간 동안 열심히 아침 공부를 해볼 것이다. 우선 책에 있는 내용을 모두 마치고 객체 탐지 수업을 들어보려고 한다. 오늘도 시각지능 수업 이틀 치를 모두 학습하고 내일까지 해서 CNN을 마치고 내일 모레부터는 RNN 공부에 들어갈 생각이다.

그럼 바로 공부를 시작해보자.


 

 

 

 

텐서플로 데이터셋 로드

텐서플로 데이터셋에서는 인공위성에서 지표면을 촬영한 이미지와 토지이용분류 값이 정리되어 있는 EuroSAT 데이터셋을 제공한다. EU의 코페르니쿠스 지구 관측 프로그램에 의해 제공되는 공용 데이터셋인 Sentinel-2 위성이 관측한 이미지를 기반으로 만들어졌다. 총 27000장의 위성사진과 10개의 토지이용분류 값이 매칭되어 제공된다.

먼저 텐서플로 데이터셋을 사용하기 위해 라이브러리를 다른 필수 라이브러리와 함께 불러온다.

 

 

 

EuroSAT 데이터셋을 load 함수를 사용하여 불러온다. (훈련 셋, 검증 셋), 메타 정보 순으로 정리되어 반환된다. URL을 통해 데이터를 다운로드한다. data_dir 옵션에 파일 저장 위치를 지정하면 다운로드한 데이터셋 파일을 해당 위치에 저장한다. 여기서는 dataset 폴더에 저장했다. train 데이터만 제공하기 때문에 80 : 20으로 구분해 80%는 훈련 섹, 나머지 20% 데이터 검증 셋으로 분할하여 저장한다. 이미지는 (64, 64, 3) 형태로 확인된다.

이렇게 중단에 데이터셋이 종료된다.

 

 

 

 

처음에는 실행하다 몇 번이나 연결이 끊어져서 인터넷 서비스를 불러야 하나 했는데, GPU를 바꿨더니 이제 잘 된다. 역시 며칠 전에 구입하길 잘한 것 같다. T4보다 A100이 훨씬 더 좋다.


 

 

 

메타 정보를 할당받은 info 변수를 출력하면 데이터셋에 대한 기본 정보를 보여준다. 앞서 우리는 EuroSAT 데이터셋의 2가지 유형 중에서 JPEG 이미지로 인코딩한 RGB 데이터셋을 다운로드한 상태다.

 

 

 

샘플 이미지를 메타 정보인 분류 레이블과 함께 화면에 출력한다. show_examples 함수를 사용하는 예제다.

 

 

 

이번에는 as_dataframe 함수를 사용하여 샘플 이미지 10개를 화면에 표시하는 예제다.

 

 

 

토지이용분류에 해당하는 정답 클래스 개수는 10개다. 앞의 실행 결과를 보면 클래스 0은 경작자(AnnualCrop), 클래스 9는 바다/호수(SeaLake)를 나타낸다.

 

 

 

 

클래스를 나타내는 숫자 레이블을 메타 데이터의 문자열로 변화할 수 있다. 메타 데이터의 features 값 중에서 label에 해당하는 메타 정보에 int2str() 메서드를 적용한다. 클래스 6은 영구작물을 나타내는 것을 확인할 수 있다.


 

 

 

 

데이터 전처리

텐서플로 데이터셋을 사용하면 딥러닝 학습에 필요한 데이터셋을 쉽게 구할 수 있다는 장점 외에도 데이터 전처리 과정이 매우 쉽다. 데이터 전처리에 필요한 함수들을 제공하고 있을 뿐만 아니라, 텐서 연산을 효율적으로 처리할 수 있는 최적화를 지원한단다.

다음 코드는 텐서플로 데이터셋에 특화된 전처리 함수들을 소개하는 예제다.

 

이들 함수를 사용하기 앞서 텐서플로 연산은 float32 숫자값을 사용하기 때문에, cast 함수를 사용하여 자료형을 float32 형태로 변환해 준다. 이미지는 0~255 범위의 픽셀 값을 갖기 때문에 255로 나눠서 정규화한다. 이 과정을 처리하는 preprocess_data 함수를 정의한다.

map 함수는 사용자 정의 함수를 매핑하여 텐서플로 데이터셋에 적용하는 메서드로 전처리 과정에서 매우 유용하다. num_parallel_calls 옵션을 오토튠으로 지정하면 텐서플로 병렬연산 처리를 자동으로 최적화한다.

 

다음 그림을 비교해 보면, 오토튠을 적용하지 않을 때 데이터를 읽어서 매핑하고 훈련하는 과정을 순차적으로 처리하기 때문에 시간이 오래 걸린다는 것을 알 수 있다. 반면 오토튠을 적용하면 하드웨어 리소스를 병렬로 매핑하여 처리하기 때문에 같은 작업을 훨씬 짧은 시간에 처리할 수 있게 된다.

 

 

정규화 변환을 마친 데이터셋에 shuffle() 메서드를 적용하면 순서를 랜덤하게 섞어 준다. 모델의 일반화된 성능을 높이기 위해 훈련 데이터셋에서 미니 배치를 생성할 때 입력 순서에 무작위성을 부여하는 개념이다. 

prefetch() 메서드는 모델이 훈련을 진행하는 동안 다음에 입력할 데이터를 불러와서 미리 전처리를 하도록 시스템을 조율한다. 병렬 처리를 통해 모델 훈련 시간을 단축시켜 준다.


 

 

 

 

모델 훈련 및 검증

배치 정규화, 합성곱, 풀링 레이어로 구성된 유닛을 2개 연결하고, Dense 레이어와 Dropout으로 구성된 최종 분류기를 갖는 딥러닝 모델을 Sequential API로 생성한다.

 

 

 

예측 클래스가 10개인 다중 분류 문제에 맞게 손실함수와 평가지표를 설정하고 모델을 50 epoch 훈련한다.

 

 

 

모델은 10 epoch까지는 빠른 속도로 훈련이 진행되면서 손실함수가 급격하게 감소한다. 하지만 그 이후로는 검증 셋에 대한 손실함수가 더 이상 줄어들지 않으면서 과대적합 경향을 나타낸다.

 


 

 

 

학습을 마치고

위성이미지를 분류하는 학습을 진행하고 있다. 데이터셋을 로드해서 전처리를 하고 모델을 훈련하고 검증하는 것까지 진행해 보았다. 데이터셋을 로드하는 일이 참 어려웠지만 이후에는 순조롭게 실행되었다.

다음 포스트에서 데이터 증감과 나머지 공부를 이어갈 것이다.