22.02.25 [kfood프로젝트] YOLOv3 우리팀만의 음식 데이터로 detection training 시키기 1탄 - 이어서 학습할 때 UnboundError: local variable 'epoch' referenced before assignment 해결

2022. 2. 25. 13:24프로젝트/KFood

https://github.com/ultralytics/yolov3/wiki/Train-Custom-Data

 

GitHub - ultralytics/yolov3: YOLOv3 in PyTorch > ONNX > CoreML > TFLite

YOLOv3 in PyTorch > ONNX > CoreML > TFLite. Contribute to ultralytics/yolov3 development by creating an account on GitHub.

github.com

 

일단 우리가 tmux session에 어제 실행시켜놓고 잤던 train.py 를 실행시키는 기본 코드는 다음이다

python train.py --img 640 --batch 16 --epochs 5 --data kfood.yaml --weights yolov3.pt

저 각 옵션들에 대한 내용은 밑에 설명하겠다.

 

train.py에는 크게 4가지 함수가 있다.

train 함수
parse_opt 함수
main 함수
run 함수
그리고 실행

실행 순서는 opt라는 전역?변수에 parse_opt 함수를 가장 먼저 실행시켜서 받는다.

그리고 그 opt들을 main함수 안에 넣어준다.

python train.py --img 640 --batch 16 --epochs 5 --data kfood.yaml --weights yolov3.pt

opt는 이 뒤에 --하고 붙는 애들안에 넣어주는 옵션값들이다. 이 옵션값들에 대한 설명은 아래 parse_opt함수에 정의되어 있다.

여기서 지금 우리가 바꾸려는 것은 다음과 같다. 

1. epoch이 원래 어제 돌려놨던 게 5까지 하고 끝났어야 했는데 4에서 끝났다.

2. wandb에서 이름을 임의의 값으로 주지 말고 lr 정보나 batch사이즈 등 파라미터 정보를 포함한 이름으로 만들어주자.

 

 

일단 2번의 경우 함수를 타고타고 들어가서 다음과 같은 곳에서 옵션을 발견했다.

utils/loggers/wandb 안에 wandb_utils.py라는 파일에서 wandb.init 함수 속에 opt.name을 기본인 exp로 주지 않으면 그 이름으로 wandb run이름이 바뀐다고 한다! 따라서 --name 옵션을 추가한다.

 

그리고 1번의 경우.. --epochs 옵션을 건드려야 할 것 같은데.. 일단 어제 밤에 진행됐던 4 epoch때의 best.pt를 이용해서 거기서 시작해서 --weight를 사용하고, epochs는 1로 하면 나머지 1개 epoch을 마저 돌 것 같다는 생각이 든다.

그래서 코드를 다음과 같이 수정한다.

 

python train.py --img 640 --batch 16 --epochs 1 --data kfood.yaml --weights ../yolov3_what/runs/train/exp4/weights/best.pt --name exp5

이렇게 했더니 안 된다..

 

python train.py --img 640 --batch 16 --epochs 1 --data kfood.yaml --weights best.pt --name exp5

이렇게 바꾸고 best.pt를 train.py와 같은 위치에 오게 해서 돌려보자.

아아.. 

epoch을 1으로 했더니 이런 오류가 뜨는 것 같다..

원작자 GitHub의 issue로 UnboundError: local variable 'epoch' referenced before assignment 를 검색

아하.. 내가 지금 4 epoch까지 진행했었는데 1 epochs를 진행하려고 하니까 오류가 난 것 같다

동일하게 5 epochs로 집어넣어야 될 것 같다.

 

진짜진짜 최종 코드

진짜진짜 최종코드 실행

오 이어서 training이 되고 있다! 아직 1 epoch이라 train_loss등은 출력 되지 않았따.

이전까지 진행했던 4 epochs의 train loss

 

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

근데 wandb 그래프가 이미 한번 끊겨버려서 그냥 처음부터 다시 돌리기로 했다.

기존에 학습하다말았던 best.pt말고 우리는 전이학습이라 이미 대용량데이터로 학습되고 있던 yolov3.pt로 시작.

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

이제 학습되는 동안 train.py랑 수현님께서 만들어주시는 team_07.py, detect.py를 더 공부해보자.