부스트캠프 4기-영섭 캠퍼가 준 방법
1. Conda 가상환경 생성하기
conda create --name openmmlab python=3.8 -y
conda activate openmmlab

conda activate에서 위와 같은 오류가 발생하여서
생각을 해보니 root@~ 앞에 (base)가 없는 걸 보고 그냥 터미널을 다시 열었다

어쩌다 보니 해결 ㅇㅇ..
2. Pytorch 생성하기
conda install pytorch==1.7.1 torchvision==0.8.2 torchaudio==0.7.2 cudatoolkit=11.0 -c pytorch
3. MIM과 MMCV 설치하기
pip install -U openmim
mim install mmcv-full
4. mmsegmentation 설치하기
git clone https://github.com/open-mmlab/mmsegmentation.git
cd mmsegmentation
pip install -v -e .
5. 설치확인하기
mim download mmsegmentation --config pspnet_r50-d8_512x1024_40k_cityscapes --dest .

6. 밑의 코드를 복사하여 터미널에서 실행하고 result.jpg가 생성되면 설치 완료
python demo/image_demo.py demo/demo.png configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth --device cuda:0 --out-file result.jpg

mmsegmentation파일이 생겼고

내려보면 result.jpg 가 생성된 것을 확인할 수 있다
7. mmsegmentation에 맞게 데이터 변환
우리에게 제공된 데이터는 image(.jpg), gt(.json).
하지만 mmsegmentation이 요구하는 데이터는 image(jpg), gt(.png), split(.txt)입니다.
이를 위해 아래의 코드를 실행하면 된다
import os.path as osp
import os
import cv2
import numpy as np
from pycocotools.coco import COCO
import json
def coco_to_mmsegmentation(
annotations_file: str, output_annotations_file: str, output_masks_dir: str
):
path = '/opt/ml/input/data'
if not osp.isdir(output_annotations_file):
os.mkdir(osp.join(path, output_annotations_file))
if not osp.isdir(output_masks_dir):
os.mkdir(osp.join(path, output_masks_dir))
os.mkdir(osp.join(path, output_masks_dir, 'batch_01_vt'))
os.mkdir(osp.join(path, output_masks_dir, 'batch_02_vt'))
os.mkdir(osp.join(path, output_masks_dir, 'batch_03'))
print(f"Loading annotations form {annotations_file}")
annotations = json.load(open(annotations_file))
print(f"Saving annotations to {output_annotations_file}")
with open(output_annotations_file + "/train.txt", "w") as f:
for image in annotations["images"]:
filename = image["file_name"][:-4]
f.write(str(filename))
f.write("\n")
print(f"Saving masks to {output_masks_dir}")
coco_annotations = COCO(annotations_file)
for image_id, image_data in coco_annotations.imgs.items():
filename = image_data["file_name"]
anns_ids = coco_annotations.getAnnIds(imgIds=image_id)
image_annotations = coco_annotations.loadAnns(anns_ids)
print(f"Creating output mask for {filename}")
output_mask = np.zeros(
(image_data["height"], image_data["width"]), dtype=np.uint8
)
for image_annotation in image_annotations:
category_id = image_annotation["category_id"]
try:
category_mask = coco_annotations.annToMask(image_annotation)
except Exception as e:
print(f"Skipping {image_annotation}")
continue
category_mask *= category_id
category_mask *= output_mask == 0
output_mask += category_mask
output_filename = osp.join(output_masks_dir, str(filename[:-4]) + ".png")
# output_filename.parent.mkdir(parents=True, exist_ok=True)
print(f"Writting mask to {output_filename}")
cv2.imwrite(str(output_filename), output_mask)
if __name__ == "__main__":
path = '/opt/ml/input/data'
json_path = path + '/train.json'
labels_path = path + '/labels'
splits_path = path + '/splits'
coco_to_mmsegmentation(json_path, splits_path, labels_path)
/opt/ml/input/data 내부의 이미지들을 images 폴더를 추가하고 그 안에 위치
(ex : /opt/ml/input/data/images/batch_01_vt/0001.jpg)

convert_json_to_mmseg.py의 25번째의 train.txt, 65번째의 train.json의 train을 val, test로 바꾸어 총 3번 실행
실행할 때 현재 가상환경이 mmsegmentation이므로
conda deactivate
다음 코드를 실행해서 (base)로 돌아간다

8. 새로운 데이터 셋 등록
7번에서 만든 새로운 데이터 셋인 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))
9. 코드 추가
다음은 /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)
10. 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''NaverBoost Camp 4기 > [P stage] Semantic Segmentation' 카테고리의 다른 글
| [P stage][Semantic Seg] ModuleNotFoundError: No module named 'utils' (0) | 2022.12.26 |
|---|---|
| [P stage][Semantic Seg] 실행코드 (0) | 2022.12.23 |
| [Semantic Seg] U-Net, U-Net++, U-Net 3+ (2) | 2022.12.22 |
| [P stage][Semantic Seg] 대회 프리뷰 & Segmentation 대회 소개 (마스터 클래스) (0) | 2022.12.21 |
| [P stage][Semantic Seg] 대회 환경세팅 (0) | 2022.12.21 |