mmdet train
DataSet
Data 수집
기존 데이터셋 : 다운로드
- coco : https://cocodataset.org/#home
- pascal voc
신규 데이터셋 : 구성
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) |
neck | backbone과 head 사이를 연결하는 요소 | (ex. FPN, PAFPN) |
head | 구체적인 태스크를 위한 요소 | (ex. bbox prediction, mask prediction) |
roi extractor | 피처맵으로부터 RoI 특징을 추출하는 부분 | (ex. RoI Align) |
loss | loss를 계산하기 위한 head의 구성 요소 | (ex. FocalLoss, L1Loss, GHMLoss) |
checkpoints 파일 준비
mmdet 에서 ConvNeXt (CVPR’2022).
Model Zoo에서 pretrained Model의 네트웍을 받아옴.
configuration – Config
기존 Config 가져오기
sixxconfigs/makeConfig.py 를 통해 초기 Config 생성
쉬운 수정을 위해 풀어진 config 만들기
config 대분류 및 주요설정내역
config 대분류 | 설명 |
dataset | dataset의 type(customdataset, cocodataset 등), train/val/test dataset 유형, data_root, train/val/test dataset의 주요 파라미터 설정(type, ann_file, img_prefix, pipeline 등) |
model | object 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 수정 예
W&B설정 예
transfer learning
예시2>
runner 의 max_epochs 가 원하는 epoch 46
Batch_size
step 1473/ 46 약 32 …= iteration..
평가 (evaluation, 50번에 한번)
checkpoint 1번에 한번
log_config 1번
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/
GPU사용량 모니터링 (nvidia-smi, nvitop, gpustat)
watch -d -n 0.5 nvidia-smi
Training 실행
~/my/git/mmdetection/tools ==> sixxtools
work_dirs에 작업할 폴더를 만들어짐

수정된 cfg 확인
epoch_69.pth (PyTorch Model)이 생성된다.
모델 실험을 위한 config 수정
https://pebpung.github.io/wandb/2021/10/06/WandB-1.html

직관적으로 수정하는 방법은 비효율적이다..
여러 GPU 사용
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
참고
다시 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
https://github.com/facebookresearch/maskrcnn-benchmark
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
$ python sixxtools/train.py sixxconfigs/cascade_rcnn_r50_fpn_1x_coco.py