[사이냅소프트 사내 기술 세미나 Inno Tech Day #1] 사이냅 OCR Pro에 적용된 기술은?
안녕하세요.
인공지능·전자문서 전문기업 사이냅소프트입니다.
2022년, 사이냅소프트 혁신개발본부에서 처음으로 진행되는 기술세미나 ‘Inno Tech Day’를 소개합니다.😊
“동료와 함께 배우고 공유하며 성장합니다.”
세상에는 많은 개발 기술이 존재합니다. 문제를 해결하기 위한 방법들도 너무 많을 것이고요.
이 모든 것들을 누군가 혼자서 공부해서 알기도 어렵고 해결책을 찾아낼 수도 없을 것입니다. 우리가 해결해야 할 문제와 알아야 할 것들이 많아진 지금, 스스로의 노력과 더불어 타인을 통해 배우고 타인과 함께해야만 원하는 만큼 성장하고 발전할 수 있는 때인 것 같습니다.
우리에게는 좋은 동료가 있고, 좋은 환경이 있고, 꽤 오랜 시간 쌓아놓은 노하우도 있습니다.
기술혁신본부에서는 멋진 동료들이 축적한 기술적 가치를 함께 나누고 함께 성장할 수 있는 기회를 만들기 위해
사이냅소프트의 사내 기술 세미나 ‘Inno Tech Day’를 시작하게 되었습니다.
by. Mobidic
——————————
Inno Tech Day. 첫 번째 이야기
사이냅 OCR Pro – 문서 내 표, 체크박스 인식을 위해 사용된 기술과 사례 소개
혁신개발팀 오효원
OCR 대상이 되는 이미지는 예시 이미지처럼 서식이 정해져있으면서 표로 구성되어 있는 문서들이 많습니다.
따라서 단순히 글자의 위치와 텍스트만 추출하기보다는 문서의 서식을 바탕으로
Key-Value 형태의 데이터를 추출하거나 구조화된 표 데이터를 추출할 필요가 있었습니다.
(좌) (주)사이냅소프트 – 재무상태표 / (우) 대한요양병원협회 – 코로나19 예방접종 예진표
이를 위해 사이냅 OCR Pro는 서식 인식 기능을 통한 Key-Value 형태의 데이터 추출과 사용자가 서식을 쉽게 설정할 수 있도록 GUI 기반의 서식 설정 도구 폼메이커를 제공하게 되었습니다.
하지만 표 형태의 서식의 경우 각 셀을 하나하나 설정해야 한다는 번거로움과 서식이 인식되었을 때 각 셀의 데이터가 별개로 인식되면서 표의 구조화 정보가 사라진다는 불편함이 있었습니다.
이러한 불편함을 해결하기 위해 표를 검출 및 인식하여 이미지 내 표의 크기 및 위치, 행렬 정보, 병합 여부를 찾을 수 있는 방법들을 검토했습니다.
그 중 하나에 대한 내용을 소개합니다!
식품의약품안전처 – 의약품의 위해성관리계획 가이드라인(민원인 안내서)
표는 선분들의 조합으로 이루어진 셀들과 각 셀 내부의 텍스트로 구성되어 있습니다. 이미지에서 표를 검출할 때는 표를 구성하고 있는 선분을 찾는 게 우선되어야 합니다.
이미지에서 선분을 어떻게 찾고 이를 이용해 표의 구조화된 데이터는 어떻게 만들까요?
#1. 표 검출 및 인식 프로세스
표 검출 및 인식 프로세스는 크게 3단계로 볼 수 있습니다.
■1단계 선분 추출
이미지에서 선분을 추출하는 단계부터 알아보겠습니다.
이미지에서 선분을 추출하기 전에 이진화를 먼저 진행합니다.
이미지를 그냥 이진화 하면 배경이 하얗고 글자와 성분은 까맣게 되지만, 흑백을 반전하여 배경은 까맣고 글자와 성분이 하얗게 되도록 이진화했습니다.
흑백 반전없이 이진화할 경우 배경 값이 1이 되고 글자 및 성분 값은 0이 되어 배경 값이 강조가 됩니다. 사람 눈에는 어떻게 이진화하더라도 배경과 글자 및 성분이 명확하게 구분될 테지만 실제로 값을 통해 데이터를 처리할 때는 처리 대상이 강조되어 있는 것이 작업하기 좋습니다.
이를 위해 우리가 집중하고자 하는 대상의 값이 1로 강조될 수 있도록 흑백을 반전하여 이진화한 것입니다. 이미지 이진화 후에는 모폴로지 연산을 통해 선분을 추출합니다.
모폴로지(Morphology)란 ‘형태학’이라는 뜻으로 객체의 형태에 대한 처리 및 추출에 사용되는 영상 처리 기법입니다. 노이즈를 제거하거나 원하는 형태의 객체를 추출하는 방식으로 활용됩니다.
https://docs.opencv.org/4.x/d9/d61/tutorial_py_morphological_ops.html
예제 이미지처럼 모폴로지 연산을 활용하면 객체 외부 또는 내부의 노이즈를 제거하고 객체의 형태를 강조할 수 있습니다. 이를 이용해 가로 및 세로 선분이 아닌 요소들은 노이즈로 간주하여 제거하고 선분은 강조하여 추출합니다.
OpenCV를 이용한 모폴로지 연산에 대한 자세한 내용은 https://docs.opencv.org/4.x/d9/d61/tutorial_py_morphological_ops.html 를 참고하세요.
■2단계 셀 정보 생성
이제 표를 이루고 있는 셀들의 행렬 정보와 크기 및 위치 정보를 만들 차례입니다.
이를 위해 첫 번째 단계에서 추출한 선분 정보를 활용합니다. 셀은 네 변을 가진 테두리가 있는 사각형의 형태를 띄고 있습니다. 하지만 선분 정보만으로는 각 셀들의 영역을 계산할 수가 없습니다.
어떻게 하면 계산할 수 있을까요?
셀이 네 변을 가지고 있다는 말은 네 개의 꼭짓점이 있다는 말과 동일합니다. 꼭짓점을 찾는다면 꼭짓점을 잇는 변도 찾을 수 있을 것이고, 변을 찾는다면 셀도 찾을 수 있을 것입니다. 추출한 선분들을 이용해 각 선분들이 교차하는 모든 교점을 찾습니다. 찾은 교점들은 셀의 꼭짓점이 됩니다.
선분과 교점 정보를 모두 활용한다면 각 셀의 크기 및 위치 정보와 병합 여부를 계산할 수 있습니다.
다음은 셀 정보를 이용해 표를 구조화할 차례입니다.
■3단계 표 데이터 구조화
이미지 내에는 표가 여러 개 있을 수 있고, 이때 당연히 각 표가 구분된 데이터를 만들어야 합니다. 앞선 단계에서 추출한 선분 정보와 교점 정보를 이용하여 각 표의 경계 영역(Boundary)을 계산합니다.
경계 영역(Boundary)과 두 번째 단계에서 생성한 셀 정보를 이용하면 셀들을 표 별로 분류할 수 있습니다. 셀들을 분류한 이후에는 OCR 인식 결과와 셀 정보를 매치하여 각 셀에 들어있는 텍스트 정보를 생성합니다.
이제 모든 정보를 활용하여 표를 구조화한 데이터를 생성하면 표 검출 및 인식 프로세스는 끝이 납니다. 날까요?
하지만, 끝이 아니었고 그 이후에도 ….
소개 드린 방법 외에도 여러 가지 방법들을 검토했으며 표 검출 및 인식 기능을 완성한 후에는 여러 번의 품질 테스트를 진행하였습니다. 테스트에는 사이냅소프트가 가지고 있는 문서 데이터와 렌더링 엔진을 이용해 생성한 표 데이터를 사용하여
테스트 준비 시간을 단축시키면서도 테스트 셋을 다양화하였습니다. 중첩된 형태의 표라던가 선분 요소들이 노이즈로 인해 균일하지 않은 경우 등 여러 개선 포인트들이 있었는데요. 기능이 완성된 직후에는 78%이던 정확도가 여러 번의 개선 작업을 통해 현재는 95%까지 개선되었습니다.
#2. 체크박스 검출 및 인식 과정
그다음으로는 체크박스 인식에 대해 이야기해 보려고 합니다.
편의상 체크박스 인식이라고 표현하고 있으나 정확히는 체크박스의 체크 여부 인식입니다. 서식 인식 기능을 통해 체크박스 영역을 추출하고 해당 영역의 체크박스가 체크되었는지 여부를 인식하고자 했습니다. 인식이라고 표현하지만 체크됐음(True)과 체크되지 않음(False)를 판단하는 일종의 Classification입니다.
체크박스 인식의 경우, 체크박스 모양도 다양하고 체크 방식과 색깔 또한 다양합니다. 기능 구현을 위해서는 당연히 이러한 요소들이 모두 고려되어야 합니다.
체크박스의 모양과 체크 방식, 색깔을 고려한 체크 여부 True, False 분류를 위한 방법들 중 하나로 SVM(Support Vector Machine)을 활용한 방법을 소개 드립니다.
우선 체크박스 인식 프로세스는 서식 인식 과정을 포함하여 네 단계로 진행됩니다.
서식 인식 결과를 이용해 전체 이미지에서 체크박스 이미지를 검출하고, 검출한 체크박스 이미지를 이용해 체크 여부 판단을 더 잘 할 수 있도록 이진화 등 전처리 작업을 진행합니다. 이후에는 이미지의 특징을 추출하고 이를 이용해 체크 여부를 판단하게 됩니다.
■이미지의 특징 추출
(좌) https://learnopencv.com/histogram-of-oriented-gradients
(우) https://donghwa-kim.github.io/hog.html
이미지의 특징을 추출하고 벡터화하는 기법으로는 일반적으로 많이 사용하면서 SVM과 궁합이 좋다고 알려진 HOG(Histogram of Oriented Gradient)를 사용했습니다. HOG는 픽셀의 변화량과 각도의 크기를 계산하여 이를 벡터화합니다.
변화량이 있다는 것은 곧 기울기가 있다는 것인데, 이 기울기와 각도의 크기를 조합하여 Gradient를 계산합니다. 그리고 계산한 Gradient를 방향(bin)으로 하여 총 8개의 방향(bin)으로 히스토그램을 계산합니다. 이 히스토그램 bin 값들로 계산한 벡터가 곧 체크박스 이미지의 특징이 됩니다.
특징을 구한 후에는 SVM을 이용해 이 특징들에 대해 체크 여부 True, False 분류를 하게 됩니다. SVM은 머신러닝 분야 중 하나로 Classification에 사용되는 지도 학습 방식 모델입니다.
■SVM(Support Vector Machine)
https://hleecaster.com/ml-svm-concept
SVM은 분류를 위한 기준 선을 정의하는 모델이며 이 기준 선을 ‘결정 경계(Decision Boundary)’라고 합니다. 결정 경계와 가장 가까운 곳에 위치한 벡터 값을 Support Vector로 활용하여 경계와의 마진을 계산하게 되는데요.
예시 이미지에서 그래프 A, B, C, D, E는 결정 경계가 한 쪽으로 치우쳐져 마진이 작고 그래프 F는 경계가 한 쪽으로 치우치지 않고 마진이 큰 것을 확인할 수 있습니다. 마진이 작을 수록 경계와 서포트 벡터의 거리가 가까울 것이고 이상치(Outlier)가 나왔을 때 마진이 큰 결정 경계보다 분류가 잘못될 확률이 높을 것입니다. 따라서 SVM은 이 결정 경계의 마진이 최대화되는 방향으로 학습이 진행됩니다.
그 이후, 표 검출 및 인식 기능과 마찬가지로 체크박스 인식 모델도 여러 가지 방법들을 검토하고 테스트 및 개선 작업을 진행했습니다.
주요 개선 포인트 중 하나는 전처리였습니다.
체크박스 이미지는 일반적인 이미지보다 사이즈가 작아 노이즈에 취약하여 딥러닝을 사용하지 않고 이미지 프로세싱으로만 해결하려다 보니 여러 가지 임계 값들로 인한 많은 고통이 있었습니다.
최종적으로 전처리를 포함한 여러 개선 작업을 거쳐 테스트 셋 기준 인식률을 96%까지 개선하였습니다.
하지만.. 아직도 숙제는 많이 있을 것….
여기까지 사이냅 OCR Pro에 적용된 표 검출 및 인식 기능과 체크박스 인식 기능에 대해 소개 드렸습니다.
표 및 체크박스 인식을 통해 문서 형태의 이미지로부터 더 다양한 데이터를 추출할 수 있게 되고, 이러한 기능이 적용된 OCR은 아날로그 종이 문서에서 디지털 문서로의 전환에 활용됩니다.
하지만! 소개해 드린 방법이 전부는 아닙니다.
더 다양하고 좋은 방법이 존재하고 있고, 사이냅 OCR Pro 도 소개해 드린 방법을 포함해 더 나은 방법을 사용하고 있으니까요.
사이냅소프트에서는 고객 요구 사항을 해결하기 위하여 여러 방법을 실험하고 구현하면서 더 나은 방법을 찾아 개선해가고 있습니다.😊
———————————————-
🧡
Inno Tech Day를 마치며
발표를 준비하면서 우리 팀에서 다루던 기술에 대해 다른 팀은 어떻게 생각할까 궁금했는데, 이번 Inno Tech Day를 통해 다른 팀이 관심 갖고 있는 부분에 대해 알게 되어 재밌었습니다.
피드백을 잘 기록하고 자료를 공유하며 함께 성장하는 사이냅소프트가 되면 좋을 것 같습니다.
——————————-
기술 중심의 세미나로 개발자들의 큰 호응을 이끌어냈던 사이냅소프트 Inno Tech Day!
다음에는 공공시장 뷰어 시장점유율 1위를 차지하고 있는 사이냅 문서뷰어에 대한 이야기를 들고 오겠습니다.
다음 시간에 만나요.👋