관리 메뉴

꿈 많은 사람의 이야기

파이썬 케라스(keras)로CNN 딥러닝하자! cat dog binary image classification 본문

deep learning(딥러닝)

파이썬 케라스(keras)로CNN 딥러닝하자! cat dog binary image classification

이수진의 블로그 이수진의 블로그 2018. 7. 4. 16:24


지난번까지 multi classification 이미지 분류를 해봤습니다

하지만 모든 카테고리 분류가 multi이지는 않죠~

그래서 이번에는 이진 분류(binary classification)을 해보겠습니다


cat dog로 해볼게요

개냐 고양이냐?를 판단하는 이미지 분류 작업입니다



폴더는 2개입니다

cat, dog 즉, 고양이 강아지 이렇게 입니다.




그리고 각 폴더 아래에 이렇게 고양이 사진들이 있죠.

고양이와 강아지(개) 사진은 크롤링해서 긁어 왔습니다



그리고 각 사진은 25000개 정도 있습니다.

데이터는 충분한 것 같네요

keras의 ImageDataGenerator를 굳이 사용안해도 될 것 같았습니다.



저는 사진 크기를 64x64 크기로 변환할 것입니다.

그래서 weight와 height를 64씩 주었습니다.




그 다음으로 이제 이미지 변환을 해줍니다.

각 이미지를 가지고 와서 RGB형태로 변환해준 뒤 resize해줍니다.

그리고 그 값을 numpy 배열로 바꾸고 배열에 추가해주죠.

동시에 category 값도 넣어줍니다(Y)



이제 컨볼루션 레이어(Conv2D)를 통해 이미지 인식 레이어를 구축합니다.

input_shape에는 64, 64, 3 값이 들어갑니다.

MaxPooling2D는 2x2사이즈로 지정해주고요

각 padding은 same, 마지막 출력층을 제외한 activation은 렐루(relu)로 합니다

그리고 얘는 2진 분류(카테고리가 2개)이니까 binary값으로 출력을 지정해줍니다.



val_loss값이 5번 이상 상승되지 않으면 자동적으로 멈추게 했습니다.(오버피팅, overfitting 방지)

batch_size는 64, epochs는 100번씩 돌면서 model을 fit 시켰습니다.

그 결과는 아래와 같습니다.




뭔가 불안정해 보이기도 하지만

훈련은 잘 되었습니다

정확도는 87%정도 나오네요


컨볼루션 레이어 계층들을 조금씩 수정해주거나 등등 하면 92%까지 올라가는 것을 확인했습니다.


이제 predict를 해볼까요?

해당 이미지 말고 전혀 다른 이미지로 예측을 해보았습니다.



테스트할 이미지를 변환할 소스입니다.

맨 처음 이미지를 RGB로 변환할 때와 같습니다.



그리고 해당 이미지를 predict합니다

테스트할 파일은 아래와 같이



2개의 폴더에 들어가있구요



전혀 다른 이미지로 구성되어 있습니다

이제 테스트를 해볼까요?




이렇게 나오네요

역시 100%가 아니라서 맞추지 못하는 것도 있습니다.

그래도 되긴되네요~


42 Comments
  • 프로필사진 안녕하세요 2018.12.05 12:55 이부분을 공부중인대 혹시 소스코드좀 얻을수있을까요...? 이해좀 해보려구요. ㅠ
  • 프로필사진 이수진의 블로그 이수진의 블로그 2018.12.05 14:53 신고 안녕하세요. 제 블로그 공지 보시면 깃허브 주소가 있습니다. 거기에서 keras_basic 레파지토리 들어가시면 소스 있습니다. 참고해주세요!
  • 프로필사진 안녕하세요 2018.12.05 17:24 감사합니다.!!!
    학습중이네요~~~

    좋은 공부 자료가 될것같아요 감사해요
  • 프로필사진 이수진의 블로그 이수진의 블로그 2018.12.05 18:34 신고 넵 ㅎㅎ 도움 되기를 바랍니다
  • 프로필사진 안녕하세요 2018.12.14 20:07 이코드로 연습중인데 y training data 가 인식이 안되네요 뭐가 문제인지 알려주실수 있나요 ㅜㅜ?
  • 프로필사진 이수진의 블로그 이수진의 블로그 2018.12.15 10:20 신고 음 어떤식으로 인식이 안되시는거죠??? 에러 내용을 볼 수 있을까요??
  • 프로필사진 ikemen_hk 2019.02.20 18:01 신고 저 질문이 있는데 학습시킬 때
    X_train = X_train.astype('float32') / 255
    왜 255를 나누나여? 이거에 관련된 개념같은 거 혹시 자세히 알 수 있는 사이트가 있을까여?
    안하면 학습이 재대로 안되더라구요
  • 프로필사진 이수진의 블로그 이수진의 블로그 2019.02.20 18:17 신고 normalization 이라고 하는 과정입니다. 0~255의 범위가 넓으니 그 중 가장 큰 값인 255로 나눠주어 0~1범위로 바꿔주는 것입니다~
  • 프로필사진 ikemen_hk 2019.02.21 10:43 신고 답변감사합니다!
    제가 normalization에 대해 조금 검색해봤는데 몇 가지 궁금한 점이 생겼습니다.

    1. 데이터의 범위를 [0-1]로 설정하는 것과
    x = (x-mean(x))/std(x);
    이런 식으로 하는 것에 차이가 있을까요?

    2. 반대로 정규화를 해서는 안되는 경우도 있을까요?
    만약 데이터가
    [
    [0,0,1,0,1],
    [1,0,0,1,1],
    ]
    이런 식으로 되어 있는 경우는 정규화가 필요없을까요?

    3. 모든 이미지 데이터(RGB 형식)는 255로 나누는 정규화 작업을 해주는게 일반적인가요?
  • 프로필사진 이수진의 블로그 이수진의 블로그 2019.02.21 11:50 신고 정규화는 여러가지 방법이 있습니다!
    제가 말씀드린 255는 minmaxscaler를 뜻합니다. 0~1 범위로 하는 것이죠~

    그리고 그 외에 standardscaler 같은 것이 있습니다. 표준 편차로 바꿔주는 방법이 있죠. 아마 글쓴이님께서 작성하신 부분이 그 표준편차를 이용한 것이 아닌가 싶습니다.

    또 다른 것은 log scale로 바꿔주는 것도 있습니다. 이거는 종류가 여러개고, 각 데이터 셋, 상황에 따라서 어떤 것을 쓸지는 고민해봐야 합니다!

    2.번 같은 경우에서는 굳이 정규화가 필요 없습니다. 정규화를 하는 이유가 어떤 최소 값은 0인데 최대 값은 막 500 이러면 값의 범위가 너무 커지기 때문에 모델 훈련이 잘 되지 않고 튀는 경우가 있습니다. 그래서 이 범위를 축소시키고자 할 때 사용합니다. 2번 같은 경우는 0, 1의 경우니까 굳이 필요 없을 것 같습니다.

    3.번 질문은 약간 case by case인 것 같습니다. 255로 나눠주는 분들도 계시고 안나눠도 된다고 말씀하시는 분들도 계십니다. 저는 그냥 보통 책에서 다들 255로 나눠주길래 그거에 습관이 되서 나눠주고 있습니다!
  • 프로필사진 ikemen_hk 2019.02.21 12:15 신고 답변 정말 감사합니다!
    죄송한데 한번 만 더 질문할게요

    어떤 데이터에 minmaxscaler를 사용할 것인지 standardscaler, log scale를
    사용할 것인지에 대한 참고용 사이트나 책, 자료가 있을까요?

    범주형 특징이랑 같이 있는 데이터인 경우는 어떻게 정규화 하나요?
    예를 들어 "지역"이라는 범주형 데이터가 포함된 경우
    [
    ["평수", "건축년도", "지역"],
    [20, 1999, 3]
    ]
    이런 데이터는 정규화를 어떻게 해주어야 하나요?
  • 프로필사진 이수진의 블로그 이수진의 블로그 2019.02.21 13:07 신고 책은 파이썬 라이브러리로 배우는 머신러닝 책이 있습니다~

    그리고 필요에 따라서 구글링으로 보시면 될 것 같아요

    만약 범주형(categorical)이면 굳이 scaler를 안해도 됩니다. 이거는 카테고리이기 때문이죠. 카테고리 구분은 scaler를 하지 않습니다. 다만, 뭔가 연속적인 데이터면(집 값, 금액 등) scaler를 하는 것이 좋습니다!

    제 답이 꼭 정답은 아닙니다 ㅠㅠ
  • 프로필사진 2019.03.27 22:11 비밀댓글입니다
  • 프로필사진 ㅁㅁㅁ 2019.03.27 22:12 아.. 죄송해요 ㅠㅠ 저 바로 윗댓글(2019.03.27 22:11) 작성자입니다..
    티스토리 처음이라 비밀번호 막 입력했더니 제가 제껄 확인못하네요 ㅋㅋ 이 댓글에 답글 달아주시면 정말 감사하겠습니다
    ===========
    아 첫번째 물어본건 문제도 아니였네요.
    두번째거만 알려주시면 감사하겠습니다.
    아.. 텐서플로가 제대로 설치안돼있었나봐요... 다시설치해봐야겠네요 ㅠ
  • 프로필사진 이수진의 블로그 이수진의 블로그 2019.03.28 08:36 신고 도움 되셨다니 다행이네요 감사합니다 ㅎㅎ 음 제 생각에는
    using tensorflow backend 되면 일단은 잘 되시는겁니다.

    제 생각에는 numpy load 부분이 조금 시간이 걸리시는 것 같네요
    numpy로 저장시킨 npy 데이터 size가 크면 load 시간이 조금 걸릴 수도 있답니다~
  • 프로필사진 ㅁㅁㅁ 2019.03.28 12:24 오오 방금 다 됐네요!!
    정말 감사합니다 ㅎㅎ
  • 프로필사진 이수진의 블로그 이수진의 블로그 2019.03.28 13:47 신고 ㅎㅎ 축하드립니다~ 화이팅하세요!
  • 프로필사진 catdog 2019.06.10 20:58 안녕하세요! 사진 이진분류중인데 마지막에 predict_classes해서 이미지를 테스트 했는데 원하는 답이 안 나와서(그냥 1 이렇게만 나와서요ㅜㅜ ) 서치하다가 들어왔습니다. 선생님 깃허브에 들어가서 코드 다운받으려고 했는데 reload? 요렇게 나와서 혹시 어떻게 하면 코드를 참고할 수 있을 지 도움주실 수 있을까요?
  • 프로필사진 이수진의 블로그 이수진의 블로그 2019.06.10 21:07 신고 아 깃허브가 가끔씩 그럽니다 ㅠㅠ
    제가 어떻게 해드릴 수는 없구요
    시간 간격을 두고 다시 시도해보셔야합니다

    저도 가끔 깃허브 쓸 때 reload가 떠서 난처합니다 ㅠㅠ

    아니면 repo 자체를 다운 받으셔서 ipynb 파일이니 주피터 노트북으로 실행시키시면 됩니다!
  • 프로필사진 catdog 2019.06.10 22:26 우왓 지금 되서 코드 복사하였습니다. 빠른 답변 너무 감사드려요!! 아 그리고 실례지만 질문 드려도 괜찮으실지요ㅜㅜ 제가 연예인 두 명 사진 각각 200장씩해서 총 400장으로 모델만들어서 완전 새로운 사진 한 개를 각 연예인으로 분류하는 지 시험하고 있습니다..
    모델 만들어서 모델 넣고(이상없이 돌아가는 걸보니 모델은 만들어진 것 같긴 합니다..)
    from keras.models import load_model
    final_model=load_model('/content/tm_mh_small_2.h5')

    img_path = '/content/tm_test.jpg'
    img = image.load_img(img_path, target_size=(150, 150))
    plt.imshow(img)

    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)
    x = x/255.

    pred=final_model.predict_classes(x)
    print('class: %d'%(pred))

    요렇게 했는데
    class : 1
    이 나왔는데
    이게 무엇을 의미하는 지 모르겠습니다

    저는 연예인 A사진을 넣었고 이것이 A입니다 라는 답을 구하고 싶었는데...ㅜㅜ
    혹시 이유를 알려주신다면 감사드리겠습니다ㅠㅠ
    아휴 너무 도배를 했네요 죄송합니다...
  • 프로필사진 이수진의 블로그 이수진의 블로그 2019.06.10 22:36 신고 넵 ㅎㅎ 다행이네여 카테고리 분류하실 때 1번으로 하신 카테고리가 무엇인가요? 2개 분류면 2진 분ㄹ류인데 0 아니먄 1입니다. 1번으로 분류된 이미지가 어떤 연예인인지 보시면 될 것 같아여 ㅎㅎ
  • 프로필사진 이수진의 블로그 이수진의 블로그 2019.06.10 22:37 신고 깃허브 스타도 눌러주시면 감사하겠습니다 ㅎㅎ
  • 프로필사진 catdog 2019.06.10 22:56 감사합니다 당연히 눌러드릴 예정이었습니다.
    그리고 제가 코드짜면서 특별히 카테고리를 지정하지 않앗는데 이상하네요..다시 노력해보겠습니다.
    그리고 저 또 질문있는데 올려주신 코드 중에
    for i, f in enumerate(files):
    try:
    img = Image.open(f)
    img = img.convert("RGB")
    img = img.resize((image_w, image_h))
    data = np.asarray(img)
    #Y는 0 아니면 1이니까 idx값으로 넣는다.
    X.append(data)
    y.append(idx)
    if i % 300 == 0:
    print(tm, " : ", f)
    except:
    print(tm, str(i)+" 번째에서 에러 ")
    X = np.array(X)
    Y = np.array(y)
    (여기까진 문제없엇습니다)
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.1)
    요거 실행했는데
    ValueError: With n_samples=0, test_size=0.1 and train_size=None, the resulting train set will be empty.
    Adjust any of the aforementioned parameters.
    요런 에러가 뜨는데요 혹시 뭔지 알수있을까요? 앞에서 나온 파라미터를 조정하라는데 테스트 사이즈 0.1을 조정하라는 얘기일까요?
    이것저것 숫자를 넣어봤는데 계속 에러나서 질문드립니다ㅜㅜ
    아 그리구 대댓글을 달줄 몰라서 계속 새댓글 다는데 거슬린다면 양해부탁드릴게요ㅜㅜ

    아니면 염치없지만 괜찮으시면 이메일로...코드 통쨰로 해서 질문드려도 될까요?ㅜㅜ
  • 프로필사진 이수진의 블로그 이수진의 블로그 2019.06.11 07:12 신고 일단 제 코드 중에서 y.append(idx) 부분이 지금 category를 지정해주는 부분입니다. 첫 번째 file이면 0, 두 번째 파일이면 1이 붙게 됩니다.

    음 에러는 데이터가 없다는 뜻인데요

    X = np.array(X) 하고 나서
    X를 print 찍어보시겠어요? 아니면 print(X.shape) 찍어보셔서 데이터가 들어갔는지 확인해보셔야 할 것 같아요

    이메일로 보내주셔도 되는데 제가 확인하는 시간이 늦을 수도 있습니다 ㅠㅠ
  • 프로필사진 비눗방울거품 2019.06.24 19:14 신고 저도 똑같은 오류가 발생 했는데 혹시 알려주실수 있을가요
  • 프로필사진 이수진의 블로그 이수진의 블로그 2019.06.24 19:55 신고 위 댓글에서 제가 설명드린바와 같이 데이터가 없다는 것입니다. 데이터가 있는 경로를 잘 설정하셔야 합니다~
  • 프로필사진 선생님질문입니다 2019.08.16 12:40 좋은 강의 감사드립니다
    해당 code 중
    X_train, X_test, y_train, y_test = np.load('./numpy_data/binary_image_data.npy')
    를 실행하였을 때 하기와 같은 에러가 발생합니다 ㅠㅠ

    File "test1.py", line 53, in <module>
    X_train, X_test, y_train, y_test = np.load('./numpy_data/binary_image_data.npy')
    File "C:\Users\taewo\AppData\Local\Programs\Python\Python37\lib\site-packages\numpy\lib\npyio.py", line 447, in load
    pickle_kwargs=pickle_kwargs)
    File "C:\Users\taewo\AppData\Local\Programs\Python\Python37\lib\site-packages\numpy\lib\format.py", line 696, in read_array
    raise ValueError("Object arrays cannot be loaded when "
    ValueError: Object arrays cannot be loaded when allow_pickle=False

    위와 같은 에러가 발생할 ㄸ때, 어느 부분을 만져야할 지 모르겠습니다 ㅠㅠ
    답변해주시면 감사하겠습니다 : )
  • 프로필사진 이수진의 블로그 이수진의 블로그 2019.08.16 13:34 신고 저도 처음보는 오류라 검색해봤습니다. 혹시 넘파이 버전이 어찌되시나요?
    1.16.2 버전 이상일 때 오류가 난다고하네요
    1.16.1 버전으로 다운그레이드를 하시면 될 것 같습니다.

    위 방법이 안되면 다른 방법을 해야하는데 그럴경우 댓글 남겨주세요. 퇴근 후 답변드릴게요
  • 프로필사진 선생님질문입니다 2019.08.17 00:08 저도 방금 퇴근해서 downgrade 해보니 정상적으로 진행하네여!! 감사합니다 ㅎㅎ
    혹시 code 중에 if i % 300 == 0 : 은 무엇을 의미하는 걸까요??
    이 글과 다른 내용이지만, 혹시 pyautogui 가 아닌, 파이썬 내장 함수를 이용하여 키보드나 마우스를 조작할 수 있는 방법이 있을까여?? 이를 이용하면 분류하는데 도움이 될 것 같아서 질문드립니다! 감사합니다 : )
  • 프로필사진 이수진의 블로그 이수진의 블로그 2019.08.17 09:52 신고 if i % 300은 i가 300으로 나누어 떨어질 때 라는 뜻입니다 ㅎㅎ 저 조건일 때 그냥 출력해보려고 넣었습니다. 잘 되고 있는지 안되고 있는지 판별하려규요

    음 자동으로 하는 것이 있는 것으로 알고있습니다. 선생님께서 말씀하신 부분까지 컨트롤이 되련지 모르겠네요 ㅎㅎ 저도 해보지 않은 부분이라 자세히는 모르겠네요! 하지만 좋은 아이디어입니다
  • 프로필사진 선생님질문입니다 2019.08.18 04:15 답변 감사드립니다 ^^
    어떠한 것을 기준으로 300인지는 한 번 데이터를 바꿔가면서 해봐야겠네요 ㅋㅋㅋ
    컨투어로 사각형 테두리가 생긴 부분만 따로 이미지를 저장하려면 어떻게 해야할까요?? 배열로써 데이타가 있는데, 이걸 어떻게 하면 이미지로 저장할 수 있을지 가르쳐주시면 감사하겠습니다!!
  • 프로필사진 이수진의 블로그 이수진의 블로그 2019.08.18 17:31 신고 음 그부분은 조금 난이도가 있겠군요.
    단순히 배열로 처리하는 것은 무리가 있다고 생각합니다.
    사각형 테두리가 어느 위치에 생길지도 모르고 어느 크기로 생길지도 모르니까요

    opencv 등을 활용해야 할 것 같습니다.
    저의 짧은 지식으로는 이거뿐이 생각이 나지 않네요 ㅎㅎ
  • 프로필사진 선생님질문입니다 2019.08.19 01:53 답변 감사드립니다!
    어떻게 할까 생각하다가 각 테두리 중심점으로 해서 적당한 길이로 시작점, 끝점을 잡아, crop으로 잘라내고 이걸 이미지로 저장했다가 다시 불러들어와서 일일히 저장하는 걸로 해보고 있습니다 ㅋㅋ 되기는 한데 for 문을 어떻게 써야할지 감이 안잡혀서 코딩 줄이 엄청 길어졌네여 ㅋㅋㅋ
  • 프로필사진 이수진의 블로그 이수진의 블로그 2019.08.19 06:09 신고 대단하시네요 ㅋㅋㅋㅋ 되는군요
    코드는 나중에 리팩토링 하셔서 정리하시면 되지 않을까 싶습니다!
    성공하셨다는것이 큰 의미가 있는 것이니까요
  • 프로필사진 2019.08.23 10:28 신고 dat, dog 이미지를 각각 5개씩 샘플링 하면 동작이 안되나요?

    C:\Users\Administrator\Anaconda3\python.exe C:/Users/Administrator/PycharmProjects/DDong/DdongDataClass.py
    Using TensorFlow backend.
    Cat : ./imgs/Cat\1.JPG
    Dog : ./imgs/Dog\1.JPG
    (9, 64, 64, 3)
    9
    [5 4]
    [0 1]
    WARNING: Logging before flag parsing goes to stderr.
    W0823 1

    중간생략

    정확도 : 0.00
    OMP: Info #250: KMP_AFFINITY: pid 13012 tid 15216 thread 32 bound to OS proc set 0
    Traceback (most recent call last):
    File "C:/Users/Administrator/PycharmProjects/DDong/DdongDataClass.py", line 146, in <module>
    prediction = model.predict(X)
    File "C:\Users\Administrator\Anaconda3\lib\site-packages\keras\engine\training.py", line 1149, in predict
    x, _, _ = self._standardize_user_data(x)
    File "C:\Users\Administrator\Anaconda3\lib\site-packages\keras\engine\training.py", line 751, in _standardize_user_data
    exception_prefix='input')
    File "C:\Users\Administrator\Anaconda3\lib\site-packages\keras\engine\training_utils.py", line 128, in standardize_input_data
    'with shape ' + str(data_shape))
    ValueError: Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (0, 1)

    이렇게 에러가 나네요.

    조언좀 부탁드립니다.
  • 프로필사진 이수진의 블로그 이수진의 블로그 2019.08.24 09:15 신고 어제 너무 바빠 댓글이 늦었네요 죄송해요

    음 일단 이미지 개수가 너무 적네요 ㅎㅎ
    어떻게 진행하시는 지는 모르겠지만, 그걸로 train을 하시는거면 무리가 있습니다.

    그리고 에러는 그에 대한 에러는 아니구요
    에러는 이미지가 변형이 안되어 있어서 생기는 에러네요 ㅎㅎ

    제가 구성한 환경과, 글쓴이님이 구성한 환경이 다를 수도 있습니다.
    디렉토리 구조 등 환경을 잘 살펴보셔요
  • 프로필사진 sua 2019.08.25 16:48 좋은 글 남겨주셔서 감사합니다.
    제가 일단 test사진 10장과 검증데이터 1장을 가지고 돌려볼려고 하는데
    ValueError: Error when checking input: expected conv2d_5_input to have 4dimenstions, but got array with shape(0,1)
    이런 오류가 뜨는데 입력데이터가 잘못되서 그런건가요? 무슨뜻인지 잘 모르겠어요.
    일단 사진들의 크기는 200*200입니다.
  • 프로필사진 이수진의 블로그 이수진의 블로그 2019.08.25 17:06 신고 이미지 처리는 먼저 전처리 작업을 진행합니다. 근데 sua님의 코드에서는 이미지 전처리 작업이 진행이 안되었나보네요.

    제 코드에서는 이미지가 들어가있는 디렉토리 경로가 있고 sua님의 디렉토리 경로는 다를겁니다. 그 디렉토리 경로가 맞는지 확인하시고 이미지가 잘 들어오시는지 확인하셔요~

    디렉토리 경로만 맞으면 코드는 잘 동작합니다.
  • 프로필사진 김용현 2019.09.02 15:26

    혼자 파리, 모기 사진 7장정도루 연습해보려구하는데
    이런 에러가뜨는데 뭔지알수있을까요??
    With n_samples=1, test_size=0.1 and train_size=None, the resulting train set will be empty. Adjust any of the aforementioned parameters.

  • 프로필사진 이수진의 블로그 이수진의 블로그 2019.09.02 19:20 신고 답글이 늦었네요
    음.. 저도 처음보는 오류입니다 ㅎㅎ..
    참 다양한 오류가 많네요

    아마 제 생각은 데이터 양이 부족해서 그런거지 않을까 싶습니다.
    용현님께서 정확히 어디 부분에서 에러가 나오시는 지 모르겠지만, 7장 정도로 test_size로 나누려니까 데이터가 부족해서 그런것으로 추측을 해봅니다.
  • 프로필사진 카카 2019.12.06 20:43 알약 이미지를 이용해서 train데이터 140개를 넣어서 모델을 완성했습니다.
    하지만 train 데이터에서 모델을 import 하려니
    ValueError: Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (0, 1)
    라고 나와서 질문드립니다!!
  • 프로필사진 이수진의 블로그 이수진의 블로그 2019.12.08 15:22 신고 안녕하세요.
    제 코드 기준에서 이미지를 넣으실 때 4 dimension으로 들어갑니다.
    근데 카카님께서 넣는 이미지는 2 dimension인 (0, 1)로 들어가시네요.

    보통 제 코드에서 해당 오류가 나오시는 분들을 보면 이미지 경로가 잘못 설정되어 있어서 이미지 upload를 못한 경우였습니다.

    한 번 참고해보셔요~
댓글쓰기 폼