본문 바로가기
Project/Image Classification Pipeline Project

7. [최종] 이미지 분류 모델 인사이트 (이미지 수집부터 분류 모델까지)

by inhovation97 2021. 8. 2.

이 포스팅은 아래 흐름대로 진행되는 포스팅입니다.

데이터 수집 - 전처리 - 모델링 - 성능 개선

이번 마지막 포스팅은 직접 수집한 이미지를 분류하면서 얻은 인사이트를 공유합니다.

 

1. 파이썬 이미지 데이터 크롤링하기 (이미지 수집부터 분류 모델까지)

 

2. 파이썬 파일 정리하기 (이미지 수집부터 분류 모델까지)

 

3. (1) 이미지 전처리 - augmentation, normalization(이미지 수집부터 분류 모델까지)

 

3. (2) Pytorch 데이터 클래스 정의 & albumentations 활용하기(이미지 수집부터 분류 모델까지)

 

4. Pytroch resnet50 구현하기 (이미지 수집부터 분류 모델까지)

 

5. Pytorch 텐서보드 활용 & image augmentation 중요성-실험 결과(이미지 수집부터 분류 모델까지)

 

6. ResNet50 Transfer learning & fine tuning 적용(이미지 수집부터 분류 모델까지)

 

https://github.com/inhovation97/personal_project/tree/main/pytorch

 

GitHub - inhovation97/personal_project: 개인 프로젝트

개인 프로젝트. Contribute to inhovation97/personal_project development by creating an account on GitHub.

github.com

 

 

<이번 프로젝트를 통한 인사이트>

 

인사이트를 정리하는 건 개인적으로 경험을 쌓는 데에 너무 중요한 것 같습니다. 이걸 위해서 실험을 하는 거니까요!

 

1. image normalize의 중요성이 크지 않은 것 같다.

뭔 x소리야? 할 수도 있는 말인데, 0~1 텐서화를 했다는 전제입니다.

보통 이런 저런 ex 파일들을 공부해보면, 이미지들을 train/test별로 normalize한 뒤에 값들을 tensor시키더군요. 이 포스팅에서 저는 normalize에 실패하여, 그냥 텐서화만 시켜서 전처리를 해주었었죠.

어차피 텐서화를 진행하며, 모델에 batch norm도 많이 깔려있기 때문에 그렇게 큰 성능 gain의 요인은 아닐 것 같다는 생각입니다.

 

2. Image Augmentation은 너무 중요하다.

이 포스팅에서 나온 재밌는 인사이트였습니다. 

augmentation의 유무가 아니라 Tool의 질적인 차이만으로도, 학습이 되냐 안되냐의 차이를 경험했습니다. Accuracy 10% 이상의 성능 gain이 있었습니다.

 

3. transfer learning에서 SGD보다 Adam이 좋은 것 같다.

Learning rate & batch size best 조합 찾기 (feat.논문리뷰와 실험결과)

이 포스팅은 이번 포스팅과는 별개이지만 여기서 transfer learning할 때에 Adam을 써서 SGD보다 더 좋은 성능을 냈었습니다. 아마 데이터셋의 양이 많아서, 잘 된 것일 수도 있었던 것 같습니다.

 

하지만 이번에도 제가 크롤링한 약 1,000장의 데이터에서 Transfer learning에 Adam이 더 좋은 성능을 내었습니다. 물론 SGD를 쓰면 좀 더 loss가 안정되는 그래프를 보이긴 합니다. 그리고 제가 에포크를 100정도만 했기 때문에 Adam이 더 잘 나왔을 수도 있죠. 

많은 논문에서 transfer learning시에 SGD를 많이 쓰는데 아마 논문은 에포크를 엄청 많이 돌려서 나오는 성능을 내는 것일 겁니다. (논문을 무시할 순 없겠죠!)

하지만 Adam을 써도 시간도 훨씬 더 빠르고 우려없이 꽤나 잘 수렴합니다.

논문대로 SGD로 포스팅을 진행했다면, 시간이 너무 오래 걸려 여러 시행착오를 경험해볼 수 없었을 것입니다. 또한 논문을 쓰는 연구기관은 아주 좋은 환경이겠죠...?

 

4. fine tuning은 매우 강력하고 섬세하다.

제가 직접 크롤링한 이미지라 약 1,000장 정도의 학습 데이터를 구할 수 없었음에도, 최종적으로 Accuracy 92%의 모델을 생성해냈습니다. 처음 포스팅할 때만 해도 7~80% 나와도 대박이겠다 라는 생각을 훨씬

뛰어넘는 수치입니다.

데이터도 전부 해양생물이라 색깔이라는 특성은 거의 배제되고 분류를 해야되는 상황이었는데도 말입니다.

 

5. 구글 드라이브는 화가난다.

저는 노트북으로 모델을 돌려야하는 환경이라서 대부분 colab에서 진행했습니다. colab으로 OS모듈을 써서 폴더나 파일을 다루면, 진짜 너무 화납니다 ㅋㅋ (OS로 파일명을 바꿔줬는데, 갑자기 왜 파일이 쓰레기통에...?)

최근에도 다른 프로젝트를 하는데, 저만이 아니라 다른 분들도 OS와 g드라이브에서 문제가 일어나더군요. 혹시나 코랩에서 os모듈 쓰는데 오류가 난다면, 코드 문제가 아닐 확률도 큽니다.

 

 

 

이렇게 이번 포스팅을 마지막으로 개인 프로젝트를 마칩니다. 

읽어주신 분들 감사합니다.

제 포스팅이 큰 도움이 되었기를 바랍니다.

 

그냥 재미로 읽어보신 분들이나 제대로 프로젝트를 안해보신 분들은 제가 코드를 올린 깃헙을 전부 공유했으니, 한 번 따라 해보시면 실력이 많이 늘 것 같습니다!

 

댓글