To

CNN으로 깃발 인식 - (2) 데이터 수집/Labeling/Resizing/정리 본문

Development Log/Deep Learning Study

CNN으로 깃발 인식 - (2) 데이터 수집/Labeling/Resizing/정리

딸기소 2020. 5. 21. 00:55

이제 본격적으로 train 할 데이터를 수집해야 한다.

 

Dataset을 Kaggle같은 데서 다운로드하는 것이 아니라 우리가 직접 모으기로 했다. 바람직한 데이터의 양은 클래스 당 1000개 이상이라고 한다. 그런데 좋은 양질의 데이터를 찾는 것이 쉽지 않았다. 구글링으로 검색하면 많이 나올 것 같았지만, 깃발이 안 나오고 문양만 나오거나 다른 사람이나 물체와 같이 나오거나 하는 경우가 많았고 이런 경우들을 일일이 제외해주다 보니 시간도 오래 걸리고 실제로는 얼마 모이지 못했다. 약 2000개 정도?

 

구글에서 이미지를 다운로드 할 때는 Fatkun이라는 크롬 플러그인을 사용했다. 일일이 다운로드하느라 2시간 정도 걸렸다. 자동으로 구글링하며 적절한 이미지 set을 만들어주면 좋을텐데.... 

 

더 자세한 사항은 다음 글을 참고하면 좋을 것 같다.
https://crystalcube.co.kr/192

 

Labeling

이미지를 다운받은 후에는 Labeling을 해주었다. Jupyter lab이 대화형 interpreter이다 보니, 코드가 보이는 것이 조금 부자연스러울 수 있다. 코드는 다음과 같다. 

 

Resizing

Labeling 한 뒤에는 크기가 뒤죽박죽인 이미지를 한 size로 통일시켜주어야 한다. CNN에서 input shape가 일정해야 하기 때문이다. Tensorflow에서 공식적으로 올린 CNN tutorial에서 사진들의 사이즈가 모두 정사각형이었고 2의 제곱수의 꼴을 취해서(왜 그렇지?..) 우리도 size를 (64,64)로 맞췄다. 사진의 해상도가 떨어짐에도 불구하고 작은 size로 resizing을 한 이유는 크게 하면 크게 할수록 학습시켜야 하는 parameter가 많아져서 그렇다. 각자 상황에 맞게 input data의 크기를 조정해주면 좋을 것 같다. 

 

Train, Validation, Test

이제 마지막 단계다. 

지금 데이터가 train 폴더에 몰려있는 상태인데 train, val, test로 데이터를 구분하고 각 class 폴더를 따로 만들어주어야 한다. 이렇게 하면 나중에 ImageDataGenerator를 사용할 때 편하게 쓸 수 있다. 우리는 train 데이터의 10%를 test로, 20%를 validation으로 나누어주었다.

 

 

처음에는 안그래도 없는 train data를 또 옮겨야 하는게 부담스러워서 shutil.copyfile를 이용해 data를 복사 붙여넣기 했다. 하지만 이렇게 되면, 모델이 너무 train data에만 최적화되어 overfitting이 일어나게 된다.

 

다음에는 본격적으로 keras를 이용해 모델을 만들어보겠다.