바야흐로 대량 생산, 대량 소비의 시대. 우리는 많은 물건이 대량으로 생산되고, 소비되는 시대를 살고 있습니다. 하지만 이러한 문화는 '쓰레기 대란', '매립지 부족'과 같은 여러 사회 문제를 낳고 있습니다.
분리수거는 이러한 환경 부담을 줄일 수 있는 방법 중 하나입니다. 잘 분리배출 된 쓰레기는 자원으로서 가치를 인정받아 재활용되지만, 잘못 분리배출 되면 그대로 폐기물로 분류되어 매립 또는 소각되기 때문입니다.
따라서 우리는 사진에서 쓰레기를 Detection 하는 모델을 만들어 이러한 문제점을 해결해보고자 합니다.
- 입력
- 쓰레기 객체가 담긴 이미지, bbox 정보(좌표, 카테고리)
- bbox annotation은 COCO format
- 출력
- bbox 좌표, 카테고리, score 값을 리턴.
- submission 양식에 맞게 csv 파일을 만들어 제출
- COCO format이 아닌 Pascal VOC format
- 전체 이미지
- 9754 images
- train
- 4883 images
- test
- 4871 images
- 클래스 수
- 10 class
- General trash, Paper, Paper pack, Metal, Glass, Plastic, Styrofoam, Plastic bag, Battery, Clothing
- 이미지 크기
- 1024 x 1024
김건수 | 박진영 | 방민혁 | 오홍석 | 이소영 | 이예진 |
T7103 | T7156 | T7158 | T7208 | T7222 | T7225 |
Member | Role |
---|---|
김건수 | PM 역할 수행, YOLO Develop, Ensemble |
박진영 | ConvNeXT Develop, Ensemble, Util 기능 구현 |
방민혁 | EDA, Data Relabel, ATSS Swin Develop, Ensemble |
오홍석 | PM 역할 수행, DETR 기반 Model Develop, Util 기능 구현, Project 구조 및 서버 환경 구성 |
이소영 | VFNet, RTMDet Model Develop, Util 기능 구현 |
이예진 | EDA, Data Relabel, Pseudo Labeling, TTA |
아래의 항목들로 프로젝트를 진행한 과정을 설명한다.
📦 level2-objectdetection-cv-14
┣ 📂 EDA_data
┃ ┣ 📜 eda_(2).ipynb
┃ ┣ 📜 eda_dataset.ipynb
┃ ┣ 📜 eda_traindata.ipynb
┣ 📂 mmdetection
┃ ┣ 📂 configs
┃ ┣ 📂 custom_configs
┃ ┣ 📂 mmdet
┃ ┗ 📜 train.py
┃ ┗ 📜 inference.py
┣ 📂 mmdetectionV3
┃ ┣ 📂 configs
┃ ┣ 📂 custom_configs
┃ ┣ 📂 mmdet
┃ ┗ 📜 train.py
┃ ┗ 📜 inference.py
┣ 📂 yolo
┣ 📂 utils
┃ ┣ 📜 csv_pseudo.py
┃ ┣ 📜 Ensemble.py
┃ ┣ 📜 Gsheet.py
┃ ┣ 📜 modify_test.py
┃ ┣ 📜 pseudo_data_split.py
┃ ┣ 📜 pseudo_ensemble_labeling.py
┃ ┣ 📜 pseudo_labeling.py
┃ ┣ 📜 pseudo_labes_count.py
┃ ┣ 📜 split_val_train_log.py
┃ ┣ 📜 Stratified_Group_K_Fold.py
┣ 📃 requirements.txt
┗ 📃 README.md
Class Imbalance, Object Size 등 여러 항목에 대해서 진행하였다.
아래는 그 중 하나에 대한 예시이다.
Wrap-UP Report 참고
- Clothing은 상대적으로 큰 박스 크기를 가지고 있으며 Battery와 같은 물체는 작고 일정한 크기로 나타나는 경향을 확인
- Glass, Plastic, Paper Pack, Plastic bag 등의 경우, 박스 크기가 매우 다양한 분포를 보임
진행한 실험으로는 Data Relabeling, Pseudo Labeling 등이 있다.
아래는 그 중 하나에 대한 예시이다.
Wrap-UP Report 참고
- 잘못된 라벨링에 대해서 수정하는 작업을 거침
- Object 마다 label의 통일성 유지 ex) 전단지나 명함 같은 경우 General trash로 통일
사용한 모델에는 ATSS Swin, ConvNeXT, DINO 등등 여러가지가 있다.
아래는 그 중 하나에 대한 예시이다.
Wrap-UP Report 참고
Version | Description | Public mAP 50 |
---|---|---|
1 | ATSS Swin Base model 적용 | 0.5587 |
2 | pretrained model 교체 (swin win12-384 model) | 0.5397 |
3 | Cascade Swin Base model 적용 | 0.5482 |
4 | load_from(사전 학습된 가중치) 적용 | 0.6297 |
5 | Anchor ratios 수정 | 0.6073 |
6 | train_pipeline의 Resize를 multiscale_v1로 수정 | 0.6536 |
7 | Hard Augmentation | 0 |
8 | train_pipeline의 Resize를 (1024,1024)로 수정 | 0.6558 |
9 | train_pipeline의 Resize를 multiscale_v2로 수정 | 0.6800 |
- 모델간 앙상블에서 2가지 전략을 사용하였다.
- Stratified Group K Fold Cross Validation
- 각기 다른 Fold에 학습한 같은 구조의 모델간 앙상블 (NMS, WBF)
- 다른 모델간 앙상블
- Confusion Matrix와 같은 평가 지표를 활용하여 모델간 특성을 파악
- 파악한 모델간 특성을 바탕으로 최적의 모델 조합 선택
Model | Fold Avg Score | WBF | NMS |
---|---|---|---|
ConvNeXT | 0.6929 | 0.7091 | 0.7063 |
DINO | 0.6969 | 0.5328 | 0.7106 |
ATSS Swin | 0.6791 | 0.6929 | 0.6970 |
YOLO | 0.4360 | 0.5539 | 0.5272 |
CO-DINO | 0.6955 | 0.6212 | 0.7111 |
프로젝트를 진행하면서 편의성을 위한 기능 또는 실험을 위한 추가 기능들을 구현하였다.
- Stratified Group K Fold Cross Validation
- Google Sheet을 이용한 실험 인자 기록 자동화
- Pseudo Labeling 관련 기능
- train / inference log 분할 기능 등등
아래는 그 중 하나에 대한 예시이다.
Notion 참고
- 학습한 모델의 성능 평가를 위해서 Validation Set을 분리해낸다.
- 기존 데이터 셋의 클래스 분포를 유지한다. (아래 표 참고)
- 같은 이미지에서 나온 annotation이 Train 또는 Validation에만 포함되도록 구분한다.
General trash | Paper | Paper pack | Metal | Glass | Plastic | Styrofoam | Plastic bag | Battery | Clothing | |
---|---|---|---|---|---|---|---|---|---|---|
training set | 17.14% | 27.45% | 3.88% | 4.04% | 4.24% | 12.72% | 5.46% | 22.37% | 0.69% | 2.02% |
train - fold1 | 17.11% | 26.73% | 3.92% | 4.07% | 4.14% | 13.01% | 5.46% | 22.88% | 0.66% | 2.02% |
val - fold1 | 17.23% | 29.88% | 3.72% | 3.96% | 4.59% | 11.70% | 5.45% | 20.66% | 0.76% | 2.04% |
train - fold2 | 17.17% | 27.75% | 3.92% | 4.16% | 4.27% | 12.52% | 5.47% | 22.21% | 0.66% | 1.88% |
val - fold2 | 17.01% | 26.23% | 3.72% | 3.58% | 4.13% | 13.53% | 5.40% | 23.02% | 0.81% | 2.58% |
train - fold3 | 17.05% | 27.66% | 3.95% | 3.81% | 4.37% | 12.35% | 5.67% | 22.51% | 0.66% | 1.99% |
val - fold3 | 17.53% | 26.55% | 3.56% | 5.04% | 3.71% | 14.29% | 4.56% | 21.79% | 0.82% | 2.16% |
train - fold4 | 17.18% | 27.19% | 3.85% | 4.00% | 4.28% | 12.66% | 5.66% | 22.37% | 0.70% | 2.11% |
val - fold4 | 16.96% | 28.54% | 4.00% | 4.23% | 4.07% | 12.94% | 4.59% | 22.40% | 0.64% | 1.64% |
train - fold5 | 17.18% | 27.88% | 3.75% | 4.19% | 4.15% | 13.05% | 5.02% | 21.92% | 0.76% | 2.11% |
val - fold5 | 16.95% | 25.66% | 4.41% | 3.46% | 4.63% | 11.33% | 7.23% | 24.25% | 0.40% | 1.68% |
Public Leader Board
Private Leader Board
Feature
: 새로운 기능 추가Fix
: 버그 수정Docs
: 문서 수정Style
: 코드 포맷팅 → Code ConventionRefactor
: 코드 리팩토링Test
: 테스트 코드Comment
: 주석 추가 및 수정
커밋할 때 헤더에 위 내용을 작성하고 전반적인 내용을 간단하게 작성합니다.
git commit -m "[#issue] Feature : message content"
커밋할 때 상세 내용을 작성해야 한다면 아래와 같이 진행합니다.
git commit
어떠한 에디터로 진입하게 된 후 아래와 같이 작성합니다.
[header]: 전반적인 내용
. (한 줄 비워야 함)
상세 내용
브랜치를 새롭게 만들 때, 브랜치 이름은 항상 위 Commit Convention
의 Header와 함께 작성되어야 합니다.
Feature/~~~
Refactor/~~~