22.02.26 [kfood프로젝트] 4탄 YOLOv3 음식데이터 detection epochs 5 lr 0.01, 0.001, 0.002 train 결과 비교 - loss

2022. 2. 26. 20:02프로젝트/KFood

일단 전이학습 할 weights : yolov3.pt <- ImageNet이라는 어마어마한 대용량 빅데이터셋으로 사람,차,의자 등등을 detection training해놓은 모델

 

우리의 데이터셋 : 음식분류데이터셋(직접 만듦) train : test : val = 65000:8000:8000 정도 됨.

epoch : 5 (0~4 epoch)

batch_size : 16 (8의 배수로 해야되고, GPU memory?가 딸린다면 더 늘릴 수 없다)

 

따라서 yolov3를 처음 train시킬 때의 lr값인 0.01에서 1/10으로 줄여보기로 함(데이터셋 개수도 적으니 보폭도 줄인다.)

 

 

 

0.01 , 0.001 , .0.002 일 떄 train 의 각 loss 비교
recall, precision , mAP

recall 이 높은 것은 lr이 0.002일 때이다.(자주색)

0.01, 0.001, 0.002일 때의 val의 loss들

우리는 recall(검출률)이 더 중요하므로 box loss와 obj loss를 중점적으로 보면 val(답을 모르는 이미지들에 대한 detect) 에서는 lr이 0.002인 경우가 제일 loss가 낮아서 좋았다.(자주색)

lr 0.002
val 0.002의 label .jpg
val 0.002의 pred jpg

 

그리고 lr_0.002일 떄의 모델로 inference도 한번 진행해 봤다.

못 본 사이에 class.json이 생겼다.

 class_list의 출력을 위한 class.json 파일인 것 같다

그럼 이제 inference 코드 실행(원래는 python detect.py --weights 원하는모델 인데 우리는 이렇게 수정했다)

python team_07_test.py --weights 원하는모델 # 여기서는 best_lr_0.002.pt

lr이 0.002로 학습된 모델도 역시나 음식이 여러개 있는 건 잡지 못했다.

이번엔 한개인 음식

lr 0.01일 때
lr 0.002

엥..!! 잘 잡던 애도 못잡아졌다..

 

+ 엥.. 다시 실행해보니 잘 된다. VM이 귀신들린 것 같다 ㅋㅋ

이건 그냥 터미널에 print가 이상하게 되서 수현님께서 수정해주신 부분
아까 잘 잡히던 장어구이도 잘 잡힌다. 대신 weight가 best_0225.pt(0.01꺼)

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

따라서 lr은 0.002로 고정시키고 이번엔 다른 요소를 바꿔보기로 했다.

1. optimizer (default = SGD) -> adam

2. epochs = 5 -> epochs = 10

 

 

 

1번쨰 방법은 지금 tmux에서 돌아가고 있고! 

python train.py --img 640 --batch 16 --epochs 5 --data kfood.yaml --weights yolov3.pt --name batch_16_lr_0.002_adam --adam

 

2번째 방법은 우리 VM이 GPU가 1개밖에 없어서 수현님 연구실네 컴퓨터에서 돌려보기로 했다.

이 결과는 다음 포스팅에 작성하겠다!

 

++

코치님 말씀 : lr 0.002는 상승곡선이 좀 느리다.. smoothing

따라서 lr은 0.001, 0.01로 고정시키고 이번엔 다른 요소를 바꿔보기로 했다.

1. optimizer (default = SGD) -> adam

2. epochs = 5 -> epochs = 10

3. batch_size = 16 -> 8 더 낮춰보자

 

우리는 loss(0.8~0.6 오차)를 보는 것도 중요하지만, 일단은 음식을 몇 개 맞추느냐가 중요하므로

loss보다는 precision, recall을 보는 게 더 좋다.

 

그리고 있었던 문제점 : 음식 여러개는 못 잡았던 경우

해결 1 . 일단 학습을 더 오래 해본다.(epoch을 늘리고, 여러 fitting을 해보기) -> 학습이 많이 되면 틀릴지언정 많이 잡아낸다. 아예 bbox가 안잡히는 건 학습이 덜 된 것이다! 

해결 2 . 정 안되면 threshold를 0.2~정도로 낮추자.

 

 

+ 전이학습 (pretrained) 과 

처음에 하이퍼 파라미터를 찾을 떄는 : yolov3.pt를 사용

5epoch부터만 하이퍼파라미터를 바꿔주면 최적을 찾아갈 수 있을 거 같아 : best.pt 사용 -> 6epoch부터 이어서 학습

 

 

conf_thres : 클래스를 맞추는 거(김치볶음밥이냐 오뎅국이냐) 0.25이상이면 OK (obj_loss)

iou_thres : 이 bbox 안에 음식이 있는지 없는지 0.45 이상이면 OK (bbox_loss)

-> 이건 inference할 때 설정하는 것도 괜찮다.

 

cls_loss = obj_loss , bbox_loss를 모두 맞힌 경우?

 

+mAP 0.5 0.5:0.95

mAP 0.5 : bbox 중에서 50%이상 정답인 것만

mAP 0.5:0.95 : bbox 중에서 50%이상 정답인 것과 95% 이상 정답인 것의 평균

 

 

 

++ 내일 할 것 정리

wandb로 핸드폰으로도 들어가보기