Deep Learning

Deep Learning - Multi Image Classification 위한 CNN 설계하기

electronicprogrammer 2020. 10. 8. 01:24

데이터 출처 : https://www.kaggle.com/puneet6060/intel-image-classification/notebooks

 

Intel Image Classification

Image Scene Classification of Multiclass

www.kaggle.com

 

ipynb file : github.com/sangHa0411/DataScience/blob/main/Intel%20Multi%20Image%20Classification.ipynb

 

sangHa0411/DataScience

Contribute to sangHa0411/DataScience development by creating an account on GitHub.

github.com

 

이번 포스팅에서는 여러 종류의 label이 있는 이미지 데이터들에 대해서 분류를 진행하는 CNN을 설계해보고자 합니다. 그리고 이 다음 포스팅에서는 학습된 CNN에서 Convolution Layer의 활성화를 시각화 해보겠습니다.

 

먼저 이미지 데이터를 불러옵니다. 

위 데이터 출처 주소에 보시면 알 수 있겠지만 데이터는 총 6개 종류의 데이터로 구성이 되어 있습니다.

1. building (건물)

2. forest (숲)

3. glacier (빙산)

4 . mountain (산)

5. sea (바다)

6. street (거리)

 

데이터는 주로 자연 경관에 대해서 구성이 되어있음을 알 수 있습니다. 이제 Python의 Opencv를 이용해서 이미지 데이터를 불러옵니다.

저는 Dictionary 자료구조에 이미지 데이터를 저장하였는데 Key는 클래스 Value는 이미지 데이터인 Dictionary 자료구조입니다. 더 자세하게는 위 github 주소에 가시면 확인하실 수 있습니다.

이제 각 클래스의 이미지 데이터 갯수를 확인해봅니다.

각 클래스당 대략 2300개 정도 되는 것을 확인할 수 있습니다.

이제 각 클래스의 이미지를 무작위로 뽑아서 확인해보겠습니다. 

다른 클래스는 다 맞지만 glacier (빙산) 클래스는 사진은 잘못된 것을 확인할 수 있었습니다. 이로써 데이터에 약간의 오류가 있음을 확인할 수 있습니다.

이제 훈련데이터을 만들기 위해서 훈련 데이터 리스트 , 정답 데이터 리스트를 만들어서 사진들을 저장합니다.

하지만 여기서는 각 클래스의 사진을 순서 그대로 집어 넣은 것이기 떄문에 무작위로 셔플하는 과정을 추가로 진행하였습니다.

이제 정답 데이터는 0 ~ 5 까지의 정수로 이루어져 있으니 One - Hot Encoding 을 진행하였습니다.

이제 이로써 CNN을 위한 데이터 준비를 대부분 마쳤습니다. 추가적으로 해야 할 일은 훈련 데이터들이 0 ~ 255로 구성되어 있는데 이 값들을 255로 나눔으로써 각 픽셀이 0 ~ 1 사이의 값이 되도록 조정하는 것입니다. 이는 나중에 할 계획입니다.

훈련 데이터는 준비를 마쳤으니 이제 테스트 데이터에 대해서 같은 과정으로 데이터를 불러오고 전처리를 진행하겠습니다.

테스트 데이터에 대해서 각 클래스의 이미지 갯수를 확인하였습니다.

그리고 훈련 데이터 때 했던 것과 같은 과정을 진행하고 나서 데이터 구조를 확인해보겠습니다.

 

이제 CNN을 위한 라이브러리 들을 불러오겠습니다.

 

먼저 Covolution Layer부터 구성하겠습니다.

 

그 다음 Convolution Layer의 출력을 1차원으로 평탄화하고 Dense Layer와 연결하겠습니다.

다중 클래스 분류이기 때문에 마지막의 활성화 함수는 softmax로 지정합니다.

그리고 손실함수 또한 categorical_crossentropy로 지정을 하였습니다.

학습을 진행하면서 validation loss가 가장 작은 것을 최종 모델로 결정하는 것으로 지정하였습니다.

다음은 모델의 훈련 과정입니다.

훈련 과정에 대해서 손실 및 정확도를 그래프로 그려보았습니다.

 

이제 최종 선정된 모델을 통해서 테스트 데이터를 대상으로 성능을 측정하겠습니다.

 

 

이로써 CNN을 이용한 Multi Image Classification 문제를 다루어 보았습니다.

다음 포스팅에서는 이렇게 훈련된 CNN에서의 중간층의 활성화를 시각화해보도록 하겠습니다.