mmdet train

Published by onesixx on

W&B (Weight and Biases)

DataSet

Data 수집

기존 데이터셋 : 다운로드

신규 데이터셋 : 구성

1. Image 수집

  • 직접수집
  • 동영상에서 이미지 추출 (ffmpeg 사용)
    ffmpeg -i example.mp4 -vf fps=Afolder/ex_detect_%4d.jpg
  • google에서 수집
  • Unity를 통해 가상데이터 생성

2. Annotation (CVAT 사용)

  • Bbox
  • Polygon : segmentation
  • Key-point (top-down, down-top)

3. 데이터셋 만들기 (Image와 Annotation을 연결)

  • CoCo 데이터셋 포멧으로 CVAT에서 Export
    (keypoint에 경우, coco형식으로 export가 되지 않아, CVAT(xml)포멧으로 내보내기 한후, datumaru를 통해 coco 데이터셋으로 변환
  • Custom 데이터셋
    mmdetection에서 custom dataset 등록후 사용

DataSet 구성 (train / valid & test)

train / valid & test 데이터셋 준비 : 이미지는 그대로 두고, 각 DataSet별로 Annotation파일 분리하여 준비
(coco데이터셋은 새로 annotation후 채번을 다시 해야함)

Config에서, 소스의 trn, val, tst 의 디렉토리 구조 결정

커스텀 데이터셋의 경우

MyCustomDataset을 등록 (load_annotations 잘 수정해서)

dataset 생성

  • datasets = [build_dataset(cfg.data.train)] # /tools/train.py에서

cocoset으로 변환

웬만하면 Coco로 변환

Model

모델 선정

open-mmlab/mmdetection 의 model-zoo

Model-zoo 에서

ex) faster_rcrnn

https://comlini8-8.tistory.com/86

MMDet 모델을 5가지 요소로 구분

Backbone피처맵을 추출하기 위한 FCN 네트워크(ex. ResNet, MobileNet)
neckbackbone과 head 사이를 연결하는 요소(ex. FPN, PAFPN)
head구체적인 태스크를 위한 요소(ex. bbox prediction, mask prediction)
roi extractor피처맵으로부터 RoI 특징을 추출하는 부분(ex. RoI Align)
lossloss를 계산하기 위한 head의 구성 요소(ex. FocalLoss, L1Loss, GHMLoss)


checkpoints 파일 준비

mmdet 에서 ConvNeXt (CVPR’2022).

Model Zoo에서 pretrained Model의 네트웍을 받아옴.

Shell

configuration – Config

기존 Config 가져오기

sixxconfigs/makeConfig.py 를 통해 초기 Config 생성

Python
sixxtools/makeConfig_sixx_without_arg.py
Python
sixxtools/makeConfig_sixx.py

쉬운 수정을 위해 풀어진 config 만들기

Shell
sixxtools/misc/print_config.py
Shell
sixxtools/misc/print_config.py

config 대분류 및 주요설정내역

config
대분류
설명
dataset dataset의 type(customdataset, cocodataset 등),
train/val/test dataset 유형,
data_root,
train/val/test dataset의 주요 파라미터 설정(type, ann_file, img_prefix, pipeline 등)
modelobject detection model의 backbone, neck, dense head, roi extractor, roi head(num_classes=4)
주요 영역별로 세부 설정
scheduler optimizer 유형 설정 (sgd, adam, rmsprop 등),
최초 learning 설정
학습중 동적 learning rate 적용 정책 설정(step, cyclic, cosine annealing 등)
train 시 epochs 횟수 : learning rate scheduler
runtime주로 hook(callback)관련 설정
학습 중 checkpoint 파일,
log 파일 생성을 위한 interval epochs 수

config 수정

기존 config가져와서, training에 사용할 config 파일생성
sixxconfigs/faster_rcnn_r50_fpn_1x_coco_sixx.py 그리고 수정

  • num_classes=4, 수정(model아래)
  • dataset_type = ‘CocoDataset’ 확인
  • data_root = ‘data/msc_pilot2/’ 수정
  • classes = [‘TRAY_A_1’, ‘TRAY_A_2’, ‘TRAY_A_3’, ‘TRAY_B_1’] 추가

gpu

  • samples_per_gpu
  • workers_per_gpu

data

  • train / val / test
    – ann_file 수정
    – classes 추가

config 수정 예

Python

W&B설정 예

https://onesixx.com/wandb/

Python

transfer learning

Python
Python

예시2>

Python

runner 의 max_epochs 가 원하는 epoch 46

Batch_size

step 1473/ 46 약 32 …= iteration..

평가 (evaluation, 50번에 한번)

checkpoint 1번에 한번

log_config 1번

Python
Python

model

  • num_class

dataset_type

data_root

classes

data

  • samples_per_gpu
  • workers_per_gpu
  • train / val / test
    – ann_file
    – classes

load_from


evaluation

  • save_best=’auto’, interval=50

checkpoint_config


optimizer의 lr 줄임

lr_config = dict(
    policy='step',      # 어떤 scheduler 를 쓸건지
    warmup='linear',    # warmup을 할건지
    warmup_iters=500,   # warmup iteration 얼마나 줄건지
    warmup_ratio=0.001, 
    step=[8, 11])        # step은 얼마마다 밟은 건지

runner (_1x는 epoch 12번, _2x는 epoch 24번, _20e는 epoch 20번을 의미)

  • max_epochs=10000


auto_resume

gpu_ids

https://onesixx.com/mmdet-log/

Python

GPU사용량 모니터링 (nvidia-smi, nvitop, gpustat)

watch -d -n 0.5 nvidia-smi

Shell

Training 실행

Shell

~/my/git/mmdetection/tools ==> sixxtools

Shell

work_dirs에 작업할 폴더를 만들어짐

수정된 cfg 확인

epoch_69.pth (PyTorch Model)이 생성된다.

모델 실험을 위한 config 수정

https://pebpung.github.io/wandb/2021/10/06/WandB-1.html

직관적으로 수정하는 방법은 비효율적이다..

여러 GPU 사용

Shell
Shell

CUDA_VISIBLE_DEVICES로 사용할 GPU를 한정해주고,

Port를 분리한 후,

실행

CUDA_VISIBLE_DEVICES=2,3 python train.py

CUDA_VISIBLE_DEVICES=2,3 python train.py

CUDA_VISIBLE_DEVICES=2,3 python train.py

참고

Shell
sixx/dist_train.sh
Python
Shell

다시 Training work_dirs

sixx/dist_train.sh: line 2: $’\r’: command not found

이런 에러가 날 경우, 전체 줄바꿈(Carriage return과 New Line \r\n)을 newline(\n)으로 바꿔준다.

sed -i -e ‘s/\r$//’ ./sixx/dist_train.sh

https://github.com/open-mmlab/mmdetection/issues/334

Shell

https://github.com/facebookresearch/maskrcnn-benchmark

Shell

https://artiiicy.tistory.com/61

 “CUDA_VISIBLE_DEVICES”를 통해 cuda가 볼 수 있는 GPU 제한하기

항상 cuda는 GPU 0번(torch.cuda.current_device())부터 사용을 하게 되고, CUDA_VISBLE_DEVICES= 2,3 이라면, cuda는 2,3번째만 볼수 있기때문에 GPU 0을 할당하는다는 것이 2를 사용하는것과 같다.

단, multi인 경우, nn.DataParallel()을 작성해주어야 한다.

1-2) Jupyter notebook 등의 python script “~.ipynb” file 내에서 돌리는 경우

“~.ipynb” 와 같이 python script 내에서 돌리는 경우에는 다음과 같이 os.environ[ ] code를 활용하여 environment를 설정하여 실행할 수 있다.

os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"  # Arrange GPU devices starting from 0
os.environ["CUDA_VISIBLE_DEVICES"]= "2,3"     # Set the GPUs 2 and 3 to use
Shell

$ python sixxtools/train.py sixxconfigs/cascade_rcnn_r50_fpn_1x_coco.py

Categories: vision

onesixx

Blog Owner

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x