작성
·
262
0
안녕하세요 강사님, 항상 좋은 수업 잘 듣고있습니다.
mmdetection으로 Mask-RCNN + Resnet-101 model Training중 Training Dataset 구성 관련하여 질문있습니다.
제가 기존 model을 학습시키는데 사용된 모든 이미지 데이터는 1280x720 해상도였습니다.
그러나 이번에 수집한 데이터는 2208x1242 해상도입니다.
Q1. 각기 다른 해상도로 촬영된 이미지들을 하나의 데이터셋으로 만들고, 네트워크에 학습시켜도 문제가 없을까요?
당연히 COCO dataset이나 PASCAL dataset을 살펴봐도 다양한 해상도의 이미지를 annotation하여 구성하였기 때문에 문제될 건 없다고 생각하는데
일반적으로, 1280x720 해상도 이미지를 추론하는 경우, 동일한 해상도의 데이터셋으로 학습된 모델이 성능이 더 우수한지 궁금해서요.
ex) 1280x720 이미지 추론시, 1280x720 해상도만으로 이루어진 데이터셋으로 학습된 model 사용
1920x1080 이미지 추론시, 1920x1080 해상도만으로 이루어진 데이터셋으로 학습된 model 사용
2208x1242 이미지 추론시, 2208x1242 해상도만으로 이루어진 데이터셋으로 학습된 model 사용
만약 일반적으로 이렇게 한다면, 새로 획득한 데이터가 아닌 라벨링되지 않은 1280x720해상도 데이터들을 더 annotation 작업 진행하려 합니다.
답변 1
0
안녕하십니까,
mmdetection은 서로 다른 이미지 사이즈를 가진 데이터 세트로 학습 및 추론이 모두 가능하지만, 내부적으로는 이들 서로 다른 이미지 사이즈를 공통 이미지 사이즈로 다시 Resize합니다. 결론적으로 말씀드리면 모델 내부에 입력될때는 공통의 이미지 사이즈가 필요합니다.
예를 들어 faster_rcnn_r50_fpn_1x_coco.py config기반에서 이미지를 1333x800으로 재 구성합니다.
그러니까 어떠한 이미지 사이즈를 가져다 놓더라도 1333x800으로 재 구성하게 됩니다.
1280x720 보다는 1920x1080로 학습하는 것이 모델 성능이 더 좋을 겁니다.
하지만 이를 적용하려면 아래 /content/mmdetection/configs/_base_/datasets/coco_detection.py 파일에서 train_pipeline과 img_scale을 원하는 사이즈로 변경해 주셔야 합니다.
# dataset settings
dataset_type = 'CocoDataset'
data_root = 'data/coco/'
img_norm_cfg = dict(
mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)
train_pipeline = [
dict(type='LoadImageFromFile'),
dict(type='LoadAnnotations', with_bbox=True),
dict(type='Resize', img_scale=(1333, 800), keep_ratio=True),
dict(type='RandomFlip', flip_ratio=0.5),
dict(type='Normalize', **img_norm_cfg),
dict(type='Pad', size_divisor=32),
dict(type='DefaultFormatBundle'),
dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']),
]
test_pipeline = [
dict(type='LoadImageFromFile'),
dict(
type='MultiScaleFlipAug',
img_scale=(1333, 800),
flip=False,
transforms=[
dict(type='Resize', keep_ratio=True),
dict(type='RandomFlip'),
dict(type='Normalize', **img_norm_cfg),
dict(type='Pad', size_divisor=32),
dict(type='ImageToTensor', keys=['img']),
dict(type='Collect', keys=['img']),
])
]
data = dict(
samples_per_gpu=2,
workers_per_gpu=2,
train=dict(
type=dataset_type,
ann_file=data_root + 'annotations/instances_train2017.json',
img_prefix=data_root + 'train2017/',
pipeline=train_pipeline),
val=dict(
type=dataset_type,
ann_file=data_root + 'annotations/instances_val2017.json',
img_prefix=data_root + 'val2017/',
pipeline=test_pipeline),
test=dict(
type=dataset_type,
ann_file=data_root + 'annotations/instances_val2017.json',
img_prefix=data_root + 'val2017/',
pipeline=test_pipeline))
evaluation = dict(interval=1, metric='bbox')
기존 1280x720 해상도 이미지를 img_scale=(1333, 800) 이 아닌
img_scale=(1920, 1080)으로 늘려서 학습하면 성능이 개선된다는 말씀이신가요?
아니면 고해상도의 1920x1080의 이미지를 데이터셋으로 하여 img_scale=(1920,1080)으로 해야 성능이 개선된다는 말씀이신가요?