Link
10-22 09:21
«   2020/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
398
Total
1,079,528
관리 메뉴

꿈 많은 사람의 이야기

파이썬 케라스(keras)로 딥러닝하자! CNN을 이용해 이미지 분류하기(image classification) 본문

deep learning(딥러닝)

파이썬 케라스(keras)로 딥러닝하자! CNN을 이용해 이미지 분류하기(image classification)

이수진의 블로그 이수진의 블로그 2018. 6. 29. 17:49


해당 코드는 https://github.com/lsjsj92

에 있습니다. 참고하시고 스타도 주시면 감사하겠습니다 :)


파이썬으로 케라스(keras)와 사이킷런(scikit-learn)을 독학한지 어느덧 1달이 조금 넘었습니다.

그 동안 카테고리 분류도 해보고, 감정 분석도 해보고(실패....) 여러가지 해보면서

일반적인 머신러닝 알고리즘(서포트 벡터 머신(SVM), 랜덤 포레스트(random forest) 등)이 아닌 케라스로 다층 퍼셉트론(MLP)을 구현해서 

해봤습니다.


뭐 아직 다음 단계로 넘어갈 실력은 아니었지만 일단은 여러가지 경험을 쌓고자 이젠 컨볼루션 뉴런 네트워크(convolutional neural networks)를 해보려고 합니다.

컨볼루션 신경망이라고도 불리는데요

케라스에선 컨볼루션 신경망 레이어가 있습니다!(Conv2D)


이것을 이용해 이미지를 인식해보려고 합니다.

컨볼루션은 특히 영상 처리에 특화되어 있어서 영상처리쪽에서 많이 쓰인다고 합니다


제가 한 것은

비행기, 불상, 나비, 게 

이렇게 4가지 카테고리를 분류하는 작업을 진행했습니다.



디렉토리는 위와 같이 되어 있습니다.

test와 train 디렉토리가 있구요 

그 안에 세부적으로



이렇게 되어 있습니다.

비행기, 불상, 나비, 게

이 순으로 디렉토리가 있네요




각 이미지는 대략 200개? 정도 있었습니다.

비행기 같은 경우엔 500개가 넘었네요

어떤건 300개 이러구요


근데 아무래도 데이터 셋이 조금 부족합니다.

예제로 많이 쓰는 MNIST는 6만개 이러는데..

고작 몇백개니까요!

그래서 데이터를 부풀려보려고 합니다




케라스에 있는 ImageDataGenerator를 통해서 이미지를 생성을 할 예정인데요

각도를 바꾸고, 옆으로 조금 이동시키고 뭐 이런식으로 하면서 이미지를 더 생성할 예정입니다.

그리고 파일을 바로 생성해서 저자하도록 save_to_dir을 통해서 저장 경로를 지정했구요

1개 사진마다 10개씩 더 추가하려고 합니다~



이렇게 각도가 바뀌고, 옆으로 이미지가 좀 움직이는 등으로 이미지를 더 생성했습니다

각 사진 하나당 10개씩 추가되었어요

데이터 셋이 천 단위로 넘어가게 되었습니다~


이제 다음은 이미지와 카테고리를 X, Y 값으로 나눠야 합니다.

그래야 케라스에서 학습을 진행하니까요



이미지 크기는 64 x 64로 진행합니다.

카테고리별로 돌면서 label을 먼저 0으로 전부 초기화 한 다음

첫번째 idx에 1을 놓아줍니다.

그러면 맨 처음인 비행기는 [1 0 0 0]이 될 것이구요(라벨이 4개라서 배열 크기도 4개입니다)

두번재 불상은 [0 1 0 0]의 형태를 가지고 있을 겁니다.

그리고 이미지를 RGB값으로 바꿔주면서 resize하고 그 값을 numpy 라이브러리를 이용해 가지고와 저장합니다.



이렇게 저장됩니다~

이제 훈련을 시켜야겠죠!



카테고리는 마찬가지로 4개, 그림 크기는 64 x 64입니다.

아까 저장한 npy 파일을 가지고와서 저장합니다.

이제 CNN 컨볼루션 신경망 모델을 만들어보죠


Conv2D를 이용해서 만들 수 있는데요



3 x 3 크기의 컨볼루션 레이어를 32개의 필터수를 처음에 생성합니다. 활성화 함수는 relu를 사용하구요

input_shape는 64 x 64 크기와 컬러 값이니 3

즉 (64, 64, 3)의 튜플 값을 가지게 됩니다.

그리고 maxpooling2D를 통해서 주요 값만 뽑아내어 작은 출력 값을 만들어 냅니다.

즉 사소한 변화를 무시하는 것이죠.


그리고 Flatten()은 CNN에서 컨볼루션 레이어나 맥스풀링을 거치면 주요 특징만 추출되고 전결합층에 전달되어 학습됩니다.

이때, 컨볼루션이나 맥스풀링은 2차원을 주로 다루는데요. 전결합층에 전달을 하기 위해서는 1차원으로 바꿔줘야합니다.

이때 Flatten()을 사용하는 것이죠!

그리고 loss 함수로 binary_crossentropy를 사용했는데요

왜 softmax인데 이걸 사용하는지 저도 의문이었습니다.

이 글 뒷 부분엔 categorycial을 사용합니다.

(결론부터 말하면 binary_crossentropy 이런 상황에서 사용하면 안좋다고 말합니다

조언 해주신 인스페이스 김태영 이사님 감사드립니다)




이렇게 훈련을 진행합니다~



callback 함수로 인해 modelcheckpoint와 earlystoppin을 진행합니다.

케라스에선 이게 정말 좋더군요



계속 val_loss가 떨어지는 것을 볼 수 있습니다.



그 결과 94%의 정확도가 나왔네요



val_acc와 val_loss값도 안정적이구요

이제 테스트를 해봐야죠!

샘플 이미지를 미리 빼놨습니다.




이 이미지들을 기준으로 테스트 해보면요!



이렇게 나옵니다.

그리고 실패한 이미지들은 img_missing디렉토리로 빠지도록 저장했습니다.



얘가 실패했네요


자 이제 위에선 loss를 binary_crossentropy로 했는데요

이제 정석대로 categorical_crossentropy로 해보죠!



이렇게 바꿔주고요 진행해봅니다



음 뭔가 그래프가 아까보단 안이쁘지만..

그래도 정확도는 90%가 나왔네요


이제 새로운 샘플로 테스트를 해볼까요?



구글에서 새로운 사진들을 가지고 왔습니다~

얘내를 가지고 테스트를 해보면요!




음 비행기를 잘 못맞추네요~

그래도 불상, 게, 나비는 다 맞추는군요 ㅎㅎ


이렇게 파이썬 케라스(keras)를 통해서 CNN 컨볼루션 레이어를 구축해서 이미지를 분류할 수 있습니다~

독학하기 참 힘드네요 ㅠ

139 Comments
  • 이전 댓글 더보기
  • 프로필사진 123 2020.05.11 00:38 궁금한게 있습니다.
    코드 중 prediction = model.predict(X)을 적었더니
    ValueError: Error when checking input: expected conv2d_7_input to have 4 dimensions, but got array with shape (0, 1) 오류가 나타났는데 어떻게 해결하는지 고민입니다.
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.05.11 09:33 신고 안녕하세요.
    해당 코드는 predict할 때 X에 데이터가 제대로 들어가지 않은 상태입니다.
    X에 데이터가 올바르게 들어가 있는지 확인해주세요~
  • 프로필사진 궁금 2020.05.12 20:35 안녕하세요 좋은 내용 감사합니다
    글을 보며 딥러닝을 공부하고 있는 학생입니다.
    트레이닝 데이터에 개와 강아지 폴더를 만들고 각각의 데이터를 10개씩 넣어줬습니다. 또한 테스트 데이터를 5개 정도 만들고 진행을 하였는데요 prediction= model.predict(x) 부분에서 앞에 님과 같은 오류가 남니다.
    numpy와 model은 프로그램이 돌아가며 저절로 생긴다고 이해를 하여 바탕화면에다가만 생기게끔 경로를 지정을 해주고 실행을 한 상태이고요. 앞 처럼 x값이 제데로 들어가지 않았다는 건데 numpy나 model를 폴더로 경로룰 따로 만들고 numpy나 model폴더안에 다른 값 예를 들어) 트레이닝 데이터나 어떤 값을 임의로 넣어줘야하는 건가요??
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.05.13 09:26 신고 안녕하세요.

    predict(x)에서 x는
    training 때와 똑같이 img -> numpy로 되어 있는 상태여야 합니다.
    근데, 이때 img를 불러올 때 경로가 제대로 설정되어 있어야 불러올 수 있어서 위에서 경로 이야기를 드린겁니다.
    경로만 잘 성정 되어 있으면, 보통 문제 없이 진행되었고, 저에게 같은 에러로 들어오는 질문이 대부분 경로 문제였어요 ㅎㅎ
  • 프로필사진 2020.05.13 01:27 좋은 글 감사합니다~
    제가 여러개 이미지가 들어있는 폴더를 부퓰려 다른 폴더에 저장하고 싶은데요
    이해가 잘 안되는데 전체코드좀 얻을 수 있을까요? github에는 없어서요ㅜㅜ부탁드립니다!!
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.05.13 09:27 신고 안녕하세요.
    https://tykimos.github.io/2017/06/10/CNN_Data_Augmentation/
    여기 김태영님의 블로그를 보시면 도움이 되실 것 같습니다 ~
  • 프로필사진 좋은하루되세요 2020.05.24 23:47 좋은글 감사드립니다~
    ValueError: Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (0, 1)
    해당 에러 발생하시는 분들은 경로 한번 더 확인해보셔요!

    github에 올라와있는 6번 예제보고 따라하고 있었는데, 20번 줄에 있는
    files = glob.glob(caltech_dir+"/*/*.*")
    이 구문 잘 보시면 폴더 하나 더들어가야합니다! 최종경로가 "./binary_img_data/img_test/*/*.*" 이렇게 됩니당
    /*를 하나 지우시던지 하셔서 진행하시면 될거 같아용
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.05.25 09:34 신고 감사합니다 ㅎㅎ
    말씀해주신 대로 경로는 본인 환경에 맞추어서 수정해주셔야 합니다~
    댓글 감사드립니다 :)
  • 프로필사진 python 2020.06.03 18:45 혹시 소스가 정확히 사이트 어디 있는지 알 수 있을까요??
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.06.03 21:37 신고 안녕하세요~
    https://github.com/lsjsj92/keras_basic
    에 있습니다.
  • 프로필사진 안녕하세요 2020.06.05 22:25 ith K.tf_ops.device('/device:GPU:0'):
    model = Sequential()
    model.add(Conv2D(32, (3,3), padding="same", input_shape=X_train.shape[1:], activation='relu'))
    model.add(MaxPooling2D(pool_size=(2,2)))
    model.add(Dropout(0.25))부분에서 RuntimeError: /job:localhost/replica:0/task:0/device:GPU:0 unknown device.의 오류가 뜨는데 이 경우에는 어떻게 해야하는지 아시나요ㅜㅜ?
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.06.06 13:13 신고 안녕하세요.
    해당 코드는 keras에서 gpu가 있음을 인식할 때 동작되는 코드입니다.
    님의 PC 환경에서는 gpu가 인식이 안되서 그런것 같아요.
    해당 with문 없애시고 동작시키시면 될 것 같습니다 ~
  • 프로필사진 keras 2020.06.06 04:34 좋은 글 감사드리며 하나 여쭙겠습니다.
    callback 함수 파트에서 NameError: name 'checkpoint' is not defined 이렇게 에러가 뜨는데 어찌해야하는지 아십니까?
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.06.06 13:14 신고 안녕하세요.
    해당 오류는 callback 함수에 사용되는 Callback 객체를 생성하지 않아서 나는 오류입니다.
    checkpoint를 담당하는 callback 객체를 생성하는 부분이 코드에 있을겁니다. 그 부분을 확인해주세요~
  • 프로필사진 kjw 2020.06.06 14:37 caltech_dir = "./multi_img_data/imgs_others/train" 이 부분이 약간 이해가 안되는데 무슨 의미 인가요??
    그리고 사진이 충분히 있으면 imagedatagenerate를 안해도 되는건가요?
    만약 카테고리 사진이 충분히 있다면 어디서부터 코드를 실행하는게 좋을까요..?
    캐글에서 이미지를 다운 받았습니다!
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.06.07 13:24 신고 안녕하세요.
    해당 부분의 의미는 train 데이터가 있는 디렉토리 경로입니다.
    사진이 충분히 있다면 imagedatagenerate 부분을 생략하고 하시면 됩니다 ~
  • 프로필사진 하라곤 2020.06.06 22:08 안녕하세요. CNN 과제를 하는데 수진님의 포스터가 굉장히 큰 도움이 되고 있습니다! 감사합니다!
    다름이 아니라, 중간에 validation 과정을 수행하는 코드를 진행 중인데 ( history = model.fit(X_train, y_train, epochs = 50, batch_size = 32, validation_split = 0.125, callbacks = [checkpoint, early_stopping]) )

    여기서 이러한 에러가 발생을 하더라고요. ValueError: Error when checking target: expected dense_53 to have 2 dimensions, but got array with shape (837, 64, 64, 3)

    이보다 앞선 코드인 summary 파트에서는 결과가 ( Layer - dense_53 (Dense) / Output Shape - (None, 25) / Param # - 6425 ) 으로 떠서 2 dimensions인 것 같은데, 왜 저런 error가 발생하는지를 잘 모르겠습니다. 혹시 어떠한 이유로 이러한 error가 뜨는지 알려주실 수 있으신가요?

    다시 한 번 좋은 글 감사합니다!!
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.06.07 13:28 신고 안녕하세요~ 도움이 되고 있으시다면 다행입니다 ㅎㅎ

    음.. 일단은 중간에 validation 과정을 수행한다는 것이 어떤 의미인 줄 모르겠습니다.
    코드를 보니 training 과정을 말씀하시는 것 같은데 맞을까요?

    에러를 보아하니 shape 문제인 것 같습니다. model을 통과 시킬 때 image의 shape가 어떻게 변화할 지 잘 구성해야합니다.

    그래서 저도 코드상에 input_size와 output size를 고민하면서 넣었었구요.
    Dense에서 받을 때 앞선 layer에서 output 형상이 잘 맞아떨어지도록 해야합니다 ~
  • 프로필사진 여쭤봅니다.. 2020.06.07 13:55 prediction = model.predict(X) 이부분에서
    ValueError: Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (0, 1) 일케 오류가 뜨는데 X에 데이터를 어떤식으로 넣야할까요ㅜㅜ? X="폴더경로" 이런식으로 넣는걸까요ㅜㅜ?
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.06.07 19:25 신고 안녕하세요~
    일단, 해당 오류가 뜨신 대부분의 사용자분들은 폴더 경로를 잘못 설정하셨던 경험이 대부분입니다.

    X가 들어가는 데이터가 있는 폴더 경로를 정확히 지정하셔서 데이터 입력이 잘 들어가도록 해주세요~
  • 프로필사진 Yong 2020.06.07 14:59 혹시 제가 버섯종류로 하려고 하는데 4가지 버섯과 그 외의 버섯들은 다른 문구들을 뜨게 하고 싶습니다.
    정확률이 몇 퍼센트 이하면 등록되지 않은 버섯입니다. 이런 식으로 값을 나오게 하고 싶은데 방법이 있을까요..? 지금 4가지 버섯에 대해서는 값이 잘 나오고 있습니다. 4가지 버섯은 종류를 잘 분별하고 있는데 그 외 다른 버섯을 넣었을 때 4가지 버섯과 어떻게든 비슷한 부분은 찾아서 그 버섯으로 인식하는게 같더군요..
    블로그 글은 몇번은 봤을 정도로 많이 봤습니다. 좋은 글 감사합니다.
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.06.07 19:26 신고 안녕하세요.
    등록되지 않는 버섯에 대해서 나오는 것은 안될겁니다.
    왜냐하면 모델 자체가 4가지 버섯에 대해 훈련을 진행했고, 모델 입장에선 등록되지 않은 버섯이 나와도 그 4가지 버섯 중 가장 높은 확률을 가진 output 값을 내기 때문입니다.
  • 프로필사진 안녕하세요! 2020.06.07 16:25 if i[0] >= 0.8 : print("해당 "+filenames[cnt].split("\\")[1]+"이미지는 "+pre_ans_str+"로 추정됩니다.")
    해당 (파일이름) 이미지는 네모으로 추정됩니다.
    이런식으로 이부분을 출력하는데 이미지의 이름과 확장자명이 아니라 폴더명만 출력되는데 왜그런지 아실까요ㅜㅜ?
    caltech_dir = "파일이름"
    files = glob.glob(caltech_dir+"/*.*")
    이런식으로 똑같이 한건데 모르겠어서요ㅜ
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.06.07 19:27 신고 안녕하세요.
    아마 저와 폴더 경로가 달라서 그럴겁니다.
    split 메소드는 문자열을 /를 기반으로 잘라주니까요. 안녕하세요 님의 환경에 맞추어서 split으로 나온 list에 대한 index 값을 다르게 해주세요~
  • 프로필사진 이미지 2020.06.12 03:25 안녕하세요! 게시물 잘 봤습니다. imagegenerator를 활용하고싶은데 쉽지않네요. 사용한 코드에서 앞부분에 추가로 뭔가 더있는건가요? fname같은 경우 위 사진은 하나의 이미지에 대해서만 실행되는 것 같아서요!
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.06.12 11:36 신고 안녕하세요~
    imagegenerator 활용 예제는 김태영님의 케라스 블로그를 보시면 금방 이해가 되실겁니다!
    https://tykimos.github.io/2017/06/10/CNN_Data_Augmentation/
    확인해보셔요~
  • 프로필사진 이미지 2020.06.12 20:20 답변감사합니다! 저 하나 더 궁금한점은 처음에 imagegenerator이용해서 여러가지 이미지를 만든 후 그 생성된 이미지들 까지 포함해서 train,validation,test 데이터로 활용하셨나요?
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.06.13 11:07 신고 아뇨~ train과 validation set에서만 사용했습니다.
    test data는 따로 만들어놨었어요~
    그 당시에 이렇게 하는 방법을 권장 받았기도 했습니다. 왜냐하면, imageGen으로 생성한 이미지는 test set으로 쓰기가 애매해서(실 데이터가 아니므로) 그렇게 했었던 기억이 있습니다.
  • 프로필사진 독학생 2020.06.15 08:24 매우 알기쉽게 잘 설명된글 너무너무 감사합니다. 덕분에 CNN을 직접 해보는데 많은 도움이 되었습니다.
    evaluation을 위한 이미지가 따로 폴더로 카테고리에 나눠져있는데 폴더로 evaluation하기위해 수정해볼려했더니 몇일째 잘 안되더라고요. 그래서 참고하고 싶은데 github에서 evaluation하는 부분에
    #이 비교는 그냥 파일들이 있으면 해당 파일과 비교. 카테고리와 함께 비교해서 진행하는 것은 _4 파일
    라고 되있는 부분이있는데 _4.py가 어디에 있는파일인가요?
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.06.15 11:58 신고 안녕하세요. 도움이 되셨다니 다행입니다.

    아 해당 코드에서 _4.py에 있다는 내용은 제가 실수로 달아 놓은거에요 ㅠㅠ 죄송합니다.
    _4 파일이라고 쓰여져 있는 부분이 해당 코드로 옮겨 온 것입니다.
    저대로 그냥 하시면 됩니다.
    말씀하신대로 경로만 잘 맞춰주시면 됩니다!
  • 프로필사진 감사합니다다 2020.06.16 00:08 좋은 글 감사합니다! 저는 npy파일로 저장하는거에 대해 여쭤보고 싶은게 있습니다! 저는 현재 train 데이터 약 6천개, test 데이터 약 천오백개로 미리 구분을 해놓고 모델을 만드려고 하는데 이런 상황에
    X_train, X_test, y_train, y_test = train_test_split(X, y)
    xy = (X_train, X_test, y_train, y_test)
    np.save("./numpy_data/multi_image_data.npy", xy) => 이 학습/테스트 전용 데이터로 구분하는 코드를 사용하는 대신 학습데이터/테스트데이터를 따로따로 npy파일로 저장하는 코드를 사용해야 할 것 같습니다! 이 때 어떤 식으로 수정하면 좋을지 조언 부탁드립니다 ㅠㅠ 감사합니다!
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.06.16 10:22 신고 안녕하세요.
    이미 데이터가 그렇게 구축이 되어 있으시다면

    따로 저렇게 저장하실 필요가 없습니다.
    그냥 있는 것을 numpy로 변환한 뒤에 사용하시면 될 것 같아요.
    그리고 따로따로 데이터를 저장 및 load 하시면 됩니다 ~
    굳이 저 코드에 얽매이실 필요가 없으실 것 같아요!
  • 프로필사진 감사합니다다 2020.06.16 11:59 아 아닙니다 감사합니다!!!
  • 프로필사진 2020.06.17 23:28 안녕하세요 ~ 딥러닝 입문자입니다~! 알기 쉽게 설명해주신 글을 읽으며 공부 중인데 넘파이 파일로 바꾸는 코드에서 궁금한게 생겼습니다!
    pixels = image_h * image_w * 3 여기서 마지막에 *3 한건 이미지가 컬러이기 때문인가요 아니면 다른 의미가 있나요~?
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.06.18 09:42 신고 안녕하세요.
    넵 맞습니다. 3인 이유는 RGB 3채널이기 때문에 그렇습니다~
  • 프로필사진 감사합니다 2020.06.18 21:27 코딩의 제일 마지막에
    for i in prediction:
    pre_ans = i.argmax() # 예측 레이블 / 최대값에 해당되는 인덱스 반환
    print(i) # '게' 이면 [0.000, 0.000, 1.000, 0.000 ]
    print(pre_ans) # '게' 이면 3
    pre_ans_str = ''
    if pre_ans == 0: pre_ans_str = "비행기"
    elif pre_ans == 1: pre_ans_str = "불상"
    elif pre_ans == 2: pre_ans_str = "나비"
    else: pre_ans_str = "게"
    if i[0] >= 0.8 : print("해당 "+filenames[cnt].split("\\")[1]+"이미지는 "+pre_ans_str+"로 추정됩니다.") #어차피 1 이상 아니야?
    if i[1] >= 0.8: print("해당 "+filenames[cnt].split("\\")[1]+"이미지는 "+pre_ans_str+"으로 추정됩니다.")
    if i[2] >= 0.8: print("해당 "+filenames[cnt].split("\\")[1]+"이미지는 "+pre_ans_str+"로 추정됩니다.")
    if i[3] >= 0.8: print("해당 "+filenames[cnt].split("\\")[1]+"이미지는 "+pre_ans_str+"로 추정됩니다.")
    cnt += 1
    # print(i.argmax()) #얘가 레이블 [1. 0. 0.] 이런식으로 되어 있는 것을 숫자로 바꿔주는 것. ex) --> 0
    # 즉 얘랑, 나중에 카테고리 데이터 불러와서 카테고리랑 비교를 해서 같으면 맞는거고, 아니면 틀린거로 취급하면 된다.
    # 이걸 한 것은 _4.py에.

    1. 본 코딩의 print(i) 를 하신 걸 봤는데
    i 가 [1, 0, 0, 0] 이런식으로 전부 1로 출력이 되어 0.8보다 크게 나오는데 왜 굳이 0.8을 적어주신건가요???

    정말 도움많이 받았습니다. 감사합니다 ㅠㅠ!!
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.06.19 11:26 신고 안녕하세요.
    저 코드가 원래는 threshold를 표현하려고 했습니다.
    말씀하신대로 argmax 결과로 무조건 1이 나오지만, 표현?만 그렇게 해둔거에요 ㅎㅎ
  • 프로필사진 도움이 많이 되었어요 2020.06.19 15:59 X_train, X_test, y_train, y_test = train_test_split(X, y)
    xy = (X_train, X_test, y_train, y_test)

    1. 이 부분에서 train과 test를 나누는 비율을 부여를 안해주었는데 뒷부분을 보니가 train이 2673개라고 나와있더라구요!! 나뉘는 기준이 무엇인가요??


    감사합니다ㅜㅜㅠ!!
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.06.20 15:56 신고 안녕하세요 ~
    네 따로 값을 넘겨주지 않았고, 그냥 default로 하도록 했습니다.
    보통은 0.2 정도 주면 됩니당
  • 프로필사진 감사합니다 2020.06.19 23:46 np.random.seed(5)
    iterations = 5

    path1 = 'C:/Users/park/Desktop/CNN Image _ test'
    result = 'C:/Users/park/Desktop/CNN Image _ result'
    file_list = os.listdir(path)
    file_list.sort()

    generator = ImageDataGenerator( rescale = 1. / 255,
    rotation_range = 15,
    width_shift_range = 0.1,
    height_shift_range = 0.1,
    shear_range=0.2,
    zoom_range=[0.8, 2.0],
    horizontal_flip=True,
    vertical_flip = True,
    fill_mode = 'nearest')

    for num in file_list:
    path2 = path1 + '/' + num
    for fname in glob.glob(path2 + "/*.png"):
    img = load_img(fname)
    x = img_to_array(img)
    x = x.reshape((1,) + x.shape)

    i=0
    for batch in generator.flow(x, batch_size=1, save_to_dir=result+'/'+num,
    save_prefix='plus_', save_format='png'):
    i += 1
    if i >5:
    break
    else:
    continue

    path1 = 'C:/Users/park/Desktop/CNN Image _ test'
    이 폴더 안에 cat 과 crab의 폴더가 각각 들어있고
    result = 'C:/Users/park/Desktop/CNN Image _ result'
    저장할 result 폴더 안에도 cat과 crab의 폴더가 생성되어있어서
    위와 같은 코딩으로 만들어보았는데 오류는 뜨지않지만 result 폴더안에 저장이 안되는데 이건
    어떻게 해결해야할까요..???
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.06.20 15:59 신고 안녕하세요~
    오류는 뜨지 않지만, 코드 자체가 동작이 제대로 안한 것일 수도 있습니다.
    중간에 for num in file_list 부분을 돌 때 결과 값이 제대로 나오고 있는지 print 등을 써보셔서 확인해주세요 ~

    의심되는 부분 한 줄 한 줄 입력해보시면서 잘 나오는지 확인하시면 금방 찾을 수 있을것 같아요!
  • 프로필사진 글 잘읽었습니다~ 2020.06.28 17:52 안녕하세요! 소중한 소스 올려주셔서 진심으로 감사드립니다.
    개발자님의 소스대로 코딩을 했습니다. 그런데 처음부터 막히내요ㅠㅠ 머신러닝은 처음이라 그냥 따라해보는중인데 여러가지로 많이 부족합니다.. 그래서 여쭙습니다!
    import os, re, glob
    import cv2
    import numpy as np
    from sklearn.model_selection import train_test_split

    caltech_dir = "../Users/USER20/tomato"
    categories = ["greentomato", "redtomato"]
    nb_classes = len(categories)

    imge_w = 64
    image_h = 64
    pixels = image_h * image_w * 3

    X = []
    Y = []

    for idx, cat in enumerate(categories):
    label = [0 for i in range(nb_classes)]
    label[idx] = 1
    image_dir = caltech_dir + "/" + cat
    files = glob.glob(image_dir + "/*.jpg")

    for i, f in enumerate(files):
    img = image.open(f)
    img = img.convert("RGB")
    img = img.resize((image_w, image_h))
    data = np.asarray(img)

    X.append(data)
    Y.append(label)
    np.save("./image_data.npy",X,Y)

    이렇게 저장하고,

    categories = ["greentomato", "redtomato"]
    nb_classes = len(categories)
    image_w = 64
    image_h = 64

    X_train, X_test, Y_train, Y_test = np.load("./image_data.npy")

    이렇게 했더니
    >> not enough values to unpack (expected 4, got 0) 이런 결과가 나왔습니다ㅠㅠ
    print(X.shape)
    print(Y.shape) 했더니
    (0,)
    (0,) 이렇게 출력이 됩니다.ㅠㅠ
    위의 댓글중에 대부분 경로 문제라고 하셔서 참고로 제 토마토 파일 경로는 C:\Users\USER20\tomato로, tomato 폴더 속에 "greenstomato"와 "redtomato" 폴더가 있습니다.
    caltech_dir을 잘못쓴것일까요..?ㅠㅠㅠ 도와주시면 진심으로 감사드리겠습니다.ㅠㅠㅠ (혹시 저장도 D드라이브에 저장되어야하나요..?)
  • 프로필사진 글 잘읽었습니다~ 2020.06.28 19:02 헐,, 저 여기에 있는 소스 다 성공했어요... 진짜 경로 문제였네요...
    caltech_dir 에서 폴더 위치를 (제 위치는 C:/Users/USER20/tomato/ 입니당) 이렇게 변경했더니 다 성공했어요ㅠㅠㅠ 세상에ㅠㅠㅠ 진짜 소스 공유해주셔서 진심으로 감사드려요ㅠㅠㅠ 복받으실거에요ㅠㅠㅠㅠㅠ
  • 프로필사진 이수진의 블로그 이수진의 블로그 2020.06.28 20:36 신고 안녕하세요~
    오 ㅎㅎㅎ 다행입니다. 성공하셨군요.
    축하드립니다! 열공하세요
댓글쓰기 폼