OCR, 트랜스포머를 곁들인[3]

OCR, 트랜스포머를 곁들인 [1]본래 이 프로젝트는 작년 말부터 시작되어 올해 초에 끝낸 프로젝트였다. 그러나 개선 과제가 남아 있어… blog.naver.com OCR, 트랜스포머를 곁들인 [1]원래 이 프로젝트는 지난해 말부터 시작해 올해 초에 마무리한 프로젝트였다. 그러나 개선과제가 남아있어… blog.naver.com

 

OCR, 트랜스포머가 있는 [2](제1탄에 이어…) 인코더-디코더 기반의 TrOCR 모델은 성능은 좋았지만, 2개 부분에서 큰 결점이 있었다… blog.naver.com OCR, 트랜스포머가 있는 [2](제1탄에 이어…) 인코더-디코더 기반의 TrOCR 모델은 성능은 좋았지만, 2개 부분에서 큰 결점이 있었다… blog.naver.com

(1, 2편에 이어…) 많은 시도를 했지만, Inference 시간이 유의미하게 줄어들거나 정확도가 좀 더 오르지는 않았다. 그래서 모델 구조를 바꿔보기로 했다. 먼저 최신 OCR 기술의 흐름을 살펴봤다. (1, 2편에 이어…) 많은 시도를 했지만, Inference 시간이 유의미하게 줄어들거나 정확도가 좀 더 오르지는 않았다. 그래서 모델 구조를 바꿔보기로 했다. 먼저 최신 OCR 기술의 흐름을 살펴봤다.

최근 OCR 관련 발표 기술부터 먼저 다양한 OCR 관련 기술과 논문을 살펴봤다. 대상이 된 것은 Score의 높은 논문이었다. 최근 OCR 관련 발표 기술부터 먼저 다양한 OCR 관련 기술과 논문을 살펴봤다. 대상이 된 것은 Score의 높은 논문이었다.

먼저 네이버 연구진이 발표한 도넛이다. ([OCR-free Document Understanding Transformer]) 이 모델의 가장 큰 특징은 OCR 모델을 앞쪽 단에 두고 추출한 Text를 input으로 KIE(Key Information Extraction)를 진행하는 다른 모델과 달리 모든 Task를 End-to-end로 처리하는 모델이라는 점이다. 문서 이미지에서 주요 정보를 추출하는 VDU(Visual Document Understanding)와 같은 기술은 필수적이며, 보통 [문서 이미지에서 텍스트 읽기→전체적 문서 이해하기] 순으로 진행되지만, OCR을 선행하는 것에는 expensive cost의 문제가 있으며, 여기서 error가 발생할 경우 VDU 성능을 저하시킨다는 치명적인 단점이 존재한다. 이에 OCR dependency를 없애기 위해 OCR-free VDU 모델인 Donut를 설계했으며, 강력한 이해력을 바탕으로 accuracy와 speed 모두 좋은 성능을 보였다. 그러나 우리는 Text Detection 및 KIE 부분에서는 다른 모델을 사용하고 있었기 때문에 우선 제외했다. 먼저 네이버 연구진이 발표한 도넛이다. ([OCR-free Document Understanding Transformer]) 이 모델의 가장 큰 특징은 OCR 모델을 앞쪽 단에 두고 추출한 Text를 input으로 KIE(Key Information Extraction)를 진행하는 다른 모델과 달리 모든 Task를 End-to-end로 처리하는 모델이라는 점이다. 문서 이미지에서 주요 정보를 추출하는 VDU(Visual Document Understanding)와 같은 기술은 필수적이며, 보통 [문서 이미지에서 텍스트 읽기→전체적 문서 이해하기] 순으로 진행되지만, OCR을 선행하는 것에는 expensive cost의 문제가 있으며, 여기서 error가 발생할 경우 VDU 성능을 저하시킨다는 치명적인 단점이 존재한다. 이에 OCR dependency를 없애기 위해 OCR-free VDU 모델인 Donut를 설계했으며, 강력한 이해력을 바탕으로 accuracy와 speed 모두 좋은 성능을 보였다. 그러나 우리는 Text Detection 및 KIE 부분에서는 다른 모델을 사용하고 있었기 때문에 우선 제외했다.

다음은 HE Block을 활용하는 HENet이라고 하는 아키텍처인데, 별로 도움이 될 것 같지 않고, 간단하게 조사할 뿐이었다. 다음은 HE Block을 활용하는 HENet이라고 하는 아키텍처인데, 별로 도움이 될 것 같지 않고, 간단하게 조사할 뿐이었다.

다음은 [Easter2.0: Improving convolutional models for handwritten text recognition] 라는 논문이다. 최근 많은 연구에 따르면 Encoder를 통해 이미지를 읽고 특징을 추출하려면 CNN 계열을 사용하고 Decoder에서 언어를 생성하려면 트랜스포머 계열을 많이 사용하는데, 이 실험에서는 CNN을 기반으로 한 모델을 제안하고자 하며, 이를 위해 가장 필요한 것은 충분한 양의 고품질 이미지(sufficient amounts of high quality training data)라고 밝히고 있다. 여기서는 두 가지 방법론을 제안하고 있는데, 첫 번째는 간단한 데이터 증량 기술로 수기 데이터에 사용되어 유효성이 입증된 TACO이고, 다른 하나는 CNN 기반 아키텍처에서 dense residual Connection과 squeeze-and-excitation 모듈을 적용한 1차원 convlolution을 이용하는 Easter 2.0이다. 하지만 우리는 트랜스포머 기반의 모델을 사용하고 싶었기 때문에 이것도 건너뛰었다. 다음은 [Easter2.0: Improving convolutional models for handwritten text recognition] 라는 논문이다. 최근 많은 연구에 따르면 Encoder를 통해 이미지를 읽고 특징을 추출하려면 CNN 계열을 사용하고 Decoder에서 언어를 생성하려면 트랜스포머 계열을 많이 사용하는데, 이 실험에서는 CNN을 기반으로 한 모델을 제안하고자 하며, 이를 위해 가장 필요한 것은 충분한 양의 고품질 이미지(sufficient amounts of high quality training data)라고 밝히고 있다. 여기서는 두 가지 방법론을 제안하고 있는데, 첫 번째는 간단한 데이터 증량 기술로 수기 데이터에 사용되어 유효성이 입증된 TACO이고, 다른 하나는 CNN 기반 아키텍처에서 dense residual Connection과 squeeze-and-excitation 모듈을 적용한 1차원 convlolution을 이용하는 Easter 2.0이다. 하지만 우리는 트랜스포머 기반의 모델을 사용하고 싶었기 때문에 이것도 건너뛰었다.

다음은 pretrained 모델의 unified multimodal을 제안한 [Transferring General Multimodal Pretrained Models to Text Recognition]이라는 논문이다. pretrain된 중국어 모델과 Transformer의 encoder-decoder 프레임워크 기반 모델을 사용하여 중국어 관련 모든 데이터셋에서 SOTA를 달성하였다. 하지만 중국어 데이터는 표의문자로 표음문자인 한국어와 성격이 다르다고 판단했기 때문에 이 역시 통과했다. 다음은 pretrained 모델의 unified multimodal을 제안한 [Transferring General Multimodal Pretrained Models to Text Recognition]이라는 논문이다. pretrain된 중국어 모델과 Transformer의 encoder-decoder 프레임워크 기반 모델을 사용하여 중국어 관련 모든 데이터셋에서 SOTA를 달성하였다. 하지만 중국어 데이터는 표의문자로 표음문자인 한국어와 성격이 다르다고 판단했기 때문에 이 역시 통과했다.

마지막으로 [Towards Accurate Scene Text Recognition with Semantic Reasoning Networks]라는 논문에서 기존 모델들은 전단에서 제한된 정보만 받고 초반에 잘못된 디코딩 정보를 받으면 이후 집값을 추론하는 과정에서 문제가 되는 점을 지적했다. 이를 보완하기 위해 서브 네트워크 구조인 SRN을 제안하였다. SRN은 end-to-end의 훈련 가능한 틀로 4가지로 구성되는데, Input 이미지가 주어지면 2차원 형태의 V개 feature를 추출하는 Backbone Network, N개의 1차원 형태의 G만의 feature를 생성하며, 각 feature는 텍스트 내의 문자와 대응하여 시각적 정보를 담고 있는 PVAM(Parallel Visual Attention Module), N1-D features G에서 의미론적 정보S를 캡처하는 GSRM(Global Semantic Reasoning Module, G와 S를 결합하여. 아이디어는 좋지만 모델 구조가 복잡해 단기간에 학습을 진행하기 힘들다고 판단해 제외했다. 마지막으로 [Towards Accurate Scene Text Recognition with Semantic Reasoning Networks]라는 논문에서 기존 모델들은 전단에서 제한된 정보만 받고 초반에 잘못된 디코딩 정보를 받으면 이후 집값을 추론하는 과정에서 문제가 되는 점을 지적했다. 이를 보완하기 위해 서브 네트워크 구조인 SRN을 제안하였다. SRN은 end-to-end의 훈련 가능한 틀로 4가지로 구성되는데, Input 이미지가 주어지면 2차원 형태의 V개 feature를 추출하는 Backbone Network, N개의 1차원 형태의 G만의 feature를 생성하며, 각 feature는 텍스트 내의 문자와 대응하여 시각적 정보를 담고 있는 PVAM(Parallel Visual Attention Module), N1-D features G에서 의미론적 정보S를 캡처하는 GSRM(Global Semantic Reasoning Module, G와 S를 결합하여. 아이디어는 좋지만 모델 구조가 복잡해 단기간에 학습을 진행하기 힘들다고 판단해 제외했다.

디코더 모델 layer수를바꾸는데코더모델 layer수를 바꾸다

우선 기존 학습모델의 디코더 layer의 수를 바꾸어 보기로 하였다. 기존 한국어 기반 GPT 모델은 총 12개의 layer를 가지고 있었으나 이번에는 6개, 9개만 선택해 학습을 진행하고 결과를 비교했다. 한국어, 영어, 숫자, 혼합어가 골고루 섞인 총 100,000장의 간단한 Sample Dataset으로 학습한 후 4,500장의 Test Set을 inference한 결과를 살펴봤다. 우선 모델의 크기를 봤을 때 인코더-디코더 레이어 수가 12-12인 기존 모델의 경우 2억 4천만 개 정도의 parameter를 가지고 있었다면 12-9 모델의 경우 2억 1천만 개, 12-6 모델의 경우 1억 8천만 개 정도의 파라미터를 가지고 있었다. 화상 당의 평균 inference 시간을 비교했을 때는, 12-12가 0.16초, 12-9가 0.13초, 12-6가 0.1초 정도의 시간이 걸렸다. 그 후 인코더의 layer수도 조절하면서 비교하였으나 인코더의 경우는 layer수가 12개 이상이어야 성능이 나오며 디코더의 경우 OCR 성능에 큰 영향을 미치지 않는 것으로 나타났다. 우선 기존 학습모델의 디코더 layer의 수를 바꾸어 보기로 하였다. 기존 한국어 기반 GPT 모델은 총 12개의 layer를 가지고 있었으나 이번에는 6개, 9개만 선택해 학습을 진행하고 결과를 비교했다. 한국어, 영어, 숫자, 혼합어가 골고루 섞인 총 100,000장의 간단한 Sample Dataset으로 학습한 후 4,500장의 Test Set을 inference한 결과를 살펴봤다. 우선 모델의 크기를 봤을 때 인코더-디코더 레이어 수가 12-12인 기존 모델의 경우 2억 4천만 개 정도의 parameter를 가지고 있었다면 12-9 모델의 경우 2억 1천만 개, 12-6 모델의 경우 1억 8천만 개 정도의 파라미터를 가지고 있었다. 화상 당의 평균 inference 시간을 비교했을 때는, 12-12가 0.16초, 12-9가 0.13초, 12-6가 0.1초 정도의 시간이 걸렸다. 그 후 인코더의 layer수도 조절하면서 비교하였으나 인코더의 경우는 layer수가 12개 이상이어야 성능이 나오며 디코더의 경우 OCR 성능에 큰 영향을 미치지 않는 것으로 나타났다.

새로운 모델 새로운 모델

상기에서 다양한 테스트를 수행한 결과, 인코더 레이어 수는 적어도 12개여야 하며 디코더 레이어 수는 모델에 크게 영향을 주지 않음을 알 수 있었다. 이러한 아이디어를 바탕으로 디코더 모델을 좀 더 가벼운 것을 사용해 보고, 또 레이어 수도 줄여 성능 및 속도를 확인한 후 새로운 모델을 학습시키기로 했다. 대상은 주로 해깅페이스에 업데이트된 한국어 전용 상업적 이용이 가능한 (혹시 모르니) 모델을 대상으로 했다. 크게 토크나이저 종류별로 모델을 하나씩 선택했는데 BPE(Byte Pair Encoding), Wordpiece, Character-level 토크나이저가 각각 대상이었다. Sentence_level의 경우는 OCR이 문장보다는 단어 단위로 inference를 수행하기 때문에 따로 선택하지 않았다. 학습을 진행할 때 유의할 점은 토크나 로딩 시 존재하지 않는 special token이 입력되어 있을 경우 이를 직접 수정해야 한다는 것이었다. 토크나이저에 cls_token_id가 있는 경우 decoder_start_token_id로 설정하고, 없는 경우 bos_token_id를 설정하고 있으며, sep_token_id가 있는 경우 eos_token_id로 설정하지 않은 경우 eos_token_id를 설정하였다. pad_token_id는 그대로 토크나이저의 pad_token_id로 설정하였다. 상기에서 다양한 테스트를 수행한 결과, 인코더 레이어 수는 적어도 12개여야 하며 디코더 레이어 수는 모델에 크게 영향을 주지 않음을 알 수 있었다. 이러한 아이디어를 바탕으로 디코더 모델을 좀 더 가벼운 것을 사용해 보고, 또 레이어 수도 줄여 성능 및 속도를 확인한 후 새로운 모델을 학습시키기로 했다. 대상은 주로 해깅페이스에 업데이트된 한국어 전용 상업적 이용이 가능한 (혹시 모르니) 모델을 대상으로 했다. 크게 토크나이저 종류별로 모델을 하나씩 선택했는데 BPE(Byte Pair Encoding), Wordpiece, Character-level 토크나이저가 각각 대상이었다. Sentence_level의 경우는 OCR이 문장보다는 단어 단위로 inference를 수행하기 때문에 따로 선택하지 않았다. 학습을 진행할 때 유의할 점은 토크나 로딩 시 존재하지 않는 special token이 입력되어 있을 경우 이를 직접 수정해야 한다는 것이었다. 토크나이저에 cls_token_id가 있는 경우 decoder_start_token_id로 설정하고, 없는 경우 bos_token_id를 설정하고 있으며, sep_token_id가 있는 경우 eos_token_id로 설정하지 않은 경우 eos_token_id를 설정하였다. pad_token_id는 그대로 토크나이저의 pad_token_id로 설정하였다.

결과적으로 디코더 모델에 BART 형태의 모델을 달았을 때 가장 좋은 성능을 보였다. layer 수는 인코더인 ViT 모델이 12개의 layer를, 디코더인 BART 모델이 3개의 layer를 선택하였다. 이후 이미지를 최대 32개의 batch 단위로 처리하도록 해 Beam_Search가 아닌 GreedySearching이 되도록 하면 한 장의 평균 처리 속도가 0.03초 이하로 떨어지기도 했다. 정확도는 기존 모델과 비교했을 때 큰 차이가 없었지만 고유명사에 대한 성능은 크게 좋아진 모습을 보였다. 물론 100퍼센트 정확하게 맞춘다고 하기에는 아직 부족한 점이 있다 결과적으로 디코더 모델에 BART 형태의 모델을 달았을 때 가장 좋은 성능을 보였다. layer 수는 인코더인 ViT 모델이 12개의 layer를, 디코더인 BART 모델이 3개의 layer를 선택하였다. 이후 이미지를 최대 32개의 batch 단위로 처리하도록 해 Beam_Search가 아닌 GreedySearching이 되도록 하면 한 장의 평균 처리 속도가 0.03초 이하로 떨어지기도 했다. 정확도는 기존 모델과 비교했을 때 큰 차이가 없었지만 고유명사에 대한 성능은 크게 좋아진 모습을 보였다. 물론 100퍼센트 정확하게 맞춘다고 하기에는 아직 부족한 점이 있다

우선은 마지막에 설명한 모델을 최종적으로 선택하여 사용하고 있다. 생각보다 GPU메모리도 잘 안먹고 속도도 빨라서 다행이라고 생각해 우선은 마지막에 설명한 모델을 최종적으로 선택하여 사용하고 있다. 생각보다 GPU메모리도 잘 안먹고 속도도 빨라서 다행이라고 생각해

error: Content is protected !!