OCR은 광학 문자 인식(Optical character recognition)으로, 이미지에서 문자를 추출해 컴퓨터에서 편집가능한 문자 형식으로 변환하는 것입니다.
OCR 관련 논문과 여러 모델들을 찾아보며 알게된 사실이 있습니다. 바로 OCR은 Detection 모델과 Recognition 모델이 결합한 모델이라는 것입니다.
저희는 대표적인 오픈소스 모델인 tesseract, PaddleOCR, EasyOCR을 비교해보았습니다.
이들을 같은 사진으로 여러번 비교해본 결과, EasyOCR이 가장 정확하게 변환했고 EasyOCR을 fine-tunning하기로 결정했습니다. 모델에 대한 설명은 생략하겠습니다.
easyocr을 훈련시키는 방법을 찾아봤더니 대부분 네이버 ClovaAI에서 제공하는 deep-text-recognition-benchmark의 훈련 방법을 따라했습니다. 저도 구글링으로 다양한 글을 참고하며 모델을 훈련시켰습니다.
사실 AIhub의 데이터를 사용하기 전에 textrecognitiondatagenerator를 이용해 텍스트 이미지를 직접 생성했었는데, 이걸로 fine-tunning한 모델의 인식결과가 매우 처참해서 AIhub데이터를 사용해 처음부터 다시 학습시켰습니다.
모델 훈련 전 AIhub에서 다운 받은 데이터를 전처리해야했습니다.
우선 각 사진마다있는 json파일에서 텍스트별로 바운딩박스 좌표를 추출해 해당 사진에서 단어들만 크롭한 사진을 따로 저장했습니다.
이제막 추출하려고 할때, 화장품 성분명인 사진만 추출하려고했습니다. 그래서 '대한화장품협회'에서 제공하는 '화장품 성분명 표준화를 위한 기준(2019)'를 참고했습니다.
단일성분으로 간주하는 복수원료의 성분명칭을 [ / ](slash, 사선)로 이어서 표시하고 이것을 ( )로 묶는다.
...
혼합한 복수의 동식물에서 얻은 추출물은 하나의 성분으로 기재한다.
그리고 화장품 성분사전을 다운받아 사진에 있는 단어가 성분사전에 존재하는지 확인 후 사진을 크롭했습니다.
하지만 추출하는데 시간이 오래걸렸습니다. 그래서 어떻게 더 빠르게 추출할지 고민했는데,
굳이 성분명인 부분만 크롭하지 않고 필요없는 기호들만 걸러서 모든 단어를 추출해야 학습 데이터가 더 많아질 것이라고 생각했습니다. 그 이유는, 일반적으로 학습 데이터가 많을수록 모델 성능이 좋아지기 때문입니다.
데이터의 품질도 중요하지만 가지고 있는 데이터의 품질이 이미 검증되었기 때문에 ocr모델의 인식성능을 저해할 것이라고 생각하지 않았습니다.
그래서 다음과 같은 순서로 데이터셋을 만들었습니다.
- ‘전성분’,’성분명’,’성분’이 없는 라벨링.json파일의 이미지는 제외하기
- 학습시킬땐 모델 구조상 전성분 부분만 학습할 필요 없음
- 문자열마다 지정된 bbox 부분만 크롭하고 흑백 변환, 파일명=문자열로 저장
- 이미지 세로길이 모두 동일하게 맞춰야함 → 평균값으로 확대 or 축소
- 훈련/검증 데이터 나누고 각 데이터셋 마다 gt.txt 파일 만들기
- lmdb 변환
노트북 저장공간의 한계로 인해 모든 원본데이터셋을 한번에 전처리하지 않고 모델 학습 결과를 보며 그때그때 추가로 만들었습니다.
4번의 훈련동안 사용된 훈련데이터(크롭한 이미지)는 총 533,764장이고 검증데이터는 총 247,965장입니다.
(훈련데이터 : 검증데이터 = 0.68 : 0.32)
코드를 올리고 싶지만 파일이 날아가버렸습니다..
다음 편은 모델 훈련 과정을 설명하겠습니다.
'프로젝트' 카테고리의 다른 글
[DSBA]예비프로젝트 : OCR모델 후처리 (0) | 2023.08.22 |
---|---|
[DSBA]예비프로젝트 : 모델 훈련(2) (0) | 2023.08.20 |
[DSBA]예비프로젝트 : 모델 훈련(1) (0) | 2023.08.19 |
[DSBA]예비프로젝트 : 프로젝트 기획 (0) | 2023.08.04 |
딥러닝으로 뉴진스 멤버 분류해보기 (0) | 2023.02.18 |