세로형
Link
10-23 13:14
«   2021/10   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
Archives
Today
367
Total
1,883,319
관리 메뉴

꿈 많은 사람의 이야기

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

deep learning(딥러닝)

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

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

해당 코드는 이 깃허브에 존재합니다. 

(https://github.com/lsjsj92/keras_basic)

 

------------

 

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

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

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

 

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

 

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

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

 

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

라이브러리는 텐서플로 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가 떨어지긴 하지만 엄청 낮아지지 않았네요.

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

 

300x250

훈련할 때도 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까지 떨어졌네요

 

 

정확도도 쭉쭉 올랐구요!

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

 

 

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

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

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

 

 

 

이렇게 나옵니다.

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

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

 

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

 

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

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

 

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

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

반응형
그리드형
94 Comments
  • 이전 댓글 더보기
  • 프로필사진 ㅎㅎ 2020.05.16 18:29 ValueError Traceback (most recent call last)
    <ipython-input-5-a458c52d8f9f> in <module>
    11 session = tf.compat.v1.Session(config=config)
    12
    ---> 13 X_train, X_test, y_train, y_test = np.load('./numpy_data/multi_image_data.npy')
    14 print(X_train.shape)
    15 print(X_train.shape[0])

    C:\ProgramData\Anaconda3\lib\site-packages\numpy\lib\npyio.py in load(file, mmap_mode, allow_pickle, fix_imports, encoding)
    451 else:
    452 return format.read_array(fid, allow_pickle=allow_pickle,
    --> 453 pickle_kwargs=pickle_kwargs)
    454 else:
    455 # Try a pickle

    C:\ProgramData\Anaconda3\lib\site-packages\numpy\lib\format.py in read_array(fp, allow_pickle, pickle_kwargs)
    737 # The array contained Python objects. We need to unpickle the data.
    738 if not allow_pickle:
    --> 739 raise ValueError("Object arrays cannot be loaded when "
    740 "allow_pickle=False")
    741 if pickle_kwargs is None:

    ValueError: Object arrays cannot be loaded when allow_pickle=False
    잘되던가 싶더니 갑자기 이런 에러가 나오는데 혹시 왜이러는지 알려주실수 있을까요...?
  • 프로필사진 오키여 이수진의 블로그 2020.05.17 16:11 신고 안녕하세요.
    에러 내용을 보니까 numpy load할 때 allow_pickle 파라미터 옵션을 True로 하셔야 할 것 같아요~

    np.load('./asdf.txt', allow_pickle=True)이런식으로요!
  • 프로필사진 랄라 2020.06.01 22:15 안녕하세요! 혹시 이미지 크롤링은 구글에서 하나하나 다운 받으신 건가요?? 사진이 많이 필요한거 같은데 코드 이용해서 크롤링했더니 일정 개수 이상 다운이 안되고 사진의 화질도 떨어져서요ㅠㅠㅠ
    혹시 크롤링 방법이 있다면 조언 부탁드려요ㅠㅠㅠ
  • 프로필사진 오키여 이수진의 블로그 2020.06.02 09:38 신고 네 저는 구글 이미지에서 크롤링했습니다.
    화질이나 이런 것에서 큰 이상은 없었어요.
    일정개수 이상 다운이 안되는 것은 구글 이미지는 밑으로 스크롤바를 내리거나, 더보기 버튼을 눌러야 합니다. 해당 기능을 구현해주셔야 해요~
  • 프로필사진 랄라 2020.06.08 21:42 답변 감사합니다ㅠㅠㅠㅠㅠㅠ 혹시 강아지 사진들 크롤링 하실 때 팁을 얻을 수 있을 까요? 저는 그냥 강아지 이름 검색하고 이미지에 나오는 사진들은 다 가져오는 코드로 짰는데 강아지 사료나 강아지 사진이 들어간 핸드폰케이스 이런것도 같이 가져오더라구요... 질 좋은 사진들을 크롤링 하려면 어떻게 해야 하는지 알 수 있을까요...??!
  • 프로필사진 오키여 이수진의 블로그 2020.06.09 09:34 신고 안녕하세요.
    아 ㅠㅠ 그런 것은 어쩔 수가 없어요..
    저도 일단 크롤링 하고 손수 작업으로 한 번 검정했습니다. (전 직장 동료와 함께..)

    아니면, 강아지 데이터로 이미 pre-train된 모델을 사용하셔서 predict를 하면 얘가 강아지인지 아닌지 판단해주는데 강아지라고 판단 안하는 이미지는 전부 제거하는 방법으로 하는 방법도 있습니다.
  • 프로필사진 랄라 2020.06.15 19:10 와아... 직접 해야하는군요ㅠㅠㅠㅠㅠㅠㅠ
    답변 감사합니다ㅠㅠㅠㅠㅠ 많은 걸 얻었어요!!!
  • 프로필사진 오키여 이수진의 블로그 2020.06.15 22:10 신고 넵 ㅎㅎ 감사합니다. 부디 도움이 되었길 바랍니당
  • 프로필사진 매운세데스 2020.06.19 22:56 안녕하세요 보고많은 도움 얻는중입니다
    제가 여줘보고 싶은게 하나있는데
    맨처음에 이미지 데이터를 입력해야하는데
    이 이미지 데이터들을 전처리 하는 과정이 조금 궁금해서여
    저는 프레임워크를 안쓰고 opencv로 처리하는중이고 ..이미지 데이터들을 다 다운받았어여 대략 40000만장 정도되는데 ,,
    전처리 하는 문제보다는 이 이미지 파일들을 어떻게 불러와야되는지.... 한두장이 아닌데,,,,
    어떻게 넣으신건지 자세한 과정을 좀 알고싶은데 도움을 주실수 있으신지요 ㅠㅠㅠㅠ
  • 프로필사진 오키여 이수진의 블로그 2020.06.20 16:03 신고 안녕하세요.

    일단 제가 생각하기로는 메모리 문제가 클 것 같군요.
    아마 local에서 작업하시기엔 힘들 수도 있을 것 같습니다.

    아마 제가 생각하기로는
    1. 이터레이션 구축 ( yield 로 데이터 불러오기)
    2. 불러온 데이터로 훈련을 진행하는 방법

    https://stackoverflow.com/questions/7883962/where-to-use-yield-in-python-best

    참고해보시면 좋을 것 같습니다.
  • 프로필사진 이필모 2020.07.23 16:07 안녕하세요! 데이터를 넣어서 트레이닝은 시켯는데 새로운 데이터를 가져와서 예측은 어떻게 하는지 궁금합니다! 파이썬이 아닌 텐서플로우를 사용하였습니다 ㅠ
  • 프로필사진 오키여 이수진의 블로그 2020.07.23 16:31 신고 안녕하세요.
    일단, 하나 짚고 넘어가자면 파이썬이 아닌 텐서플로우를 사용했다는 말은 모순입니다.
    tensorflow는 Python의 패키지입니다.

    새로운 데이터에 대한 predict은 model.predict() 함수 안에 데이터를 넣어주시면 됩니다!
  • 프로필사진 show 2020.11.06 12:43 import keras.backend.tensorflow_backend as K
    이부분 에러가 나요 ㅠㅠ
    No module named 'keras.backend.tensorflow_backend'; 'keras.backend' is not a package
    이런 에러 나옵니다
  • 프로필사진 show 2020.11.06 13:03 뭔가 텐서랑 케라스 버전문제인듯 합니다
    텐서 , 케라스 버전을 알수있을까요?
  • 프로필사진 오키여 이수진의 블로그 2020.11.06 22:32 신고 안녕하세요.

    네 아마 버전 문제일 확률이 높습니다. 해당 글은 작성된 시기가 2년이 넘어서요. 현재는 Tensorflow 2.x 버전으로 다 되어서 그럴겁니다.

    당시에는 Tensorflow1.3, Keras 2.2.2로 기억을 합니다.
  • 프로필사진 s 2020.12.11 17:15 안녕하세요! 혹시 ImageDataGenerator를 깃허브의 7번 코드에 적용시키는 방법을 따로 알 수 있을까요? 혼자 찾아보고 시도하는데 해결이 잘 안되네요ㅠ
  • 프로필사진 오키여 이수진의 블로그 2020.12.14 12:16 신고 안녕하세요!

    https://keras.io/ko/preprocessing/image/
    를 참고하시면 될 것 같습니다!
  • 프로필사진 hee 2020.12.11 17:36 혹시 최종 샘플 이미지의 분류 판단을 함에 있어서 각 카테고리에 대해 그 이미지가 해당 카테고리에 속할 확률을 아웃풋으로 얻을 수는 없나요?
    예를 들어 개의 종 13종류에 대해 각 종일 확률이요!
  • 프로필사진 오키여 이수진의 블로그 2020.12.14 12:16 신고 안녕하세요

    단순히 model.predict를 하면 class 개수에 따라 확률이 나오게 됩니다!
  • 프로필사진 류기철 2020.12.17 14:39 안녕하세요 좋은 블로그 잘보고있습니다. 공부하던 중에 궁금한 내용이 있어서 문의드립니다.

    현재는 1개의 이미지에 1개의 라벨링을 하고있는데 예) 이미지1=신발, 이미지2=가방

    혹시 1개의 이미지에 여러가지 라벨링을 할 수 있을까요? 예) 강아지 이미지 = 대분류:포유류, 중분류:푸들, 소분류: 이름 이런식으로요

    그리고 혹시 라벨링이 가능하다면 학습 후 필요에 따라 대분류, 중분류, 소분류 등 필요에 따라 예측이 가능한가요??

    두서없는 글이지만 답변 부탁드립니다~~
    감사합니다!!
  • 프로필사진 오키여 이수진의 블로그 2020.12.17 15:41 신고 안녕하세요.

    2가지 방법이 있다는 것으로 알고 있습니다.

    1. 대분류-중분류-소분류를 하나로 합쳐서 하나의 라벨로 만든다.
    예를 들어 '포유류-푸들-강아지' 가 라벨1이 되고 '포유류-푸들-개'가 라벨2이 되고 뭐 이런식으로요! 예제가 이상한 것 같지만..

    2. multi label classification 문제로 풀 수 있는 것으로 알고 있습니다. https://stats.stackexchange.com/questions/11859/what-is-the-difference-between-multiclass-and-multilabel-problem 참고해보셔요!
  • 프로필사진 정은숙 2021.01.15 12:02 안녕하세요. 흥미로운 블로그 잘읽었습니다.
    혹시 keras_basic소스의 CNN을 이용한 단일 이미지(개, 고양이) 분류(6. predict_binary_img_with_CNN.ipynb)
    이부분을 활용하신건가요?? ipynb 확장자인데 파이썬 으로 변환해서 프로그래밍하신건지요.
    시간되시면 답변좀 부탁드리겠습니다.
  • 프로필사진 오키여 이수진의 블로그 2021.01.15 20:15 신고 안녕하세요.
    제가 올린 코드는 전부 파이썬입니다.
    .ipynb는 jupyter-notebook으로 작성했기 때문에 확장자가 ipynb인 것입니다!
  • 프로필사진 콩닭통닥 2021.01.21 18:46 학습하기 전에 강아지 이미지에서 얼굴 detector 사용하여 얼굴만 crop 해서 학습하면 어떨까요?
    그러면 눈과 같은 주위 환경에 영향을 덜 받지 않을까요?
    아니면 각 강아지들의 몸통의 특징(다리길이, 꼬리길이, 체형, 털 색 등)이 학습되지 않아 정확도가 오히려 떨어질까요?
  • 프로필사진 오키여 이수진의 블로그 2021.01.23 11:28 신고 안녕하세요~
    네 실제로 그렇게 하시는 분들도 많습니다!
    그리고 그런 전처리 과정이 확실히 도움이 될 것이라고 생각합니다.

    하지만, 말씀하신대로 '얼굴만'을 하면 부정확할 수도 있어요. object 전체를 detect 하는 방향으로 하는 것이 더 좋을 것 같습니다 :)
    주위 환경(일종의 노이즈 데이터)를 제거하는 것은 좋은 아이디어라고 생각합니다~
  • 프로필사진 11 2021.01.29 16:04 덕분에 딥러닝 공부하는데 도움이 많이 되었습니다!!
    근데 깃허브 어느 폴더를 열어도 강아지 품종 분류 코드는 못찾겠습니다...
    제가 하고있는것과 많이 유사해서 코드를 꼭 보고싶은데 어떻게 볼수있을까요,,?
  • 프로필사진 오키여 이수진의 블로그 2021.01.31 19:12 신고 안녕하세요
    품종 분류는 multi task 이기 때문에 predict multi image 쪽을 보시면 됩니다~
  • 프로필사진 듀누듀누 2021.04.02 19:36 정말 감사합니다,, 제 인생을 구하셨어요,,
  • 프로필사진 오키여 이수진의 블로그 2021.04.03 10:01 신고 안녕하세요~ 도움이 되셨다면 다행입니다!
  • 프로필사진 2021.04.15 16:57 비밀댓글입니다
  • 프로필사진 2021.04.15 21:45 비밀댓글입니다
  • 프로필사진 jaeaheonlee 2021.05.17 15:21 텐서플로우 , 쥬피터노트북, 머신러닝 등이 처음이라 무에서 위와 같은 코드를 만드는데 어려움을 겪고 있습니다.
    소스기반으로 학습을 하는게 더 좋을 것 같아서 혹시 완성된 소스코드가 있다면 첨부가능하신가요?
  • 프로필사진 오키여 이수진의 블로그 2021.05.17 21:27 신고 안녕하세요.

    제 코드는 글 또는 공지사항에 소개되어 있는 github에 전부 올려져 있습니다~
    참고해주세요!
  • 프로필사진 harryhslee 2021.05.23 18:46 predict multi image 코드를 보면 불상,비행기 애네를 비교하는 코드고 강아지 품종 비교하는 코드는 없는데 어디서 찾아봐야하나요
  • 프로필사진 오키여 이수진의 블로그 2021.05.23 21:30 신고 안녕하세요.
    binary 라고 쓰여져 있는 코드를 보시면 됩니다.
  • 프로필사진 dada 2021.05.28 17:53 안녕하세요! binary 코드에도 개와 고양이를 분류하는 모델인 것 같은데 품종 비교 코드는 어디서 볼 수 있을까요ㅠㅠ?
  • 프로필사진 오키여 이수진의 블로그 2021.05.28 19:39 신고 안녕하세요.
    아 ~ 제가 강야지, 고양이 분류 코드라고 쓰여진 줄 알고 잘못봤네요. 죄송합니다.

    강아지 품종 코드는 multi image와 동일합니다.
    dataset만 강아지 품종이고 똑같이 multi image classification이기 때문에 동일한 방법으로 진행하면 됩니다!
  • 프로필사진 감자튀김 2021.06.13 07:03 모델을 만들고 학습은 시켰는데 아무 이미지나 넣어서 xx는 xx입니다. <- 이 결과를 보려면 어떤 코드를 추가해야하나요 ㅠㅠㅠ
  • 프로필사진 오키여 이수진의 블로그 2021.06.14 06:41 신고 안녕하세요.

    해당 코드는 model.predict 하는 부분에 넣어주시면 됩니다. predict를 하면 각 카테고리 별 확률이 나오니 이를 if문 등으로 처리해서 출력해주시면 됩니다~
  • 프로필사진 딥러닝 2021.08.06 09:50 여러종을 한번에 학습시키고싶은데 메모리 부족 현상으로 안될때 이미지를 따로 가져와서 하는 방법 혹시 어떻게 하셨나요??
    현재 13종 학습중인데 6종 7종 2개의 데이터셋으로 나눠서 하고있을때 좋은 방법이라도 있을까요?
  • 프로필사진 오키여 이수진의 블로그 2021.08.08 14:24 신고 안녕하세요.

    메모리 관리를 하기 위해선 파이썬의 generator 기능이 포함된 것들을 사용하시면 좋습니다. 아마 tensorflwo 등에서도 관련 기능을 제공해주는 것으로 알고 있어요~ 필요한 데이터만 불러와서 모델을 학습시키는 방법입니다~
  • 프로필사진 으나 2021.10.13 23:39 안녕하세요! 모델을 만들고 학습 시켰는데 예측할 이미지 폴더에 있는 이미지를 불러서 예측 결과를 확인하고 싶습니다. 혹시 어떻게 하시는지 아시나요?ㅜㅜ 아무리 찾아도 이미지 하나만 부르고 예측하는 방법밖에 안 나와서요,,,ㅜㅠㅜ
  • 프로필사진 오키여 이수진의 블로그 2021.10.15 19:42 신고 안녕하세요.

    predict하는 것을 loop 돌면서 하시면 될 것 같습니다~
    python os에 file list 출력할 수 있는 기능이 있는데 이를 활용하셔서 불러오시면서 predict하시면 될 것 같아요.

    아니면 데이터를 2d로 한번에 넣어도 될 것 같긴하네요~
댓글쓰기 폼