이번 주부터 몇 주 동안 도면 이야기를 해 볼게요. 저희 도면 파서는 CAD에서 뽑은 PDF든, 복사기로 스캔한 낡은 도면이든 받아서 부품번호·치수·공차·주기를 뽑아요. 그 첫 단계가 표제란(title block) 찾기예요.
표제란이 왜 중요하냐면요
표제란은 도면 오른쪽 아래에 있는 그 표예요. 도면 번호, 품명, 재질, 척도, 작성자, 검도·승인 서명란이 들어 있죠. 이게 중요한 이유는 두 가지예요.
- 도면의 신원증명이에요. 도면 번호와 리비전이 여기 있어요. 이걸 못 읽으면 도면 세트 안에서 서로 연결을 못 해요.
- 본문이 아니에요. 표제란 안의 숫자는 치수가 아니고, 글자는 주기가 아니에요. 표제란을 먼저 분리해야 나머지 영역의 숫자를 치수로 해석할 수 있어요.
처음엔 템플릿 매칭을 했어요
고객사마다 표제란 양식을 등록하고, 그 템플릿을 도면에 맞춰 보는 방식이었어요. 같은 회사 도면은 양식이 같으니까 잘 됐어요. 그런데 금방 문제가 생겼어요.
- 한 회사 안에서도 설계팀마다, 연도마다 양식이 달라요. 2010년대 도면과 작년 도면이 달라요.
- 협력사 도면이 섞여요. 조립도는 우리 양식인데 단품도는 협력사 양식이에요.
- 스캔 도면은 기울어지고 축소돼 있어요. 템플릿 스케일을 맞추는 것부터 일이에요.
템플릿을 수십 개 등록해도 새 도면이 오면 또 안 맞는 일이 반복됐어요.
선 구조로 찾기로 했어요
표제란은 양식이 달라도 공통점이 있어요. 굵은 외곽선 안에, 가로세로 선이 촘촘한 격자가, 도면 테두리 모서리에 붙어 있다는 거예요. 저희는 이 성질을 이용해요.
대략 이런 순서예요.
- 기울기 보정. 도면 외곽 테두리(border)의 긴 수평선을 찾아서 각도를 재고 회전시켜요. 스캔 도면은 0.5~2도 정도 기울어진 게 보통이에요.
- 선 검출. 이진화한 뒤 모폴로지 연산으로 긴 수평선·수직선만 남겨요. 커널 길이는 도면 폭의 일정 비율로 잡아요(픽셀 고정값은 해상도 바뀌면 깨져요).
- 격자 밀도 지도. 이미지를 작은 타일로 나누고 타일마다 선 교차점 개수를 세요. 표제란 영역은 교차점 밀도가 압도적으로 높아요.
- 모서리 우선 탐색. 밀도가 높은 영역 중 도면 테두리 모서리에 붙어 있는 걸 골라요. 오른쪽 아래가 1순위, 그 다음 아래쪽 전체 폭, 그 다음 오른쪽 세로예요.
- 외곽선 확정. 후보 영역을 감싸는 가장 바깥 사각형을 찾아서 표제란 좌표로 확정해요.
도면 테두리
┌──────────────────────────────────────┐
│ │
│ (본문: 뷰, 치수, 주기) │
│ │
│ ┌───────────┤
│ │ ▦▦▦▦▦▦▦▦ │ ← 교차점 밀도 높음
│ │ ▦▦▦▦▦▦▦▦ │ + 모서리에 붙어 있음
└──────────────────────────┴───────────┘
이렇게 바꾸고 좋아진 점
- 새 양식이 와도 등록 없이 돼요. 저희 테스트셋에서 양식이 처음 보는 도면도 대부분 잡혀요.
- 표제란 안의 칸 구조도 같은 선 검출 결과에서 바로 나와요. 어느 칸이 도면 번호인지는 다음 단계(라벨 인식)에서 정하지만, 칸 경계는 공짜로 얻어요.
아직 안 되는 것들
솔직하게 쓸게요.
- 표제란이 왼쪽 위에 있는 도면. 오래된 일부 양식이 그래요. 모서리 우선순위에 넣어 두긴 했는데, 왼쪽 위는 부품표(BOM)랑 헷갈려서 오탐이 있어요.
- 부품표가 표제란 바로 위에 붙은 경우. 둘이 한 덩어리로 잡혀요. 이건 "표제란 라벨(품명·척도·도번 같은 글자)이 있는 쪽이 표제란"이라는 규칙으로 쪼개는데, 글자 인식이 틀리면 같이 틀려요.
- 테두리 없는 도면. 기울기 보정 기준이 없어서 흔들려요. 긴 치수선으로 대체하는 중인데 아직 불안정해요.
이런 경우는 신뢰도를 낮게 매기고 사람 확인 대상으로 넘겨요. 억지로 맞히려고 하지 않아요. 이 원칙은 3월에 따로 글로 쓸게요.
다음 주에는 표제란 다음으로 중요한 부품표(BOM)와 도면 위 부품을 연결하는 이야기예요. 풍선 번호 찾기가 핵심이에요.