본문 바로가기

멋사 AI SCHOOL에서

[AI SCHOOL] Mini_Project_6 : CNN 이미지 분류

https://www.kaggle.com/datasets/vishalsubbiah/pokemon-images-and-types

 

Pokemon Image Dataset

Pokemon image dataset

www.kaggle.com

데이터 소개

이번 mini project는 캐글의 포켓몬 이미지 데이터셋을 활용하여 CNN을 활용한 이미지 분류를 진행하였다. 미니프로젝트 진행은 코렙에서 실행하였다. 포켓몬 이미지 데이터셋에서 주어진 데이터들은 포켓몬 이미지들과 각각의 포켓몬들의 타입들이 들어있는 csv 파일 하나가 들어있었다. 이 CNN을 활용해 이 포켓몬들의 이미지를 보고 type을 구분하는 것이 이번 프로젝트의 목적이다.

 

이미지 로드하기

코렙의 특성상 데이터를 바로 끌어다 쓰면 재실행 할때마다 계속 불러다 써야하는데 코렙에 마운트기능을 사용하여 드라이브에 저장시킨 데이터를 재실행 할 때마다 가져올 수 있게 만들어줬다. 그리고 os.listdir()를 사용하여 해당 디렉토리 내의 모든 파일 이름들을 리스트로 저장하였다.

일부 이미지 미리보기

포켓몬 이미지가 잘 불러와지는지 확인할 수 있는 함수를 만들었다. 여기서 image_label은 위에 os.listdir()로 불러온 것으로 for 문을 활용해야 함축되어있는 모든 파일들을 꺼낼 수 있다. 그렇게 꺼낸 이미지를 imread로 불러오고 imshow로 출력하게 일부 이미지를 가져왔다.

label 정리하기

csv 파일로 저장된 type들을 포켓몬 이미지의 이름에 맞는 type으로 라벨링을 해줘야한다. 일단 csv파일의 이름과 type을 zip 함수로 묶어준다.(여기서 type2는 사용하지 않는다.) 그리고 학습 가능한 형태로 만들어주기 위해 type을 숫자형태로 바꿔준다.

 

이미지 데이터셋 만들기

먼저 데이터 학습을 위해 이미지 크기를 일정하게 만들어주는 함수를 만들었다. 그리고 array 형태로 불러와 list형태로 넣어주는데 이때 사이즈 조정과 label 설정을 같이 설정해주는 함수를 만들었다. 이 함수를 사용하여 x와 y를 나누었다. x에는 이미지를 넣고 y에는 type을 넣어주었다. 그리고 다시 x, y 값을 np.array 형태로 만들어주었다.

x, y 나누기

 

array 형태로 변환

train, valid로 나누기

y값을 기준으로 학습용 데이터셋과 검증용 데이터 셋을 만들어주기 위해 train_test_split을 사용하였다.

이미지 데이터 정규화

네트워크가 데이터를 처리하기 쉽게 만들어주기 위해 정규화 작업을 해주었다.

레이어층 만들기

이미지의 전처리를 위해 접고 돌리고 땡기는 작업을 해주었고 Conv2D와 MaxPooling2D를 사용하여 레이어층을 쌓았다. 마지막에는 3차원을 1차원으로 만들어주기 위해 Flatten을 사용하였고 출력층에 활성화 함수로 softmax를 사용했다.

Compile 만들기

학습하기

결과 시각화

느낀점

기존에 했던 머신러닝과는 많이 거리가 있는 느낌이다. 전체적인 흐름은 비슷하지만 피처엔지니어링을 따로 해주지 않아도 된다는 것이 조금 편했다. 하지만 성능을 올리는 방법이 너무 어렵다. baseline을 만들어 layer층을 많이 쌓기 전이 가장 성능이 좋았다. 접고 돌리고 땡기는 전처리를 하고 layer층을 한층씩 더 쌓을 때마다 성능이 떨어진다. 어떤식으로 해야 성능이 오르는 지는 아직 잘 모르겠다. 하지만 CNN을 활용하여 이미지 분류를 해봤다는 것에 내가 성장했음을 느꼈다.