Deep Learning - Multi Image Classification 위한 CNN 설계하기
데이터 출처 : 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 문제를 다루어 보았습니다.