22.03.02 [kfood프로젝트] YOLOv3 -> YOLOv5로 변경 및 성능은 좋은데 inference가 별로인 이슈 / lr과 batch size조정하여 training 속도 향상 / epochs 17 vs epochs 50 비교

2022. 3. 3. 21:04프로젝트/KFood

wandb 결과

 

YOLOv3 폴더에서 YOLOv5모델을 ineference하려 하니 오류발생 -> 아래에서 해결

-> inference를 YOLOv5 깃허브에서 돌려야 한다.

새 깃허브 클론

git clone https://github.com/ultralytics/yolov5.git

사용할 hyps-low.yaml파일
class.json
yolov5 폴더구성
kfood.yaml

 

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

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

1 epoch당 55+33분? 총 1시간 30분정도 걸린다는 것 같다.

epoch 20, batch 8, yolov5x6, lr 0.01으로 했을 때 학습시간은 총 30시간정도가 소요될 것으로 예상(현재 남은 시간 25시간..)

+ 서버에 ssh 접속이 안된다.. 결국 training은 수현님 학교 서버로 하기로 결정

training은 외부 서버 사용하기로 결정, 이 두개 돌리기

 

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

 

Recall & mAP

training 진행중.. epoch 19번까지 되야함

 

val/cls_loss

training 진행중

 

lr warmup

lr Warmup : lr을 낮췄다가 높여가면 gradient descent쓸 때 초기값을 잘 찾아가서 학습이 잘 된다는 'warm up'이라는 새로운 기술이 있다. YOLOv5같은 경우는 warm_up을 잘 적용시켜본 것 같다.

 

+이슈1

미역국 색을 파란색으로 했더니 만두국으로 잡긴 했다. -> data augmentation이 이상한 필요없는 것까지(Gray Scale 등등) True로 설정되어 있어서 train.py에서 augment=False로 수정하기

augment False
음식 사진 색깔 cv2.cvtColor 줄을 지우면 음식이 파란색이 됐었다 ㅋㅋ

 

+이슈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 진행중)

epoch 17 0.005063 epochs 50(현재20) 0.004663
Recall : epochs 17 0.8867 epochs 50(20) 0.8754 / mAP_0.5 : epochs 17 0.9066 epochs 50(20) 0.907

성능개선도 epochs이 많아도 잘 진행되고 있고 patience도 5로 줘놨기 때문에 epochs 17보다는 50이 더 성능개선의 가능성이 있어보인다.

 

+수정사항 detect_y5.py

inference하려고 하면 에러 뜨는 경우(Tensor가 match되지 않는다..어쩌구 계속 뜨던 에러)

1. stride = 32를 stride = stride로 수정, 

그리고 빈 bbox_list와 class_list를 for문 밖으로 뺀다.

2. bbox_list, class_list for문 밖에서 초기화

 

 

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

epochs 17 vs epochs 50(earlystop 23) 성능 최종 결과(batch 16, lr 0.004, yolov5x6)

recall epochs 17 : 0.8867 , epochs 50 : earlystop 23 0.8901(21일때)
mAP_0.5 epochs 17 : 0.9066 epochs 50(23) : 0.9096
val cls_loss epochs 17 : 0.005063 epochs 50(21) 0.4618

 

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

epochs 17 vs epochs 50(earlystop 23) Inference 결과

epoch 17 / epoch 50(early stop 23) 방탄소년단 먹방 사진
epoch 17 / epoch 50(23) 방탄소년단 먹방 사진을 더 tight하게 준 경우
epoch 17 / epoch 50(23) 기생충 짜파구리
epoch 17 / epoch 50(23) 쯔양 양념,간장게장 먹방
epoch 17 / epoch 50(23) 밥상 사진

대체로 epoch17에서 아예 못 잡아내는 사진들의 경우 epoch 50에 가면 뭐라도 잡아내기 시작했다.

여러 음식 밥상 사진 epoch 50
여러 음식 밥상 사진의 crop epoch 50
여러 음식 밥상 사진의 crop epoch 17

그리고 동일한 epoch 50에서 이렇게 여러 음식 사진이 있는 경우, 잘 잡아내지 못하는데 crop을 해서 주면 잡아낸다.(정확도는 좀 다르긴 하다..)

 

- 성능비교에서는 epoch 17과 epoch 50이 비슷했으나 아예 못잡는 경우가 있었으므로 이것 역시 epoch수가 너무 부족해서 일어나는 현상인 것 같기도 하다..? (확실히는 모름)

 

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

결론

- bbox가 아예 안잡히는 문제는 epoch 이 작아서 그런듯함.

- 학습데이터셋에서 대부분 음식 사진을 tight하게(그릇 속 음식이 아닌 음식을 크게 찍은 사진들)이 많아서 크게 찍은 사진들을 잘 잡아내는 것 같음.

- 여러 음식이 있는 밥상사진. 음식 종류가 5가지 이상?으로 많아져서 음식 사진이 너무 작아지면..? epoch 17, epoch 50 둘다 못 잡는 것 같다.

 

프로젝트로서의 해결방안

->  데이터셋을 애초에 먹방,드라마,영화에서 따오든가 input을 통제하는 방법이 있다.

일단 프로젝트 시연할 때는 test나 val에 있는 이미지로 시연하기!

그리고 modeum-twigim 을 twigim으로 변경, kfood.yaml이랑 class.json 도 변경
val에 있는 이미지로 시연하면 결과가 잘 나온다.

+ 지금 돌리고 있는 epoch 100은 다음 포스팅에서 계속 쓰겠다.