사진에서 일반 쓰레기, 플라스틱, 종이, 유리 등 10 종류의 쓰레기를 Detection하는 모델을 만들어 쓰레기 분리배출에 도움이 되고자 함 🌎
Input : 쓰레기 객체가 담긴 이미지와 bbox 정보(좌표, 카테고리)가 모델의 인풋으로 사용. bbox annotation은 COCO format으로 제공
Output : 모델은 bbox 좌표, 카테고리, score 값을 리턴
Metric: test set의 mAP50
저는 baseline code 분석을 통해 어떤 구조로 파이프라인이 돌아가는지 파악하는 것을 제일 우선으로 삼았고, 어느정도 구조를 파악하고 나서 제공된 모델인 FasterRCNN 을 사용해보며 출력이 어떻게 나오는지 확인을 했습니다. 이후 Wandb 에 연결하여 train 상황을 그래프로 볼 수 있게 했습니다.
이후 MMDetection을 기반으로 SOTA 논문이 구현돼있는 1-stage 모델인 UniverseNet을 baseline으로 사용하기 위해 여러 가지 조합의 수를 생각해서 모델을 튜닝하고 반복적으로 실험을 해보며 어떤 조합이 가장 성능이 좋고, 우리 팀의 base조합으로 가져가면 될지 파악하고자 했습니다.
또한 저번 대회에 이어서 협업 툴(git)의 사용법에 더 익숙해지고자 했습니다.
dataset
├── train.json
├── test.json
├── train
└── test
train: 4883 images
test: 4871 images
class: General trash, Paper, Paper pack, Metal, Glass, Plastic, Styrofoam, Plastic bag, Battery, Clothing
# images
{
"width": 1024,
"height": 1024,
"file_name": "train/0000.jpg",
"license": 0,
"flickr_url": null,
"coco_url": null,
"date_captured": "2020-12-26 14:44:23",
"id": 0
},
# annotations
{
"image_id": 0,
"category_id": 0,
"area": 257301.66,
"bbox": [
197.6,
193.7,
547.8,
469.7
],
"iscrowd": 0,
"id": 0
},
EDA는 크게 이미지당 bbox 개수, bbox label, bbox 형태를 중점적으로 진행함.(김대근 캠퍼님께서 해주셨다)
이미지당 bbox 개수 분포 분석
Bbox target label 분포 분석
Bbox의 크기와 형태에 대한 분석
Data level modification 전략
Library : MMdetection
아키텍쳐 : Universenet101
LB(mAP50) : 0.5962
dataset
Augmentation
Train
Valid
LR scheduler : StepLR
Loss
Optimizer : SGD
TTA(Test Time Augmentation)
아키텍쳐는 MMDetection을 기반으로 SOTA 논문이 구현돼있는 UniverseNet을 사용
dataset은 CV를 위한 Multilabel K-Fold를 적용하여 LB와 상관관계가 있는 fold를 사용. 이를 검증하기 위하여 스프레드시트를 만들어서 팀원들과 각자 모델의 val map와 public map 점수를 기록하여 적합한 CV인지 검증함.
optimizer는 adam과 adamW를 사용해봤지만, SGD보다 성능이 좋지 않았음. 또한 가장 최적의 Learning rate를 찾기 위해 실험을 가장 많이함.
Learning rate Scheduler는 CosineAnnealingWarmRestarts, CosineAnnealingLR, Cyclic, Step 이 네가지를 비교하며 실험하여 사용. 이 중 Step의 성능이 가장 좋았음.
augmentation은 HorizontalFlip, VerticalFlip, RandomRotate90을 base로 RandomBrightness만 사용. 이후 kaggle의 object detection solution을 보면서 상위 팀들이 대부분 hard augmentation을 사용한 것을 보고 여러 augmentation을 추가하며 실험해봄.
RandomBrightness
A.OneOf(RandomBrightness, RandomFog, HueSaturationValue, Blur)
A.OneOf(RandomBrightness, RandomFog, HueSaturationValue), Blur
val/bbox_mAP가 3번, 1번, 2번 순으로 높았음.
MMDetection에서 제공하는 class별 AP와 Public leaderboard를 사용
CV 전략 : dataset v2를 사용하여 어느정도 public과의 상관관계를 찾았기 때문에 v2를 사용
앙상블 목록 : UniverseNet, Yolov5 , swin(small,tiny,large)
SOTA 모델을 가져와서 많은 튜닝을 하며 성능을 끌어올리고자 했습니다. 그 과정에서 파라미터 간의 상관관계(eg. learning rate와 batch_size)가 있다는 사실을 새롭게 알 수 있었지만, 단순히 파라미터 값만 바꿔가며 실험을 한 것이 아쉬웠습니다. 왜냐하면 시간이 너무 많이 걸렸고, 실험이 끝난 이후 유의미한 결과를 얻었을 때 이 결과가 왜 유의미한지 정확한 이유를 알 수 없었기 때문이었습니다. EDA 및 아키텍처에 대한 논문을 통해 충분한 조사를 기반으로 실험을 해야한다는 것을 느끼게 된 계기가 되었습니다.
대회 진행 간 정보를 팀원들과 공유하고자 여러 협업툴(eg. Slack, Git, Notion, Wandb, Google Spreadsheet)을 사용했습니다. 하지만 협업툴에서 공유하고자 하는 바가 명확하지 않아서 각자 다른 목적으로 사용하게 되었고, 이로인해 팀 내 업무파악이 힘들었습니다. 다음 번에는 확실한 그라운드 룰을 정하여 최소한의 협업 툴만 사용해 팀 내부 업무를 파악하고 싶다 느꼈습니다.
가장 큰 아쉬움을 느낀 점은 팀 단위로 체계적인 계획을 세우지 못했다는 점이었습니다. 팀원들 모두 좋은 성적을 위해 열심히 대회에 참여했지만, 체계적인 플랜을 세우지 않아 효율적인 시간 관리가 되지 않았습니다. 또한 각자 다른 속도로 대회를 진행하다 보니 정보 공유를 해도 바로 적용 및 실험을 못했습니다.