This repository is the 3rd place solution for DACON Lesion Object Detection AI Contest.
-
학습
-
YoloV5 - Ensemble 시 다양성을 주기위해 이미지 사이즈, 모델 사이즈, Fold를 다양하게 학습하였습니다.
-
다만, 적절한 구조 및 하이퍼파라미터를 찾는것에 시간을 소모하여 Fold0인 모델이 많습니다.
- L - Fold0: size(384, 512)
- X - Fold0: size(320, 384, 480), Fold2(480), Fold4(640)
-
MMDetection
- CenterNet(R-18) - 512size (Fold0, Fold1)
- RetinaNet(R-101) - 1024size (Fold0)
- 모든 모델은 학습 시 Pretrained Weight을 yolov5 & mmdet github로부터 받아서 사용하였습니다.
-
-
추론
-
모델
- 7개의 YoloV5 모델 Single image inference = 7개의 결과
- 7개의 YoloV5 모델 Test Time Augmentation(TTA) = 7개의 결과
- 2개의 CenterNet Single image inference = 2개의 결과
- 2개의 CenterNet Test Time Augmentation(TTA) = 2개의 결과
- 1개의 RetinaNet Single image inference = 1개의 결과 (Retina의 경우 TTA가 꽤 오래걸려서 수행하지 않았습니다)
-
Ensemble
- BBox를 Ensemble하는 방법으로는 캐글 디텍션 대회에서 필수적으로 사용되는 Weighted Boxes Fusion (https://github.com/ZFTurbo/Weighted-Boxes-Fusion) 기법을 사용하였습니다.
-
- 최종적으로 총 10개의 모델을 학습하고 TTA를 포함하여 19개의 결과물을 Ensemble하였습니다.
- 제 Github에서 trained Weight을 다운로드하여 결과를 추론해보실 수 있습니다.
- Ubuntu 18.04, Cuda 11.1
- Anaconda - Python 3.8 (Anaconda 가상환경, Yolov5 및 MMdetection 학습 시 따로 구축하는 것을 권장하나 제 환경에서는 한 번에 돌아가긴 했습니다.)
- numpy
- pandas
- opencv-python
- python-dateutil
- pytz
- six
- matplotlib
- natsort
- tqdm
- scikit-learn
- ensemble-boxes
- torch==1.9.0 torchvision 0.10.0 with cuda 11.1 (YoloV5)
- torch==1.8.0 torchvision 0.9.0 with cuda 11.1 (MMDetection)
- mmcv-full
- mmdet
├── README.md
├── data
│ ├── class_id_info.csv
│ ├── lesion.names
│ ├── sample_submission.csv
│ └── train
├── train_100000.json
├── train_100001.json
├── ...
│ └── test
├── test_200000.json
├── test_200001.json
├── ...
├── trained_weights (학습 완료된 가중치)
│ ├── exp1.pt
│ ├── exp2.pt
│ ├── ...
├── pretrained_weights (centernet, retinanet -> 포함하여 제출함 or MMdetection Github로부터 받을 수 있음.)
│ ├── centernet_resnet18_dcnv2_140e_coco_20210702_155131-c8cd631f.pth
│ ├── retinanet_r101_fpn_2x_coco_20200131-5560aee8.pth
│ ├── ...
- 주어진 데이터를 Yolov5와 MMdetection 학습에 필요한 각각의 포맷으로 변환시켜줍니다.
sh make_dataset.sh
- Ensemble 시 다양성을 주기위해 이미지 사이즈, 모델 사이즈, Fold를 다양하게 학습하였습니다.
- 그리고 적절한 구조 및 하이퍼파라미터를 찾는것에 시간을 소모하여 0Fold 모델이 많습니다.
- 따라서, 5Fold CV방식의 학습을 수행하지는 않았습니다.
sh train_yolov5.sh
- 기존에 Yolov5를 학습시킬 때 torch 1.9.0 버전을 사용하였는데, MMDetection에서 1.9.0이 돌아가지 않는 현상이 있었습니다.
- 따라서, torch를 1.8.0, torchvision을 0.10.0으로 재설치 해주었습니다. (가상환경을 따로할 시 상관없음)
sh mmdet_install.sh
- 처음엔 Yolov5 계열로만 Ensemble을 하다가 성능 향상이 더뎌진 것 같아 전혀 다른 구조의 모델을 사용하였습니다.
- 그 중에서 CenterNet(R-18)과 RetinaNet(R-101)을 학습하였습니다.
- Backbone으로 CBNetV2나 Detector로 HTC 등 COCO 기준으로 더 좋은 성능을 보이는 모델도 학습해보았으나 오버피팅 문제가 발생하여 가벼운 구조를 채택하였습니다.
sh train_mmdet.sh
sh inference_yolo.sh
sh inference_mmdet.sh
- Make final submission
python ensemble_wbf.py
- 10개의 Weight를 불러와야하는데 Github 서버 문제인지 가끔 하나씩 안불러오는 경우가 있는 것 같습니다.
- exp1~exp10까지 다 불러와졌는지 확인이 필요합니다.
- 한 두개가 빠져있으면 해당 폴더를 삭제하고 다시 실행하거나 wget으로 하나씩 불러오면 됩니다.
sh inference_load_weight.sh