๐โ๐โโ๏ธ๐โโ๏ธ [์๋ฆผ]ย ๊ธฐ์กด ๋ฒ ์ด์ค๋ผ์ธ ๋ฌธ์ ์ฌํญ์ด ๋ง์์ ํ ๋ฒ์ ์คํ๋ ์ ์๋๋ก ์ ์ฒด base line์ ๋ณ๊ฒฝํ์ต๋๋ค. ์ด์ ๋ณด๋ค ์์ํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๐โ๐โโ๐โโ๏ธ
ย
๐โ๐โโ๏ธ๐โโ๏ธ [์๋ฆผ] MMCV ๋ฒ์ ๋ณ๊ฒฝ์ด ์์ด์ ์ถ๊ฐ ์์ ํ์ต๋๋ค! ย ๐โ๐โโ๐โโ๏ธ
๐โ๐โโ๏ธ๐โโ๏ธ [์๋ฆผ] MMdet ๋ฒ์ ๋ณ๊ฒฝ์ด ์์ด์ ์ถ๊ฐ ์์ ํ์ต๋๋ค! ย ๐โ๐โโ๐โโ๏ธ
mmdetection์ ์ด์ฉํ base line์ ๋๋ค.
๋ชจ๋ ํ๊ฒฝ์ colab์ ํตํ ๊ธฐ๋ณธ ํ๊ฒฝ์์ ์ด๋ฃจ์ด์ก์ต๋๋ค.
์ต์ข ๊ฒฐ๊ณผ๋ฌผ์ ์ colab๊ณผ ๊ฐ์ ํ์์ json ํ์ผ์ ๋๋ค.
ย
ย
from google.colab import drive
drive.mount('/content/drive')ย
import torch
import os
torch.__version__ย
import os
os.chdir('/content/')
os.mkdir('lg_test')
os.chdir('lg_test')๊ฒฝ๋ก ํ์ธ
os.getcwd()colabย ๊ธฐ์ค์ผ๋กย ์ค์ ํย ์ค์นย ๊ณผ์ ย ๋ง์ฝย ์์์ย pytorchย ๋ฒ์ ย ์ฌ์ฉย ์ย ๋ฐ์ย ๊ณผ์ ์ย ๋ฌ๋ผ์งย ์ย ์์
mmcv ๋ฒ์ ์ด ๋ณ๊ฒฝ๋์์ต๋๋ค!
!pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu113/torch1.12.0/index.html
!git clone https://github.com/open-mmlab/mmdetection.git
%cd mmdetection
!pip install -r requirements/build.txt
!pip install -v -e .ย
ย
%mkdir data
%cd dataย
!gdown --id 1kepvD1uQqhRBhkNb08r3rmocA2U3-3NF์์ถํ๊ธฐ
!unzip -qq "/content/lg_test/mmdetection/data/dataset.zip"ย
import json
with open("/content/lg_test/mmdetection/data/dataset/label_test.json") as f:
data_train = json.load(f)
data_train['categories'] = [{'id': 1, 'name': 'Normal'}]
print(data_train.keys())
with open('/content/lg_test/mmdetection/data/dataset/test.json', 'w') as f:
json.dump(data_train, f)ย
mmdetection์์ย ์ ๊ณตํ๋ย configย ์ฌ์ฉย ์ย ์ํ๋ย ๋ณ์๋กย ์ค์ ํด์ผย ํฉ๋๋ค.
๋น ๋ฅด๊ฒย ๋ชจ๋ธย inference๋ฅผย ์ํํ ย ๋ย ์ข์ต๋๋ค.
json ์ถ๋ ฅ ํ์ผ์ ๋ง๋ค๊ธฐ ์ํด mmdetection/tools/test.py ์์ ํ์ํ ๋ถ๋ถ์ ๋ณ๊ฒฝ์ ์ํํ์ต๋๋ค.
ย
import mmcv
from mmcv.runner import load_checkpoint
from mmdet.apis import inference_detector, show_result_pyplot
from mmdet.models import build_detector
from mmdet.apis import set_random_seed
def set_config():
# ์ฌ์ฉํ ๋ชจ๋ฐ ์ด๊ธฐ py ์ค์
config = './configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py'
# config ๋ถ๋ฌ์ค๊ธฐ
cfg = mmcv.Config.fromfile(config)
# config ์ base ๊ธฐ๋ก
cfg.base = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py'
# ๋ฐ์ดํฐ์
์ง์
cfg.dataset_type = 'CocoDataset'
# data_root๋ ์ฌ์ฉ์๊ฐ ์ ์ฅํ ๋ฐ์ดํฐ๊ฐ ์๋ ํด๋ ์ ๊น์ง
data_root = 'data/dataset/'
# class ์ค์
cfg.classes = ('Normal',)
# train, val, test ๋ฐ์ดํฐ์
์ ๋ํ type, data_root, ann_file, img_prefix ์ค์
cfg.data.samples_per_gpu=1
cfg.data.workers_per_gpu=0
cfg.data.train.data_root = data_root
cfg.data.train.ann_file = 'label(polygon)_train.json'
cfg.data.train.img_prefix = 'train/'
cfg.data.train.classes = cfg.classes
cfg.data.val.data_root = data_root
cfg.data.val.ann_file = 'label(polygon)_train.json'
cfg.data.val.img_prefix = 'train/'
cfg.data.val.classes = cfg.classes
cfg.data.test.data_root = data_root
cfg.data.test.ann_file = 'test.json'
cfg.data.test.img_prefix = 'test/'
cfg.data.test.classes = cfg.classes
# ํด๋์ค ์ ์ง์
cfg.model.roi_head.bbox_head.num_classes = 1
cfg.model.roi_head.mask_head.num_classes = 1
# ์ฌ์ ํ๋ จ ๋ชจ๋ธ ์ง์
cfg.checkpoint_config = dict(interval=1,out_dir='work_dirs/lg_mask/')
# ๊ฐ์ค์น ์ ์ฅ ์์น
cfg.work_dir = './work_dirs/lg_cfg2/'
# ํ๊ฐ ์งํ๋ก ์ค์
cfg.evaluation.metric = ['bbox', 'segm']
# epoch ์ค์
cfg.runner = dict(type='EpochBasedRunner', max_epochs=5)
# batch size ์ค์
cfg.auto_scale_lr = dict(enable=False, base_batch_size=16)
# gpu ์ค์ ๋ฐ seed ์ค์
cfg.seed = 0
cfg.gpu_ids = range(1)
cfg.device='cuda'
return cfgcfg = set_config()ย
ย
from mmdet.datasets import build_dataset
from mmdet.models import build_detector
from mmdet.apis import train_detector
# dataset ์์ฑ ๋ฐ model ์ค์
datasets = [build_dataset(cfg.data.train)]
model = build_detector(cfg.model)
model.CLASSES = datasets[0].CLASSES
# ํ๋ จ
train_detector(model, datasets, cfg, distributed=False, validate=True)ย
img = mmcv.imread('/content/lg_test/mmdetection/data/dataset/test/0087.jpg')
model.cfg = cfg
result = inference_detector(model, img)
show_result_pyplot(model, img, result)ย
ย
ํด๋น ์ฝ๋๋ mmdetection/tools/test.py ์ ๋ด์ฉ ์ค cfg๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๊ฒ ๋ณ๊ฒฝํ ์ฝ๋์ ๋๋ค.
์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ์ํํ ๋๋ ์๋ํ์ง ์์ ์ ์์ต๋๋ค.
test.py ๋ด์ฉ ํ์ธ์ ํด๋น ๋งํฌ๋ฅผ ์ฐธ์กฐํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค : test.py
ย
test๋ฅผ ์ํํ๊ธฐ ์ ์ cfg ๊ธฐ์กด ์ค์ ๋ค์ ์คํ
train์ ์ํํ๋ฉด์ ์ค์ ๋ ๋ด๋ถ ํ๋ผ๋ฏธํฐ ์ด๊ธฐํ ์ํด์
cfg = set_config()ย
import argparse
import os
import os.path as osp
import time
import warnings
import mmcv
import torch
from mmcv import Config, DictAction
from mmcv.cnn import fuse_conv_bn
from mmcv.runner import (get_dist_info, init_dist, load_checkpoint,
wrap_fp16_model)
from mmdet.apis import multi_gpu_test, single_gpu_test
from mmdet.datasets import (build_dataloader, build_dataset,
replace_ImageToTensor)
from mmdet.models import build_detector
from mmdet.utils import (build_ddp, build_dp, compat_cfg, get_device,
replace_cfg_vals, setup_multi_processes,
update_data_root)
# ํ์ํ ํ๋ผ๋ฏธํฐ ์ค์
checkpoint='work_dirs/lg_mask/lg_cfg2/latest.pth' # ํ๋ จ์ํจ ๋ชจ๋ธ ๊ฐ์ค์น
show=False
show_dir=None
show_score_thr=0.3
eval_options={'jsonfile_prefix': './work_dirs/out_json/predict'} # json ์ถ๋ ฅ ์ ์ฅ์์น
format_only = True
out = None
## ์ฌ๊ธฐ์ ๋ถํฐ ๊ธฐ์กด์ mmdetection/tools/test.py ๋ฅผ ๋ณ๊ฒฝํ ์ฝ๋ ##
cfg = replace_cfg_vals(cfg)
update_data_root(cfg)
cfg = compat_cfg(cfg)
setup_multi_processes(cfg)
# set cudnn_benchmark
if cfg.get('cudnn_benchmark', False):
torch.backends.cudnn.benchmark = True
if 'pretrained' in cfg.model:
cfg.model.pretrained = None
elif 'init_cfg' in cfg.model.backbone:
cfg.model.backbone.init_cfg = None
if cfg.model.get('neck'):
if isinstance(cfg.model.neck, list):
for neck_cfg in cfg.model.neck:
if neck_cfg.get('rfp_backbone'):
if neck_cfg.rfp_backbone.get('pretrained'):
neck_cfg.rfp_backbone.pretrained = None
elif cfg.model.neck.get('rfp_backbone'):
if cfg.model.neck.rfp_backbone.get('pretrained'):
cfg.model.neck.rfp_backbone.pretrained = None
cfg.gpu_ids = [cfg.gpu_ids]
cfg.device = get_device()
distributed = False
test_dataloader_default_args = dict(
samples_per_gpu=1, workers_per_gpu=2, dist=distributed, shuffle=False)
# in case the test dataset is concatenated
if isinstance(cfg.data.test, dict):
cfg.data.test.test_mode = True
if cfg.data.test_dataloader.get('samples_per_gpu', 1) > 1:
# Replace 'ImageToTensor' to 'DefaultFormatBundle'
cfg.data.test.pipeline = replace_ImageToTensor(
cfg.data.test.pipeline)
elif isinstance(cfg.data.test, list):
for ds_cfg in cfg.data.test:
ds_cfg.test_mode = True
if cfg.data.test_dataloader.get('samples_per_gpu', 1) > 1:
for ds_cfg in cfg.data.test:
ds_cfg.pipeline = replace_ImageToTensor(ds_cfg.pipeline)
test_loader_cfg = {
**test_dataloader_default_args,
**cfg.data.get('test_dataloader', {})
}
rank, _ = get_dist_info()
# build the dataloader
dataset = build_dataset(cfg.data.test)
data_loader = build_dataloader(dataset, **test_loader_cfg)
# build the model and load checkpoint
cfg.model.train_cfg = None
model = build_detector(cfg.model, test_cfg=cfg.get('test_cfg'))
fp16_cfg = cfg.get('fp16', None)
if fp16_cfg is not None:
wrap_fp16_model(model)
checkpoint = load_checkpoint(model, checkpoint, map_location='cpu')
if 'CLASSES' in checkpoint.get('meta', {}):
model.CLASSES = checkpoint['meta']['CLASSES']
else:
model.CLASSES = dataset.CLASSES
if not distributed:
# model = build_dp(model, torch.device(type = 'cuda'), device_ids=cfg.gpu_ids)
model = build_dp(model, device_ids= range(1))
outputs = single_gpu_test(model, data_loader, show, show_dir,
show_score_thr)
rank, _ = get_dist_info()
if rank == 0:
if out:
print(f'\nwriting results to {out}')
mmcv.dump(outputs, out)
kwargs = {} if eval_options is None else eval_options
if format_only:
dataset.format_results(outputs, **kwargs)ย
ย
import json
with open("/content/lg_test/mmdetection/work_dirs/out_json/predict.bbox.json") as f:
out_data1 = json.load(f)
with open("/content/lg_test/mmdetection/work_dirs/out_json/predict.segm.json") as f:
out_data2 = json.load(f)out_data2
>> {'bbox': [558.1932983398438,
671.9804077148438,
88.63323974609375,
66.42950439453125],
'category_id': 1,
'image_id': 0,
'score': 0.951795756816864,
'segmentation': {'counts': 'le_a0>ao03L3N2O1N2O1O1N2O2M2O1N2N2O1O1N101N101N101M2O1O1O2N1O100O1O100O100O10000O100O01000O10000000O10000000001N10001O001O001N2O1O1O1O1O1N2O2N1O1O001O1O1O1O2N100N3N2N1N2O2N1N3M2O2LkYic0',
'size': [1024, 1280]}},....