MakeAI 딥러닝

치수와 공차 읽기 — 숫자를 읽는 것과 뜻을 아는 것은 달라요

도면의 "Ø100 H7 ±0.05" 를 OCR로 읽는 건 시작일 뿐이에요. 어느 선의 치수인지, 공차가 어디에 걸리는지, 단위가 뭔지까지 알아야 데이터가 돼요.

4분 읽기

도면 시리즈 세 번째예요. 오늘은 치수(dimension) 이야기인데, 처음엔 "숫자니까 OCR이면 되겠지" 했다가 제일 오래 걸린 부분이에요.

치수는 숫자가 아니라 "관계"예요

도면에서 100 이라는 숫자 하나는 그 자체로 의미가 없어요. 어떤 두 점(또는 선) 사이의 거리인지, 지름인지 반지름인지, 공차가 얼마인지가 붙어야 의미가 생겨요. 그래서 치수 하나를 제대로 뽑으려면 이런 게 다 필요해요.

요소 예시 어디서 얻나
값 100 글자 인식
종류 Ø(지름), R(반지름), □(정사각), SR(구면 반지름) 접두 기호
공차 ±0.05, +0.1/-0, H7 값 뒤 작은 글자 또는 끼워맞춤 기호
치수선 화살표 두 개와 그 사이 선 선 검출
치수 보조선 치수선 양 끝에서 물체까지 선 검출
대상 어느 뷰의 어느 형상 보조선이 닿는 곳

OCR은 이 중 "값"만 줘요. 나머지는 전부 따로 해야 해요.

글자 인식부터 쉽지 않아요

도면 글자는 일반 문서랑 달라요.

  • 회전돼 있어요. 세로 치수는 90도 돌아가 있고, 경사 치수는 그 각도대로 돌아가 있어요. 저희는 치수선 각도를 먼저 재고 그 각도로 글자 영역을 돌린 뒤 인식해요.
  • 작고 얇아요. 스캔 도면에서는 0과 6, 1과 7, 5와 S가 자주 헷갈려요.
  • 기호가 많아요. Ø, ±, °, □, ⌴(깊이), ⌵(카운터싱크) 같은 기호는 일반 OCR 사전에 없어요. 저희는 도면 전용으로 학습한 인식 모델을 쓰고, 기호 클래스를 따로 뒀어요.
  • 위첨자·아래첨자로 공차가 붙어요. 100 ⁺⁰·¹ ₋₀ 처럼요. 글자 높이 차이로 공차 부분을 분리해요.

치수선 찾기

화살표 쌍을 찾는 게 시작이에요. 화살표는 작은 삼각형(채운 것, 빈 것, 사선 두 개) 형태라 작은 템플릿 집합으로 찾아요. 같은 직선 위에서 서로 마주 보는 화살표 쌍이 치수선 후보예요. 그 사이(또는 바깥) 근처에 글자가 있으면 그 글자가 이 치수선의 값이에요.

여기서 많이 틀리는 패턴이 있어요.

  • 치수가 치수선 밖에 있어요. 공간이 좁으면 값을 치수선 바깥에 쓰고 지시선으로 이어요. 지난주 풍선 지시선 따라가기 로직을 재활용해요.
  • 연속 치수는 화살표가 이어져 있어서 쌍 매칭이 꼬여요. 같은 선 위의 화살표를 순서대로 정렬해서 인접한 것끼리 묶어요.
  • 지름 기호 없이 원에 그어진 치수. 원의 중심을 지나는 치수선이면 지름으로 해석하는 규칙을 둬요.

공차: 적힌 것과 적용되는 것

공차는 두 가지로 와요.

  1. 직접 공차: 100 ±0.05 처럼 치수 옆에 적혀요. 글자 인식에서 바로 나와요.
  2. 일반 공차: 치수 옆엔 아무것도 없고, 표제란이나 주기에 "일반 공차 KS B ISO 2768-m" 처럼 적혀 있어요. 이 경우 치수 크기 구간에 따라 공차가 정해져요(예: 30 초과 120 이하면 ±0.3).

2번이 함정이에요. 치수에 공차가 안 적혀 있다고 "공차 없음"으로 내보내면 틀린 데이터예요. 저희는 표제란과 주기에서 일반 공차 등급을 읽고, 직접 공차가 없는 치수에는 일반 공차를 계산해서 붙이되 tolerance_source: "general" 로 표시해요. 담당자가 보고 "아, 이건 일반 공차가 적용된 거구나" 알 수 있게요.

끼워맞춤 기호(H7, g6)는 기준 치수와 등급으로 공차 범위가 정해지는데, 저희는 KS/ISO 표를 내장해 두고 계산해요. 이것도 tolerance_source: "fit" 으로 표시하고요.

단위와 척도

치수 단위는 거의 항상 mm인데, 가끔 inch 도면이 섞여요. 표제란의 단위 칸을 보고, 없으면 "UNLESS OTHERWISE SPECIFIED, DIMENSIONS IN INCHES" 같은 주기를 찾아요. 둘 다 없으면 mm로 두되 unit_inferred: true 예요.

척도(1:2, 2:1)는 치수 값에는 영향이 없어요. 도면에 적힌 치수는 실제 치수예요. 하지만 픽셀 거리로 치수를 검증할 때는 척도가 필요해서 읽어 둬요.

결과 하나의 모양

{
  "text": "Ø100 H7",
  "value": 100, "kind": "diameter",
  "tolerance": { "upper": 0.035, "lower": 0, "source": "fit", "fit": "H7" },
  "unit": "mm",
  "line": { "page": 2, "x1": 0.41, "y1": 0.33, "x2": 0.41, "y2": 0.61 },
  "conf": 0.88
}

conf 가 낮으면(저희 기준 0.85 미만) 결과 목록에 넣지 않고 별도 "저신뢰 목록" 으로 빼요. 3월 10일에 이 원칙을 따로 쓸 건데, 핵심은 "읽기 어려운 값을 읽은 척하지 않는다"예요.

아직 못 하는 것

  • 기하 공차(평행도, 직각도 같은 사각 틀 안의 기호)는 틀은 찾는데 데이텀 참조까지 연결하는 건 아직이에요.
  • 손글씨 치수는 인식률이 많이 떨어져요.
  • 3D 등각 투상도 위의 치수는 보조선 해석이 안 돼요.

다음 주는 지금까지 계속 나온 "신뢰도"라는 숫자가 실제로 뭘 뜻하는지, 보정은 어떻게 하는지 이야기해 볼게요.