🙇🙇♂️🙇♀️ [알림] 기존 베이스라인 문의 사항이 많아서 한 번에 실행될 수 있도록 전체 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]}},....