• 카테고리

    질문 & 답변
  • 세부 분야

    컴퓨터 비전

  • 해결 여부

    미해결

EfficientDet 관련 질문

22.11.26 23:27 작성 조회수 143

0

안녕하세요.

현재 efficientdet esri 코드를 기반으로 custom data로 프로젝트를 진행하고 있습니다.

학습하는데에는 문제가 없으나 궁금한 점이 있어 질문 드립니다.

  1. 학습을 중단한 후 다시 학습을 진행할 때 중단한 시점부터 다시 시작하는 방법이 있을까요? esri 코드에서 def get_efficientdet_model(config): 부분 pretrained_ckpt에 저장된 ckpt를 넣으면 될까요? 혹은 다른 방법이 있을까요?

  2. 훈련 중 loss값이나 AP, AR 값을 저장하고 시각화하기 위해 wandb를 사용할려고 하는데 코드 중 어느 부분에 wandb 코드를 넣어야 할지 모르겠습니다.

답변 1

답변을 작성해보세요.

0

안녕하십니까,

efficientdet은 --ckpt 파라미터를 train config로 설정하면 train 시 가장 마지막 checkpoint 부터 자동으로 학습을 수행합니다.

이를 적용하려면 아래에서 TRAIN_CFG에서 ckpt 파라미터를 model_name과 동일하게 'efficientdet-d0' 로 설정해주면 됩니다.

class TRAIN_CFG:
  model_name = 'efficientdet-d0' # efficientdet 모델명
  ckpt = 'efficientdet-d0'
  strategy = '' # tpu, 여러개의 GPU들, 단일 GPU 일때 학습 strategy 설정. 
  model_dir = '/mydrive/model_trained' # 학습된 모델이 저장될 위치
  pretrained_ckpt = '/content/efficientdet-d0' 
  hparams = 'num_classes=20,moving_average_decay=0,mixed_precision=true'
  use_xla = False
  use_fake_data = False
  batch_size = 8
  eval_samples = 5000 # evaluation image 데이터 갯수
  steps_per_execution = 1 # ModelCheckPoint의 save_freq 를 숫자로 설정할 경우 사용. 
  num_examples_per_epoch = 2500 # 1 epochs 시 적용하는 examples 개수 
  num_epochs = 15 # epochs 횟수
  train_file_pattern = '/content/tfrecord/train/pascal-*.tfrecord' # 학습용 tfrecords를 glob 형태로 가져오는 표현식. 
  val_file_pattern = '/content/tfrecord/val/pascal-*.tfrecord' # 검증용 tfrecords를 glob 형태로 가져오는 표현식. 
  val_json_file = None # optional coco validation json 
  mode = 'traineval' # train만 적용 또는 train과 eval함께 적용(traineval)
  
  num_cores = 2 # tpu 8 일때 적용.  
  tpu = None
  gcp_project = None
  tpu_zone = None
  eval_master = ''
  eval_name = None
  tf_random_seed = 2021
  profile = False
  debug = False

 

그리고 wandb는 제가 적용하는 법을 잘 몰라서 아래 예제를 확인해 주십시요. tensorflow 예제는 아니지만, 아마 callback에 wandb를 적용하는 것 같습니다.

https://colab.research.google.com/github/airctic/icevision/blob/master/notebooks/wandb_efficientdet.ipynb

감사합니다.

윤정덕님의 프로필

윤정덕

질문자

2022.11.27

ckpt가 저장되는 위치는 model_dir인데 왜 ckpt 파라미터를 model_name으로 주는 것인가요?

답변 감사드립니다.

Efficientdet 내부에서 그렇게 구현되어 있습니다

윤정덕님의 프로필

윤정덕

질문자

2022.11.28

아래 이미지처럼 처음엔 ckpt를 주석처리하고 10에폭 중 2에폭까지만 돌리고 중지한 다음 주석을 풀고 다시 재실행해보았지만 다시 에폭 1에서 도는 것을 확인했습니다. 왜 그런거죠?image

fit 인자로 epochs를 주었기때문에 횟수는 바뀌지 않습니다. Loss 로 확인해 보시면 이전 checkpoint 파일로 수행되어 loss값이 줄어들었음을 알수 있습니다

윤정덕님의 프로필

윤정덕

질문자

2022.11.28

10에폭 중 5에폭까지 돌리고 다시 실행해보았지만 loss값이 줄어들지 않았습니다.

5에폭 loss -> det_loss: 0.9043 - cls_loss: 0.4297 - box_loss: 0.0095 - reg_l2_loss: 0.1280 - loss: 1.0324 - learning_rate: 4.6875e-05 - gradient_norm: 5.0070 - val_det_loss: 2.6320 - val_cls_loss: 1.7534 - val_box_loss: 0.0176 - val_reg_l2_loss: 0.1280 - val_loss: 2.7600

새로 시작

image

윤정덕님의 프로필

윤정덕

질문자

2022.11.28

image혹시 여기에 TRAIN_CFG.ckpt를 추가해야하나요?

네 거기에 추가해 주셔야 합니다.

윤정덕님의 프로필

윤정덕

질문자

2022.11.28

hparams_config.py에 override를 해주는 과정인 것으로 아는데 hparams_config.py에는 ckpt인자가 들어가는 부분을 확인하지 못했습니다. 혹시 TRAIN_CFG.ckpt를 어디서 읽어서 모델이 돌아가나요??

윤정덕님의 프로필

윤정덕

질문자

2022.11.29

2에폭을 돌리고 ckpt 저장 후 image해당 ckpt를 불러와 다시 학습을 해보니 loss값을 보면 훨씬 떨어졌다는 것을 알 수 있지만 2에폭 때의 loss와는 차이가 나는 모습을 확인 했습니다.
imageckpt를 불러와 학습이 이어진다는 것을 알 수 있는 방법은 loss값 확인 말고는 없나요?

마지막 에폭을 불러와 그 에폭부터 다시 시작하는 방법은 없나요?

음, 특정 epoch의 checkpoint 파일을 지정해서 다시 시작하는 방법은 없는 것 같습니다. ^^;;

윤정덕님의 프로필

윤정덕

질문자

2022.11.29

그럼 중지된 학습을 재개하는 것이 아닌 이전 가중치를 참고하여 새로운 학습을 진행하는 것 아닌가요??

중지된 학습을 재개하는 것이 아닌 이전 가중치를 참고하여 새로운 학습을 진행하는 것의 차이가 무엇을 의미하는지 정확힌 모르겠지만,

제가 efficientDet의 ckpt에 대해서 알고 있는 것은 여기까지 입니다. 말씀드린대로 efficientdet에서 특정 checkpoint 파일을 별도로 지정하는 방법은 없는 것 같습니다.

윤정덕님의 프로필

윤정덕

질문자

2022.11.29

많은 질문에 친절히 답해주셔서 감사합니다. 많은 도움이 됐습니다.