Skip to content

dhfpswlqkd/level2-objectdetection-cv-23

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

♻️ Recyclables Object Detection


✏️ Introduction

대량 생산과 대량 소비의 시대에서 환경 부담을 줄일 수 있는 분리수거의 중요성이 더욱 강조되고 있습니다. 분리배출 된 쓰레기는 자원으로서 가치를 가지지만, 잘못 분리배출 되면 그대로 폐기물로 분류되어 매립 또는 소각되기 때문입니다. 따라서 이번 프로젝트에서는 올바른 분리배출을 위해 쓰레기를 정확히 탐지하는 Object Detection 모델 제작을 목표로 합니다. 데이터 셋은 일반 쓰레기, 플라스틱, 종이, 유리 등 10 종류의 쓰레기가 찍힌 사진을 사용하며, mAP 50을 통해 평가를 진행합니다.


📅 Schedule

프로젝트 전체 일정

  • 2024.10.02 ~ 2024.10.24

프로젝트 세부일정

  • 2024.10.02 ~ 2024.10.11 : MLFlow 연동
  • 2024.10.02 ~ 2024.10.17 : 데이터 EDA 및 Streamlit
  • 2024.10.10 ~ 2024.10.24 : Model 실험
  • 2024.10.19 ~ 2024.10.21 : Wandb 연동
  • 2024.10.20 ~ 2024.10.24 : 모델 앙상블 실험
  • 2024.10.20 ~ 2024.10.24 : 모델 평가

🕵️ 프로젝트 파이프라인

각 파이프라인에 대한 상세한 내용은 아래 링크를 통해 확인할 수 있습니다.


🥈 Result

Private 리더보드에서 최종적으로 아래와 같은 결과를 얻었습니다.


🗃️ Dataset Structure

dataset/
│
├── train.json
├── test.json
│
├── test/
│   ├── 0000.JPG
│   ├── 0001.JPG
│   ├── 0002.JPG
│   ├── ...
│
├── train/
│   ├── 0000.JPG
│   ├── 0001.JPG
│   ├── ... 
  • 데이터셋은 General Trash, Paper, Paper Pack, Metal, glass, plastic, Styrofoam, Plastic bag, battery, Clothing 10가지 카테고리로 이뤄지며, 학습 데이터 4,883 장, 평가 데이터 4,871 장으로 구성되어 있으며 이미지는 모두 (1024, 1024) 크기로 제공됩니다.

Train & Test json

Train json 파일은 coco format을 따르며 Info, licenses, images, categories, annotations로 구성되어 있습니다.

  • Images
      "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
      },
      ...
  • Annotation
        "annotations": [
      {
        "image_id": 0,
        "category_id": 0,
        "area": 257301.66,
        "bbox": [
          197.6,
          193.7,
          547.8,
          469.7
        ],
        "iscrowd": 0,
        "id": 0
      },
      ...
  • Test JSON 파일은 Train JSON 파일과 동일한 구조를 가지며, 단 Annotation 정보만 빠져 있습니다.

⚙️ Requirements

env.

이 프로젝트는 Ubuntu 20.04.6 LTS, CUDA Version: 12.2, Tesla v100 32GB의 환경에서 훈련 및 테스트되었습니다.

Installment

또한, 이 프로젝트에는 다앙한 라이브러리가 필요합니다. 다음 단계를 따라 필요한 모든 라이브러리를 설치할 수 있습니다.

  git clone https://github.com/boostcampaitech7/level2-objectdetection-cv-23.git
  cd level2-objectdetection-cv-23
  pip install -r requirements.txt

🎉 Project

1. Structure

project
├── Detectron2
│   ├── detectron2_inference.py
│   └── detectron2_train.py
├── EDA
│   ├── confusion_matrix_trash.py
│   └── Stramlit
│       ├── arial.ttf
│       ├── EDA_Streamlit.py
│       ├── EDA_Streamlit.sh
│       ├── inference_json
│       │   └── val_split_rand411_pred_latest.json
│       └── validation_json
│           └── val_split_random411.json
├── mmdetection2
│   ├── mmdetection2_inference.py
│   ├── mmdetection2_train.py
│   └── mmdetection2_val.py
├── mmdetection3
│   ├── mmdetectionV3_inference.py
│   ├── mmdetectionV3_train.py
│   └── mmdetectionV3_val.py
├── README.md
├── requirements.txt
└── src
  ├── ensemble.py
  └── make_val_dataset.ipynb

2. EDA

2-1. Streamlit

Train data 및 inference 결과의 EDA을 위해 Streamlit을 활용했습니다. Streamlit을 통해 EDA를 진행하기 위해 다음을 실행하세요.

bash EDA_Streamlit.sh

실행을 위해 다음의 인자가 필요합니다.

  • dataset_path : dataset 경로
  • font_path : bbox의 시각화를 위한 font 경로 (우리의 Repository에 있는 arial.ttf을 이용하세요)
  • inference_path : inference json 파일 경로
  • validation_path : validation json 파일 경로

데모 실행을 위해 validation_json, inference_json directory에 데모 json 파일이 있습니다.

2-2. confusion_matrix

Confusion matrix를 시각화하기 위해 confusion_matrix_trash.py 코드를 추가하였습니다.

해당 코드는 validation inference 시 confusion matrix도 함께 출력하기 위한 코드로 직접 실행하지 않고 val.py에서 import해 사용합니다. mmdetectionv2_val.py에서 confusion matrix를 출력하는 코드를 확인하실 수 있습니다.

mmdetectionv2_val.py를 실행하면 추론 결과를 담은 json 파일, confusion_matrix를 위한 pickel파일, confusion_matrix png파일이 함께 저장됩니다.

3. Train and inference

프로젝트를 위해 mmdetection V2 및 V3, Detectron2를 사용했습니다. 각 라이브러리에 해당하는 directory에 train과 inference를 위한 코드가 있습니다.

해당 코드들을 사용하기 위해 mmdetection 및 Detectron2 라이브러리에 포함된 config 파일이 필요합니다. 밑의 링크들을 통해 config 파일과 그에 필요한 구성 요소들을 clone할 수 있습니다.

[라이브러리명]_val.py 파일은 Streamlit 시각화를 위해 validation inference 결과에 대한 json 파일을 추출하는 코드입니다. Detectron2의 경우 detectron2_inference.py를 통해 json 파일을 추출할 수 있습니다.

4. ensemble

앙상블을 사용하기 위해 다음을 실행하세요.

python ./src/ensemble.py

아래 변수 값을 수정하여 csv 파일 및 json 저장경로를 지정할 수 있습니다.

root = ['*.csv',] # 앙상블을 진행할 csv 파일을 지정합니다.
submission_dir = '../../submission/' # csv 파일이 저장된 경로 및 앙상블 후 저장할 경로를 지정합니다.
annotation = '../../dataset/test.json' # 앙상블에 사용하기 위해 file의 image 정보가 포함된 json 파일 경로를 지정합니다.

아래 변수 값을 수정하여 앙상블 기법 및 수치를 지정할 수 있습니다.

ensemble_type = '' #[nms, wbf, nmw, soft-nms] 중 사용할 앙상블 기법을 선택합니다. 
iou_thr = 0.5 #iou threshold 값을 설정합니다.

# WBF 기법 설정 값
wbf_conf_type='avg' # ['avg', 'max', 'box_and_model_avg', 'absent_model_aware_avg'] # WBF 기법 수행 시 신뢰도 계산 방법을 설정 값입니다.
wbf_allows_overflow = False # {True: 가중치 합 > 1, False: 가중치 합 1로 고정} # 가중치 합을 1을 초과하거나 1로 고정 하는 설정 값입니다.
wbf_skip_box_thr = 0.0 # 값에 해당하는 정확도가 넘지 않으면 제외하는 설정 값입니다.

# Soft-NMS 기법 설정 값
method = 2 # 1 - linear soft-NMS, 2 - gaussian soft-NMS, 3 - standard NMS 기본값: 2  # Soft-NMS의 방식을 선택하는 설정 값입니다.
sn_sigma = 0.5 # Gaussian soft-NMS 방식 사용 시 분산을 설정하는 값입니다. 
sn_thresh = 0.001 # 값에 해당하는 신뢰도 미만의 Box를 제거하는 설정 값입니다.


weights = [1] * len(submission_df) # 각 모델의 동일한 가중치 1을 고정하는 설정 값입니다. None으로 설정 시 각 모델에 적용된 가중치로 진행됩니다. 

해당 코드들은 Weighted-Boxes-Fusion GitHub 내 ensemble_boxes 라이브러리가 포함되어 있습니다.

🧑‍🤝‍🧑 Contributors

⚡️ Detail

프로젝트에 대한 자세한 내용은 Wrap-Up Report 에서 확인할 수 있습니다.

About

level2-objectdetection-cv-23 created by GitHub Classroom

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 75.6%
  • Jupyter Notebook 23.5%
  • Shell 0.9%