재활용 품목 분류를 위한 Sementic Segmentation in Bostcamp
💻 하나둘셋Net()
😎 Members
🔎 Competition Overview
잘 분리 배출 된 쓰레기는 자원으로서 가치를 인정받아 재활용되지만, 잘못 분리배출 되면 그대로 폐기물로 분류되어 매립 또는 소각되기 됩니다.
따라서 우리는 사진에서 쓰레기를 Segmentation하는 모델을 만들어 이러한 문제점을 해결해보고자 합니다. 문제 해경을 위한 데이터셋으로는 배경, 일반 쓰레기, 플라스틱, 종이, 유리 등 11종류의 쓰레기가 찍힌 사진 데이터셋이 제공됩니다.
여러분에 의해 만들어진 우수한 성능의 모델은 쓰레기장에 설치되어 정확한 분리수거를 돕거나, 어린아이들의 분리수거 교육 등에 사용될 수 있을 것입니다.
🎉 수행결과 best score?
✨ 리더보드(대회 진행): 11위 mIoU : 0.757
🎊 리더보드(최종): 14위 mIoU : 0.706
🎮 Requirements
- Linux version 4.4.0-59-generic
- Python >= 3.8.5
- PyTorch >= 1.7.1
- conda >= 4.9.2
- tensorboard >= 2.4.1
⌨ Hardware
- CPU: Intel(R) Xeon(R) Gold 5220 CPU @ 2.20GHz
- GPU: Tesla V100-SXM2-32GB
🔍 Reference
📏 역할
팀구성 |
역할 |
공은찬_T2009 |
Custom loss, Optimizer 적용 |
곽민구_T2255 |
Optimizer, Loss, Scheduler Test 진행 |
김준섭_T2056 |
Segmentation Multi-label Stratified K-fold 구성 |
김진용_T2063 |
Copy paste 데이터 셋 제작 |
심용철_T2122 |
Model 탐색, Resize 및 weighted loss 실효성 검증 |
오재석_T2133 |
Stratified K-fold 데이터셋 코드 틀 작성 |
최현진_T2234 |
Baseline Code 작성, Pseudo Labeling, Oversampling |
🔨 수행 과정
🔑 Validation Dataset 구성
🔑 Oversampling
🔑 Pseudo Labeling
- 가장 성능이 좋은 모델의 inference 결과로 학습 데이터를 만들고 재학습
- Segmentation task 특성으로 점수 크게 향상(0.727 -> 0.75)
🔑 DenseCRF
- Dense CRF 기법을 적용해 boundary 좀 더 뚜렷하게 반영, 단일 객체에서 성능 향상 기대
📂 Archive contents
baseline/
├── train.py # main
├── trainer.py
├── dataset.py
├── test.py
├── utils.py
└── models/ # train model package
└── loss/ # loss metric package
└── scheduler/ # scheduler package
└── model
└── exp1/ # model file will save here
util/
├── oversampling.py
└── pseudo_labeling.py
copy_paste/
├─ check_copy_paste.ipynb
├─ copy_paste.py
├─ mask_convert_json.py
├─ get_coco_mask.py
├─ README.md
└─ requirements.txt
💎Copy Paste
Augmentation Method:
- Random Horizontal Flip
- Large Scale Jittering
- Copy-Paste
- Large patch to Small patch
- Small patch to Large patch
- Random Flip
Copy_paste Quick Start
1. 쉘 스크립트를 사용하고자 한다면 해당 디렉토리에 들어가 다음 명령어를 입력한다.
./aug.sh
2. 명령어를 따로 입력하고자 한다면 다음과 같은 순서로 명령어를 입력한다.
1. 모듈 설치하기
pip install -r requirements.txt
2. 원본 이미지와 json 파일을 통해 segmentation mask 생성
python get_coco_mask.py
--input_dir ../../input/data/
--split train_all
3. 원본 이미지, 원본 mask, 랜덤 이미지, 랜덤 mask로부터 copy_paste
python copy_paste.py --input_dir ../../input/data/ --output_dir ../../input/data/
--patch ["Paper pack", "Battery", "Plastic", 'Clothing',"Glass" ]
--remove_patch ["Paper", "Plastic bag"]
--json_path train.json
--lsj True
--lsj_max 2
--lsj_min 0.2
--aug_num 1500
--extract_patch True
4. mask로부터 json파일로 변환
python mask_coco_mask.py
--main_json train.json
--mode add
5. 결과
🛒 Train Test Quickstart
python train.py \
--model UPlusPlus_Efficient_b5 \
--epochs 200 \
--loss FocalLoss \
--val_json kfold_0_val.json \
--train_json kfold_0_train.json \
--train_augmentation CustomTrainAugmentation \
--batch_size 5
python test.py python test.py --model_dir model/exp --model_name epoch10.pth --augmentation TestAugmentation