코드 한 줄 없는 딥러닝으로 문서에서 지문 찾기!

2023. 8. 4.Tech

은행에 가면 여러가지 공문서, 신분증을 지참하고 이를 제출하게 되는데요.
과거에는 문서에 본인 확인을 위해 도장 대신 지문을 찍는 경우가 더러 있었습니다. 그리고 제출하는 신분증 뒷면에도 지문이 떡하니 찍혀 있죠.

주민등록증 뒷면
 

2015년 초 금융위원회에서는 금융사가 가진 모든 고객 지문정보를 폐기하도록 지침을 내렸습니다.

당시에는 광범위한 문서에서 지문을 찾을 수 있는 방법이 사람이 직접 조회하는 방법 밖에 없었죠. 기술적, 비용적 이슈로 대다수의 금융사에서 손도 못대고 있는 상황 이었던 것으로 기억합니다.

 

여러 분야에서 AI / 딥러닝 기술 수준이 사람을 뛰어 넘었다고 이야기 하는 것은 참 진부한 이야기가 되어버렸습니다. 구글의 알파고가 이세돌을 2016년에 이겼지만, 이미지 분류 분야에서는 이미 사람의 판단 수준을 넘어섰습니다.

 

2015년에 이미지를 보고 정답을 맞추는 분야에서 사람을 넘어섰습니다.

판단하는 문제를 넘어서서 창조와 예술의 영역까지 넘보고 있습니다. 아래 그림은 AI가 창조해낸 그림입니다. 결국 학습된 무언가에 의해 재구성된게 아니냐 반문할 수 있지만 사람이 창조해낸 예술도 경험과 학습의 산물이 아닐까요?

다시 본론으로 돌아와서 위와 같은 문제를 기술로 어떻게 해결할 수 있을까요?

Object Detection

 

 

 

저는 사물탐지(Object Detection)라는 컴퓨터 비전 기술로 이를 해결할 수 있다고 생각했습니다. 위 그림처럼 Object Detection은 사진에서 어떤 것이 자동차인지, 사람인지 잘 구분해내고 있습니다.

Object Detection을 학습시키기 위해서는 준비물 2가지가 필요합니다.
(학습을 위한 개발환경은 이미 갖춰져 있다고 가정)

 

첫번째) Object Detection 알고리즘

Object Detection을 구현하는 알고리즘은 꽤 많습니다.

그중에서 많이 사용하는 알고리즘으로 YOLO(You Only Look Once)가 있습니다.
이름도 직관적이고 계속적으로 개선이 이뤄지고 있어 현재는 Yolo version 7 까지 나와 높은 성능과 새로운 기능들이 추가되어 있습니다.

이외에도 SSD, Faster-RCNN, MobileNet 등 많이 쓰이는 알고리즘이 있는데 시간적, 자원적 여유가 된다면 여러 알고리즘을 같이 학습시켜 성능이 좋은 모델을 쓰는 것도 방법입니다.

 

두번째) 학습을 위한 데이터셋 준비 입니다.

학습데이터를 확보하는 방법도 여러가지가 있을수 있는데요

1. 가진 데이터를 가공하여 활용하기
이미 은행에는 많은 문서가 저장되어 있고 그중에 지문이 찍힌 문서들도 상당수 있었을 겁니다 (지금은 저장을 못하므로 없겠지만요)
그러한 문서들을 사람이 다시 분류하고, 지문이 어떤 위치에 있는지도 기록해놔야 합니다. 이러한 행위를 데이터 어노테이션(Annotation) 이라고 합니다.
아래 그림처럼 회색 박스는 접시고, 보라색은 포크, 연두색은 쿠키라는 것을 사람이 도구(Annotation Tool)을 이용하여 지정해주면 추후에 알고리즘을 학습시킬수 있는 형태로 위치정보, 분류정보가 기록됩니다.

 
2. 공개된 데이터를 활용하기

데이터의 양이 풍부하고, Annotation을 할수 있는 여력이 있다면, 사실 위의 방법이 가장 좋은 방법입니다. 실제 비즈니스에 적용했을때 높은 학습성능을 보여줄 가능성이 크고요 하지만 기업들이 많은 데이터를 가지고 있어도 그림의 떡인 경우가 많습니다. 특히 금융권 같이 고객정보를 민감하게 다루는 곳에서는 더욱 그렇습니다.

그래서 최대한 현실과 가까운 데이터를 확보해야 합니다.
공개된 문서와 공개된 지문이 있다면 현실과 가까운 데이터셋을 만들수 있지 않을까요?

우선 구글이나 캐글에 들어가 찾아봅니다. Document로 검색하니 상당히 많은 스캔문서들을 구할 수 있었습니다.
저는 그 중 NIST SD2 라는 공개 데이터셋을 사용하였습니다.

NIST SD2 Document Dataset

다음은 지문을 찾아야 합니다. fingerprint로 검색해보니 마침 SOCOFing이라는 좋은 데이터셋을 구할 수 있었습니다.

SOCOFing Dataset

 

너무 고마운 이 데이터셋에 대해 좀 더 알아봐야겠습니다.

The SOCOFing dataset contains 6,000 fingerprints belonging to 600 African subjects. There are 10 fingerprints per subject and all subjects are 18 years or older.


아프리카 주민 600명으로 부터 얻은 6,000개의 지문이었군요. 아마 지문에 대한 사회적 민감도가 낮은 이들로부터 취한 데이터라고 조심스럽게 생각해 봅니다.

이제 문서와 지문 2가지 데이터를 구했으니 실제 비즈니스에 가까운 데이터로 합성해야 합니다. 문서에 Random한 위치로 지문을 합성하여 실제에 가까운 ‘지문 찍힌 문서’를 합성 해낼 수 있었습니다. 더욱이 좋은 것은 합성할때 위치정보를 알수 있으니 사람이 직접 Annotation 하는 과정 없이 알고리즘에 학습시키기 적합한 형태의 데이터 확보가 가능했습니다.

 

 

꽤 그럴싸한 지문 찍힌 문서가 완성 되었습니다!

 

이제 준비물이 완성이 되었으니 학습을 시킬 차례 입니다.

개략적인 학습 과정은 아래와 같습니다.

준비된 학습 데이터로 딥러닝 알고리즘 통해 모델을 학습 시킵니다.
여기서 알고리즘과 모델의 차이가 뭘까요?

사람도 공부를 하기 위해서는 공부할 수 있는 자료가 필요할 것이구요. 그 자료를 어떻게 학습할지 방법이 필요합니다. 방법은 계~~속 자료를 소리내서 읽으면서 공부할수도 있고 깜지를 써내려가며 할수도 있고 중요하지 않은 것은 눈으로 휙휙 보면서 공부하기도 합니다.

학습데이터가 공부자료라면 딥러닝 알고리즘은 공부방법입니다.

그렇다면 딥러닝 모델은 공부가 충분히 된 뇌(Brain)라고 할수 있을 것 같습니다.

아래 그림에 보면 데이터도 학습데이터와 테스트데이터가 있습니다.
학습데이터가 우리가 공부하는 학습지 같은 공부자료라 한다면, 테스트 데이터는 실제 시험지라고 볼수 있습니다. 학습에 관여하지 않고 모델(=뇌)이 학습이 잘되었는지 판단하는 최종 용도로 사용됩니다.

조금 더 들어가보면 공부할때 반복학습이 중요하다고 하는데 딥러닝/머신러닝도 반복학습이 필요합니다. Epoch과 Batch, Iteration이라는 개념이 중요한데 이 역시 사람이 공부하는 방법에 비교해보면

수학책 하나가 있다고 가정했을때 이 수학책을 전체 한번 보는 걸 Epoch라고 합니다. 수학책을 10번이나 봤다면 10 Epoch 입니다.

300장짜리 두꺼운 수학책을 하루에 한번씩 보기에는 어려움이 있습니다. 그래서 하루에 30장씩 진도를 빼기로 정했습니다. 이것을 Batch Size 라고 할수 있습니다. 하루에 30장씩 진도 빼는 것을 Iteration 이라고 하는데요 10 Iteration을 돌면 수학책 한번을 다 볼수 있겠네요.

이제 똑똑한 모델이 만들어 졌습니다.
지문이 찍힌 신분증이나 문서에서 지문을 잘 찾아내는 것을 볼 수 있습니다.

이제 비즈니스에서 실제 사용되는 문서를 모델에 통과시키면 문서에 지문이 없는지 판별할 수 있습니다.

모델이 결과를 내놓는 것을 추론(Inference)이라고 합니다. 추론과정은 학습과정에 비해 컴퓨팅 자원(GPU 등)을 훨씬 덜 사용합니다. 잘 학습된 모델은 꽤 긴 기간동안 추론을 잘할 수 있을 것입니다.

 

그런데 어느날부터 추론한 결과가 신통치 않다면

재학습이라는 과정을 통해 현재에 적합한 모델을 다시 만들어야 합니다. (사람도 계속 공부해야하는 것처럼)

 

이상으로 “코드한줄없는” 이라는 컨셉으로 딥러닝으로 지문찾는 과정에 대해 이야기를 해봤습니다.

딥러닝에 대해 최대한 잘 이해할 수 있도록 이런 저런 비유를 해가며 써봤는데 써놓고 나니 부끄럽네요.

그래도 누군가 이해하시는데 도움이 되시길 바랍니다.

 

 

 

케이뱅크와 함께 하고 싶다면 🚀