POC18 현재 진행상황 · 2026-07-06

42세 여성 필기체를 완전한 한글 폰트로 확장하는 실험

현재 작업은 실제 손글씨 글자 이미지를 기반으로 TTF를 만들고, 사람이 쓰지 않은 1만 자 이상의 한글까지 같은 필체처럼 커버할 수 있는지 검증하는 POC입니다. 결론은 명확합니다. 많이 쓴 글자는 벡터화로 안정적이고, 적게 쓴 글자를 전체 한글로 확장하는 증강 구간이 병목입니다.

10,923

Writer42 실제 손글씨로 확보된 글자 수

00_MASTER_LOG.md

11,172

현대 한글 전체 음절 커버리지 목표

REPORT_15

0.4583

최신 holdout OCR 정확도, floor 0.8 미달

run_0023

데이터의 정체

데이터는 “작가 42번”으로 묶은 실제 한글 손글씨 이미지입니다

AI Hub 한국어 글자체 이미지의 음절 이미지와 메타데이터를 분석해, 연속 id와 동일 속성 블록으로 한 사람의 글자 묶음을 추정했습니다. 이 묶음은 내부 이름으로 Writer42이며, 메모에는 여·42·직장인 실필적으로 기록돼 있습니다.

  • 글자 단위 PNG와 정확한 문자 라벨이 있으면 모델 없이 바로 벡터화할 수 있습니다.
  • 실제 원천 데이터에는 writer id가 명시돼 있지 않아, metadata block 추정과 검증 캐시가 중요합니다.
  • Writer42는 실제 글자 수가 많아 정답지 역할을 하며, 증강 결과를 OCR·IoU·Writer-ID로 평가할 수 있습니다.
Writer42 실제 손글씨 글자들이 격자 형태로 배열된 몽타주
writer42_full_montage.png · 실제 손글씨 글자 샘플 몽타주
왜 어려운가

몇백 글자로 1만 자 넘는 한글을 덮으려면, 보지 않은 조합을 만들어야 합니다

수집 현실 118~399자

Own-My-Geul 118자, AI Hub 제작 템플릿 399자, 내부 가정 최소셋 약 300자.

제품 목표 2,350 / 11,172자

KS X 1001 공통 한글 2,350자와 현대 한글 전체 11,172자. 실제 서비스에서는 빈칸과 대체폰트가 나와서는 안 됩니다.

구조 문제

초성·중성·종성의 위치와 조합은 글자마다 달라집니다. 단순 획 두께나 threshold 조정만으로는 한글 구조가 쉽게 무너집니다.

필체 문제

OCR이 맞아도 같은 사람처럼 보이지 않으면 실패입니다. 최신 실험에서 OCR 후보가 늘어도 Writer-ID 점수가 급락했습니다.

검증 문제

LLM 주관 평가가 아니라 글자 정답, OCR, 구조 IoU, Writer-ID를 동시에 봐야 합니다. smoke pass와 holdout pass도 분리해야 합니다.

수집 방식

가장 안전한 입력은 “칸마다 한 글자” 템플릿입니다

자유 필사는 필체 분위기와 OCR 연구에 유용하지만, 폰트 제작에는 라벨이 확정된 템플릿이 직행 경로입니다. 칸 위치가 라벨이 되면 세그멘테이션과 OCR 추측을 줄이고, 쓴 글자는 그대로 글리프가 됩니다.

1

템플릿

대표 글자 또는 KS/자모 커버셋을 칸 단위로 수집

2

슬라이싱

칸 좌표로 글자 이미지와 라벨을 안정적으로 연결

3

벡터화

이진화 후 potrace와 fontTools로 TTF 생성

4

라우팅

없는 글자는 자모·형제 부품·rescue source로 조립

5

게이트

OCR, Writer-ID, Windows 렌더와 설치 QA까지 확인

118자 손글씨 수집 템플릿 샘플
ownmygeul_template_118.png · 템플릿형 수집 예시
확정된 기준선

M4는 “누락 없는 한글 TTF” 기준선을 닫았습니다

현재 제품화 기준선은 M4 routed full Hangul TTF입니다. 라우터가 exact source, sibling rescue, compound jong rescue를 기록하며, KS X 1001과 현대 한글 전체 coverage를 모두 100%로 만들었습니다. 다만 스타일 polish는 아직 별도 과제입니다.

2,350 / 2,350

KS X 1001 공통 한글 coverage

REPORT_15

11,172 / 11,172

현대 한글 전체 coverage

REPORT_15

pass

Windows private render와 per-user install QA

REPORT_16

full OCR
0.4891
P(W42)
0.6198
Top1 W42
0.6848
증강 접근

POC18은 자동 실험 루프로 “읽힘”과 “필체”를 동시에 맞추려 합니다

학습 후보를 만드는 쪽

  • residual refiner: M4 렌더와 GT ink 차이를 학습
  • STE binary refiner: 이진 결과 기준 Writer-ID style loss 연결
  • OCR identity CE: 글자 정체성을 잃지 않도록 학습 손실에 포함
  • morphology와 blend 후보: 글자별 후보군을 넓혀 OCR 정답을 찾음

실패를 막는 쪽

  • OCR guard: baseline보다 읽힘이 나빠지는 글자는 되돌림
  • holdout gate: smoke overfit과 일반화 실패를 분리
  • style floor: OCR 정답이어도 Writer42 필체가 무너지면 reject
  • loop_state: 실패 이유와 next_track을 다음 실험으로 넘김
게이트 목적 현재 floor 왜 필요한가
OCR 글자가 읽히는지 확인 0.8 필체가 좋아도 읽히지 않으면 폰트로 실패
Writer-ID Writer42처럼 보이는지 확인 P(W42) 0.5 / Top1 0.8 OCR 후보가 다른 사람 필체로 붕괴하는 것을 방지
Structure IoU GT와 구조적으로 맞는지 확인 0.6 threshold나 굵기 조정이 구조를 깨는지 탐지
실행 타임라인

smoke는 통과했지만, holdout에서 병목이 드러났습니다

run 의미 OCR P(W42) 판정
run_0015 STE + OCR identity CE가 24자 smoke에서 세 게이트를 첫 동시 통과 1.0000 0.8284 smoke pass
run_0018 36자 train / 24자 holdout 분리. shared refiner가 baseline보다 OCR을 낮춤 0.2917 0.1921 reject
run_0019 per-glyph OCR guard로 baseline 회귀를 막음 0.3333 0.2110 floor 미달
run_0020 morphology 후보군으로 OCR을 0.5000까지 올렸지만 필체가 붕괴 0.5000 0.0533 style collapse
run_0022 blend + style floor로 이번 묶음 최고 style-safe 점수 0.4583 0.2184 OCR floor 미달
run_0023 style floor를 50%로 완화했지만 OCR 회복 없이 최신 reject 유지 0.4583 0.1657 reject_holdout_ocr_floor
증거 화면

run_0015는 “가능성”을, run_0023은 “현재 병목”을 보여줍니다

왼쪽 atlas는 GT, candidate, diff를 글자별로 비교합니다. run_0015는 smoke에서 OCR과 style을 동시에 통과했지만, run_0023은 holdout에서 여전히 OCR floor에 못 미치고 Writer42 확률도 낮습니다.

1.0000

run_0015 smoke OCR

P(W42) 0.8284 · IoU 0.7100

0.4583

run_0023 holdout OCR

P(W42) 0.1657 · floor 0.8 미달

run 0015 smoke atlas crop
run_0015_ste_ocr_loss_smoke
run 0023 holdout atlas crop
run_0023_relaxed_blend_style_floor_candidate_pool_holdout_gate
현재 판정

지금은 성공이 아니라, 실패 지점을 정확히 좁힌 단계입니다

닫힌 문제

실제 글자 기반 벡터화, TTF 생성, full Hangul coverage, Windows 렌더/설치 QA는 기준선이 있습니다.

부분 진전

OCR guard와 candidate pool은 holdout OCR을 baseline 0.3333에서 0.5000까지 밀어 올릴 수 있음을 보였습니다.

열린 병목

OCR을 올리는 후보가 Writer42 필체를 깨뜨립니다. style floor를 붙이면 필체는 조금 회복되지만 OCR이 0.4583에서 멈춥니다.

coverage
pass
smoke gate
pass
holdout OCR
0.4583 / 0.8
holdout style
0.2184 / 0.5 best
다음 접근

다음 실험은 “style-safe OCR 후보 생성”으로 좁혀져 있습니다

1. 탈락 후보 분석

style_rejected_correct_count가 높은 글자를 per-glyph로 추출하고, raw·morphology·blend 중 무엇이 필체를 깨는지 분류합니다.

2. 자모 구조 후보

단순 굵기 변형 대신 자모 구조를 보존하는 후보 생성, OCR-aware affine, writer-id constrained refinement를 우선합니다.

3. 수집량 손익분기

150자, 500자, 1,000자, 2,350자 reference curve를 만들고, 실제로 쓸 만해지는 최소 친필량을 정량화합니다.

next_track raise_holdout_ocr_above_floor 핵심 기준 OCR correct + P(W42) 유지 + Top1 유지 + full-font QA 재연결
근거 파일

이 슬라이드는 repo 내 보고서와 최신 산출물만 요약했습니다

구분 파일 사용한 내용
데이터 00_MASTER_LOG.md Writer42 10,923자, 여/42/직업 메타, 소량 증강 병목
수집 03_assets/sample_handwriting/README.md 자유 필사와 칸 템플릿 입력 형태, 118/399자 템플릿 맥락
coverage REPORT_15, REPORT_16 KS 2,350자, 현대 한글 11,172자 coverage와 Windows QA
POC18 20260706_POC18_AUTORESEARCH_HANDOFF.md run_0015~run_0023 흐름, latest verdict, next_track
latest run_0023/report.json holdout OCR 0.458333, P(W42) 0.1657, reject_holdout_ocr_floor