//
Search
🔨

[1_2_1.1.1] MMOCR 에서 제공되는 임의의 recognition 모델을 평가할 수 있는 작은 데이터셋을 배치한다.

상태
Done
담당
마감일
2022/11/16
요약
해당 데이터로 모델 학습, 평가가 가능하면 끝
선행 태스크 상태
Done
후행 태스크
관련 마일스톤
2 more properties
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
복사