지난주에 표제란을 찾았으니 이번엔 부품표(BOM) 차례예요. 조립도에는 부품 목록 표가 있고, 도면 위 각 부품에는 동그라미 안에 번호가 쓰인 풍선(balloon) 이 달려 있어요. "부품표 10번 = 도면 위 이 부품"을 연결하는 게 오늘 이야기예요.
이걸 왜 하냐면요, 저희가 만드는 판정 리포트의 핵심이 "부품표에 수량 2라고 적혀 있는데 도면에는 3개 그려져 있다" 같은 걸 잡아내는 거거든요. 연결이 돼야 대조가 돼요.
1단계: 부품표 찾기
표제란이랑 비슷하게 선 구조로 찾아요. 다만 부품표는 행이 반복되는 긴 표라는 특징이 있어요. 열 수는 적고(보통 품번·품명·규격·수량·재질·비고) 행 수는 많죠. 표제란 바로 위에 붙어 있는 경우가 제일 많고, 가끔 도면 왼쪽 위나 별도 페이지에 있어요.
표를 찾으면 헤더 행을 읽어서 열 역할을 정해요. "NO", "품번", "ITEM" 은 품번 열, "Q'TY", "수량", "QTY" 는 수량 열, 이런 식이에요. 헤더가 없는 표는 열 내용의 패턴(숫자만 있으면 품번/수량, 영문 대문자 위주면 품명)으로 추정하고, 추정했다는 표시를 남겨요.
2단계: 풍선 찾기
도면에서 풍선은 원 안에 숫자예요. 이렇게 찾아요.
- 원 검출. 허프 변환은 노이즈가 많아서, 저희는 윤곽선을 따서 원형도(circularity)가 높고 크기가 일정 범위인 닫힌 윤곽만 골라요. 풍선 크기는 한 도면 안에서 거의 같아서, 크기 분포의 최빈값 근처만 남기면 오탐이 확 줄어요.
- 원 안의 숫자 인식. 작은 글자라 일반 OCR이 약해요. 저희는 풍선 전용으로 학습한 작은 분류 모델을 써요(1~999 범위, 가끔 "10A" 처럼 영문 붙는 것 포함).
- 부품표 품번과 대조. 인식한 번호가 부품표에 없으면 오인식일 가능성이 높아서 신뢰도를 낮춰요. 반대로 부품표에 있는데 도면에 풍선이 없으면 그것도 보고 대상이에요.
┌── 지시선
(10)──┘
↑ 풍선: 원 + 숫자
3단계: 지시선 따라가기
풍선에서 부품까지 지시선(leader line) 이 이어져 있어요. 풍선 원 둘레에서 시작하는 선분을 찾고, 끝점(화살표나 점)이 어느 영역에 닿는지 봐요. 이 끝점 주변의 닫힌 윤곽(부품 외형)을 부품 영역으로 잡아요.
여기가 제일 많이 틀리는 데예요.
- 지시선이 다른 선을 가로질러요. 치수선, 중심선, 해칭을 지나가면 어디서 끝나는지 애매해요. 저희는 풍선에서 출발해서 방향 변화가 적은 쪽으로 따라가고, 끝점 후보가 여러 개면 전부 남긴 뒤 신뢰도를 나눠요.
- 풍선 하나에 지시선이 여러 개예요. 같은 부품이 여러 군데 있을 때 그래요. 이건 오히려 좋아요. 수량 대조에 쓰거든요.
- 지시선이 없는 풍선도 있어요. 부품 바로 옆에 그냥 놓여 있는 거죠. 이 경우 가장 가까운 닫힌 윤곽을 잡되 신뢰도를 낮게 매겨요.
4단계: 수량 대조
부품표 수량 열과 도면에서 찾은 부품 영역 개수를 비교해요. 단, 이게 1:1이 아닌 경우가 많아서 그대로 비교하면 안 돼요.
- 같은 부품이 다른 뷰에 또 그려져 있어요(정면도·측면도). 뷰 경계를 나누고 뷰 하나 안에서만 세요.
- 대칭 부품은 한쪽만 그리고 "2EA (대칭)" 식으로 적어요. 주기(note)를 읽어서 보정해요.
- 볼트·너트 같은 구매품은 풍선 하나에 수량 8 같은 식이에요. 이건 애초에 개수 대조 대상이 아니에요.
그래서 수량 대조 결과는 "일치 / 불일치 / 대조 불가" 세 가지고, 불일치는 꼭 근거(어느 뷰에서 몇 개 검출)를 같이 붙여요.
결과는 이렇게 나가요
부품표 행 하나마다 이런 구조예요.
{
"no": 10, "desc": "LINER", "spec": "t0.4 / t1.0", "qty": 4,
"confidence": 0.91,
"src": { "page": 1, "x": 0.72, "y": 0.81 },
"rects": [ { "page": 1, "x": 0.31, "y": 0.44, "w": 0.06, "h": 0.03 }, ... ],
"qty_check": "match"
}
src 는 부품표 행의 위치, rects 는 도면 위 부품 영역들이에요. 콘솔에서 행을 클릭하면 이 좌표로 도면 위에 상자를 그려요. 좌표가 없는 건 안 그려요. 추정해서 그리면 그 순간부터 아무도 못 믿게 되니까요.
아직 어려운 것
- 손으로 그린 옛날 도면의 풍선은 원이 찌그러져 있어요. 원형도 기준을 낮추면 오탐이 늘어서 아직 타협 중이에요.
- 풍선 번호가 구름 모양(리비전 표시) 이랑 겹치면 자주 틀려요.
- 부품표가 별도 페이지에 있으면 페이지 간 연결을 해야 하는데, 도면 번호 매칭이 먼저 돼야 해요. 이건 표제란 인식 정확도에 달려 있어요.
다음 주는 치수예요. "Ø100 ±0.05"를 읽는 것과 그게 무슨 뜻인지 아는 건 다른 문제더라고요.