Giter Club home page Giter Club logo

level2-semantic-segmentation-level2-cv-17's Introduction

Recycle Trash Semantic Segmentation Competition

  쓰레기 대란, 매립지 부족 등의 사회문제 해결에 기여하고자 대회 형식으로 진행되었던 프로젝트이며, 이미지에서 10종류의 쓰레기(일반 쓰레기, 종이, 금속, 유리, 플라스틱 등)의 영역을 정확히 분할하는 모델을 설계하였습니다. 이는 쓰레기장에 설치되어 정확한 분리수거를 돕거나, 어린아이들의 분리수거 교육 등에 사용될 수 있을 것입니다.

  • Input: 이미지, 쓰레기 종류, 쓰레기 영역 등 Segmentation Annotation (coco format)
  • Output: 쓰레기 종류와 영역( pixel 좌표들)

image

💁TEAM

CV 17조 MG세대

민선아 백경륜 이도연 이효석 임동우
@seonahmin @baekkr95 @omocomo @hyoseok1223 @Dongwoo-Im
mmsegm기반
모델 실험
모델 다양성,
Augmentation 실험
데이터 Visualization
모델 실험
mmsemg baseline작성
다양한 실험
torch baseline 작성,
Data Annotation 수정

🏆Leaderboard Ranking

  • Public: 4등, mIoU 0.8209
  • Private: 2등, mIoU 0.7702

🧪Experiment

  1. Data : 시각화를 통해 실험방향성을 설계하고, unique case 및 label nosie 등을 공유하며 문제를 정의하고 해결해나갔다.
  2. Validation : miou의 산식을 생각해볼 때 클래스의 분포에 민감해 Leader board와 상관성이 높은 validatoin set의 선정을 중요하게 생각했다.
  3. Augmentation : 다양한 augmentaiton 및 앞서 정의된 문제 해결을 위한 적절한 기법을 활용했다.
  4. Loss 및 학습 : mIoU와 클래스 불균형을 고려해 잘 measure할 수 있는 loss를 고민했고, 사전학습된 backbone의 사용을 통한 인코더 와 디코더의 학습 불균형 해결을 위한 lr trick 등을 고안했다.
  5. Ensemble : voting 기법에서 비효율적임을 느껴 Pseudo Labeling 등을 통해 일종의 앙상블 효과를 얻고자 했다.

✨Model

Framework, CNN base or Transformer base 등을 고려해 모델의 다양성을 높이고, , Receptive Field를 고려해 local한 정보를 최대한 활용해 기존의 모델이 가진 global한 정보만으로 판단하는 문제를 해결했다. 또한, mIoU산식과 대회 데이터가 가진 불균형한 분포의 문제점을 고려해 정량적 지표 뿐 아니라 결과를 시각화해봄으로써 부족한 클래스를 잘 맞추는 등의 적절한 실험 방향을 설계할 수 있었다. image

🌈 Pseudo Labeling

Pseudo Labeling 전략

다양한 Pseudo Labeling전략을 통해 일종의 앙상블 효과를 내도록 함으로써, 다양한 모델이 가진 특성을 살릴 수 있었다.

  1. Train data와 Pseudo Labeling된 Test data를 함께 학습
  2. 기학습된 모델에 Pseudo Labeling된 Test data를 포함하여 추가 학습 / 의도 : 기학습된 모델이 잘 예측하지 못하던 케이스에 대한 가이드를 제공함으로써 일종의 앙상블처럼 각 모델의 장점을 가져오고자 했습니다.
  3. Train data와 Pseudo Labeling된 Test data를 함께 학습한 후, Train data만 활용하여 추가 학습 / 의도 : Pseudo Labeling 학습 시, 전체적인 경향이 비슷해지면서 Test data에 대한 틀린 예측까지도 학습하는 현상을 보완하고자 했습니다. image

📖 Reference

level2-semantic-segmentation-level2-cv-17's People

Contributors

baekkr95 avatar dongwoo-im avatar hyoseok1223 avatar omocomo avatar seonahmin avatar

Stargazers

 avatar  avatar  avatar  avatar

level2-semantic-segmentation-level2-cv-17's Issues

[Augmentation] CropNonEmptyMaskIfExists

Background

Albumentation 돌아다니다가 CropNonEmptyMaskIfExists 를 발견했습니다.
RandomCrop으로 Mask가 있는 경우에 Return을 하는 것인데, 돌아가는 로직을 상상해보면 아마 Mask가 없는 경우도 존재는 할 것 같습니다.

Content

  • exp60 : base : CV 6179 LB 6614
  • exp61 : CropNonEmptyMaskIfExists(256) > Resize(512) : valid mIoU가 너무 낮아서 조기 중단
  • exp62 : CropNonEmptyMaskIfExists(384) > Resize(512) : CV 6064
  • exp63 : CropNonEmptyMaskIfExists(256) > PadIfNeeded(512) : CV 5562
  • exp64 : CropNonEmptyMaskIfExists(384) > PadIfNeeded(512) : CV 6072

Details

[Baseline] torch Augmentation

Background

  • 현재 Augmentation 함수들이 dataset.py의 get_transform 함수에 적혀있음.
  • 추후에 다양한 Augmentation 코드 추가, 수정, 실험의 편의성을 위해서 따로 transform.py 파일을 만드는게 좋아보임.

Content

  • feat/torch에서 서브 브랜치 생성
  • transform.py 파일에 Augmentation 함수들을 작성
  • dataset.py에서 transform.py에 있는 함수들을 import

Details

[Model] Swin + PSPNet

Background

이전의 object detection대회에서도 살펴봤듯이 현재 데이터셋에서는 다양한 크기의 객체들이 존재하기에 hieararchcial representation을 활용하는 것이 중요하다고 생각했고, 이전에 도연님이 간단히 공유해주신 torch baseline의 inference visualization결과를 봤을 때 크기가 작고 전체적으로 뭉개지는 느낌이 있었다.

Content

  • 따라서 다양한 스케일을 잘 캐치하는 것이 중요하다고 생각해 multi-scale information을 더 잘 사용하기 위해서 swin transformer구조를 사용해 연산량을 줄이면서도 다양한 스케일 정보를 처리할 수 있기에 backbone으로 swin transformer를 사용했다. ( 시간이 한정적인 대회인 만큼 효율성이 중요하다고 생각했다.)
  • 또한, 작은 크기의 객체가 꽤 많으며, 데이터셋의 특성상 paper나 paper pack과 같이 유사한 클래스의 구분이 어렵고, 작은 객체나 쓰레기 class들과 유사한 무늬를 가지는 background가 종종 있어 이전 대회에서도 잘못 탐지했던 점들을 고려해 PSPNet을 사용해보는 것을 baseline으로 잡았다.

Details

swin의 경우 이전 대회에서 실험했듯이 backbone으로 Large를 사용하는 것이 효율적이라고 느꼈기에 이를 사용했습니다. swin으로 명명되는 전부 Swin L입니다.

[Ensemble] 앙상블을 위한 soft label 파일 생성

Background

앙상블에 hard voting만 이용하는 것보다는 soft를 사용하는게 훨씬 괜찮아 보입니다. (averaging 도 할 수 있고)

Content

mmsegmentation 에서 test에 사용되는 forward_test의 일부를 수정해서 soft label을 함께 뱉을 수 있도록 해보고자 합니다.

[Augmentation] Small object를 위한 Augmentation

Background

LB에서 0.68정도가 나왔던 파일을 시각화해서 보던 중 아래와 같이 작은 물체의 경우 아예 잘 잡지 못하는 ( receptive field의 문제처럼 느껴졌음 ) 문제를 확인했습니다. 이를 위해서 이번에도 multi-scale전략을 가져가야할 것 같습니다.
image
이미지는 cocoid기준 16번

Content

이와 같은 맥락에서 augmentation의 관점에서 해볼 수 있는 것들을 해보고 결과를 확인해보자 합니다. 추가적으로 저희가 가지고 있는 데이터의 경우 작은 객체도 확대해서 찍힌 사진이 대부분이어서 확실히 작은 객체들에 대해서 약하다고 느꼈습니다.

Details

  • TTA( test time augmentation)
  • resize multiple scale
  • segmentation mask rescale
  • mosaic augmentation

[Model] Classification 결과를 활용하는 방법

Background

Classification 정보를 활용하여 Segmentation 결과의 정확도를 높이는 방법을 적용해보고자 함

Content

  1. smp의 aux_params
  2. mmseg의 auxiliary_head
  3. Unet3+
    image
    강의 중 짧게 언급되었던 Unet3+에서는 의료 영상 segmentation에 대해 Classification-guided Module을 활용해 장기가 있는지 없는지 구분합니다. 즉, background와 object를 구분하는데 Classification이 사용되는 것으로 보입니다.
  4. Classification 한 후 Segmentation

Details

우선 관련된 것으로 보이는 1, 2의 기능을 정확히 이해해 사용해보려고 합니다.
그리고 3의 Unet3+ 구현 및 background와 obejct 구분뿐만 아니라 전체 class에 대한 classification 결과를 guide로 해 segmentation 결과에 적용할 수 있는 방법을 찾아보려고 합니다.

[Data] Test Dataset Unique Case 공유

Cases(coco id)

  • 9
  • 38
  • 57
  • 110
  • 125
  • 126
  • 149
  • 276
  • 323
  • 337 : plastic bag 안에 있는 metal 인식
  • 347
  • 390
  • 411
  • 413
  • 415
  • 420
  • 477
  • 490

확인해볼만한 것들이라고 생각하시면 여기에 넣어주시고, 추가적으로 이미지와 함께 부연설명 하고 싶다면 comment로 coco id와 함께 이미지, 간단한 부연설명을 남겨주시면 좋을 것 같습니다.

[Data] Valid Dataset 수정

Background

valid socre가 LB를 잘 반영하지 못한다는 생각이 들었습니다. 이를 체크하기 위해서 Valid에 대해서 0.709가 나온 epoch 12 running결과를 LB에 제출해본 결과 0.631이 나왔습니다. 따라서 어느정도가 학습이 잘 된 시점인지를 결정하기에 valid set이 제 역할을 잘 해내지 못하고 있다고 생각합니다.(학습 양상을 보기에도) 따라서 valid set을 바꿔보려 합니다.

Content

  1. leakage data를 valid set으로 이용 ( leakage된 상태인데, 오히려 test를 잘 대변할 수 있지 않을까 싶어서 valid set으로 이용해볼까 합니다)
  2. train_all+leakage 합친 상태에서 새롭게 startified k-fold를 통해서 데이터를 나눠볼까 합니다.
  3. val+leak 합친 상태에서 startified k-fold로 데이터를 나눠볼까 합니다.
  4. val을 starified k-fold로 나눈 상태를 (3,5) leak에 합치기

Details

  • 1
  • 2
  • 3
  • 4 - 3
  • 4 -5

[Loss] 다양한 Loss 실험

Background

#25 에도 언급했 듯 학습자체가 무척 불안정한 것 같습니다. 특히 현재 default로 설정된 cross entropy를 낮추는 것이 저희가 원하는 IOU를 maximize하는 것과는 방향이 다르다는 생각이 들었습니다. ( acc는 maximize되는 것 같기도 합니다.)

Content

다양한 loss를 합리적인 관점에서 실험해보고, hybrid loss 등등 여러 loss를 결합해 사용하는 kaggle solution을 참고하면서 실험해볼 생각입니다. 추가적으로 loss들에 weight도 주면서 좀 더 생각해보고자 합니다.

Details

일단 생각중인 실험 목록입니다.

  • cross entropy loss ( baseline)
  • dice loss + cross entropy loss
  • dice loss + focal loss
  • #20

[Baseline] MMsegmentation baseline code

Background

다양한 backbone과 methods들을 쉽게 사용해 실험의 효율성을 높이기 위해 mmsegmentation을 사용할 수 있는 코드를 작성하고자 합니다.

Content

mmsegmentation을 통해 저희의 custom dataset(cocoformat인 것 같아서 쉬울 것 같기도 합니다) 을 사용해서 segmentation을 수행하는 baseline코드와 setup을 위해 필요한 것들을 작성해 환경 구성을 해두려고 합니다.
Reference1
Reference2

Details

  • 필요한 환경설정 정리
  • baseline으로 train.py를 수행할 수 있는 코드 작성

[Baseline] torch train.py save & wandb config

Background

현재 모델 저장 시 latest, best_loss, best_miou 라는 이름으로 저장되고 있는데 조금 불편하다고 느꼈다.
또한 wandb config 저장이 안 되고 있다.

Content

작업 내용

  • best_miou.pth, best_loss.pth 이름에 epoch 정보를 반영
  • latest.pth도 지금처럼 하나만 저장하는 것이 아니라, save_interval 값마다 모델을 저장
  • wandb config 기록
  • optimizer.py scheduler.py 추가
  • smp_model.py 다양한 모델 추가

작업 예정

  • train.py
  • wandb_setup.py (?)

Details

#22 PR

[Visualization] Fiftyone 시각화

Background

Fiftyone으로 Train data와 Test data Inference 결과를 시각화해 어떻게 segmentation annotation이 되어있는지 확인하고자 합니다. 이를 통해 특이한 case나 잘못 annotation 된 경우를 찾아낼 수 있습니다.
이때 Train data의 경우 주어진 Annotation file이 coco format으로 이루어져 있어 특별한 처리 없이 바로 시각화할 수 있습니다.
Test data의 경우 submission.csv를 이용해 그 결과를 시각화할 수 있는 코드를 작성하려고 합니다.

Content

  • Train data 시각화
  • Test data Inference 결과 시각화

Details

아래처럼 Color by value를 선택해 class별로 색을 구분해 볼 수 있다.

image

[Model] timm backbone (encoder)

추천 List

비추 List

Error List

[Augmentation] mmseg Albumentation 추가

Background

  • mmseg에 Albumentation를 추가하는 코드
  • mmsegmenation 파일은 gitignore되어 있기 때문에 issue로 코드를 올렸습니다. 꼭 확인 부탁드려요!

Content

Details

아래 코드를 transforms.py 에 추가하면 됩니다. 이후 config datasets에서 mmdetection에서 albumentation 사용했던 것처럼 사용하면 됩니다.

import copy
import mmcv
import numpy as np
from mmcv.utils import deprecated_api_warning, is_tuple_of
from numpy import random

from ..builder import PIPELINES

try:
    import albumentations
    from albumentations import Compose
except ImportError:
    albumentations = None
    Compose = None

@PIPELINES.register_module()
class Albu(object):
    """Albumentation augmentation. Adds custom transformations from
    Albumentations library. Please, visit
    `https://albumentations.readthedocs.io` to get more information. An example
    of ``transforms`` is as followed:
    .. code-block::
        [
            dict(
                type='ShiftScaleRotate',
                shift_limit=0.0625,
                scale_limit=0.0,
                rotate_limit=0,
                interpolation=1,
                p=0.5),
            dict(
                type='RandomBrightnessContrast',
                brightness_limit=[0.1, 0.3],
                contrast_limit=[0.1, 0.3],
                p=0.2),
            dict(type='ChannelShuffle', p=0.1),
            dict(
                type='OneOf',
                transforms=[
                    dict(type='Blur', blur_limit=3, p=1.0),
                    dict(type='MedianBlur', blur_limit=3, p=1.0)
                ],
                p=0.1),
        ]
    Args:
        transforms (list[dict]): A list of albu transformations
        keymap (dict): Contains {'input key':'albumentation-style key'}
    """
    def __init__(self, transforms, keymap=None, update_pad_shape=False):
        # Args will be modified later, copying it will be safer
        transforms = copy.deepcopy(transforms)
        if keymap is not None:
            keymap = copy.deepcopy(keymap)
        self.transforms = transforms
        self.filter_lost_elements = False
        self.update_pad_shape = update_pad_shape
        self.aug = Compose([self.albu_builder(t) for t in self.transforms])
        if not keymap:
            self.keymap_to_albu = {'img': 'image', 'gt_semantic_seg': 'mask'}
        else:
            self.keymap_to_albu = keymap
        self.keymap_back = {v: k for k, v in self.keymap_to_albu.items()}
    def albu_builder(self, cfg):
        """Import a module from albumentations.
        It inherits some of :func:`build_from_cfg` logic.
        Args:
            cfg (dict): Config dict. It should at least contain the key "type".
        Returns:
            obj: The constructed object.
        """
        assert isinstance(cfg, dict) and 'type' in cfg
        args = cfg.copy()
        obj_type = args.pop('type')
        if mmcv.is_str(obj_type):
            obj_cls = getattr(albumentations, obj_type)
        else:
            raise TypeError(f'type must be str, but got {type(obj_type)}')
        if 'transforms' in args:
            args['transforms'] = [
                self.albu_builder(transform)
                for transform in args['transforms']
            ]
        return obj_cls(**args)
    @staticmethod
    def mapper(d, keymap):
        """Dictionary mapper.
        Renames keys according to keymap provided.
        Args:
            d (dict): old dict
            keymap (dict): {'old_key':'new_key'}
        Returns:
            dict: new dict.
        """
        updated_dict = {}
        for k, v in zip(d.keys(), d.values()):
            new_k = keymap.get(k, k)
            updated_dict[new_k] = d[k]
        return updated_dict
    def __call__(self, results):
        # dict to albumentations format
        results = self.mapper(results, self.keymap_to_albu)
                
        results = self.aug(**results)
            
        # back to the original format
        results = self.mapper(results, self.keymap_back)

        # update final shape
        if self.update_pad_shape:
            results['pad_shape'] = results['img'].shape

        return results

    def __repr__(self):
        repr_str = self.__class__.__name__ + f'(transforms={self.transforms})'
        return repr_str

[Baseline] pytorch baseline wandb logging

Background

실험 결과를 잘 관리하기 위해서, pytorch baseline에 wandb를 연동하고자 합니다.

Content

일단은 sweep이나 image logging은 고려하지 않고,
wandb 연동 후 간단한 값들을 logging 하는 것을 목표로 하고 있습니다.

Details

  • wandb 연동
  • loss, metric, lr logging

[Data] Leakage된 데이터 195장 사용하기

Background

대회에서 195장의 test GT가 유출되는 문제가 발생했습니다. 이를 train에 사용하거나 public private에 대한 정보파악 등에 활용하는 것이 좋을 것 같아 우선 구별해두고자 합니다.

Content

동우님이 공유해주신 test_before.json과 test.json을 비교해 유출된 gt를 구별해두고 이를 train.json or train_all.json에 포함하는 코드를 작성해두고자 합니다.

Details

  • gt 목록 작성
  • 포함하는 코드 작성

[Baseline] MMSegmentation Refactoring

Background

기존의 baseline으로 올리게 된 코드들에서 학습과 추론을 위한 코드들이 rough해 이를 refactoring하고자 합니다.

Content

  • train.py를 기존의 mmsegmentation에서 그대로 가져왔는데 불필요한 정보들이 너무 많이 제공되고 가독성이 떨어져 이를 리팩토링하고자 합니다. 또한, 필요에 의해서 몇가지를 컨트롤하는 기능을 추가하고자 합니다.
  • test.py 또한 위와 같이 리팩토링함과 동시에 submission제출을 위한 파일을 만들려고 합니다.

Details

  • train.py refactoring
  • test.py에 submission을 위해 코드 수정
  • 적을게 있다면 몇가지 train.py사용과 관련해서 readme를 적어볼까 생각 중입니다.

[Loss] CE class_weight 적용

Background

Background에 지나치게 편향된 상태로 학습이 이루어진다고 생각하여 class_weights로 이를 control 해보려고 합니다.

Content

train_all.json + leak.json의 Pixel 값 기반으로 class별 점유율을 계산하고, 이에 역수를 취해 Sum이 1인 weights를 구하였습니다.
간단히 설명하면, 각 실험마다 구한 Pixel 값에 곱셈, 나눗셈 연산을 적용하여 class_weights를 구하고 있습니다.

exp0 > exp1 : Background Pixel 수가 너무 많으니깐 10 나눠보자
exp1 > exp2 : Battery Pixel 수가 너무 적으니깐 5 곱해보자
exp2 > exp3 : Background Pixel 수가 아직도 많으니깐 10 대신 30으로 나눠보자

  • exp0 : [0.0, 0.0169, 0.0045, 0.0714, 0.0616, 0.0569, 0.0152, 0.0288, 0.0043, 0.6176, 0.1228] (background : 0에 매우 근접)
  • exp1 : [0.0002, 0.0169, 0.0045, 0.0714, 0.0616, 0.0569, 0.0152, 0.0288, 0.0043, 0.6174, 0.1228]
  • exp2 : [0.0005, 0.0334, 0.0088, 0.141, 0.1218, 0.1125, 0.03, 0.0569, 0.0085, 0.244, 0.2427]
  • exp3 : [0.002, 0.0334, 0.0088, 0.1408, 0.1216, 0.1123, 0.0299, 0.0568, 0.0085, 0.2436, 0.2423]
  • exp4 : [0.0026, 0.0441, 0.0117, 0.186, 0.1606, 0.1484, 0.0395, 0.075, 0.0112, 0.1609, 0.1601]
  • exp5 : [0.004, 0.0683, 0.0181, 0.1441, 0.1244, 0.1149, 0.0612, 0.1162, 0.0173, 0.1662, 0.1653]
  • exp6 : [0.0055, 0.0934, 0.0247, 0.1314, 0.1134, 0.1048, 0.0837, 0.0795, 0.0237, 0.1705, 0.1696]
  • exp7 : [0.0068, 0.0582, 0.0308, 0.1229, 0.1061, 0.1307, 0.1045, 0.0991, 0.0295, 0.1702, 0.141]
  • exp8 : [0.0108, 0.0702, 0.0372, 0.1186, 0.128, 0.1183, 0.063, 0.1196, 0.0356, 0.171, 0.1276]
  • exp9 : [0.0146, 0.0948, 0.0502, 0.1144, 0.1153, 0.1065, 0.0567, 0.1077, 0.0481, 0.154, 0.1378]
    image

Details

  • 실험 종료 후 댓글 남겨두겠습니다. 혹시 class_weights 구하는 함수가 필요하시면 댓글에 남겨두겠습니다.

[Model]SwinT(Large)+UPerNet

Background

paper with code의 semantic segmentation task에서 1위를 하고 있는 SwinT+UperNet조합을 적용해보고자 합니다.

Content

image

SwinT Large backbone의 경우 384사이즈를 사용하게 되면 cuda memory error가 나기 때문에 224 사이즈를 사용해야 합니다.
mmsegmentation으로 실험하였고, decoder head인 UperHead의 channel을 512->256으로 줄이지 않으면 cuda memory error가 납니다.

Details

  • SwinT+UperNet 실험
  • Inference 시각화 및 LB공유
  • #32 의 다양한 Loss 적용 결과 확인
  • #27 의 다양한 augmentation 적용 결과 확인
  • lr trick 사용
  • Neck사용

[Experiment] 5fold, 10fold 한 번 돌려보기

Background

Data 수가 제한된 상황에서 Valid data가 많아야 할 필요는 없다고 생각했습니다.
그래서 stratified_kfold.py로 만든 5fold와 10fold 데이터로 학습을 진행해보고, LB 점수를 확인해보려 합니다.

Content

  • 5fold 학습
  • 10fold 학습 >>> fold 0부터 6까지 7개 학습
  • LB 제출 >>> 5개 제출

stratified_kfold.py 10fold 요약
Model : timm-efficientnet-b4 & FPN

Wandb Fold Epoch CV(mIoU) LB(mIoU)
exp5 0 4 0.5096 0.5544
exp6 1 5 0.5264 0.5524
exp7 2 10 0.5825 0.5726
exp8 3 9 0.5688 0.5617
exp9 4 10 0.5371 0.5741
exp10 5 7 0.5401 -
exp11 6 9 0.5552 -

Details

[Visualization] MMSemgmentation wandb image logging hook

Background

validation score만을 보고 현재 모델의 상황을 파악하는 것이 아직은 어렵다고 생각이 들었습니다.( overfitting 체크하기가 어려움 )
그래서 validation을 하면서 나온 결과를 확인하려고 합니다.

Content

mmsegmentation에 wandbimagehook추가 후 사용

Details

Ref1
MMDet에 최근에 wandb image logging을 위한 hook pr이 올라왔습니다. 이를 참고해서 mmsegmentation에 적용해보고자 합니다

[Augmentation] Augmentation 기능 추가 및 실험 관리

Background

  • 강의에서 소개된 Augmentation 기법들의 효과를 파악해볼 필요가 있음.
  • 현재는 Resize로만 학습을 진행하고 있고, transform.py에 없는 기법들을 추가할 예정이다.

(transform.py)
image

Content

  • 성능 비교시에는 기준 모델로 학습 시간이 상대적으로 짧은 timm-efficientnet-b4_UnetPlusPlus 을 사용할 예정

추가할 기법

  • A.GridDropout
  • A.CoarseDropout
  • A.CropNonEmptyMaskIfExists
  • Cutmix
  • ObjectAug
  • copy and paste

Details

  • 더 추가해볼 기법이 있으시면 추가해주셔도 좋습니다.
  • 기법들이 다양해서 분업을 해도 괜찮을 듯 합니다. 코멘트에 해보고 싶은 기법을 언급해주시면 될 것 같습니다.

[Experiment] mmsegmentation에 CopyPaste 적용

Background

  • 5월4일 피어세션 기준 최고 성능 모델인 UperNet에 CopyPaste를 적용해서 효과를 검증해보고자 함.
  • 현재 데이터 수 자체가 적은 Glass, Metal, Battery, Clothing 같은 클래스의 MIoU를 높이는데 효과가 있는지를 위주로 실험할 예정

Content

  • Paper pack, Glass, Metal, Battery, Clothing 총 5개 클래스에 대해 copy paste를 사용할 예정입니다.
  • 각 클래스별로 다른 Augmentation을 적용할 예정입니다. (#2, #27 참고할 예정)

Details

  • mmesegmentation > mmseg > datasets > pipelines 폴더 아래에 copypaste.py 파일을 만들고, __init__.py에 이를 import하면 됩니다.
  • configs > dataset.py의 train_pipeline에 추가하면 됩니다.
  • 선아님이 하신 실험환경을 그대로 branch로 만들어서 올리시면 될 것 같습니다.

[Experiment] torch inference에 TTA 추가

Background

  • inference.py에 tta를 추가하는 코드를 미리 세팅하려고 합니다.
  • 어느정도의 성능 향상을 가져오는지 확인해보기 위해 실험해보려고 합니다.

Content

  • base 모델 : efficient b4 + Unet plusplus
  • tta 모델 : Horizontal, Rotate90, Multiply

Details

tta_transform = tta.Compose(
        [
            tta.HorizontalFlip(),
            tta.Rotate90([0, 90]),
            tta.Multiply([0.8, 1.0, 1.2])
        ]
    )

[LR, Optimizer] Sweep 결과 공유

Background

더 좋은 LR과 Optimizer를 찾기 위함

Content

🔵 exp37 LR 0.0001 Adam CV 6315
🔴 exp38 LR 0.0001 AdamW CV 6258
🟢 exp39 LR 0.0001 AdamP CV 6305
🟡 exp40 LR 0.00005 Adam CV 6425
🟣 exp41 LR 0.00005 AdamW CV 6426
🟠 exp42 LR 0.00005 AdamP CV 6450 (best CV)
image

Details

  • LR이 낮을수록 확실히 안정적으로 학습이 된다는 느낌을 받았고, CV 점수도 잘 나오는 것 같습니다. (미제출)
  • 저의 경우엔 AdamP가 CV 성능이 가장 좋긴 했지만, 큰 차이는 아니라고 생각합니다. 적절한 LR을 찾는 것이 더 중요할 것 같습니다.
  • AdamP는 pip3 install adamp 로 간단하게 설치하실 수 있습니다. github : https://github.com/clovaai/AdamP

[Data] Train Dataset 특이 케이스 & 라벨 노이즈 공유

coco id 기준 : train_all.json

특이 케이스

  • 144 149 : 유리병 or 유리컵 안에 있는 것들은 따로 라벨링되는 듯 합니다.
  • 165 : 보조배터리 (battery)
  • 531 551 554 등등 너무많음 : 박카스에 연결되어 있는 병뚜껑은 metal이 아니고, 병째로 glass로 라벨링
  • 2665 : 깨진 유리조각 (glass)
  • 3101 : 뽁뽁이 (plastic bag)
  • 3193 : 홈키파 (metal)
  • 3222 : 곰팡이 제거제, 쉐이빙폼 (metal)
  • 라면용기
    • 2161 3204 : general trash
    • 1513 2653 2873 : paper pack
  • 0 3102 3103 : 투명도에 따라 라벨링 여부가 결정되는 것 같기도 합니다.
  • 3263 : 솜 ?

label modify

  • 12 : plastic bag > general trash
  • 495 : metal > plastic
  • 970 : plastic bag > styrofoam
  • 1217 : styrofoam > plastic & stytofoam > paper
  • 1498 : metal > background
  • 1548 : plastic > glass
  • 1671 : paper pack > paper
  • 1700 : metal > plastic bag
  • 1710 : metal > general trash
  • 1712 : metal > paper
  • 2028 : metal > glass / plastic & glass & plastic bag > metal
  • 2424 : paper pack > paper
  • 2816 : plastic > glass
  • 2836 : plastic > plastic bag & general trash > plastic

object in the plastic bag

  • 62 : styrofoam
  • 132 : metal
  • 404 : styrofoam
  • 405 : glass
  • 597 : paper, plastic
  • 618 : styrofoam
  • 838 : battery
  • 934 : plastic, metal
  • 959 : styrofoam
  • 1298 : plastic, styrofoam, metal
  • 1366 : paper pack
  • 1374 : styrofoam
  • 2011 : metal, plastic, general trash
  • 2012 : metal, paper pack
  • 2351 : plastic, styrofoam, paper
  • 2471 : plastic, styrofoam, glass, general trash
  • 2472 : metal, plastic, glass
  • 2556 : plastic
  • 3129 : plastic, general trash
  • 3130 : styrofoam
  • 3161 : plastic

크기가 큰 성의없는 라벨링 ==> fiftyone error 추정

  • 98 100 121 122 128 398 727 744 969 1287 1357 2027 2629 2635 2674 2686 2734 2735 2736 3032 3131 3148 3158 3189

이미지 제거 후보 : 야기할 수 있는 문제

  • 147 : glass <-> plastic
  • 165 : test battery와 다른 외형

[Idea 공유]

Content

  1. Data
    1-1. Class Imbalanced
    1-2. Augmentation
  2. Model
    2-1. smp (segmentation-models-pytorch)
    2-2. torch.hub
    2-3. mmsegentation
  3. Post-process
    3-1. Dense-CRF
  4. Reference
    4-1. A Survey on Deep Learning-based Architectures for Semantic Segmentation on 2D Images
    4-2. Self-supervised Auxiliary Learning with Meta-paths for Heterogeneous Graphs
    4-3. Auo-Seg-Loss
  5. Metric
    5-1. miseval
    5-2. confusion matrix
  6. Ensemble
    6-1. 앙상블을 위한 후보 선정 아이디어

[Baseline] torch baseline code

Background

규범님이 올려주신 코드와 마스터님이 올려주신 코드를 바탕으로 torch baseline을 짜려고 합니다.
자세한 내용은 details 에 적어놓겠습니다
추가로 제가 완성된 기능?들은 계속 details에 체크할건데
혹시 체크 안되어있는 것중 해보고 싶으신 게 있으면 언제든지 가져가서 하셔도 좋습니다^_^
진행중인것은 (진행중) 이라고 옆에 써놓을게요!

Content

Details

  • work_dir 자동으로 증가되는 부분 수정
  • wandb logging 수정
  • Inference 코드 작성
  • CV 코드 추가
  • 여러 data.json을 받을 수 있도록 수정
  • 한번 돌려보고 추가할 것이나 수정할 것이 있으면 할 예정

notice!!
저의 경우에 오류가 2번 났는데요

  1. albumentation error
    현재 설치되어있는 albumentation버전에 imgaug가 포함되어있지 않다? 는 식의 오류같았는데요
    pip install -U albumentations[imgaug]
    하니까 해결되었습니다

  2. segmentation-models-pytorch 의 metrics가 없다는 오류
    이 부분은 단순히 upgrade로 해결되지 않더라구요
    저의 경우에
    pip install git+https://github.com/qubvel/segmentation_models.pytorch
    처럼 깃의 레포지토리에서 바로 설치하는 방식으로 해결하였습니다.

[wandb] augmentation 적용 확인을 위한 train data wandb image logging 추가

Background

augmentation이 잘 적용되는지 확인을 위한 train_data image logging이 필요하다고 생각하여 추가하려고 합니다
대신, 추가하게 되면 train시 시간이 더 걸리는 점이 있어서 --check_train_data argument를 주면 logging하도록 코드를 짜려합니다.
(사실 짰습니다.. 늦게 올려서 죄송합니다..후,,,,)

Content

Details

[Model] SMP에 Swin + PAN 적용하기

Background

성능이 좋은 Swin 모델을 SMP에서도 사용할 수 있도록 함

Content

  • PAN + Swin : SMP에 Custom Encoder를 등록하는 방식으로 사용할 수 있다.

Details

우선 다음 블로그를 참고해 바로 적용 가능한 PAN을 이용하고 이후 가능하면 더 수정해 볼 수 있을 것 같습니다.

[Model] 모델 다양성 추가

Background

  • swin base 모델로만 앙상블을 해본 결과, LB 점수가 0.005~0.01 정도밖에 오르질 않았음. (pspnet, upernet, PAN)
  • 백본의 다양성을 높이면 앙상블 효과를 더 끌어올릴 수 있을 것 같음.

Content

  • hrnet + ocr (mmseg). epoch 50

    • valid mIoU : 0.432
    • LB mIoU : 0.5610
  • tu-resnest269e + PAN (torch smp), epoch 50

    • valid mIoU : 0.5461
    • LB mIoU : 0.6022
  • tu-hrnet_w48 + FPN (torch smp), epoch 50

    • valid mIoU : 0.4698
    • LB mIoU : 0.5482
    • 보통 epoch 40정도부터 수렴성을 보이는데, 학습을 더 해도 될 것 같음.
      image
  • tu-hrnet_w48 + FPN + multiscale (resize 512, 784, 1024) (torch smp), epoch 50

    • valid mIoU : 0.4802
    • LB mIoU : 0.5233
  • inceptionresnetv2 + unet pp + multiscale (randomresizedcrop 512) (torch smp), epoch 50

    • valid mIoU : 0.5252 (epoch50), 0.5514 (best)
    • LB mIoU : 0.5612 (epoch50)
  • inceptionresnetv2 + unet pp + noaug (torch smp), epoch 50

    • valid mIoU : 0.57
    • LB mIoU : 0.5606
  • tu-xception41 + unet pp + (torch smp, 효석님 이슈 참고) epoch 50

    • valid mIoU :
    • LB mIoU : 0.5025

Details

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.