뒤로가기뒤로가기

데일리 랩스

신분증 인증, 더 이상 ‘셀프’로 하지 마세요

자동으로 찰칵, 이 정도면 첫인상 ‘호감’이죠!

데일리펀딩

 

‘셀프’로 촬영하는 신분증 사진은 그만!

한 번에 척척 알아서 하는 플랫폼 될게요

넘쳐나는 플랫폼 사이에서 고객의 선택을 받으려면 ‘첫인상의 법칙’을 따라야 한다. 어떤 서비스를 이용하려고 하는데 자꾸 오류가 생긴다면, 고객은 바로 ‘뒤로 가기’ 하거나 삭제 버튼을 누를 테니까. 꼭 필요한 서비스인 데다 대체제가 없다면 모르지만, 플랫폼 산업에서 더 이상 유일무이한 것은 없으니.

 

플랫폼의 첫인상은 당연하게도 메인 화면이겠지만, 그보다 중요한 건 회원가입 과정이다. 제도권 금융사인 데일리펀딩은 회원가입 시 KYC(고객확인) 과정을 거치는데, 이때 좋은 첫인상을 남기려면 신분증 인식이 자동으로, 한 번에 척척 진행돼야 한다. 그동안 고객이 직접 신분증을 인식 영역에 맞추고 촬영 버튼을 눌러야 하는 번거로움이 있었다. 버튼을 누를 때 신분증이 영역에서 벗어나는 일도 자주 발생했다. 신분증이 아닌 이미지도 서버로 전송돼 불필요한 비용이 낭비되는 내부적인 이슈도 물론이었다.

 

신분증이 감지된 경우에만 서버로 전송하고, 신분증이 카메라 영역에 들어오면 고객이 버튼을 누를 필요 없이 자동으로 촬영하는 것. 그래서 고객 편의와 신뢰를 더욱 높이는 것. 이것이 바로 이번 KYC 기술 내재화 프로젝트의 목표였다.  

 

68개의 얼굴 부위를 감지하는 모델 도입  

신분증 촬영 빛반사 문제도 데일리가 보완할게요

‘신분증 자동 인식 및 촬영 기술’을 기획할 때 먼저 주민등록증, 운전면허증, 여권, 외국인등록증 등 신분증의 공통점에 주목했다. 처음에는 OCR(광학 문자 인식)만을 고려했으나, MIT님께서 ‘신분증에는 모두 얼굴 사진이 있다’고 힌트를 주셔서다. 그래서 신분증인지 아닌지 판단하기 위해 face-api.js라는 라이브러리를 기반으로 얼굴부터 감지하도록 구현했다. 이 face-api.js 안에는 여러 가지 모델이 있는데, 얼굴 자체를 인식하는 tiny_face_detector와 눈∙코∙입 등 얼굴의 특성(랜드마크)을 세세하게 추출하는 faceLandmark68TinyNet라는 모델을 둘 다 사용했다. 고객이 신분증 인증을 보통 스마트폰으로 진행할 테니, 모바일에서 가볍게 사용할 수 있는 경량 모델을 고른 것이다.  

 

신분증에서 얼굴이 인식됐는지 아닌지 그 여부도 좌표 박스로 시각화해서 감지 성능도 확인했다.

 

68개의 랜드마크를 감지하는 faceLandmark68TinyNet 모델
※ 출처: Journal of Real-Time Image Processing

 

금융 플랫폼에서 신분증을 인증할 때 빛반사가 되지 않도록 주의하라는 문구를 흔히 볼 수 있다. 포털 사이트에 잠시 검색만 해도 빛반사를 방지하는 방법을 물어보는 게시글이 쏟아진다. 신분증 인증을 위해 반드시 어두운 곳으로 이동해야 하거나 상자 안에 신분증을 두고 촬영하라는 꿀팁도 여기저기 흩어져 있다. 신분증 이미지에 포함된 문자를 디지털 텍스트로 변환하는 OCR을 진행해야 하는데, 카메라로 촬영한 이미지는 노이즈가 심해 신분증 OCR 인식률이 낮다는 게 원인이다.

 

그런데 언제까지 고객이 각종 꿀팁을 활용해 신분증을 인증해야 할까? 개발자인 나도 이런 경험을 피할 수 없었는데, 반복적인 불편함 끝에는 ‘이미지 전처리’라는 아이디어가 놓여 있었다. 강력하게 이미지 전처리를 하면 굳이 그림자를 만들거나 여러 번 재촬영할 필요가 없으리라 생각한 것이다. 물론 빛반사를 최소화해야 하는 건 맞지만, 우리가 보완해 줄 수는 있으니까.  

 

여러 번의 테스트를 거쳐 노이즈를 효과적으로 제거하고 OCR 성능을 크게 개선하는 전처리 정도를 파악했다. 그 자세한 내용은 업스케일(30%)로 해상도를 높이고, 흑백(그레이스케일), 대비 강화(30%), 밝기 강화(10%) 필터를 적용하는 것. 여기에 더해 샤프닝(3x3 커널)을 적용하면 이미지가 더 선명해진다.

 

 

고유 번호 체계 분석해 신분증 종류 구분

모바일이니까, 빠르고 가벼운 기술에 집중했어요

얼굴 인식에 더해 신분증 여부를 확인할 수 있는 또 다른 장치는 ‘문자열’이다. 신분증에 표기된 주민등록번호는 앞자리 숫자 6개, 뒷자리 숫자 7개로 구성된다. 이런 정규식을 기반으로 숫자 6개로 구성된 텍스트 덩어리가 인식됐을 때 신분증이 맞다고 1차 판단하도록 처리했다. 또 주민등록증, 운전면허증, 여권, 외국인등록증 등 신분증별로 다른 고유한 번호 체계를 분석해 어떤 신분증인지 구분 패턴도 도출했다.

 

예를 들어 운전면허증 번호는 총 12자리로, [AA-BB-CCCCCC-DE] 체계를 보인다. 여권 번호(신)는 [여권 종류 1자리 + 숫자 3자리 + 임의의 로마자 대문자 1자리 + 숫자 4자리]로 구성된다. 이런 정규식을 활용하면 OCR 속도가 향상된다.  

 

 

OCR에는 오픈 소스인 Tesseract.js를 사용했다. 이 Tesseract.js를 활용해 신분증 이미지에서 문자 영역을 감지한 다음, 수직∙수평 히스토그램을 분석해 라인과 단어를 구분한다. 문자 간격이나 커널에 기초해 글자 단위를 분할하는 것이다. 그다음에는 LSTM(Long Short-Term Memory) 기반의 딥러닝 모델로 문자를 인식한다. 마지막에 후처리를 통해 오탈자 등을 보정한다.

 

 

Tesseract.js는 한글뿐만 아니라 영어 학습 데이터도 포함돼 여권의 알파벳 일련번호도 무리 없이 인식할 수 있다. 또 반응 속도도 매우 우수하다. 이런 장점을 최대한 살리기 위해 OCR 라이브러리는 서버와의 통신 없이 고객의 디바이스에서 단독으로 작동하고, 가볍고 처리 속도가 빠른 걸로 선택했다. 내가 선택한 라이브러리를 공개하자면, OEM(OCR 엔진 모드)은 TESSERACT_LSTM_COMBINED, PSM(페이지 분할 모드)는 SPARSE_TEXT다.

 

특수문자를 제외하고 필요한 텍스트만 인식하도록 WhiteList도 설정하고, ‘주민등록증’ 글자가 ‘민등록증’처럼 일부 누락되더라도 진행되게끔 구현했다. 경량 모델 선택, 속도 강화 등의 모든 작업은 고객이 스마트폰으로 빠르고 안정적으로 KYC 과정을 거칠 수 있도록 편의를 제공하기 위해서다.  

 

KYC 기술 내재화 프로젝트는 난이도 높은 작업은 아니었다. 기획부터 개발, 테스트, 개선까지 3일 정도밖에 걸리지 않았을 정도다. 그렇지만 사용자 중심의 데일리펀딩 개발 방향, 신뢰와 편의를 제공한다는 가치관에 대해 깊게 생각해 보게 됐다. 어려운 기술이 아니더라도 좀 더 신경 쓰고 세심하게 접근하면 사용자의 불편함을 크게 개선하고 더 나은 경험을 제공할 수 있다는 점 말이다. 고객이 체감할 만한 가치를 만들어 내는 데일리 IT실에 자부심을 느낀다.

 

우리는 매일 금융의 각을 넓혀가는
데일리언입니다.

데일리언과 함께하기 >