Today I Learned

20210502_TIL

O/X IMAGE CLASSIFIER

accuracy가 떨어지는 매직. 이게뭐야!

0. 과제

- 직접 O, X를 그려서 이미지를 모으고(클래스메이트들과 품앗이했다)

- 이미지로 직접 dataset을 만들어서(이 부분을 직접 한다는 게 중요!)

- keras로 딥러닝까지 사용해보자 

 

1. 현재까지 진행상황

- 데이터셋을 만드는 것까진 성공했다(github.com/lsjsj92/keras_basic : 이수진님의 깃헙을 많이 참고했다. 감사합니다.)

- 그런데 accuracy가 엉망진창이어서 optimizer를 이리저리 바꿔보았으나 유의미한 변화는 없었다

- 혹시 데이터셋의 여백때문인가?(설마)

 

 1.1 약간의 Troubleshooting

- 예측이 틀린 이미지들을 찾아보니 진짜로, 이미지에서 가장자리 여백이 많은 이미지들만 잔뜩 나왔다. 

- 문제는 모든 이미지의 여백이 다 달라서(여러 명이 나눠 그리다보니) 여백을 한번에 잘라버릴 수도 없었다. 

predicted_result = model.predict(X_test)
predicted_labels = np.argmax(predicted_result, axis=1)
predicted_labels[:20]

wrong = []

for n in range(0, len(y_test)):
    if predicted_labels[n] != y_test[n]:
        wrong.append(n)

len(wrong)


import random 

samples = random.choices(population=wrong, k=16)
samples

- 그래서 cv2를 이용해 (억지로나마) 임계점을 도출해 O, X의 윤곽선을 잘라내고, 

- 윤곽선의 제일 바깥 좌표를 지정해서 그 부분만 잘라내도록 함수를 만들었다.

(물론 처음부터 짜진 못하고... stackoverflow에서 image background crop하는 함수를 어떻게 어떻게 응용했다)  

- 이렇게 자르니까 이미지 크기가 줄어들어서, 다시 사이즈를 늘렸다. 

-> 결과적으로 accuracy가 0.9대에 진입했다! 

 

 1.2 accuracy 상승 계획

- 데이터셋이 많지는 않아서, 이미지 증강을 하면 좀더 accuracy를 올릴 수 있지 않을까 한다.

- 그리고 아직 cv2에는 익숙하지 못해서, 어디가 문제였던 건지는 모르겠지만 이미지 crop후 어떤 이미지들은 일부분만 남아있는 것이 발견됐다. 이런 애들은 당연하게도? 예측에 실패했고. 좀더 정교하게 이미지를 자르는 법이 없을지 찾아봐야겠다. 

 

2. 오늘의 유용한 함수들

- glob.glob()

img_dir = "./drive/MyDrive/ox_dataset"
files = glob.glob(img_dir+"/*")
   

- cv.findContours()

'Today I Learned' 카테고리의 다른 글

[Note] 실험이 주도하는 제품 개발  (0) 2021.07.25
근황신고  (0) 2021.06.20
20210428_TIL  (0) 2021.04.29
20210427_TIL  (0) 2021.04.28
20210423_그동안의회고  (0) 2021.04.23