김예빈Yebeen Kim

연구 · 학사학위논문 · 산업공학 종합설계(PBL)

훈련되지 않은 필기 한자 인식 — 글자 대신 부건(部件)을 검출한다

학습셋에 없던 한자를 읽기 위해 글자 전체가 아니라 부건을 객체로 검출했다. 부건의 평균 이미지에서 Haar-radical stump를 직접 만들어 AdaBoost로 묶었고, 부건 4종에서 평균 IoU 0.3795–0.6692를 얻었다

기간
2020.03 – 2020.06
역할
4인 팀(김예빈 · 송유진 · 양효용 · 최윤정) 중 Haar filter 3종 제작 코드, 부건 결합 형태 13종 정리, 부건 검출 코드 구현 담당
발표·산출
2020년 1학기 산업공학종합설계 최종보고서 — 한양대학교 산업공학과 (지도 이기천 교수)
날짜
2020.06
목차 14개 절
목차
  1. 문제 설정 — 학습셋에 없는 글자는 원리적으로 읽을 수 없다
  2. 선행 연구가 남긴 숫자 — unseen 한자에서 40.82%
  3. 부건이라는 단위 — 8,105자 대신 200~500자
  4. 데이터 — CASIA-HWDB 1.1을 부건 단위로 잘라내기
  5. Haar-radical stump 제작 — 평균 이미지와 임계값 30 · 70 · 100
  6. 약분류기의 정의와 특징 계산 — 필터 종류 · scale · 좌표
  7. AdaBoost — 어려운 샘플을 다음 라운드에 더 자주 보게 한다
  8. 부건 검출 절차 — 다중 스케일 창과 이웃 창의 결합
  9. 검증 — IoU로 본 부건별 편차
  10. 제목에 있지만 본문에 남지 않은 것 — L2,1-norm과 ADMM
  11. Haar와 CNN을 나란히 놓고 본 것
  12. 하지 못한 비교와 남은 한계
  13. 원문을 다시 읽으며 정정한 것
  14. 이 연구가 남긴 것
요약
  • 한자 인식의 실패 지점은 정확도가 아니라 커버리지였다. 한 글자를 한 클래스로 두고 통째로 학습하면, 학습셋에 없던 글자는 어떤 클래스에도 대응되지 않아 원리적으로 읽을 수 없다. 통용규범한자표만 8,105자다.
  • 한자가 부건(部件)의 조합으로 만들어진다는 성질에 기댔다. 부건은 200~500자 정도로 글자 수보다 훨씬 적으므로, 부건을 검출하고 그 결합 형태로 글자를 판정하면 훈련되지 않은 글자도 다룰 수 있다는 것이 제안의 출발점이었다.
  • 특징을 학습시키는 대신 직접 만들었다. CASIA-HWDB 1.1에서 부건 영역만 잘라 평균 이미지를 만들고, contrast를 enhance한 뒤 임계값 30 · 70 · 100으로 이진화해 한 부건당 +/− 영역이 다른 Haar filter 3종을 제작했다. 약분류기 하나는 <필터 종류, scale, 좌표>의 조합으로 정의된다.
  • 矢 · 用 · 可 · 函 네 부건에 대해 부건당 학습 90장 · 테스트 30장으로 검증했다. 평균 IoU는 可 0.6692, 用 0.5221, 函 0.4045, 矢 0.3795였고 IoU 0.5 기준 정밀도는 0.87 / 0.6 / 0.6 / 0.5였다. 절반이 기준을 못 넘긴 부건이 있었다.
  • 논문 제목에 있는 L2,1-norm ADMM은 목차와 마지막 미팅 자료에만 남아 있고 본문 서술과 결과가 남아 있지 않다. 보고서 목차에 있던 DenseRAN 비교 실험도 실제로는 채워지지 않았다. 이 글은 그 공백을 지우지 않고 그대로 적는다.
주요 수치
8,105자통용규범한자표 글자 수중국에서 자주 쓰는 한자를 선별해 수록한 표. 이 전부를 클래스로 두는 방식은 현실적이지 않다는 것이 문제의 출발점이었다.
200~500자부건 수글자 수보다 한 자릿수 이상 적다. 부건을 학습 단위로 바꾼 근거.
3종부건당 Haar filter평균 이미지 이진화 임계값을 30 · 70 · 100으로 달리해 +/− 영역이 서로 다른 필터 3종을 부건마다 제작했다.
90 / 30부건당 학습 · 테스트 장수矢 · 用 · 可 · 函 네 부건에 대해 학습 90장, 해당 부건을 포함한 글자 30장으로 테스트.
0.3795 – 0.6692평균 IoU可 0.6692 · 用 0.5221 · 函 0.4045 · 矢 0.3795. 부건에 따라 두 배 가까이 벌어졌다.
0.5 – 0.87IoU 0.5 기준 정밀도可 0.87(TP 26 / FP 4) · 用 0.6 · 函 0.6 · 矢 0.5(TP 15 / FP 15).

문제 설정 — 학습셋에 없는 글자는 원리적으로 읽을 수 없다

정확도가 낮은 것이 아니라, 애초에 대응할 클래스가 없는 것이 문제였다.

종합설계 논문 주제로 오프라인 한자 필기체 이미지 인식을 택했다. 한자는 중국에서 자주 쓰는 글자를 선별한 ‘통용규범한자표’만 8,105자이고, 글자마다 구조가 복잡하며 획 수가 많다. 숫자나 영문 인식과 달리 필기체 한자 인식의 정확도가 낮은 이유로 보고서는 글꼴 크기의 다양성, 기기에 따른 대비와 해상도 차이, 회전 · 변형 · 맞물림, 색상 정보의 부족을 함께 들었다.

다만 우리가 문제로 삼은 것은 정확도 자체가 아니었다. 기존 연구들의 공통된 한계는 카테고리로 넣지 않은 한자에 대한 정확도가 현저히 떨어진다는 것이었다. 한 글자를 하나의 클래스로 두고 통째로 학습하는 구조에서는, 학습셋에 등장하지 않은 글자에 대응되는 클래스 자체가 없다. 모델을 키우거나 데이터를 늘려도 이 부분은 원리적으로 해결되지 않는다. 또 비슷한 부건으로 이루어지거나 모양이 매우 유사한 글자에서 오분류가 몰린다는 점도 함께 지적되어 있었다.

그래서 질문을 ‘정확도를 얼마나 올릴 것인가’가 아니라 ‘학습하지 않은 글자를 어떻게 읽을 것인가’로 바꿔 잡았다. 이 질문을 택한 순간 학습 단위를 글자에서 다른 것으로 옮겨야 한다는 결론이 따라온다.

구분기존 방식제안 방식
학습 단위한 글자 전체부건(部件)
클래스 수글자 수만큼 (8,105자 이상)부건 수만큼 (200~500자)
학습셋에 없던 글자대응 클래스가 없어 인식 불가검출된 부건의 조합으로 판정 가능
특징픽셀 또는 학습된 커널부건 평균 이미지에서 만든 Haar-radical stump
결합글자 단위 분류기약분류기 → AdaBoost 강분류기(부건 검출기)
글자 판정클래스 확률 최대값검출된 부건의 결합 형태(13종)
발표자료가 오분류 사례로 든 필기 한자 — 铭 · 铬처럼 획 일부만 다른 글자에서 오류가 몰린다는 것을 붉게 표시한 슬라이드다
발표자료가 오분류 사례로 든 필기 한자 — 铭 · 铬처럼 획 일부만 다른 글자에서 오류가 몰린다는 것을 붉게 표시한 슬라이드다

선행 연구가 남긴 숫자 — unseen 한자에서 40.82%

문제가 실재하는지부터 확인했다. 인용한 표의 숫자가 그 근거였다.

제안을 시작하기 전에, 학습하지 않은 글자에서 기존 방법이 실제로 얼마나 떨어지는지를 선행 연구에서 확인했다. 아래 표는 발표자료에 인용한 unseen HCCR 결과다. 학습 클래스 수를 500에서 2,755까지 늘려도 ICDAR 2013의 1,000 클래스에 대한 정확도는 1.70%에서 30.68%까지밖에 오르지 않고, 3,755 클래스를 전부 학습한 경우에도 HWDB 1.2의 3,277 클래스에서 40.82%에 그친다.

표의 왼쪽 열에는 학습 규모가 함께 적혀 있다. HWDB 1.0+1.1에서 500 클래스 356,553장으로 시작해 2,755 클래스 1,962,529장까지 늘렸고, 마지막 행은 3,755 클래스 2,674,784장 전부를 학습한 경우다. 학습 장수를 일곱 배 넘게 늘려도 학습에 없던 글자의 정확도는 40%대에서 멈춘다.

이 표에서 읽은 것은 두 가지였다. 하나는 학습 클래스를 늘리는 방향이 unseen 문제를 해결하는 방향은 아니라는 것이다. 500 → 2,755로 다섯 배 넘게 늘려도 정확도는 30%대에 머문다. 다른 하나는 그럼에도 정확도가 클래스 수에 따라 단조증가한다는 것이다. 즉 ‘본 적 있는 구성 요소’가 늘어나면 성능이 오른다는 뜻이고, 이는 구성 요소 자체를 학습 단위로 삼으면 어떨지에 대한 간접적인 근거가 된다.

한자 인식 관련 문헌은 Adaboost + SIFT로 이동통신 네트워크 상의 자연 장면 한자를 검출한 연구, AdaBoost로 유사 필기 한자를 판별한 연구, Multiple Instance Learning 기반의 유사 한자 판별, 대규모 분류를 위한 새로운 AdaBoost 알고리즘 등을 정리했다. 부수 · 부건 개념 쪽으로는 자휘(字彙) 부수에 관한 국문 문헌을 참고했다.

학습 클래스를 500에서 3,755까지 늘려도 학습에 없던 한자에 대한 정확도는 1.70%에서 40.82%까지밖에 오르지 않는다는 선행 연구의 결과 표
학습 클래스를 500에서 3,755까지 늘려도 학습에 없던 한자에 대한 정확도는 1.70%에서 40.82%까지밖에 오르지 않는다는 선행 연구의 결과 표
선행 CNN 연구가 비교한 신경망 구성 — 층 수와 채널 폭만 바꾸며 성능을 겨루는 접근이었다
선행 CNN 연구가 비교한 신경망 구성 — 층 수와 채널 폭만 바꾸며 성능을 겨루는 접근이었다

부건이라는 단위 — 8,105자 대신 200~500자

부건은 획보다 크고 편방보다 작은, 상대적으로 독립된 필획 구조다.

부건(部件)은 한자를 이루는 조자단위(造字單位)를 말한다. 대부분의 한자는 일정 수의 필획으로 구성되는데, 그중 상대적으로 독립된 필획 구조를 부건이라고 부른다. 점 · 가로획 · 세로획 · 삐침 · 파임 같은 기본 획보다는 크고, 편방이라 불리는 결구 단위보다는 작다. 보고서가 든 예는 ‘側’이다. 이 글자는 亻, 贝, 刂 세 부건으로 나뉜다.

중요한 것은 개수다. 부건은 최소 200자에서 최대 500자 정도로 분류할 수 있다. 실제 한자 수에 비하면 한 자릿수 이상 적다. 많은 양의 글자 종류와 각각의 다양한 필기체를 전부 학습시키는 대신, 부건 각각을 학습시키고 그것을 조합하는 쪽이 같은 비용으로 훨씬 넓은 범위를 덮는다.

부건이 어떤 형태로 모여 글자가 되는지도 정리해야 했다. 좌우 결합, 상하 결합, 둘러싸기 같은 배치를 부건 결합 형태 13종으로 정리했고, 보고서에는 “더 추가 가능”이라는 단서가 붙어 있다. 이 정리 작업이 가장 손이 많이 갔던 부분이었는데, 알고리즘이 아니라 한자 구조에 대한 도메인 지식이 부족해서였다. 어떤 획 뭉치를 하나의 부건으로 볼 것인지부터 스스로 판단 기준을 세워야 했다.

데이터 — CASIA-HWDB 1.1을 부건 단위로 잘라내기

gnt를 HDF5로 바꾸고 200 클래스를 추린 뒤, 검출할 부건 영역만 다시 잘랐다.

데이터셋은 National Laboratory of Pattern Recognition(NLPR)이 공개한 CASIA-HWDB 1.1을 사용했다. 학습용과 시험용 원본을 모두 받아, 그중 200개 문자 클래스로 추린 데이터셋을 만들었다.

전처리에서 걸린 것은 라벨이었다. 시험 데이터의 라벨이 순서대로가 아니라 무작위로 저장되어 있어서, 200자 라벨 목록을 따로 관리하며 원-핫 라벨에서 1의 위치를 읽어 몇 번째 한자인지로 되돌리는 과정을 넣어야 했다.

추린 200자 목록은 보고서에 그대로 적혀 있다. 검증에 쓴 네 부건을 포함하는 글자가 이 목록 안에 있다 — 可의 ‘河’, 函의 ‘涵’, 矢의 ‘知’, 用의 ‘拥’이다. 즉 부건 학습 데이터는 이 200 클래스 안에서 뽑아 잘랐다.

그다음이 이 연구의 실제 전처리다. 글자 전체 이미지에서 검출하고자 하는 부건에 해당하는 영역만 잘라냈다. 예를 들어 ‘可’를 부건으로 포함하는 ‘河’의 필기 이미지들에서 可 부분만, ‘函’을 포함하는 ‘涵’에서 函 부분만 남긴다. 부건당 90장 정도를 이렇게 손으로 잘라 모았다.

CASIA-HWDB 1.1의 &lsquo;河&rsquo; 필기 샘플 — 같은 글자라도 필기자에 따라 획의 굵기와 흘림이 크게 달라진다
CASIA-HWDB 1.1의 ‘河’ 필기 샘플 — 같은 글자라도 필기자에 따라 획의 굵기와 흘림이 크게 달라진다
글자 이미지에서 &lsquo;可&rsquo; 부건에 해당하는 영역만 잘라낸 학습 데이터
글자 이미지에서 ‘可’ 부건에 해당하는 영역만 잘라낸 학습 데이터
같은 방식으로 모은 &lsquo;函&rsquo; 부건 이미지 — 1번부터 90번까지 번호가 매겨져 있다. 부건 하나의 학습 집합 전체가 이 90장이다
같은 방식으로 모은 ‘函’ 부건 이미지 — 1번부터 90번까지 번호가 매겨져 있다. 부건 하나의 학습 집합 전체가 이 90장이다

Haar-radical stump 제작 — 평균 이미지와 임계값 30 · 70 · 100

필터를 학습시키지 않고, 부건의 평균 이미지에서 직접 만들었다.

Haar-like feature는 두 개 이상의 인접한 사각형 영역으로 구성되고, 그 값은 영역 간 밝기 차로 정의된다. 일반적인 Haar 검출기는 edge · line · four-rectangle 같은 정해진 몇 가지 모양을 쓴다. 그런데 부건은 그런 단순한 사각형 대비로 표현되는 형태가 아니다. 그래서 부건 자체의 모양에서 필터를 만들어 내는 방식을 택했다.

절차는 세 단계다. 먼저 잘라 모은 부건 이미지들의 평균 이미지를 계산한다. 다음으로 contrast를 enhance한다. 마지막으로 특정 임계값보다 밝기가 큰 화소는 255로, 작은 화소는 0으로 바꿔 이진화한다. 이렇게 나온 흑백 마스크가 곧 그 부건의 Haar-radical stump이고, 검은 영역이 −, 흰 영역이 +가 된다.

여기서 결과에 영향을 주는 변수를 두 가지로 정리했다. 하나는 stump의 size, 즉 한 픽셀 블록을 얼마나 잘게 나눌 것인가다. 너무 잘게 나누면 계산한 데이터에 과적합할 우려가 있고, 반대로 한 블록을 너무 크게 잡으면 작은 부분만 달라도 다른 글자가 되는 한자의 성질을 놓친다. 다른 하나는 이진화 임계값이다. 하나를 고르지 않고, 임계값을 30 · 70 · 100으로 두어 +/− 영역이 서로 다른 필터 3종을 부건마다 만들었다. 같은 부건을 세 가지 밝기 기준으로 본 셈이고, 이 3종을 모두 약분류기 후보로 넣어 AdaBoost가 고르게 했다.

부건 이미지들의 평균을 내고 contrast를 올린 뒤 이진화한 결과 — 이 흑백 마스크 하나하나가 Haar-radical stump가 된다. 검증에 쓴 네 부건 말고도 여러 부건에 대해 미리 만들어 두었다
부건 이미지들의 평균을 내고 contrast를 올린 뒤 이진화한 결과 — 이 흑백 마스크 하나하나가 Haar-radical stump가 된다. 검증에 쓴 네 부건 말고도 여러 부건에 대해 미리 만들어 두었다
일반적인 Haar-like feature 네 종류(edge 2종 · line · four-rectangle) — 부건에는 이 고정된 모양 대신 부건 평균 이미지에서 만든 마스크를 썼다
일반적인 Haar-like feature 네 종류(edge 2종 · line · four-rectangle) — 부건에는 이 고정된 모양 대신 부건 평균 이미지에서 만든 마스크를 썼다

약분류기의 정의와 특징 계산 — 필터 종류 · scale · 좌표

약분류기 하나는 <필터, 크기, 위치>의 조합이고, 그 조합이 부건의 유무를 이진으로 답한다.

stump는 Discrete AdaBoost에서 쓸 수 있는 가장 단순한 형태의 약분류기로, 특징들 간의 학습 의존성을 허용하지 않는 단일 노드 트리(single-node tree)다. 일반적으로 n−1개 변수 사이의 의존성을 모형화하려면 n개의 분할 노드가 필요한데, stump는 그 반대편 극단에 있다. 대신 개수로 승부한다.

약분류기는 창(window)에서 계산한 Haar feature 값이 임계값 θ보다 큰지로 +1과 −1을 답한다. 여기에 방향 계수 d ∈ {+1, −1}가 붙어 부등호의 방향을 뒤집을 수 있게 되어 있다. 즉 하나의 약분류기를 정하려면 어떤 필터를, 어떤 크기로, 어디에 놓고, 어떤 임계값과 방향으로 자를지를 모두 정해야 한다.

부건 검출에서는 여기에 두 가지를 명시적으로 넣었다. 부건은 글자 안에서 차지하는 크기가 일정하지 않으므로 scale을 파라미터로 두었고, 부건은 글자 안의 특정 위치(좌 · 우 · 상 · 하 등)에 놓이는 경향이 있으므로 좌표를 약분류기의 구성 요소로 함께 고려했다. 결과적으로 하나의 약분류기는 <필터 종류, scale, 좌표>의 조합으로 정의되고, 부건 하나의 최종 분류기는 이 약분류기들을 더해서 만들었다. 특징을 데이터에서 학습시키는 대신, 부건이 조합된다는 도메인의 구조를 특징 설계에 직접 집어넣은 방식이다.

계산 쪽에서 걸리는 것은 창 크기였다. Haar feature는 사각형 영역의 픽셀 합 차이다. 창을 키우면 합산해야 할 픽셀도 늘어나므로, 다중 스케일 검출에서는 이 부분이 곧바로 병목이 된다. 그래서 적분영상(integral image)을 썼다. 각 픽셀이 원점부터 그 위치까지의 직사각형 영역에 있는 모든 픽셀의 합을 갖도록 미리 한 번 만들어 두면, 임의의 사각형 영역 합을 네 번의 조회와 덧셈 · 뺄셈으로 구할 수 있다. 크기와 무관하게 일정한 연산량이 된다.

특징은 부건마다 이미지 크기를 다르게 잡아 계산했다. 矢는 40×70, 用은 40×80, 可는 30×80, 函은 60×90이다. 각 부건 이미지에 대해 가능한 모든 시작 좌표와 블록 크기를 훑으면서 흰 영역의 합에서 검은 영역의 합을 뺀 값을 특징으로 기록했다. 블록 크기로 나눠 정규화했기 때문에 scale이 달라져도 특징 값의 범위가 유지된다.

약분류기의 정의 — 창에서 계산한 Haar feature 값을 방향 계수와 임계값으로 잘라 +1/−1을 답한다
약분류기의 정의 — 창에서 계산한 Haar feature 값을 방향 계수와 임계값으로 잘라 +1/−1을 답한다

AdaBoost — 어려운 샘플을 다음 라운드에 더 자주 보게 한다

약분류기 하나는 부건 하나에 대해서도 충분히 정확하지 않다.

AdaBoost(Adaptive Boosting)는 훈련 집합과 약분류기로 강분류기를 구성하는 반복 학습 알고리즘이다. 훈련 집합은 양성 샘플과 음성 샘플로 이루어지고, 약분류기는 앞에서 만든 Haar-like feature에서 생성된다. 원래 이진 분류를 위해 고안되었지만 다중 계층 분류로 확장할 수 있고, 얼굴 검출에서 성공적으로 쓰인 전례가 있었다. 필기 변동이 큰 한자에서 차원 수를 줄이고 필요 없는 특징을 제외해 수행 시간을 단축할 수 있다는 점도 이 알고리즘을 택한 이유였다.

학습 절차는 다음과 같다. 각 약분류기는 전체 훈련 집합의 랜덤 하위 집합으로 훈련한다(완전 무작위는 아니고, 어느 수준까지 훈련한 뒤 가중치를 반영한다). 훈련이 끝나면 각 훈련 항목에 가중치를 부여하는데, 잘못 분류된 항목에 더 높은 가중치를 주어 다음 분류기의 하위 훈련 집합에 확률적으로 더 자주 나타나게 한다. 각 분류기에는 정확도에 따른 가중치를 주어, 정확한 분류기가 최종 결과에 더 크게 기여하도록 했다.

부스팅 계열에서 샘플 가중치를 갱신하는 방식은 두 갈래로 나뉜다. 요소 분류기의 인식률에 따라 갱신하는 Discrete AdaBoost와, 샘플의 인식 정도에 따라 갱신하는 Real AdaBoost다. Real 쪽이 더 정교해 인식률이 높아질 수 있지만 표본의 인식 차이를 추정해야 해서 실무에서는 복잡해질 수 있다. Real AdaBoost의 출력은 부호가 인식 결과를, 절댓값이 그 결과의 신뢰도를 나타낸다는 점도 정리해 두었다. 이 연구에서 쓴 것은 stump 기반의 Discrete 계열이다.

보고서에 적어 둔 의사코드(AdaBoost Algorithm for binary radical filtering)는 표준형 그대로다. 입력은 훈련 집합과 각 샘플의 정답 라벨, 그리고 반복 횟수 T다. 가중치 분포를 D₁(i) = 1/m으로 초기화한 뒤 t = 1…T 동안 (1) 가중치를 구성하고 (2) 오차가 작은 약분류기를 찾고 (3) 그 오차로 분류기 가중치를 정하고 (4) 정규화 상수로 나눠 표본 가중치를 갱신한다. 출력은 이들을 더한 강분류기다.

AdaBoost를 택한 실무적 이점도 함께 적어 두었다. 훈련 복잡도가 훈련 데이터 수에 대해 선형이라 테스트가 빠르고, 약분류기를 고르는 데 유연하며, 시간을 크게 줄이면서도 더 높은 탐지 성능을 얻을 수 있다는 점이다.

약분류기 T개의 출력을 정확도 가중치로 더해 강분류기를 만드는 구조
약분류기 T개의 출력을 정확도 가중치로 더해 강분류기를 만드는 구조

부건 검출 절차 — 다중 스케일 창과 이웃 창의 결합

부건이 있다고 예측한 창이 충분히 모여야 검출로 인정했다.

검출은 슬라이딩 윈도우로 했다. 정해진 구간 안에서 일정 간격으로 scale을 바꿔 가며, 각 scale에서 기준 창 크기를 그 배율만큼 늘려 이미지 전체를 훑는다. 창의 이동 폭도 창 크기에 비례하게 두어, scale이 커지면 보폭도 함께 커지도록 했다.

각 창에 대해서는 먼저 창 이미지의 평균을 빼고 표준편차를 계산한다. 표준편차가 1보다 크지 않으면 그 창을 버린다. 획이 거의 없는 빈 영역을 걸러 내기 위한 조건이다. 통과한 창은 표준편차로 나눠 정규화한 뒤 해당 캐스케이드 층이 요구하는 특징을 계산하고, 층이 음성으로 판정하면 그 자리에서 후보 집합에서 제거한다. 층을 통과한 창만 다음 층으로 넘어간다.

마지막으로 남은 창들을 하나의 검출로 합쳤다. 부건이 있다고 예측된 창들 중 같은 크기의 인접한 창이 충분히 많이 모인 영역만 부건이 있다고 판정했고, 예측 창들의 왼쪽 위 모서리가 서로 겹치면 같은 부건에 대한 예측으로 간주해 묶었다. 이렇게 결합해 만든 최종 창을 원본 글자 이미지 위에 그려 결과를 확인했다.

검출 코드를 실행한 화면 — 可 부건 검출기가 &lsquo;河&rsquo; 이미지 안에서 찾아낸 최종 창과, 터미널에 찍힌 필터 파라미터와 비용 값
검출 코드를 실행한 화면 — 可 부건 검출기가 ‘河’ 이미지 안에서 찾아낸 최종 창과, 터미널에 찍힌 필터 파라미터와 비용 값

검증 — IoU로 본 부건별 편차

네 부건 모두에서 되지는 않았다. 可는 0.87, 矢는 0.5였다.

검증은 矢 · 用 · 可 · 函 네 부건을 대상으로 했다. 부건당 학습 데이터는 90장, 테스트는 해당 부건을 포함하는 글자 30장이다. 평가지표는 IoU(Intersection over Union)를 썼다. 모델이 예측한 상자와 실제 영역(GT) 두 상자의 교집합을 합집합으로 나눠, 위치까지 맞게 찾았는지를 본다.

지표
평균 IoU0.37950.52210.66920.4045
TP 개수 (IoU > 0.5)15182618
FP 개수 (IoU < 0.5)1512412
정밀도0.50.60.870.6

부건에 따라 결과가 크게 갈렸다. 可는 30장 중 26장을 IoU 0.5 이상으로 맞혔지만, 矢는 절반인 15장에 그쳤다. 평균 IoU도 0.6692와 0.3795로 거의 두 배 차이다. 可는 ‘口’가 들어간 닫힌 윤곽과 긴 세로획이 함께 있어 평균 이미지가 뚜렷한 흑백 대비를 만드는 반면, 矢는 삐침과 파임이 필기자마다 크게 흔들려 평균 이미지가 뭉개진다. 다만 이 해석은 결과를 보고 붙인 것이고, 부건별 평균 이미지의 선명도와 IoU를 정량적으로 대응시켜 확인하지는 못했다.

用과 函은 정밀도가 0.6으로 같지만 평균 IoU는 0.5221과 0.4045로 벌어진다. 즉 函은 ‘맞다/틀리다’의 개수는 用과 같은데 맞힌 상자의 위치가 더 어긋나 있다. 이런 지점 때문에, 개수 기반 정밀도만 보고 판단하면 안 된다는 것을 이 표에서 확인했다.

IoU 계산 방식 — 실제 영역과 예측 영역의 교집합을 합집합으로 나눠 위치까지 맞게 찾았는지 본다
IoU 계산 방식 — 실제 영역과 예측 영역의 교집합을 합집합으로 나눠 위치까지 맞게 찾았는지 본다

제목에 있지만 본문에 남지 않은 것 — L2,1-norm과 ADMM

논문 제목의 절반은 목차에만 있고, 서술과 결과가 비어 있다.

이 프로젝트의 최종 논문 제목은 “Haar radical stump를 사용한 부건 결합 검출 에이다부스트 알고리즘과 L2,1 norm ADMM을 통한 훈련되지 않은 한자 필기체 이미지 인식 방법 연구”다. 목차에도 ‘2.2 ADMM 알고리즘의 Offline 한자 필기체 인식의 적용’, ‘2.2.1 ADMM 알고리즘’, ‘2.2.2 알고리즘 구현’이 들어 있다.

그런데 남아 있는 원문에서 이 절들은 제목만 있고 본문이 비어 있다. 마지막 미팅 자료의 메모에 “ADMM, boosting 선행연구, 정리 포함 응용”이라고 적혀 있는 것이 이 부분에 관한 유일한 기록이다. 실제로 구현해 결과를 낸 것인지, 계획 단계에서 멈춘 것인지 자료로는 판정되지 않는다.

의도했던 역할 자체는 분명하다. L2,1-norm은 행 단위로 L2 노름을 취한 뒤 그 값들을 L1으로 더하는 형태여서 특징(행) 전체를 함께 0으로 밀어내는 그룹 희소성을 만들고, 부건 검출에서는 쓸모 없는 stump 조합을 통째로 떨어뜨리는 데 쓰인다. 이 목적함수는 미분 불가능한 항을 포함하므로 문제를 나눠 번갈아 풀고 이중변수로 제약을 맞추는 ADMM으로 최적화한다. 다만 그 결과가 이 프로젝트의 어느 수치에도 반영되어 있지 않으므로, 위의 IoU 표는 Haar-radical stump + AdaBoost까지의 결과로 읽어야 한다.

Haar와 CNN을 나란히 놓고 본 것

직접 설계한 특징이 어디까지 통하는지 알려면 학습된 특징과 비교해야 했다.

제안 방법만 붙들고 있지 않고, 같은 문제를 CNN이 스스로 뽑은 특징으로 풀면 어디까지 되는지도 함께 조사했다. 보고서에는 두 방식을 “Haar-feature는 수동으로 결정 / CNN은 커널 값이 훈련에 의해 결정”으로 대비해 정리했다.

항목Haar 기반 캐스케이드CNN
특징 결정사람이 수동으로 설계훈련으로 커널이 결정
학습해야 할 것어떤 Haar 특징을 쓸지에 대한 가중치커널 값 전체
필요한 데이터 양상대적으로 적은 데이터로도 가능훈련 데이터 품질과 양에 의존
연산량 · 속도계산이 적어 실행이 빠름상대적으로 무거움
변형에 대한 강건성모서리 · 선이 명확한 정면 형태만 검출부분적으로 가려지거나 기울어진 대상도 검출 가능

얼굴 검출 사례를 참고한 관찰도 함께 적었다. OpenCV의 Haar 기반 캐스케이드는 훨씬 빠르지만 실제 정면만 인식했고, MTCNN 검출기로 바꾸자 기울어지거나 손에 부분적으로 가려진 얼굴까지 잡는 대신 영상이 지연되기 시작했다. 그리고 Haar 기반 검출기를 전제로 훈련한 감정 인식 네트워크는, MTCNN이 가려진 얼굴에 상자를 그려 줘도 그 얼굴의 감정을 인식하지 못했다. 앞단 검출기의 성질이 뒷단 모델의 입력 분포를 결정한다는 관찰이었다.

이 대비는 우리 문제에 그대로 적용된다. 부건 검출에서 Haar-radical stump가 유리한 것은 부건당 90장이라는 적은 데이터로도 분류기를 만들 수 있다는 점이었고, 불리한 것은 필기 변동이 큰 부건(矢 등)에서 곧바로 정확도가 떨어진다는 점이었다. IoU 표의 편차가 그 대가였다.

앞의 네 Haar 특징을 3×3 커널의 수치로 옮긴 것 — 번호가 위 그림과 같다. Haar에서는 이 −1과 5가 사람이 정해 둔 고정값이고, CNN에서는 같은 자리의 값이 훈련으로 정해진다
앞의 네 Haar 특징을 3×3 커널의 수치로 옮긴 것 — 번호가 위 그림과 같다. Haar에서는 이 −1과 5가 사람이 정해 둔 고정값이고, CNN에서는 같은 자리의 값이 훈련으로 정해진다

하지 못한 비교와 남은 한계

보고서 목차에 있었지만 채우지 못한 절들을 그대로 적는다.

학사학위논문 목차의 3장은 검증에 통째로 배정되어 있었다. ‘3.1 haar like weak classifier + adaboost 알고리즘 검증’, ‘3.2 DenseRAN 알고리즘 정확도’, ‘3.3 Radical mapping encoder + Radical aggregation module + Character analysis decoder 정확도’이고, 셋 모두 ‘학습시킨 글자를 다른 글쓴이가 쓴 test data’와 ‘unseen data(다른 부건 결합 형태를 가진 test data)’의 두 조건으로 나뉘어 있었다. 이 절들은 제목만 있고 결과가 채워지지 않았다. 제안 방법 자신의 unseen 조건인 ‘3.1.2’도 마찬가지로 비어 있다. PBL 최종보고서의 ‘3. 실험’ 절 역시 비어 있다.

따라서 이 연구가 실제로 보인 것은 다음까지다. 부건 4종에 대해 Haar-radical stump 기반 약분류기와 AdaBoost로 검출기를 만들 수 있고, 그 검출기가 필기 글자 이미지 안에서 부건 위치를 IoU 0.38~0.67 수준으로 찾아낸다는 것. 부건 검출 결과를 결합 형태 13종에 대응시켜 실제로 훈련되지 않은 글자를 판정하는 마지막 단계는 검증되지 않았다. 제안의 핵심 주장인 ‘unseen 한자 인식’에 대한 수치는 원문에 없다.

정리하면 이 논문에서 확인된 것과 확인되지 않은 것은 이렇게 갈린다.

단계상태
부건 단위 데이터 구축 (CASIA-HWDB 1.1 → 부건 crop)완료 · 부건당 90장
Haar-radical stump 3종 제작 (임계값 30 · 70 · 100)완료
약분류기 + AdaBoost 부건 검출기완료 · 부건 4종
부건 검출 성능 (IoU · 정밀도)측정됨 · 0.3795~0.6692 / 0.5~0.87
L2,1-norm 회귀 + ADMM 결합본문 · 결과 없음
부건 결합 형태 13종으로 글자 판정형태 정리만 · 판정 결과 없음
DenseRAN 등 선행 기법과의 정확도 비교목차만 · 미수행

원문을 다시 읽으며 정정한 것

글로 옮기면서 자료끼리 어긋나는 지점을 찾아 함께 적는다.

세 종류의 원본(PBL 최종보고서 · 학사학위논문 · 발표자료)을 대조하면서 서로 어긋나는 지점을 찾았다. 지우는 대신 남겨 둔다.

지점원문 서술확인한 사실 · 정정
실제 한자 수두 보고서의 1.1절과 학사학위논문 2.2.1절은 “실제 한자 수가 5000개 이상”, 발표자료 3번 슬라이드와 학사학위논문 뒤쪽 ‘연구의 배경’ 메모는 “50000개 이상”같은 팀의 자료 안에서 한 자릿수가 다르고, 한 문서 안에서도 두 값이 함께 쓰인다. 이 글에서는 확정 가능한 수치인 통용규범한자표 8,105자만 본문에 썼다
두 산출물의 제목과 저자 순서PBL 최종보고서는 “Haar radical stump를 사용한 … L2,1 norm ADMM을 통한 …”(김예빈 · 송유진 · 양효용 · 최윤정), 학사학위논문은 “Adaboost 알고리즘을 이용한 한자 필기체 인식 개선 방법 연구”(송유진 · 최윤정 · 김예빈 · 양효용)같은 프로젝트의 두 산출물인데 제목과 저자 순서가 다르다. ADMM은 PBL 최종보고서 쪽 제목에만 들어 있다
PBL 최종보고서 표지“2019년 2학기 산업공학종합설계 · PBL 최종보고서”, 작성 시점은 “2020년 6월”학사학위논문 표지는 “2020년 1학기”로 적혀 있고, 발표자료와 코드 스크린샷의 날짜도 2020년 4~6월이다. 2019년 2학기 표기는 이전 학기 양식을 그대로 쓴 것으로 보인다
논문 제목의 ADMM제목과 목차에 L2,1-norm ADMM이 들어 있음해당 절의 본문과 결과가 비어 있다. 이 글에서는 IoU 결과를 ‘Haar-radical stump + AdaBoost까지의 결과’로 한정해 적었다
보고서 3장 ‘실험’목차와 절 제목이 존재본문이 비어 있다. 정량 결과는 4장 ‘식별률 결과’에만 있다
참고문헌 표기본문 인용과 참고문헌 목록의 표기 방식이 통일되어 있지 않음1저자 · 학회 · 연도만 남기고 이 글에서는 개별 인용을 옮기지 않았다

이 연구가 남긴 것

배우지 않은 것을 논문으로 읽고 직접 구현해 동작을 확인한 첫 경험이었다.

Haar-radical stump도, L2,1-norm 회귀의 ADMM 최적화도 수업에서 다룬 내용이 아니었다. 논문을 찾아 읽고, 무엇을 구현해야 하는지 스스로 정리하고, 코드로 옮겨 동작을 확인하는 절차를 처음부터 끝까지 밟은 것이 이 프로젝트였다. 팀에서 맡은 몫은 Haar filter 3종 제작(부건 평균 이미지 · 합성 · 대비 보정), 부건 결합 형태 13종 정리, 부건 검출기였다.

가장 어려웠던 부분은 알고리즘이 아니라 한자 구조에 대한 도메인 지식이었다. 어떤 획 뭉치를 하나의 부건으로 볼 것인지, 그 부건이 글자 안에서 어떤 형태로 결합하는지를 스스로 정리해야 했고, 그 판단이 곧 학습 데이터의 crop 기준이 되었다. 많은 양의 이미지를 직접 가공하면서 얻은 결론은, 특징 설계의 대부분은 코드가 아니라 데이터를 어떻게 자를지의 결정이라는 것이었다.

논문이 끝난 뒤 방학 동안에는 Factorization을 적용한 GoogLeNet과 ResNet으로 PC 웹캠에서 한자를 인식하는 데모를 만들었다. 다만 이 후속 작업은 이력 정리 메모에만 남아 있고 코드나 결과물을 확인하지 못했으므로, 여기까지만 적는다. 이때 접한 인셉션 계열 구조는 바로 다음 학기의 종합설계(유방암 조직병리 이미지 인식)에서 다시 쓰게 된다. 직접 설계한 특징이 어디까지 통하는지 확인하고 싶어 학습된 특징과 비교해 보기로 한 것이 그 다음 프로젝트였다.

결과 자체는 완결되지 않았다. unseen 한자를 실제로 읽어 보이는 마지막 단계에 도달하지 못했고, 제목에 넣은 방법의 절반은 문서에 흔적만 남았다. 다만 이 프로젝트에서 만들어진 습관 — 배우지 않은 방법을 논문에서 가져와 직접 구현하고, 되는 곳과 안 되는 곳을 수치로 갈라 놓는 것 — 이 이후 석사 과정에서 베이스 모델을 재현하고 제안 기법을 구현하는 작업의 기반이 되었다.

여기서 배운 것

  1. 학습 단위를 바꾸는 것이 모델을 키우는 것보다 먼저다. 글자를 클래스로 두면 8,105자를 다 모아도 그 밖의 글자는 못 읽지만, 부건(200~500자)을 단위로 두면 같은 비용으로 훨씬 넓은 범위를 덮을 수 있다.
  2. 특징을 손으로 설계한다는 것은 결국 데이터를 어떻게 자를지 결정하는 일이었다. 부건 crop 기준과 평균 이미지의 이진화 임계값(30 · 70 · 100)이 검출기의 성능을 실제로 결정했다.
  3. 부건마다 결과가 크게 갈렸다(可 0.87 vs 矢 0.5). 평균 성능 하나로 요약하면 어디서 무너지는지 보이지 않는다는 것을, 부건별로 나눠 표를 만들어 보고 알았다.
  4. 개수 기반 정밀도와 평균 IoU가 어긋나는 경우(用 0.6/0.5221 vs 函 0.6/0.4045)가 있었다. 지표 하나로 판정하면 위치가 어긋난 검출을 놓친다.
  5. 제목에 쓴 방법과 실제로 검증한 범위가 다를 수 있다. 이 글을 쓰면서 ADMM 절과 3장 실험이 비어 있다는 것을 확인했고, 결과를 인용할 때 어디까지가 측정된 것인지 먼저 확인하는 습관을 얻었다.