관리 메뉴

꿈 많은 사람의 이야기

파이썬 케라스(keras) 딥러닝 CNN으로 강아지 종류(품종)을 예측해봅시다! 본문

deep learning(딥러닝)

파이썬 케라스(keras) 딥러닝 CNN으로 강아지 종류(품종)을 예측해봅시다!

이수진의 블로그 이수진의 블로그 2018. 10. 1. 10:20


요즘 딥러닝이 완전 핫합니다!

이미지 인식, 영상처리 문장 처리 등 많은 분야에서 사용되고 있는데요

이번 포스팅은 그 중에서 이미지 인식을 해봅니다


어떤 이미지 인식이냐구요?


바로 강아지 품종(종류)를 인식해보는 것입니다!

포메라니안, 불독, 시바, 허스키 등 강아지 종류를 한 번 예측해보죠


언어는 당연히 파이썬을 썼습니다.

라이브러리는 텐서플로 backend를 이용해 케라스(keras)를 사용했습니다.


즉 케라스로 CNN 네트워크를 구성해 훈련해봅니다



먼저 훈련 자료가 필요하겠죠??

훈련 자료는 크롤링을 해서 가지고 왔습니다.

강아지 종류별로 폴더를 만들었는데요 

종류는 다음과 같습니다.

비글, 불독, 치와와, 웰시코기, 그레이하운드, 허스키, 말티즈, 포메라니안, 셰퍼드, 시바견, 시츄, 토이푸들(푸들), 요크셔테리어

이렇게 13가지 종류를 모아놨습니다.



이건 웰시코기 사진이구요



이건 포메라니안 사진입니다.

이렇게 각 폴더 안에 사진들을 모아놨습니다

그럼 각 이미지 개수는 얼만큼 될까요??



이렇게 되네요. 각 이미지 개수는 제각기 다르지만 대략 평균적으로 2400개 정도 되었습니다.

이미지 개수가 안맞는게 조금 흠이네요~

일단은 이 상태로 모델을 만들어보죠.



총 이미지 개수는 38599개입니다

13개의 카테고리 치고는 훈련 셋이 조금 많이 부족합니다

나중에 imagedatagenerator로 이미지를 부풀리겠습니다.

일단은 이 상태로 훈련을 해봅니다.



먼저 클래스 개수(nb_classes)를 설정합니다.

그리고 각 이미지를 컬러 값이니까 (255,255,3) 모양의 numpy 배열로 변환시켜줍니다

그리고 numpy 배열로 잠깐 저장을 했어요

이후 X_train, X_test, y_train, y_test 값으로 불러왔습니다

그래서 훈련 셋에서는 약 2만7천개정도 데이터가 있구요

테스트 셋에서는 6700여개가 있습니다.


라벨(클래스)값은 원핫 인코더로 변환시켰습니다.



여기서 정규화(normalization)을 해줍니다.

왜냐하면 0~255값을 가지고 있으니까 값의 폭이 크기 때문이죠.

이거를 0~1의 값을 가지도록 해줍니다.


자! 이제 데이터 전처리는 끝났습니다.

훈련 모델을 만들어보죠

저는 컨볼루션 레이어를 구축했습니다.

이미지 -> 32개 Conv2D -> maxpooling -> dropout -> 64개 Conv2D -> Maxpooling -> dropout -> 128개 conv2d -> 128개 Conv2D

-> MaxPooling2D -> dropout -> Dense -> dropout -> Dense


망으로 구축했어요



이렇게 말이죠!

이걸 요약해서 보면



이렇게 나옵니다.

이 상태에서 훈련을 시켜주고

정확도를 측정해보죠



조금은 아쉬운 결과가 나왔네요

70%대에 불과합니다.

그래프로 봐볼까요??



cost loss가 떨어지긴 하지만 엄청 낮아지지 않았네요.

그럼 과적합을 보기 위해서 훈련할 때 정확도는 어떠했는지 봐볼까요?



훈련할 때도 72% 정도였네요. overfitting(오버피팅)은 걸리지 않았습니다.

제 생각엔 데이터 셋이 부족해서 그런거 같더군요.

그래서 늘려봅니다!



keras 케라스에서 imagedatagenerator가 있습니다.

이것을 이용해 좌우 0.1씩 움직여주고 0.2배로 크고 작게 해주는 로직을 이용해서

이미지를 늘려줍니다!



근데 제가 메모리가 부족하더라구요

16G인데도..

numpy에서 memoryerror가 계속 떴습니다.

아마도 이미지 개수가 많아서 numpy 배열에서 처리하기 힘들었나 봅니다.

이건 케라스에서 이미지를 따로따로 가지고와서 훈련하는 방법을 알아봐야겠습니다.

그래서 아무튼 원래는 각 이미지당 1만개정도를 하려고 했는데

한계가 2의 16승인 대략 65500~7만개 정도가 한계였습니다.

그래서 한 이미지당 6천개로 제약했습니다.



아까 총 이미지 개수보다 대략 2배가 늘어났습니다.

무엇보다 이미지 개수가 같아졌죠!

각 이미지는 6001개로 동일합니다



이 상태에서 훈련하니까 정확도가 무려 0.86까지 올라갔습니다!

즉 86%이죠. 아까는 70%에 불과했는데 말입니다

그래프로 볼까요??



오차도 잘 떨어졌습니다.

아까는 1.0 언저리였는데 이젠 0.4까지 떨어졌네요



정확도도 쭉쭉 올랐구요!

그럼 이제 실전 이미지로 테스트해봅니다.



그냥 구글에서 데이터를 가지고 왔습니다.

말티즈, 불독, 비글, 토이푸들, 포메, 허스키

이렇게 가지고 와서 이미지를 추측해보면!




이렇게 나옵니다.

흠.. 말티즈는 예측을 잘 하지 못하네요

하지만 불독, 비글, 토이푸들, 포메라니안, 허스키는 잘 예측했습니다.


말티즈 같은 경우는 허스키, 불독으로 예측을 하는데


아마 허스키 사진이 뒷 배경이 하얀색(눈 때문에)이 많았거든요

그래서 말티즈 색 특성상 하얀색이 많아서 그런거 같기도 합니다


아무튼! 이렇게 딥러닝을 이용해서 품종을 예측해봤습니다

다음번엔 더 효율적으로 짜서 가지고 오겠습니다~

27 Comments
댓글쓰기 폼