boostcampaitech4lv23cv2 / level2_semanticsegmentation_cv-level2-cv-13

level2_semanticsegmentation_cv-level2-cv-13 created by GitHub Classroom
5 stars 1 forks source link

How to complete mmsegmentation settings #8

Open 0seob opened 1 year ago

0seob commented 1 year ago

issue #4를 통해서 mmsegmentation을 설치하였으면 이제 이를 이용하여 학습을 시켜봅시다.

/opt/ml/ <- 저번 issue를 통해 mmsegmentation을 설치했다면 이 경로에 설치되어 있을 것입니다.

1. mmsegmentation에 맞게 데이터 변환 우리에게 주어진 데이터는 image(.jpg), gt(.json)입니다. 하지만 mmsegmentation이 요구하는 데이터는 image(jpg), gt(.png), split(.txt)입니다. 이를 위해 develop에 있는 convert_json_to_mmseg.py를 실행시키면 됩니다.

   a. /opt/ml/input/data 내부의 이미지들을 images 폴더를 추가하고 그 안에 위치 (ex : /opt/ml/input/data/images/batch_01_vt/0001.jpg)
   b. convert_json_to_mmseg.py의 25번째의 train.txt, 65번째의 train.json의 train을 val, test로 바꾸어 총 3번 실행

2. 새로운 데이터 셋 등록 우리는 1번에서 만든 새로운 데이터 셋인 recycle dataset을 활용해야 하기 때문에 이를 mmsegmentation에 새로 등록해야 합니다. /opt/ml/mmsegmentation/configs/base/datasets의 경로에 recycle.py라는 이름으로 아래의 코드를 추가해줍니다.

# dataset settings
dataset_type = 'RecycleDataset'
data_root = '/opt/ml/input/data'
img_norm_cfg = dict(
    mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)
crop_size = (512, 512)
train_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(type='LoadAnnotations', reduce_zero_label=True),
    dict(type='Resize', img_scale=(2048, 512), ratio_range=(0.5, 2.0)),
    dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75),
    dict(type='RandomFlip', prob=0.5),
    dict(type='PhotoMetricDistortion'),
    dict(type='Normalize', **img_norm_cfg),
    dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255),
    dict(type='DefaultFormatBundle'),
    dict(type='Collect', keys=['img', 'gt_semantic_seg']),
]
test_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(
        type='MultiScaleFlipAug',
        img_scale=(2048, 512),
        # img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75],
        flip=False,
        transforms=[
            dict(type='Resize', keep_ratio=True),
            dict(type='RandomFlip'),
            dict(type='Normalize', **img_norm_cfg),
            dict(type='ImageToTensor', keys=['img']),
            dict(type='Collect', keys=['img']),
        ])
]
data = dict(
    samples_per_gpu=4,
    workers_per_gpu=4,
    train=dict(
        type=dataset_type,
        data_root=data_root,
        reduce_zero_label=True,
        img_dir='images',
        ann_dir='labels',
        split='splits/train.txt',
        pipeline=train_pipeline),
    val=dict(
        type=dataset_type,
        data_root=data_root,
        reduce_zero_label=True,
        img_dir='images',
        ann_dir='labels',
        split='splits/val.txt',
        pipeline=test_pipeline),
    test=dict(
        type=dataset_type,
        data_root=data_root,
        reduce_zero_label=True,
        img_dir='images',
        ann_dir='labels',
        split='splits/test.txt',
        pipeline=test_pipeline))

다음은 /opt/ml/mmsegmentation/mmseg/datasets/_ init _.py 파일에 아래와 같은 코드를 추가해 줍니다. (all은 덮어 씌우세요.)

from .recycle_512x512 import RecycleDataset

__all__ = [
    'CustomDataset', 'build_dataloader', 'ConcatDataset', 'RepeatDataset',
    'DATASETS', 'build_dataset', 'PIPELINES', 'CityscapesDataset',
    'PascalVOCDataset', 'ADE20KDataset', 'PascalContextDataset',
    'PascalContextDataset59', 'ChaseDB1Dataset', 'DRIVEDataset', 'HRFDataset',
    'STAREDataset', 'DarkZurichDataset', 'NightDrivingDataset',
    'COCOStuffDataset', 'LoveDADataset', 'MultiImageMixDataset',
    'iSAIDDataset', 'ISPRSDataset', 'PotsdamDataset', 'FaceOccludedDataset', 'RecycleDataset'
]

마지막으로 /opt/ml/mmsegmentation/mmseg/datasets에 recycle_512x512.py 파일을 만들고 아래의 코드를 추가합니다.

from mmseg.datasets.builder import DATASETS
from mmseg.datasets.custom import CustomDataset
import os.path as osp

classes = ('Background', 'General trash', 'Paper', 'Paper pack', 'Metal', 'Glass', 'Plastic', 'Styrofoam', 'Plastic bag', 'Battery', 'Clothing')
palette = [[0,0,0], [192,0,128], [0,128,192], [0,128,64], [128,0,0], [64,0,128], [64,0,192], [192,128,64], [192,192,128], [64,64,128], [128,0,192]]

@DATASETS.register_module()
class RecycleDataset(CustomDataset):
  CLASSES = classes
  PALETTE = palette
  def __init__(self, split, **kwargs):
    super().__init__(img_suffix='.jpg', seg_map_suffix='.png', 
                     split=split, **kwargs)

3. config 수정 num_classes=11 등과 같이 task에 맞게 config를 수정하여 /opt/ml/mmsegmentation의 경로에서 아래와 같은 코드로 학습 실행

python tools/train.py configs/swin/upernet_swin_tiny_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K.py --work-dir='/opt/ml/mmsegoutput'
lsvv1217 commented 1 year ago

11 같이 참조하면 될 것 같습니다