•
ICDAR 2015가 가장 만만하다.
◦
ICDAR 2015 은 model zoo 에 존재한다. 즉, 이미 data obtainer 과 data converter 모두가 잘 명세되어 있다. 데이터를 다운로드받기도 쉽고, 변환 방법을 빠르게 공부해서 Aihub 데이터셋에 적용하기도 편하다.
데이터 다운로드받기
•
dataset_zoo 디렉토리의 설정파일은 크게 data_obtainer 설정과 data_converter 설정으로 이루어져 있음을 알 수 있다.
data_root = 'data/icdar2015'
cache_path = 'data/cache'
data_obtainer = dict(
type='NaiveDataObtainer',
cache_path=cache_path,
data_root=data_root,
files=[
dict(
url='https://rrc.cvc.uab.es/downloads/ch4_training_images.zip',
save_name='ic15_textdet_train_img.zip',
md5='c51cbace155dcc4d98c8dd19d378f30d',
split=['train'],
content=['image'],
mapping=[['ic15_textdet_train_img', 'textdet_imgs/train']]),
dict( ... ),
dict( ... ),
dict( ... ),
])
data_converter = dict(
type='TextDetDataConverter',
splits=['train', 'test'],
data_root=data_root,
gatherer=dict(...),
parser=dict(...),
dumper=dict(...),
delete=[...])
Python
복사
•
DataObtainer 클래스를 어떻게 사용하는지 알아야 한다. DataObtainer 클래스의 역할은 아래 코드의 주석에 명시된 내용과 같다.
mmocr/datasets/preparers/data_obtainer.py
class NaiveDataObtainer:
"""A naive pipeline for obtaining dataset.
download -> extract -> move
Args:
files (list[dict]): A list of file information.
cache_path (str): The path to cache the downloaded files.
data_root (str): The root path of the dataset.
task (str): The task of the dataset.
"""
# ...
Python
복사
•
하지만 DataObtainer 클래스는 독립적으로 사용되지 않는다. DataObtainer 클래스에 정의된 파이프라인은 DatasetPreparer 클래스에서 자동으로 불러와 실행되도록 코드가 작성되어 있다. 주석을 봐도 알 수 있고, 코드를 봐도 쉽게 알 수 있다. DatasetPreparer 클래스가 호출되면 __call__() 메서드가 실행되고, 다시 내부에서 DataObtainer 클래스의 인스턴스의 __call__() 메서드가 실행될 것이다.
mmocr/datasets/preparers/data_preparer.py
class DatasetPreparer:
"""Base class of dataset preparer.
Dataset preparer is used to prepare dataset for MMOCR. It mainly consists
of two steps:
1. Obtain the dataset
- Download
- Extract
- Move/Rename
2. Process the dataset
- Parse original annotations
- Convert to mmocr format
- Dump the annotation file
- Clean useless files
"""
# ...
def __call__(self):
"""Prepare the dataset."""
if self.with_obtainer:
print('Obtaining Dataset...')
self.data_obtainer()
if self.with_converter:
print('Converting Dataset...')
self.data_converter()
Python
복사
•
DatasetPreparer 을 실행하기 전에 우선 DataObtainer 이 어떻게 실행되는지 알아보자. 코드는 굉장히 직관적으로 작성되어 있다. data_obtainer = dict(...) 의 정보를 참고하여 캐싱된 파일이 없으면 데이터셋 압축파일을 다운로드받고(self.download()), 압축을 풀고(self.extract()), 적절한 디렉터리로 옮긴다(self.move()). 만약 커스텀 데이터를 사용하고자 한다면 일단 Obtainer 클래스를 상속받거나 새로운 클래스를 구현하면 될 것이다.
class NaiveDataObtainer:
# ...
def __call__(self):
for file in self.files:
save_name = file.get('save_name', None)
url = file.get('url', None)
md5 = file.get('md5', None)
download_path = osp.join(
self.cache_path,
osp.basename(url) if save_name is None else save_name)
# Download required files
if not check_integrity(download_path, md5):
self.download(url=url, dst_path=download_path)
# Extract downloaded zip files to data root
self.extract(src_path=download_path, dst_path=self.data_root)
# Move & Rename dataset files
if 'mapping' in file:
self.move(mapping=file['mapping'])
self.clean()
Python
복사
•
DatasetPreparer 실행
◦
recognition
python3 -m tools.dataset_converters.prepare_dataset icdar2015 --task textrecog
Python
복사
데이터 변환하기
•
DatasetPreparer 은 데이터를 MMOCR 표준으로 변환해 저장한다. 따라서 지금은 딱히 고민할 것이 없다. 변환 파이프라인에 대해서는 나중에 따로 알아본다.
•
단, OCR 태스크가 처음이라면 recognition 데이터셋이 어떻게 만들어지는지 감이 잘 잡히지 않을 수 있다. ICDAR 2015 데이터셋의 경우, 다음과 같은 형태의 text recognition 데이터셋이 생성된다.
textdet_test.json
{
"metainfo":
{
"dataset_type": "TextRecogDataset",
"task_name": "textrecog",
"category": [{"id": 0, "name": "text"}]
},
"data_list": [
{"instances": [{"text": "JOINT"}],
"img_path": "textrecog_imgs/test/word_1.png"},
{"instances": [{"text": "yourself"}],
"img_path": "textrecog_imgs/test/word_2.png"},
...
]
}
Python
복사
textrecog_imgs/test/word_1.png
textrecog_imgs/test/word_2.png
MMOCR detection 데이터로 변환하기
•
프로젝트 스캐폴드에 맞게 데이터 저장 루트 디렉토리를 변경한다.
dataset_zoo/icdar2015/textdet.py
data_root = 'data/det/icdar2015'
Python
복사
•
DatasetPreparer 실행
# command
python3 -m tools.dataset_converters.prepare_dataset icdar2015 --task textdet
Python
복사
detection 모델 평가하기
•
•
저장된 데이터 형태에 맞게 수정
configs/textdet/_base_/datasets/icdar2015.py
ic15_det_data_root = 'data/det/icdar2015'
ic15_det_train = dict(
type='OCRDataset',
data_root=ic15_det_data_root,
ann_file='textdet_train.json',
filter_cfg=dict(filter_empty_gt=True, min_size=32),
pipeline=None)
ic15_det_test = dict(
type='OCRDataset',
data_root=ic15_det_data_root,
ann_file='textdet_test.json',
test_mode=True,
pipeline=None)
Python
복사
•
◦
single gpu
# command
# python3 -m tools.test {config_file_path} {pth_path}
python3 -m tools.test \
configs/textdet/dbnet/dbnet_resnet18_fpnc_1200e_icdar2015.py \
work_dirs/dbnet_resnet18_fpnc_1200e_icdar2015_mini/epoch_400.pth
Bash
복사
◦
multi gpu
# command
# tools/dist_test.sh {config_file_path} {pth_path} {n_gpu}
tools/dist_test.sh \
configs/textdet/dbnet/dbnet_resnet18_fpnc_1200e_icdar2015.py \
work_dirs/dbnet_resnet18_fpnc_1200e_icdar2015_mini/epoch_400.pth \
2
Bash
복사
MMOCR recognition 데이터로 변환하기
•
프로젝트 스캐폴드에 맞게 데이터 저장 루트 디렉토리를 변경한다.
dataset_zoo/icdar2015/textdet.py
data_root = 'data/det/icdar2015'
Python
복사
•
DatasetPreparer 실행
# command
python3 -m tools.dataset_converters.prepare_dataset icdar2015 --task textdet
Python
복사
recognition 모델 학습 및 평가하기
•
•
학습
◦
저장된 데이터 형태에 맞게 수정
configs/textdet/_base_/datasets/icdar2015.py
ic15_rec_data_root = 'data/rec/icdar2015'
ic15_rec_train = dict(
type='OCRDataset',
data_root=ic15_rec_data_root,
ann_file='textrecog_train.json',
test_mode=False,
pipeline=None)
ic15_rec_test = dict(
type='OCRDataset',
data_root=ic15_rec_data_root,
ann_file='textrecog_test.json',
test_mode=True,
pipeline=None)
Python
복사
•
평가
◦
single gpu
# command
# python3 -m tools.test {config_file_path} {pth_path}
python3 -m tools.test \
configs/textrecog/sar/sar_resnet31_parallel-decoder_500e_icdar2015.py \
work_dirs/sar_resnet31_parallel-decoder_500e_icdar2015/epoch_500.pth
Bash
복사
◦
multi gpu
# command
# tools/dist_test.sh {config_file_path} {pth_path} {n_gpu}
tools/dist_test.sh \
configs/textrecog/sar/sar_resnet31_parallel-decoder_500e_icdar2015.py \
work_dirs/sar_resnet31_parallel-decoder_500e_icdar2015/epoch_500.pth \
2
Bash
복사