박현규

알약 각인 판독, 실험 전체 기록

NurseMate의 알약 인식에서 각인을 자동으로 읽게 만들기까지, 무엇을 재고 무엇을 버렸는지 시간순으로 적었다. 수치는 전부 실측이고, 채택보다 기각이 훨씬 많다.

2026.08.26 ~ 2026.09.30 · 평가 실사진은 학습에 한 장도 쓰지 않음

0% → 58.0%
각인 검색 top-1, 실사진 69알약
188 → 240면
자체 판독기 정밀도 90% 통과, 감사셋 331면 (앱 단일 모델. 서버 앙상블 248)
77.0% → 91.2%
두 장 촬영 규칙, 모델 변경 없음
0.82 → 0.99
마크 유무 AUC, 정답 해석 교정 후

1. 문제와 재료

사용자가 손으로 고치지 않아도 정답이 top-k 안에 들어오게 만들 수 있는가.

앱 분석에서 속성 수정 이벤트를 보면 각인이 압도적이고 색, 모양, 제형은 거의 0이다. 속성 추출은 이미 잘 되고 있고, 앱에 각인 추출이 없어 사용자가 매번 직접 입력하고 있었다. 병목은 각인 하나다.

카탈로그와 라벨
카탈로그식약처 DB 25,246종. 읽기 전용 덤프
앞뒤 모두 각인8,694종 (34%)
한 면만 각인16,114종 (64%)
각인 없음438종 (1.7%)
참조 이미지24,786종 확보. 한 장에 앞뒤 두 면이 함께 찍혀 있음
실사진 라벨 (처음)약포지 22개, 알약 69개, 면 138장
실사진 라벨 (확장 후)약포지 129개, 알약 291개, 면 559장. 사람이 점검한 감사셋 331면, 192알약
S3 크롭팀 S3 저장소에 쌓인 알약 크롭 68장. 파일명에 품목코드가 있어 그대로 정답이 된다. 12장의 후보 좁히기 실험에서 감사셋 347면과 함께 썼다

98.3%가 각인을 갖고 있으니 각인 기반 접근의 상한은 높다. 64%가 한 면에만 있다는 사실은 뒤에서 두 번 중요해진다. 두 면을 찍어야 하는 이유이고, 학습 라벨을 면에 배정할 때의 함정이다.

라벨링 도구를 먼저 만들었다

실사진 평가셋은 팀이 직접 만들어야 했다. 구글 드라이브의 약포지 사진에서 알약을 잘라내고 정답을 고르는 웹 도구를 만들어 세 명이 나눠 썼다.

  • 검출은 RF-DETR 체크포인트, 경계선은 폴리곤으로 사람이 보정. 앞뒤 사진은 상자를 짝지어 같은 알약으로 묶음
  • 속성 추출과 후보 검색은 앱이 쓰는 API를 그대로 부른다. 크롭 방식(마스크, 투명 PNG, 원본 해상도)도 앱과 맞춤. 라벨이 앱 동작과 어긋나면 평가가 무의미해지기 때문
  • 정답 속성은 API 응답에 없어 DB 테이블을 읽기 전용으로 조회
  • 기록은 Sheets 세 장. 확정 결과, 어떤 속성을 무엇에서 무엇으로 고쳤는지, 약포지별 소요 시간. 세 명이 동시에 써도 안 부딪히게 xlsx 대신 Sheets
  • 나중에 자체 판독기가 생기자 각인 칸을 자동으로 채워 주게 했다. 사람이 고친 기록이 그대로 판독 정확도 지표가 된다

2. 실험 A. 판독기 없이 검색만

판독기를 붙이기 전에, 각인이 얼마나 정확해야 검색이 버티는지부터 쟀다. 리더를 먼저 붙이면 결과가 나빠도 원인이 리더인지 검색인지 알 수 없다.

정답 각인을 일부러 망가뜨리는 시뮬레이터를 만들었다. 글자 일부만 남기기, 앞 n글자만, 확률로 탈락, 닮은 글자(0/O, 1/I, 5/S 등 15쌍) 치환, 빈 문자열.

조건별 검색 순위 (실사진 라벨 69알약)
각인 조건top-1top-3top-10중앙 순위
각인 없음 (당시 앱 상태)0.0%0.0%0.0%3,043위
앞 1글자1.4%5.8%10.1%57위
앞 2글자31.9%46.4%58.0%4위
임의 3글자62.3%73.9%82.6%1위
20% 닮은 글자 혼동85.5%92.8%94.2%1위
50% 글자 탈락21.7%29.0%39.1%29위
각인 정확92.8%100%100%1위

각인 없이는 25,246종 중 사실상 무작위다. 확실한 글자 셋이면 top-10 82.6%, 둘이면 58.0%. 그래서 목표를 "각인을 다 읽는다"가 아니라 "확실한 두세 글자를 뽑는다"로 잡았다. 닮은 글자 혼동은 편집거리 검색이 흡수하지만, 탈락은 못 버틴다.

3. 실험 B. 판독기와 전처리 비교

기성 판독기 다섯 종과 전처리 열 종을 전부 조합해 돌렸다. "최적 전처리 하나"는 없었다.

판독기 비교, 같은 조건 (크롭 25장)
판독기정확정확+부분속도
Gemini flash40.0%76.0%2,333ms
Apple Vision20.0%28.0%11ms
TrOCR8.0%48.0%424ms
EasyOCR4.0%24.0%84ms
Tesseract0.0%40.0%268ms
전처리별 정확 (크롭 138장, 판독기별 최고만 굵게)
전처리GeminiVisionTrOCREasyOCR
CLAHE36.013.010.95.1
CLAHE 강하게—10.910.16.5
원본36.05.18.02.9
호모모픽—5.810.14.3
언샤프—3.69.43.6
엠보스—2.27.20.7
이진화 / 반전—0.7 / 0.03.6 / 4.30.0 / 0.7

전처리에서 배운 것

  • 고전 OCR에는 CLAHE, 비전 언어 모델에는 원본. 각인은 배경과 같은 색이고 그림자로만 존재한다. 고전 OCR은 "밝은 배경에 어두운 잉크"를 찾는 물건이라 구조적으로 안 맞고, 대비를 올려 줘야 겨우 읽는다
  • 이진화는 모든 판독기에서 최하위. 각인 정보는 완만한 명암 기울기에 있는데 임계값이 그걸 파괴한다. 각인 전용 논문들이 쓴 Otsu 계열 이진화 가설은 우리 데이터에서 틀렸다
  • Tesseract가 너무 낮아 배선을 의심했다. 깨끗한 인쇄 텍스트는 완벽히 읽고 같은 글자를 각인으로 주면 엉뚱한 답을 낸다. 배선은 정상이고 성능이 실제로 그렇다
  • 새로 만든 전처리 둘. 조명과 돔 형상을 큰 시그마로 추정해 빼고 분위수로 늘린 뒤 CLAHE로 마무리하는 relief는 CLAHE와 동급이었다. 조명 방향을 적분해 요철을 높이로 복원하는 shading은 줄무늬가 생겨 기각
  • 그 과정에서 정규화 버그를 잡았다. 최소·최대로 정규화하면 알약 표면의 반사광 한 점이 최댓값을 잡아 각인의 미세한 차이를 0~2 범위로 찌그러뜨린다. 알약 안쪽 화소의 1~99 분위수로 바꿨다

판독기 쪽에서 배운 것

  • 확대는 무의미하다. 2배, 4배 확대해도 정확도가 20.0 → 22.9 → 20.0%로 잡음 안이다. 원인은 202px 원본과 1,400px 확대본의 입력 토큰이 둘 다 1,205개로 같다는 것. 모델이 고정 토큰으로 정규화해 확대가 정보를 못 늘린다
  • 각인 영역만 잘라 확대하는 것도 −5.7%p. 맥락을 함께 잃는다
  • 더 큰 모델이 답이 아니다. pro급은 flash와 정확이 같은데 3배 느리고, 최신 flash는 5배 느린데 오히려 낮았다
  • 곡선 각인을 직선으로 펴는 정렬(GO-PILL 방식)은 효과 0. 우리 각인은 호를 그리지 않는다
  • 회전 4방향을 한 장에 보여 주는 입력은 통했다. 크롭 138장 중 125장이 이미 똑바로 서 있어 방향 추정기는 필요 없었고, 0°를 포함하느냐가 거의 전부였다
  • 사람의 상한. 정답을 가리고 사람이 읽으면 37.1%. 45.7%는 사람도 못 읽는 사진이다(각인이 안 찍혔거나 제조사 마크). 판독기는 28.6%라 여유가 8.5%p뿐이고, 남은 병목은 촬영이다
표본 35장은 ±3%p 흔들린다

이 장의 비교 상당수가 35장 표본이라, 2~3%p 차이는 판정에 쓰지 않았다. 뒤의 회차에서 평가셋을 키우는 일이 가장 먼저가 된 이유다.

4. 실험 C. 판독, 검색, 검증 종단

판독 결과를 검색에 넣고, 상위 후보를 다시 보여 주며 고치게 하는 파이프라인. 이득의 절반은 판독기가 아니라 그 뒤에서 나왔다.

종단 결과 (실사진 69알약, 138면 전수)
구성top-1top-3top-10top-20중앙 순위
각인 없음 (당시 앱)0.0%0.0%1.4%1.4%1,248위
판독 + 검색53.6%65.2%73.9%84.1%1위
판독 + 검색 + 검증 재정렬58.0%71.0%78.3%84.1%1위

랭커 조정, API 호출 0회

  • 후보 순위 감쇠. 판독기가 낸 여러 후보 문자열에 순위별 감쇠(0.9)를 건다. 감쇠 없이 n-best를 넓히면 오히려 나빠진다. 자리 단위 n-best와 문자열 n-best는 다른 물건이다
  • 속성 가중치를 논문과 반대로. 참고 논문은 각인 가중치가 속성보다 커야 한다고 했는데, 우리 데이터에서는 속성 0.45가 오류율 0~30% 전 구간에서 강했다
  • 빈 판독은 "이 면엔 각인 없음"으로. 카탈로그의 64%가 한 면만 각인이라 빈 면이 정보다
  • 카탈로그 각인 문자열 정규화. 네 가지를 합쳐 top-20 +13.0%p

검증 재정렬

검색 상위 20개 후보를 판독기에 함께 보여 주고 고르게 한다. 호출 한 번에 top-1 +4.4%p, top-3 +5.8%p. 더 중요한 발견은 후보 목록을 보여 주면 같은 모델의 판독 자체가 59.4%에서 69.6%로 좋아진다는 것이다. 논문이 GRU로 학습시킨 언어모델 교정을 카탈로그가 대신한다. 반대로 검색 전에 교정하는 것은 해로웠다.

두 면을 찍어야 한다

한 면만이면 top-1 34.8%, 두 면이면 52.2%. +17.4%p로 이번 회차 최대 단일 레버이고, 모델 교체 효과의 여섯 배다. 한 면만 찍는 플로우는 두 면을 대체할 수 없다.

시험했고 접은 것

  • 이미지 임베딩 재정렬. DINOv2로 참조 면 2,622장과 질의 552장을 비교. top-1 +1.5%p로 검증 재정렬보다 못하고, 해상도를 224에서 448px로 올려도 무변. 임베딩은 각인을 보지 않는다. 다만 색과 모양에는 통한다(대조군 26.1% vs 5.8%)
  • 방향 추정기. PCA, 모멘트, 학습형 셋 다 "0°를 포함한 6방향 탐색"에 진다. 쌍대 부트스트랩 20,000회로 차이가 실재함을 확인하고 기각
  • 문자 검출기 학습. 수 주짜리 bbox 라벨링이 필요한데, 남은 실패 14건 중 문자 순서를 못 맞춰 진 사례가 0건이라 보류
  • 남은 실패 14건(top-20 밖 20.3%) 중 4건은 카탈로그 쪽 데이터 문제. 가장 아까운 건 빈 면을 헛읽어 완벽한 반대 면 판독을 망치는 경우
이 회차에서 뒤집힌 판단
이전 판단실측
크롭 74%는 각인이 눈에 읽힌다무효. 정답을 보고 판정했다. 블라인드로는 37.1%
언어모델 교정은 미구현 중 최대, 수 일학습 없이 이미 했다. 검증 재정렬이 같은 이득
각인 가중치가 속성보다 커야 한다속성 0.45가 전 구간에서 강했다
확대하면 글자가 커진다고정 토큰으로 정규화된다. 무영향
이미지 유사도가 각인 오류를 구제한다임베딩은 각인을 안 본다
최신 모델은 503이 잦아 못 쓴다400이었다. 신형이 특정 옵션을 거절한 것

5. 자체 판독기. 왜 만들었고 데이터는 무엇인가

기성 판독기는 "확신한다"는 말을 문자로 할 뿐이다. 자기 확신도의 AUC가 0.50이었고, 확신한다고 한 답의 23.3%가 틀렸다.

목표가 "확실한 두 글자"라면 더 잘 읽는 모델이 아니라 글자마다 확률이 나오는 모델이 필요하다. 그러면 확실한 글자는 부탁할 것이 아니라 임계값을 올려 뽑는 것이 되고, 정밀도가 목표에 닿는 지점을 곡선에서 직접 고를 수 있다. 구조는 CRNN + CTC. 온디바이스에 올릴 수 있는 크기여야 했다.

라벨은 새로 만들지 않았다

카탈로그 25,246종이 앞뒤 각인 문자열을 갖고 있고, 식약처 참조 이미지는 한 장에 앞뒤 두 면이 들어 있다. 면을 쪼개면 참조 면 한 장이 곧 라벨 하나다. 약 5만 장. 문제는 쪼갠 면이 어느 쪽이 앞인지 모른다는 것이다.

면과 라벨 배정 규칙
한 면만 각인 (63.8%)잔여 에너지가 큰 쪽에 글자를 주고 반대 면은 빈 정답. 이 빈 면 16,000장이 "각인 없는 면을 헛읽는" 실패를 고친다. 기성 판독기에는 없던 지렛대
앞뒤 다름 (34.1%)배정 두 가지를 다 계산해 손실이 작은 쪽을 쓴다. 양쪽 다 비어 있지 않아 "전부 빈 정답"으로 무너지지 않는다
학습 환경
학습23,750알약, 47,500면 (참조 사진만)
검증seen 1,187면, unseen 1,189면 (참조 사진). 체크포인트는 unseen 최고점 기준
평가실사진 전수. 학습에 한 장도 쓰지 않음
장비RTX 4070 SUPER, torch 2.11 CUDA. 에폭당 36~40초. CPU로는 에폭당 수십 분이라 전환
기록실험마다 원자료 JSON을 남겨 지표를 바꿔도 모델을 다시 돌리지 않음. MLflow로 실행 비교

증강 축은 실측으로 골랐다

진짜 난관은 정확도가 아니라 도메인 격차다. 참조는 균일 조명의 스튜디오 사진이고 질의는 약포지를 찍은 폰 사진이다. 처음에는 "실사진은 저해상도에 흐릿하다"고 보고 축소와 강한 흐림을 걸려 했는데, 재 보니 반대였다.

라플라시안 분산(선명도) 중앙   실사진 459.8  vs  참조 343.9
표준편차 중앙                 실사진  36.9  vs  참조  31.4

질의 크롭은 4,000px 폰 사진에서 잘라낸 것이라 오히려 더 선명하다. 화질 열화는 틀린 축이라 뺐다. 남은 축은 통계가 못 잡는 것들이다. 각인은 그림자로만 보이므로 스튜디오의 균일 확산광과 실제의 단일 방향광은 평균과 분산이 같아도 완전히 다른 입력이다.

  • 단일 방향광과 감마, 원근, 회전 ±20°
  • 비닐 반사광, 주름, 약포지 인쇄 글자
  • 광학 효과는 알약 안쪽에만. 질의 크롭은 폴리곤으로 잘려 배경이 순백이라 배경까지 건드리면 도메인이 벌어진다
  • 강도 0, 즉 깨끗한 원본도 함께 학습
  • 회전을 ±20°로 좁게 학습하고 추론에서 24방향을 훑는 설계. 전 방향(180°)을 학습하는 불변 설계와는 반대이며 둘 다 시험했다

6. 1회차. 채널과 전처리를 정했다

흑백과 컬러, 전처리 없음과 CLAHE를 조합한 네 모델. 전처리는 열화 뒤에 걸고, 학습·검증·추론 세 곳에 똑같이 적용한다.

4종 비교 (실사진 69알약, 24방향 스윕 중 대표 지표)
모델검증 unseen정밀도 100% 최대 커버리지 (실사진)
흑백59.6%17알약 (24.6%)
흑백 + CLAHE60.4~60.9%실행마다 요동 (아래)
컬러55.7%없음. 어느 임계에서도 100% 미도달
컬러 + CLAHE60.1%없음
  • 컬러는 손해. 각인은 색이 아니라 그림자로만 존재한다는 전제와 일치한다. 색 채널은 신호를 더하지 않고 잡음만 보탰다
  • CLAHE는 검증 점수를 두 채널 모두에서 올렸다. 모델 입력 밝기를 실사진 통계(알약 안쪽 평균 약 211)에 맞춰 준다. 원본 크롭 196이 CLAHE 후 210. 기성 판독기 스윕에서도 대비 계열이 1위였다
같은 구성(흑백 + CLAHE)을 세 번 돌린 결과
실행검증 unseen정밀도 100% 최대 커버리지
20에폭 1차60.9%27알약 (39.1%)
40에폭64.2%14알약 (20.3%)
20에폭 재현60.4%9알약 (13.0%)
단일 실행을 과신하면 안 된다

검증 점수는 비슷한데 실사진 성적이 27 → 14 → 9알약으로 제각각이다. 평가셋이 69알약이라 정밀도 100% 구간에서 알약 한둘이 뒤집히면 커버리지가 몇 %p씩 흔들리고, 스튜디오 검증 점수는 실사진 고신뢰 성적을 예측하지 못한다. 1차의 27알약은 상당 부분 운이었다. 여기서 "여러 시드로 반복해 평균과 분산을 본다"는 원칙이 나왔다.

7. 2회차. 평가셋, 지표, 구조

이 회차의 가장 큰 사건은 모델이 아니라 데이터다. 평가셋이 4.2배가 되자 결론 여러 개가 뒤집혔다.

평가셋 69알약 → 291알약

드라이브에는 팀원 둘이 라벨한 것까지 129개가 있었는데 로컬에는 22개만 받아져 있었다. 전부 가져오자 알약 291개, 면 559장(각인 있는 면 393)이 됐다.

  • "정밀도 100%"는 표본이 작아서 나온 값이었다. 291알약에서는 어떤 임계에서도 100%가 안 되고 최고가 92.1%다. 목표 지표를 정밀도 95% 지점의 커버리지로 바꿨다
  • 마크 헤드가 1위에서 기각으로. 69알약에서 전 갈래 1위였는데 291알약에서 무너졌다. 표본의 우연이었다
  • 시드보다 표본이 먼저다. 판정을 뒤집은 것은 시드 수가 아니라 평가셋 크기였다. 실무 규칙으로 정했다. 선별 실험은 1시드, 채택 판정은 3시드 이상

지표를 두 번 고쳤다

지표의 변천
지표결함증거
정밀도 95% 격자 최대성긴 임계 격자의 최댓값이라 잡음을 증폭기준선 3시드 범위 15
고정 임계값 0.95정밀도를 통제하지 않아 과확신 모델이 1위로 보임한 갈래가 0.95에서 정밀도 90.8%인데 "96알약 1위"
정밀도 P 지점의 통과 수확신도 순으로 세워 정밀도 P를 지키는 최대 지점. 임계는 갈래마다 자유기준선 범위 5/7/5. 채택

평가셋도 사람이 점검했다. 라벨 오류를 걸러 감사셋 331면, 192알약이 됐고, 이후 모든 수치는 이 감사셋 기준이다. 임계값은 평가셋에서 고르면 안 된다는 원칙도 이때 세웠다. PAVA 평활과 Wilson 하한은 시험 후 기각.

채택 1. TPS 공간 변환기

인식기 앞에 정류기를 붙인다. 작은 CNN이 제어점 20개를 예측해 이미지를 미분 가능하게 변형한 뒤 CRNN이 읽는다. 각도 정답은 쓰지 않고 CTC 손실만으로 "어떻게 펴야 읽기 쉬운가"를 스스로 찾는다. 30갈래 중 유일하게 살아남았다.

TPS (실사진 559면, 5시드씩)
지표기준TPS
맞은 면 (시드별)161 · 164 · 167 · 168 · 168181 · 184 · 186 · 186 · 198
맞은 면 평균165.6187.0
상위 100 정답률86~90%91~94%

기준의 최고(168)가 TPS의 최저(181)보다 낮다. 범위가 겹치지 않는 유일한 갈래였다. 다만 정류기는 의도한 일을 하지 않는다. 제어점 이동량이 평균 6.7px로 회전이 아니라 미세한 확대이고, 1방향만 통과시키면 미도달이라 24방향 탐색은 여전히 필수다. 구현에서 버그 둘을 잡았다. TPS 계수 행렬의 열 순서가 격자 쪽과 달라 항등이 항등이 아니었고, 격자 좌표 규약이 반 픽셀 밀려 있었다. 정류기는 반드시 항등에서 출발해야 한다.

채택 2. FRM (SVTRv2)

높이를 채널로 접어 늘 왼쪽에서 오른쪽으로 읽던 것을, 행마다 폭 방향 자기어텐션을 걸고 선택 토큰이 열마다 행을 고르는 두 단계로 바꿨다.

FRM (감사셋 331면, 정밀도 93% 통과 면, 3시드)
갈래시드별범위판정
기준 (TPS)126 · 118 · 124118~126
FRM150 · 142 · 134134~150채택
SGM (의미 지도 보조 과제)117 · 116 · 101101~117기각
FRM 축소 (가로 어텐션 제거)100 · 108 · 9595~108기각

왜 좋아지는지 가설 넷을 세워 셋을 기각했다. 읽기 순서를 배운 것이 아니다(방향 수를 줄이면 이득이 사라지고 3방향 아래에서는 기준보다 나쁘다). 용량이 늘어서도 아니다(축소판이 파라미터는 더 많은데 더 나쁘다). 행 선택 때문도 아니다(축소판에도 있다). 남은 것은 가로 자기어텐션의 전역 맥락이다. 합성곱 4블록뿐인 트렁크는 수용 영역이 커널에 갇혀 있는데, 각인은 획 하나가 흐려도 글자 사이 관계로 복원되는 면이 있다.

채택 3 (이 회차). 뒤집힌 면에 빈 정답을 가르친다. 최종 구성에서는 닫힘

신뢰도 0.9 이상인 오답 4건 중 3건이 "읽을 줄 아는데 방향을 잘못 골랐다"였다. 다른 회전에는 정답이 있는데 엉뚱한 방향을 최고 확신으로 고른 것이고, 절반이 180° 뒤집힘이다. 180° 돌리면 글자 순서까지 뒤집히고 O, N, S, Z, H는 뒤집어도 자기 모양이라 구분할 근거가 없다.

195°: VV (1.00)  ← 모델이 고름       15°: BP (0.99)  ← 정답
180°: 0N (0.67)                      15°: NO (0.57)

원인은 증강이 각도를 ±20°만 덮는 것이다. 학습에서 본 적 없는 195°는 분포 밖이고, 분포 밖에서는 확률이 보정되지 않는다. 처방은 확률 P로 면을 똑바로가 아닌 각도로 보여 주고 정답을 빈 문자열로 주는 것. "안 서 있으면 아무것도 내지 마라"를 배우면 잘못된 방향의 신뢰도가 내려가고 24방향 argmax가 저절로 바른 쪽을 고른다. 띠 가장자리(35°~325°)를 피하고, 손실의 배정 뒤집기가 글자를 뒤집힌 면에 얹지 않도록 마스크를 걸었다.

뒤집기 확률 비교 (291알약, 정밀도 95% 통과 알약, 3시드)
갈래시드별평균판정
기준0 · 36 · 012.03시드 중 2시드 미도달
P = 0.2537 · 42 · 4441.0이 회차 채택
P = 0.50전 시드 미도달0.0과함
P = 0.25, 최종 구성(TPS, FRM)에서 재시험−42면맞음 208 → 181닫힘

9장에서 TPS와 FRM이 들어간 구성으로 다시 재니 확신도 순위는 좋아졌지만 −42면이었다. FRM이 방향 정보를 이미 일부 흡수해 이득 여지가 작고, 25%를 빈 정답으로 주는 손실만 남은 것으로 보인다. 뒤집힘 축은 학습 쪽으로는 닫았고, 최종 모델에는 들어 있지 않다.

환경 종속. 밝기가 아니라 대비였다

"특정 밝기에 종속된 느낌"을 직접 쟀다. 밝기 사분위별 정확도는 20.9 / 30.2 / 25.2 / 27.5%로 단조롭지 않다. 대비(표준편차) 사분위는 26.6 / 26.6 / 33.1 / 17.6%로 상위 25%에서 급락한다. 각인 자체는 완만한 기울기라 표준편차가 작다. 27을 넘는다는 건 비닐 반사, 약포지 인쇄, 주름처럼 각인보다 훨씬 강한 무언가가 화면을 지배한다는 뜻이고 모델이 그쪽으로 끌린다. 캡슐(인쇄 각인)은 세 번 시도해 침묵률 78%에서 움직이지 않아 미해결로 남겼다.

이 회차에서 기각한 것 (전부 291알약에서 재확인)
갈래결과
방향 간 합의로 확신 보정이득 없음
마크 헤드, 각도 헤드각도 헤드는 각도를 못 맞힘. 69알약에서의 1위는 표본의 우연
전 방향(180°) 학습방향 불변이 180° 모호성을 키움
검출 → 정류 → 판독 (GO-PILL 이식)3시드 67 vs 기준 113. 사람이 그린 박스 오라클로도 17 vs 18, 크롭이 정보를 잃음
판독기 구조 교체 (ResNet18, 컬러, 160px, SVTR 혼합 등)1시드에서 1등 후 3시드에서 붕괴. 범위 36~98
혼동 문자 정규화 (O/0, I/1)검색 top-1 22.8 → 22.1. 편집거리가 이미 흡수, 변별력만 잃음
상용·사전학습 OCR 파인튜닝착수 전 기각. 음각 전용 모델이 없고 제로샷 최고가 우리의 절반
네 번 반복된 패턴

마크 헤드, 각도 헤드, 회전 STN, TPS. 부품이 의도한 기능에는 실패하는데 성적은 오른다. 그래서 "왜 좋아졌나"를 기제까지 추적하는 것을 채택 조건에 넣었다.

8. 추론만 바꾼 개선

학습 없이 추론 구성만 바꿔 정밀도 90% 지점 113 → 131알약. 재료는 확대 TTA와 후보 단위 시드 앙상블이다.

정밀도 90 / 93 / 95% 지점 통과 알약 (감사셋 331면, 192알약)
구성909395AURC비고
단일 모델, 3시드 평균11397910.111범위 5/7/5
단일 + 확대 TTA (배율 6개)11710797—범위 19/20/9
3시드 앙상블 max + 확대1311121100.093쌍 앙상블 3개 전부 기준선 위
3시드 앙상블 agree + 확대1301101070.041217면만 답함. 범위 5/9/3
  • 방향 수를 24에서 144로 늘리는 것은 한 시드에서 −12로 잡음
  • 로그확률 평균 앙상블은 CTC 정렬 불일치로 해로웠다(156면만 답함, AURC 0.223). 후보 단위로 합쳐야 한다
  • agree(합의) 앙상블은 답하는 면이 줄지만 틀릴 때 조용하다. AURC가 절반이다. 다만 모델이 셋이라 폰에 못 올려 최종 채택은 하지 않았다

9. 스윕 24개와 학습량

하룻밤 반 동안 실험 24개를 돌려 확정 개선은 1개였다. 증강, 전처리, 최적화, 사전학습, 백본은 전부 닫혔고 남은 레버는 학습량이었다.

2026.09.06~07 총괄 (정밀도 90% 통과 면/알약. 기준 1시드 188/124, 대조군 184/116, 채택안 206/130)
축실험결과 (면)상태
해부쉬운데 틀리는 16면, 시드별 후보 덤프—증강 분포 안. 원인은 선택(뒤집힘 35%, 시드 불일치). 61면은 지각 실패
회전 학습20° 간격 + 각도 헤드 (처음부터 / 이어서)0 / 81기각
합의 규칙max, 3중2, 판독문 포함, 카탈로그 공존, 방향 게이트최선 212채택안과 잡음 범위
에폭40 (시드 1, 2, 4)210 · 212 · 192단일 모델 채택
증강 추가광원 여러 개, 그림자, 플레어, 인쇄 글자, 전부173 · 157 · 181 · 143 · 151닫힘
증강 완화비중 0.35/0.45/0.20, 0.50/0.35/0.15, 기하만174 · 171 · 131닫힘
전처리CLAHE 위에 반사 인페인팅, 노출 보정, 다중 스케일 레티넥스151 · 153 · 155닫힘
최적화lr 5e-4, 2e-4, 배치 32, 조합, 재현182 · 103 · 174 · 223 → 183분산 40면, 판정 불가
가중치 평균수프 3시드, 수프 두 실행, EMA 0.9990 · 0 · 156기각
확신도TTA 일치도 (표 합, 표 수)125 · 62기각
MIM 사전학습기본, 세로띠, 75%, 회색, SparK 희소, ViT-MAE145 · 167 · 160 · 110 · 170 · 0닫힘
백본SVTR형 혼합155기각
실사 데이터 혼합AI Hub 크롭 6,192쌍153사용 중단
  • 증강 비중은 지금이 봉우리다. 더 걸어도, 덜 걸어도 −10~−50면
  • lr 5e-4 + 배치 32가 223면으로 하루 최고였는데 재현에서 183면. 요행이었다. 같은 시드 재학습이 4~40면 흔들리므로 +15면 이상만 신호로 봤다
  • MIM으로 복원한 이미지를 CRNN에 넣는 "복원 전처리"도 기각. 복원 이미지는 CRNN이 못 읽는다
  • 스튜디오 검증 점수는 실사진을 예측하지 못한다. 재확인

학습량이 마지막 레버였다

에폭별 정밀도 90% 통과 면/알약 (감사셋 331면, 확대 TTA, 24방향)
구성시드 1시드 2시드 43시드 합의합의 p95
20에폭188/124184172206/130160/107
40에폭210212192210/128146/97
60에폭240/150235/146214/135248/153223/138
80에폭213/137245/153—평균 −2—
  • 세 시드 전부 20 → 40 → 60에서 두 단계 모두 상승. 60에폭은 3시드로 확정
  • 40에폭에서는 앙상블 이득이 ±0이었는데 60에폭에서는 206 → 248로 크게 올랐다. 더 읽으면서도 최상위 확신 구간이 깨끗해져(AURC 0.07~0.09) 합의 필터가 잘라 낼 것이 줄었다. 정밀도 95%에서 223면은 331면의 67%
  • 80에폭은 3시드 평균 −2로 축을 닫았다. 단일 시드 최고는 80에폭 시드 2의 245면이지만, 같은 331면으로 6개 중 최댓값을 고른 것이라 실기기 기대치는 240과 다르지 않다고 본다
  • 최종 채택은 60에폭 단일 모델. 3시드 합의 앙상블은 모델이 셋이라 폰에 못 올려 측정만 하고 쓰지 않았다

10. 마크 모델. 일곱 번 실패하고 원인을 찾았다

제조사 기호(마크)는 글자가 아니라 판독기가 못 다룬다. 마크 유무와 종류를 따로 맞히는 모델이 필요했다.

  • 처음 일곱 판은 전부 실패했다. 원인은 모델이 아니라 앞뒤 면 배정이었다. 참조 사진의 어느 면에 마크가 있는지 모른 채 학습해 라벨이 절반은 틀려 있었다. 배정을 풀자 두 판 모두 크게 올랐다
  • 판독기를 고정하고 마크 헤드만 학습하는 구성으로 실사진 유무 AUC 0.910, 이후 전방향 다중 해상도 헤드로 단일 0.946. 각인 손실 0
  • 고해상도 입력과 ImageNet 사전학습 백본을 쓰는 전용 ConvNeXt 모델로 바꾸자 실사진 일반화가 갈렸다. 백본은 Tiny에서 포화
  • 증강은 실사 환경을 흉내 내는 도메인 증강 하나만 두 시드에서 살아남았다. 시드 재현으로 잡음 범위를 재 보니 1시드 비교의 절반은 믿을 수 없었다
AI Hub 실사진 475면, 마크 유무 AUC
모델옛 정답 해석바른 해석임계 0.60 재현 · 오경보
옛 배포 조합 (판독기 고정 + 헤드)0.8210.97562% · 3면
전용 ConvNeXt 단독0.8310.99191% · 4면

"AI Hub 0.82 천장"은 데이터 결함이 아니라 내 채점 오류였다. 라벨의 front/back은 그 사진에 찍힌 면을 뜻하는데 마크가 있다는 뜻으로 읽어, 마크가 한 면에만 있는 품목의 반대 면까지 양성으로 세고 있었다. 평가 페이지에서 "마크인데 놓침"으로 표시된 사례를 연달아 짚어 보다 찾았고, 475면 중 19면의 정답이 뒤집혔다. 배포는 전용 모델 단독으로 정했다. 우리 실사진에서는 임계 0.60에서 재현 80%, 오경보 0.7%로, 옛 조합이 같은 정밀도에서 재현 36%였던 것의 두 배다.

종류 분류는 희귀종을 "기타"로 묶는 104클래스가 전종 205클래스보다 낫다. 실사진 top-1 58.5%, top-3 85.4%. 희귀종이 클래스로 서면 정답 주변 순위를 차지해 밀어낸다. 남은 문제는 폰 사진에서의 유무 재현이지 종류가 아니다.

마크 필터로 후보를 자르는 것은 임베딩 재정렬과 겹쳐 순이득 0이었다. 종 로짓과 임베딩이 같은 모델의 같은 추론에서 나오고, 임베딩은 순위로 부드럽게 쓰는데 필터는 되돌릴 수 없게 자른다. 마크가 값을 하는 자리는 확신 글자가 하나도 없는 면이다.

11. 실패 원인 해부. 모델을 안 바꾸고 올린 것

"실사진에서 무너진다"는 것만 알고 왜인지는 몰랐다. 감사셋 347면을 유형으로 나누고 요인을 하나씩 지웠다.

확신 임계 0.95 기준 실패 유형. 부분 정답 69.1%, 저확신 17.9%, 고확신 오답 8.4%, 침묵 4.6%.

물음과 답
물음답
특정 알약이 원래 안 읽히나아니다. 같은 알약을 2번 이상 찍은 57건 중 22건(39%)이 사진에 따라 갈렸고, 전부 실패는 3건(5%)
해상도, 대비, 선명도, 밝기 탓인가아니다. 성공과의 상관이 전부 |r| 0.13 이하. 같은 알약의 성공/실패 69쌍 부호검정도 유의하지 않음
각인 홈이 깊으면 잘 읽히나아니다. 오히려 반대(r = −0.13)
덜 읽어서인가아니다. 저확신 62면 중 51면이 전혀 다른 글자
CLAHE 세기를 바꾸면 되나아니다. clip 3 / 5 / 8에서 p90 237 / 195 / 170으로 단조 감소. 사진마다 골라 쓰면 맞은 면은 5개 늘지만 확신도가 부풀려져 p90은 낮아짐
오라클 진단. 후보 144개(24방향 × 6배율) 안에 정답이 있는가 (331면)
최고 후보가 정답239면 (72%)
144개 중 어딘가에 정답 있음279면 (84%). 상한
선택 실패 (있는데 못 고름)40면 (12%)
인식 실패 (아예 없음)52면 (16%)

선택 실패 면의 정답 후보는 중앙 3위인데 확신도가 0.80이고 틀린 최고 후보가 0.92다. 확신도로는 못 고른다. 방향 간 합의를 점수에 넣는 규칙 7종을 비교했지만 최선이 +2면이고 나머지는 손해였다. 틀린 답도 인접 방향에서 똑같이 반복된다. 확신도는 전 구간이 비슷하게 과신이라(0.9 구간의 실제 정답률 84%) 단조 변환으로는 순위가 안 바뀌어 후처리 교정에서 얻을 것이 없다.

그래서 여러 장 찍게 했다

실패가 사진에 달렸고 어떤 사진이 좋은지 미리 못 고른다면, 여러 장 찍어 모델이 고르게 하면 된다. 같은 알약을 여러 번 찍은 56건에서 k장을 무작위로 뽑아 확신도가 가장 높은 답을 쓰는 실험.

촬영 장수별 정답률
장수정답률0.9 이상만 답할 때 정밀도
1장77.0%93%
2장91.2%97%
3장92.7%100%
두 장으로 후보 좁히기 (2장 이상 찍은 91품목)
방식후보 중앙값정답 유지후보 1개
1장2894%12%
2장, 교집합487%35%
2장, 교집합, 비면 확신도 쪽591%35%
2장, 합집합161100%6%

같은 촬영 세트 안에서 찍은 8건만 보면 69.3% → 100%. 장소와 조명을 바꿀 필요 없이 그 자리에서 알약을 살짝 돌려 두 번 찍으면 된다. 세 장째부터는 이득이 작다. 앱 규칙은 셋. 두 장 찍는다, 각각으로 후보를 좁힌다, 교집합을 쓰되 비면 확신도 높은 쪽을 쓴다.

실사진을 학습에 섞는 것은 네 번 시도하고 닫았다

스튜디오 사진만으로 학습해 온 것이 모든 축의 공통 벽이라 AI Hub 촬영 사진을 섞었다. 평가셋과 겹치는 품목을 빼고 38품목 1,520장. 라벨 구조를 세 번 고쳐도(알약 단위 → 면 단위 → 판독기로 면 확정) p90이 86~87이었고, 혼합 비율을 10%에서 3%로 낮추자 113으로 올랐지만 기준선 188의 60%다. 품목 수가 한계다. 37품목이 참조 21,374품목을 밀어내 3%에서도 실사 알약 하나가 참조 알약보다 18배 자주 나온다. 다시 열 조건은 실사 품목 수백 개 이상이다.

12. 후보 좁히기 끝까지. 확신 글자, 마크, 임베딩

판독기는 글자를 낸다. 앱이 보여 줄 것은 알약이다. 읽은 글자로 후보를 어디까지 줄이고, 남은 후보를 무엇으로 줄 세우나.

평가 재료는 둘이다. 사람이 점검한 감사셋 347면과, 팀 S3 저장소의 알약 크롭 68장(파일명에 품목코드). 합쳐 415장. 색, 제형, 모양은 맞다고 가정하고 그 조합이 같은 카탈로그 품목에서 출발한다.

필터를 두 글자에서 확신 글자 전부로

판독기 답은 인접 두 글자였는데, CTC 디코드는 글자마다 확률을 준다. 확신도 임계를 넘는 글자를 전부 모아 대조하는 쪽이 모든 면에서 낫다. 판독기를 다시 학습하지 않고 추론만 바꾼 것이다.

각인 필터 (S3 크롭 68장)
필터후보 중앙값1개 확정정답 유지
두 글자 ≥0.949 (옛 방식)6862/68
확신 글자 ≥0.9551664/68
확신 글자 ≥0.9031960/68
확신 글자 ≥0.7022353/68
대조 방식 (415장)
방식후보 중앙값1개 확정정답 유지
부분 수열136493%
자리 유지118089%
연속만117386%
자리 유지, 양끝 고정28557%

임계를 낮추면 후보는 줄지만 정답을 잃는다. 0.95가 봉우리다. 대조는 자리를 고정할수록 정답을 잃는다. 판독기가 앞뒤 글자를 통째로 빠뜨리거나 덧붙이기 때문이다(G100을 100으로, 100을 00으로). 글자 수 조건도 전부 손해였다(정답 유지 93%에서 69~87%). 후보를 지우지 말고 순위만 올리는 쪽이 맞다.

글자 수를 정확히 안다고 가정하면 후보 중앙값 13에서 4, 1개 확정 64에서 124로 뛰어서 글자 수 전용 모델(ConvNeXt-Tiny, 13클래스)을 따로 만들었다. 4~6자에서는 판독기보다 1.5~3배 낫지만 전체로는 48.1%로 판독기 디코드 길이 59.4%에 못 미친다. 둘이 일치하는 면(44%)에서만 83.1%라, 일치할 때만 쓰는 규칙이 다음 후보로 남았다.

임베딩 재정렬. 좁힌 뒤 사진으로 줄 세운다

처음 시도는 1차 실험 때였다. 동결 DINOv2-base로 검색 top-20 안을 다시 줄 세웠더니 top-1 53.6%에서 55.1%로 작게 올랐지만, 입력을 224에서 448픽셀로 올려도 수치가 그대로였다. 임베딩은 각인을 보지 않는다. 카탈로그 각인 오기를 이미지가 구제한다는 기대도 빗나갔다(TACENOLER를 각인 랭커가 1위로 맞혔는데 임베딩이 3위로 밀어냄). 호출 0회라는 이유로만 얹을 만하다고 닫았다.

2회차에서 다시 열었다. 바뀐 것은 둘이다. 임베딩을 각인 대체가 아니라 각인과 마크로 좁힌 뒤의 순위에만 쓰고, 특징을 범용 모델이 아니라 마크 종 모델의 분류층 앞 768차원에서 뽑는다. 질의 크롭과 후보의 식약처 참조 면을 같은 전처리(정사각 224, 알약 안쪽 CLAHE)로 통과시켜 코사인을 재고, 질의는 8방향 회전 중 최댓값을 쓴다.

임베딩 재정렬. 후보 범위에 따라 (감사셋 347면)
후보 범위후보 수 중앙값1위5위 안10위 안20위 안순위 중앙값
전체 카탈로그24,48917.4%30.0%34.5%40.4%47위
색, 제형, 모양만1,21731.5%48.9%55.8%62.8%7위
각인, 마크로 좁힌 뒤667.5%88.7%94.0%97.5%1위
  • 10위 안 열은 기록에 없어 같은 스크립트를 다시 돌려 더했다. 나머지 열은 기록과 소수점까지 같게 재현됐다
  • 수천 개 안에서 임베딩만으로 찾아도 정답 순위 중앙값이 7위다. 무작위면 600위 언저리. 각인 없이도 그림이 꽤 많이 좁히지만, 1위까지 올리려면 각인이 먼저여야 한다
  • 임베딩 단독으로는 못 쓴다. 순서를 바꿔 임베딩으로 먼저 좁히면 무너진다
  • 특징이 중요하다. ImageNet 사전학습만 쓰면 1위 45.6%, 마크 종 모델 특징은 67.5%(+21%p), DINOv2 판은 62.5%
  • 출처별로 S3 크롭 76.8%, 우리 실사진 64.6%. 실사진이 더 어려운 이유는 출발 후보가 크고(흰색 원형 정제 같은 흔한 조합) 각인 없는 뒷면이 섞여서다
  • 기각한 변형 둘. 질의 회전을 8에서 16, 24로 늘리면 67.0, 66.3, 66.0으로 내려간다(최댓값이라 우연 일치가 는다). 각인 점수와 순위를 결합하면 67.5에서 62.5(각인은 필터에서 이미 다 썼다)
전체 파이프라인 (감사셋 347면. 색, 제형, 모양은 맞다고 가정)
단계후보 중앙값1개 확정10개 이하정답 유지
출발1,248——100%
+ 확신 글자 ≥0.95194814093%
+ 마크 유무, 종175014790%
+ 임베딩 재정렬1위 67%, 5위 안 88%

S3 크롭 68장은 출발 683에서 최종 4개, 1개 확정 17장.

마크 필터는 임베딩과 겹친다. 끈다

마크 유무와 종으로 후보를 자른 뒤 임베딩을 돌리는 것과 그냥 임베딩을 돌리는 것을 같은 415장에 걸었다. 보는 값은 "끝까지 1위" = 정답 유지 × 1위. 필터를 세게 걸수록 정답을 버린 사진이 분모에서 빠져 순위 정확도만 좋아 보이기 때문이다.

필터 단계별 끝까지 성적 (415장)
단계 (마지막은 모두 임베딩)후보 중앙정답 유지1위끝까지 1위끝까지 5위 안
A 색, 제형, 모양만1,229100%31.1%30.8%48.9%
B + 확신 글자1392.8%52.6%48.4%64.3%
C + 마크 유무1390.4%53.2%47.7%63.1%
D + 마크 종1389.9%53.5%47.7%62.9%

각인을 먼저 거는 것은 필수다(끝까지 1위 +17.6%p). 마크 필터는 순위를 0.9%p 올리지만 정답 유지를 2.9%p 떨어뜨려 순손해다. 종 로짓과 임베딩이 같은 모델의 같은 추론에서 나오니 종이 아는 것을 임베딩이 이미 알고, 임베딩은 순위로 부드럽게 쓰는데 필터는 되돌릴 수 없게 자른다. 마크가 값을 하는 자리는 확신 글자가 하나도 없는 면이다. 흰색 원형 정제 4,919품목 중 양면에 각인이 전혀 없는 46품목은 마크가 유일한 단서다. 그 조건부 구성은 아직 안 쟀다.

서버 배치

카탈로그 참조 면 48,883장의 임베딩은 fp16으로 72MB. 기기는 8방향 × 768차원 fp16 = 12KB만 보내면 되고(사진은 100~300KB), 서버는 행렬 곱뿐이라 후보 50개에 0.02ms, 전체 4.9만 면과 비교해도 39ms다. GPU가 필요 없다. 대신 모델 버전을 고정해야 한다. 카탈로그 임베딩과 기기 가중치가 같은 판이어야 유사도가 성립한다.

같이 닫은 것

  • DINOv2 백본. 마크 종 모델의 백본만 ViT-S/14로 바꿔 같은 조건으로 학습. 7개 지표 중 6개에서 ConvNeXt 우세(실사진 유무 AUC 0.971 대 0.949, 후보 재정렬 1위 67.5 대 62.5%). 실사진 종 top-1만 +7.4%p인데 41면 기준 3면 차이. 더 작다는 점(22M, 84.6MB)만 남는다
  • 한 글자 각인 가중. 한 글자 알약을 4배 뽑아 학습하니 한 글자 15면 중 0에서 3면을 얻고 p95에서 32면을 잃었다. 맞힌 3면도 없는 글자를 덧붙인 뒤 최고 확신 글자만 골라낸 것이라 능력이 생긴 게 아니다. 남은 침묵 8면이 본질이고, 한 글자 각인은 카탈로그 면의 5.4%라 닫았다
이 장에서 배운 것

한 번 닫은 축도 자리를 바꾸면 열린다. 임베딩은 각인을 대체하는 자리에서는 실패했고, 각인이 좁힌 뒤를 줄 세우는 자리에서는 1위 67.5%의 채택 부품이 됐다. 특징도 범용이 아니라 이 과제로 학습한 모델에서 뽑아야 했다.

13. 온디바이스 비용과 이식

모델 크기는 문제가 아니다. 비용의 전부는 면 1장을 144번 읽는 탐색이다.

판독기 실측 (데스크톱 기준)
파라미터5.59M. 특징 추출 트렁크 0.96M, 나머지는 TPS 정류, FRM, LSTM
파일 크기23.9MB (fp32), fp16 11MB, int8 5.6MB
연산량면 1장 1회 판독 2.8 GFLOP. 24방향 × 6배율 = 144회라 면 1장에 404 GFLOP
데스크톱 CPU면 1장 1.5초 (144회 배치). 알약 1개(앞뒤)에 3초
데스크톱 GPU면 1장 55ms
8방향 × 3배율로 줄이면CPU 252ms, GPU 9ms. 정확도 손실은 재야 함

통과선은 사진 1장(알약 7개, 14면)에 3초 이내, 메모리 200MB 이내, 앱 크기 증가 30MB 이내로 제안했다. 가장 유력한 조합은 단일 60에폭 모델 + 8방향 × 3배율 + fp16으로 데스크톱 CPU 기준 면당 약 130ms. 통과 못 하는 기기 등급은 서버 판독으로 위임한다.

배포 파일이 연구 때와 같은 답을 내는가

  • 마크 모델 fp16 ONNX. 111.7MB → 55.9MB. 실사진 193면과 AI Hub 475면에서 유무 점수 최대 차 0.003, 임계 0.5 / 0.6 / 0.8 어디서도 판정이 바뀐 면 0. 종류 top-1 일치 100%. 채택
  • 전처리가 모델보다 70배 민감하다. 흑백 변환 한 줄(imread 그레이스케일 vs cvtColor)이 화소 18%에서 밝기 1단계만 다른데 유무 점수가 최대 0.22 움직였다. fp16 흔들림의 70배. iOS로 전처리를 옮길 때는 PC에서 전처리를 끝낸 텐서로 모델만 대조하는 단계와 원본 크롭으로 끝까지 대조하는 단계를 나눠, 어느 쪽 문제인지 바로 가를 수 있게 했다
  • 각인 판독기 fp16은 미채택. 어텐션 노드가 타입 검사에 걸려 198개를 fp32로 남기면 12.9MB로 로드되지만, 샘플 하나에서 글자 확신도가 0.97 → 0.94로 내려가 확신 글자가 줄었다. 각인은 임계 근처 값이 많아 fp32 ONNX 21.8MB로 탑재
  • 임베딩 fp16은 순위가 긴 꼬리에서만 움직이고 1위와 5위 안 여부는 실사진 191면에서 0건 변화. 카탈로그 임베딩은 다시 굽지 않는다
  • Core ML 이식(2026-09-30, iPhone 12·16 Pro). fp32 모델은 Neural Engine에 못 올라가고(검출 모델은 ANE 설정으로 여는 것만으로 1.94GB), 마크 fp16 + Neural Engine은 추론 60ms에 메모리 +2MB. GPU 크래시 원인은 메인 스레드에서의 첫 커널 컴파일이었고, 각인을 GPU·CPU 두 레인으로 나눠 판독 1장 9.2 → 5.4초

14. 닫힌 축, 열린 축

한 달 동안 연 축의 대부분은 닫혔다. 다음 실질 개선은 실사진 대량 확보에서 온다.

축별 최종 상태
축결과상태
판독, 검색, 검증 파이프라인top-1 0 → 58.0%채택
두 면 촬영+17.4%p. 최대 단일 레버. 앱은 아직 한 면만 찍는다UX 반영 예정
자체 판독기 (TPS, FRM, 60에폭)p90 188 → 240면. 앱은 단일 모델채택
확대 TTA (배율 6개)단일 모델 3시드 평균 113 → 117알약, 정밀도 93%에서 97 → 107채택
3시드 합의 앙상블248면. 모델 셋이라 폰에 못 올림측정만, 미채택
두 장 촬영과 교집합77.0 → 91.2%, 후보 28 → 5앱 규칙
마크 전용 ConvNeXt, fp16AUC 0.99, 55.9MB채택
전처리 (이진화, 호모모픽, 레티넥스, 인페인팅, 노출, relief, shading, CLAHE 세기)CLAHE 3.0 외 전부 미달닫힘
증강 추가, 완화현행이 봉우리닫힘
학습률, 배치, EMA, 수프, 80에폭미달 또는 재현 실패닫힘
MIM 사전학습 (CNN, SparK, ViT-MAE), SVTR형 백본, DINOv2미달닫힘
회전 학습, 각도 헤드, 방향 추정기, 전 방향 학습, 뒤집기 빈 정답(최종 구성)미달닫힘
후보 순위 규칙, 확신도 후처리 교정+2면 이하, 순위 불변닫힘
확신 글자 ≥0.95 필터, 부분 수열 대조후보 1,248 → 19, 정답 유지 93%채택
임베딩 재정렬 (각인으로 좁힌 뒤, 마크 종 모델 특징)후보 안 1위 67.5%, 5위 안 88.7%채택
이미지 임베딩으로 각인 대체, 마크 필터각인은 못 보고, 필터는 임베딩과 겹쳐 순손해닫힘
DINOv2 백본, 한 글자 가중7개 중 6개 지표 열세, p95 −32면닫힘
글자 수 전용 모델판독기와 일치할 때만 83.1%조건부 규칙 미측정
실사진 학습 혼합품목 수 한계실사 품목 수백 개 확보 시 재개
캡슐 인쇄 각인침묵률 78% 고정미해결
확신 글자가 없는 면에서만 마크 쓰기미측정열림

방법으로 남긴 것

  • 평가셋 크기가 시드 수보다 먼저다. 선별은 1시드, 채택은 3시드
  • 지표는 정밀도를 통제하는 쪽으로. 고정 임계값은 과확신 모델을 1위로 보이게 한다
  • 임계값은 평가셋에서 고르지 않는다. 원자료를 남겨 지표를 바꿔도 모델을 다시 돌리지 않는다
  • 이득이 나면 기제를 추적한다. 의도한 기능에 실패했는데 성적이 오른 부품이 넷이었다
  • 채점 오류를 먼저 의심한다. 마크 AUC 0.82 → 0.99와 종류 top-1 69 → 58.5%는 둘 다 모델이 아니라 채점을 고친 결과였다
  • 스튜디오 검증 점수는 실사진을 예측하지 못한다. 실사진 전수 평가를 한 장도 학습에 쓰지 않고 유지했다

멘토 자문과 대조

  • 확인됨. 왜곡은 고치지 말고 거절하라(판독끼리 합의가 없는 56면 중 맞은 것 0건). 업스케일링은 넣지 마라(원리적으로 무효). 뒷면도 찍게 하라(+17.4%p). DB에 없는 각인은 거절하라(카탈로그 실재 신호 AUC 0.871, 우리가 가진 가장 센 신호)
  • 절반만. 임베딩 유사도로 후보를 찾아라. 색과 모양에는 맞고 각인 대체로는 틀리다
  • 그대로는 아님. 폰트로 글자를 그리는 합성 데이터 도구는 음각의 물리를 못 만든다. 대신 진짜 각인이 찍힌 참조 사진을 촬영 조건으로 열화시켰다