2022. 3. 3. 21:04ㆍ프로젝트/KFood
wandb 결과
-> inference를 YOLOv5 깃허브에서 돌려야 한다.
새 깃허브 클론
git clone https://github.com/ultralytics/yolov5.git
--------------------------------------------------------------------------------------------------------
YOLOv5 깃허브 클론받고, YOLOv5x6으로 새 training 시작
python train.py --img 640 --batch 8 --epochs 20 --data kfood.yaml --weights yolov5x6.pt --name batch_8_0.01_epoch_20_v5x6
만약 patience(early stop : n epoch이상 성능이 개선되지 않으면 멈춰라)옵션 주고 싶으면 이런식으로
python train.py --img 640 --batch 8 --epochs 50 --data kfood.yaml --weights yolov5x6.pt --name batch_8_0.002_epoch_50_v5x6 -- patience 10
epoch 20, batch 8, yolov5x6, lr 0.01으로 했을 때 학습시간은 총 30시간정도가 소요될 것으로 예상(현재 남은 시간 25시간..)
+ 서버에 ssh 접속이 안된다.. 결국 training은 수현님 학교 서버로 하기로 결정
----------------------------------------------------------------------------------------------------------------------------------
Recall & mAP
val/cls_loss
lr Warmup : lr을 낮췄다가 높여가면 gradient descent쓸 때 초기값을 잘 찾아가서 학습이 잘 된다는 'warm up'이라는 새로운 기술이 있다. YOLOv5같은 경우는 warm_up을 잘 적용시켜본 것 같다.
+이슈1
미역국 색을 파란색으로 했더니 만두국으로 잡긴 했다. -> data augmentation이 이상한 필요없는 것까지(Gray Scale 등등) True로 설정되어 있어서 train.py에서 augment=False로 수정하기
+이슈2
GPU메모리가 남으면? batch size를 2배 늘리고 lr을 2배 줄여서 차라리 학습속도라도 빠르게 되게 하자!
batch 8 , lr 0.002 -> batch 16, lr 0.004
따라서 돌린 코드
1. batch 16 epochs 50 lr 0.004 patience(early stop) 5 weights yolov5x6.pt(가장 성능좋지만 무거운)
- batch 8 lr 0.002가 성능이 좋았으나 GPU메모리가 남아돌아서 batch 16 , lr 0.004로 바꿔 돌렸다.
- patience(early stop)은 epochs수가 많아서(50, 100 등..) 중간에 성능이 개선되지 않으면 멈춘다는 것. 10으로 할까 생각했는데 코치님께서 5가 낫다고 하셨다.(5번 안에 개선이 안되면 멈춘다.) -> 일단은 계속 조금씩이라도 개선되고 있기 때문에.. epoch을 늘려보고 early stop을 주면 됨.
- weights는 yolov5s,m,l 등등도 있으나 우리는 어차피 비디오를 넣을 게 아니므로 가장 정확도가 좋은 x6을 채택.
python train_gpu1.py --img 640 --batch 16 --epochs 50 --data kfood.yaml --weights yolov5x6.pt --name batch_16_0.004_epoch_50_v5x6 -- patience 5
2. batch 16 epochs 17 lr 0.004 weights yolov5x6.pt
- 하루밤 사이에 일단 결과를 한번 보기 위해 epoch을 조금 적절히 낮춰서(17) 본다.
- 추론 속도를 위해(GPU메모리를 더 활용) batch 16, lr 0.004로 바꿔 돌렸다.
python train.py --img 640 --batch 16 --epochs 17 --data kfood.yaml --weights yolov5x6.pt --name batch_16_0.004_epoch_17_v5x6
3. batch 8 epochs 100 patience 5 lr 0.002 weights yolov5x6.pt
- 제공받은 VM은 GPU가 딸리기 때문에 batch를 더 늘릴 수가 없다. 8->16 불가 ( 위에 두 개는 수현님네 학교 서버라서 GPU사양이 좋아서 가능함 )
- epochs를 100으로 하고 patience를 5로 줬다.
python train.py --img 640 --batch 8 --epochs 100 --data kfood.yaml --weights yolov5x6.pt --name batch_8_0.002_epoch_100_v5x6 --patience 5
현재 진행상황(epochs 17은 완료, epochs 50은 20 진행중)
성능개선도 epochs이 많아도 잘 진행되고 있고 patience도 5로 줘놨기 때문에 epochs 17보다는 50이 더 성능개선의 가능성이 있어보인다.
+수정사항 detect_y5.py
inference하려고 하면 에러 뜨는 경우(Tensor가 match되지 않는다..어쩌구 계속 뜨던 에러)
그리고 빈 bbox_list와 class_list를 for문 밖으로 뺀다.
----------------------------------------------------------------------------------------------------------------------------------
epochs 17 vs epochs 50(earlystop 23) 성능 최종 결과(batch 16, lr 0.004, yolov5x6)
-----------------------------------------------------------------------------------------------------------------------------------
epochs 17 vs epochs 50(earlystop 23) Inference 결과
대체로 epoch17에서 아예 못 잡아내는 사진들의 경우 epoch 50에 가면 뭐라도 잡아내기 시작했다.
그리고 동일한 epoch 50에서 이렇게 여러 음식 사진이 있는 경우, 잘 잡아내지 못하는데 crop을 해서 주면 잡아낸다.(정확도는 좀 다르긴 하다..)
- 성능비교에서는 epoch 17과 epoch 50이 비슷했으나 아예 못잡는 경우가 있었으므로 이것 역시 epoch수가 너무 부족해서 일어나는 현상인 것 같기도 하다..? (확실히는 모름)
---------------------------------------------------------------------------------------------------------------------------------
결론
- bbox가 아예 안잡히는 문제는 epoch 이 작아서 그런듯함.
- 학습데이터셋에서 대부분 음식 사진을 tight하게(그릇 속 음식이 아닌 음식을 크게 찍은 사진들)이 많아서 크게 찍은 사진들을 잘 잡아내는 것 같음.
- 여러 음식이 있는 밥상사진. 음식 종류가 5가지 이상?으로 많아져서 음식 사진이 너무 작아지면..? epoch 17, epoch 50 둘다 못 잡는 것 같다.
프로젝트로서의 해결방안
-> 데이터셋을 애초에 먹방,드라마,영화에서 따오든가 input을 통제하는 방법이 있다.
일단 프로젝트 시연할 때는 test나 val에 있는 이미지로 시연하기!
+ 지금 돌리고 있는 epoch 100은 다음 포스팅에서 계속 쓰겠다.