한글 필기인식 AI
건국대학교 상급, 멀티미디어 프로그래밍 - 기간 프로젝트(개인 프로젝트)
1. 소개
"인공신경망을 통해 개인의 한글 필기체를 학습할 수 있을까?"
같은 글자를 써도 사람마다 글씨체가 미묘하게 달라 보입니다. 억지로 쓰거나 트림을 하면서 쓰는 사람들의 글씨체는 평소와는 다른 흔적을 남기게 되어 증거로서의 신뢰성이 높다. 이 독특함이 시그니처를 독특하게 만듭니다. 중요한 서류나 시험에서는 필기체의 진위 여부를 확인하는 것이 매우 중요합니다.
신원을 증명하는 데 사용되는 만큼 손글씨는 독특하지만, 미묘한 차이만 있는 두 가지 다른 손글씨가 있다면 인간이 육안으로 그 차이를 구별하기는 어렵습니다. 그래서 한글 필기 인식을 위한 인공지능 모델을 구현해보고 싶었습니다.
(1-1) 입력 데이터
- 위 사진은 모두 다른 사람이 쓴 사진입니다. (같은 글자지만 미묘하게 다른 글자임을 알 수 있습니다.)
(1-2) 대상
- 10명 (가족 3명, 친한 친구 7명)
- BSN(방소나), CHW(최호원), KBJ(김범준), KJH(권준형), LJH(이종호), LSE(이승언), PJH(박종혁), PSM(박상문), SHB( 석현빈), SWS(신우섭)
(1-3) 예상 적용 분야
- 국가고시 및 중요서류의 필기검증.
- OCR(광학 문자 인식)
2. 데이터베이스 생성
2-1. 한 글자 데이터
(1) 읽지 않음
- 글꼴 디자인 회사 "Ongle-leap"에서 제공하는 템플릿을 사용했습니다.
- 한글의 모든 조합 포함
(2) 샤프되지 않은 마스크
- 손글씨를 선명하게 하기 위해 선명하지 않은 마스크를 사용함
(3) 그레이스케일 변환
(4) 히스토그램 검사 및 1차 임계값 적용
- 히스토그램을 통해 임계값을 설정하고, 임계값을 기준으로 영상을 이진화합니다.
- (이 예에서는 임계값이 0~255 중 150으로 설정되었습니다.)
(5) LPF 적용
- 필기 위치를 추출하기 위해서는 윤곽선이 노출되도록 LPF를 통해 필기를 부드럽게 처리해야 한다.
- 커널 크기를 적절하게 설정하고 cv2.filter2D를 통해 이진화된 이미지에 LPF를 적용합니다.
- 커널 크기가 작을수록 모음, 자음 등 작은 단위를 감지하기 쉽고, 커널 크기가 클수록 문자 자체의 윤곽선을 감지하기 쉽습니다.
- (예는 21x21 커널을 적용합니다)
(6) 히스토그램 검사 및 2차 임계값 적용
- LPF로 평활화한 영상의 히스토그램을 통해 임계값을 설정한 후, 임계값을 기준으로 다시 한번 이진화를 수행합니다.
- (임계값 예시 : 230)
(7) 윤곽선 및 좌표 추출, 이미지 자르기
- 글자가 아닌 작은 윤곽선은 추출되지 않았습니다.
- 추출된 윤곽선에서 x,y 좌표와 w,h 값을 추출하고, 나중에 64x64 크기로 크기를 조정해야 하므로 필기 특성이 최대한 손실되지 않도록 좌표를 사각형으로 다시 계산했습니다.
- 계산된 좌표를 통해 이미지가 정사각형 모양으로 잘려졌습니다.
(8) 임라이트
- 1인당 한 글자 데이터 81개
- 총 810개의 한 글자 데이터가 수집되었으며,
2-2. 두 글자 데이터
- 두 글자 데이터는 서로 다른 단일 글자 데이터를 결합하여 생성되었으며 각각은 적절하게 크기가 조정되었습니다.
- 크기 조정 시 특징 정보의 손실을 줄이기 위해 img_concat(img1, img2) 함수를 생성하여 이미지를 연결하고 사각형으로 구성하는 데 사용했습니다.
- 대상당 2글자 데이터 6,480개 획득(81P2)
2-3. 세 글자 데이터
- 세 글자 데이터는 한 글자 데이터와 두 글자 데이터를 각각 적절하게 스케일링하여 결합하여 만들어졌습니다.
2-4. 필기를 통해 얻은 실제 손글씨 데이터
- 데이터는 대상의 실제 메모 작성에서 수집되었습니다.
3. 1차 결과
열차 데이터 : 테스트 데이터 = 9 : 1
사용 데이터 = 한 글자(81) + 두 글자(500) + 세 글자(500) + 실제 손글씨(30)
n.Epoch = 20, 배치 크기 = 50, 학습률 = 0.01
레이어 구성
- 결과
- 손실=0.7819, 정확도=0.72
- 테스트 데이터의 결과=0.6503
4. 2차 결과
열차 데이터 : 테스트 데이터 = 9 : 1
사용 데이터 = 한 글자(81) + 두 글자(1000) + 세 글자(1300) + 실제 손글씨(30)
n.Epoch = 20, 배치 크기 = 150, 학습률 = 0.04
레이어 구성
- 결과
- 손실=0.0397, 정확도=0.9908
- 테스트 데이터 결과=0.9360
5. 결과 분석
첫 번째 결과에 비해 두 번째 결과는 모두 크게 개선되었습니다. 결과가 좋아진 이유는 다음과 같다고 생각합니다.
(5-1) 학습에 활용되는 데이터의 증가
- 1차 시도에서는 타겟당 1,111개의 데이터가 사용됐고, 두 번째 시도에서는 2배 이상 많은 2,411개의 데이터가 사용됐다.
- 더 많은 데이터를 통해 학습과 평가를 진행했기 때문에 대상의 손글씨의 더 섬세한 특성을 포착할 수 있었습니다.
(5-2) 인공신경망층의 변화
- 두 번째 시도에서는 컨볼루션 마스크의 크기와 풀링의 크기를 수정했습니다.
- 매우 미세한 필기 특성을 포착하기 위해 컨볼루션 마스크의 크기를 이전보다 작은 크기로 줄였습니다.
- 풀링 크기를 줄여 학습 과정에서 필기 특성의 손실을 줄였습니다.
- 또한 필기에 대한 더 많은 정보를 매개변수로 담기 위해 완전 연결 노드 수가 128개에서 256개로 늘어났습니다.
(5-3) 배치 사이즈 및 학습률 증가