640×640으로 줄이면 미세 결함은 어디로 갈까
EDGE AI
20 MP 영상을 640 px로 줄이면 90 μm 결함은 0.35 px로 남습니다. 원해상도 타일로 되찾으면 70장, 560 ms가 듭니다.
5,472 × 3,648 px로 찍은 PCB 영상을 640 × 640 입력 모델에 넣는 셋업에서 축소 손실, 오버랩, 경계 처리, 추론 지연을 차례로 계산했습니다.
읽는 시간 약 12분
엣지 장치용 검출 모델은 대개 640 × 640 px 전후의 고정 입력으로 학습되고 배포됩니다. 반면 PCB 외관 검사 카메라는 20 MP급 영상을 내보내죠. 이 간극을 리사이즈 한 줄로 메우면 원영상에서 3 px을 차지하던 미세 이물이 1 px에도 못 미치는 옅은 얼룩이 됩니다. 정확도 지표는 큰 결함 덕분에 좋게 나오는데 미세 결함만 조용히 빠지고, 그 유출은 고객 공정의 불량으로 돌아옵니다.
계산에 앞서 표면부터 봅니다. 녹색 솔더 마스크는 무광에 가까워 빛을 비교적 고르게 흩어 보내지만, 솔더 접합부와 금도금 패드는 거울처럼 한 방향으로 반사해서 같은 조명 아래에서도 밝기가 몇 배씩 차이 납니다. 그래서 확산 돔 조명을 전제로 하고, 아래 숫자는 솔더 마스크처럼 무광에 가까운 면을 기준으로 잡았습니다. 솔더와 도금 면에서의 검출 여부는 샘플 테스트 전 확언 불가입니다.
가정은 이렇습니다. 5,472 × 3,648 px, 화소 2.4 μm인 20 MP 카메라에 35 mm 렌즈를 달아 164 mm × 109 mm를 한 번에 찍으면 화소 하나가 약 30 μm를 맡습니다. 가장 작은 결함은 90 μm 솔더 브리지와 이물, 가장 긴 결함은 길이 1,500 μm 패드 스크래치로 두고, 모델은 640 × 640 입력을 INT81로 양자화해 타일 한 장에 8 ms가 걸린다고 봅니다. 라인 택트는 400 ms입니다. 기판을 옮기는 이송 기구의 제어는 별도 검토가 필요합니다.
640 px로 줄이면 90 μm 결함은 0.35 px가 된다
화소 분해능2은 FOV를 픽셀 수로 나눈 값입니다. 164 mm를 5,472 px로 나누면 29.97 μm/px이고, 90 μm 결함은 3.0 px을 차지합니다. 같은 영상을 폭 640 px로 다운샘플3하면 164 mm ÷ 640 = 256 μm/px가 되어 같은 결함은 0.35 px로 줄어듭니다. 다운샘플은 여러 원화소를 평균하는 방식이 보통이라, 면적 평균을 가정하면 결함이 한 화소 안에서 차지하는 비율인 (90 ÷ 256)² ≈ 0.12만큼만 콘트라스트가 남습니다. 크기와 콘트라스트가 함께 깎이는 이중 손실이에요.
그래서 “이 모델은 몇 μm까지 잡는가”라는 질문에는 모델 구조보다 모델 입력 기준 μm/px로 먼저 답해야 합니다. 제 기준으로는 최소 결함이 모델 입력에서 3 px 이상 남아야 학습할 형태가 생기는데, 256 μm/px에서 3 px을 채우려면 결함이 769 μm 이상이어야 합니다. 입력에 남지 않은 정보는 재학습으로도 돌아오지 않습니다. 광학 셋업이 만든 손실을 소프트웨어가 덮지 못하는 것과 같은 이치입니다.
학습 데이터를 더 모으면
640 px 모델도 미세 결함을 배울 것 같습니다.
90 μm 결함으로 계산하면
입력에는 0.35 px, 콘트라스트 12 %만 남습니다. 배울 신호가 모델에 닿기 전에 지워집니다.
반대로 1,000 μm짜리 부품 누락은 같은 축소 경로에서도 3.9 px로 살아남습니다. 결함 크기에 따라 경로를 나누는 근거가 여기서 나옵니다. 부품 누락이나 극성 반전처럼 769 μm보다 큰 결함은 줄인 영상 한 장으로 보고, 그보다 작은 결함만 원해상도로 보내면 되죠.
오버랩은 가장 긴 결함 길이로 정한다
타일링 추론4은 영상을 줄이는 대신 원해상도에서 모델 입력 크기로 잘라 여러 번 추론하는 방식입니다. 겹치지 않게 격자로 자르면 경계에 걸친 결함은 두 타일에 반쪽씩 나뉘고, 반쪽 결함은 형태 특징이 무너져 양쪽 타일 모두에서 점수가 낮게 나옵니다. 합성곱 신경망은 타일 가장자리에서 패딩5 영향으로 특징이 약해지기도 해서, 가장자리 근처의 판정은 가운데보다 믿기 어렵습니다.
그래서 저는 오버랩6을 가장 긴 결함의 길이(px)보다 크게 잡습니다. 1,500 μm 스크래치는 30 μm/px에서 50 px이니 오버랩 64 px이면 충분하고, 이때 보폭7은 640 − 64 = 576 px입니다. 한 축의 타일 수는 (영상 폭 − 타일 폭) ÷ 보폭을 올림한 값에 1을 더해 구합니다. 5,472 × 3,648 px 영상이면 오버랩 0에서 9 × 6 = 54장, 64 px에서 10 × 7 = 70장, 128 px에서 11 × 7 = 77장이 나옵니다.
오버랩 비율 r에 대해 타일 수는 이론상 1 ÷ (1 − r)²배로 늘어납니다. 64 px(r = 0.1)이면 1.23배인데, 실제로는 54장에서 70장으로 1.30배가 됩니다. 타일 수는 정수라서 영상 끝에서 올림이 한 번 더 일어날 때마다 계단처럼 뜁니다. 세로를 6줄로 줄이려면 보폭이 602 px 이상, 즉 오버랩이 38 px 이하여야 하는데 50 px 스크래치 기준에 못 미치니, 이 셋업에서는 70장이 하한입니다.
경계에 걸친 결함은 한 타일만 센다
오버랩만 두면 경계 결함이 두 타일에서 함께 검출되는 문제가 남습니다. 제가 쓰는 정리 방식은 중심 소유 규칙입니다. 각 타일의 가장자리에서 오버랩의 절반인 32 px을 뺀 안쪽을 그 타일의 코어로 두고, 박스 중심이 자기 코어 안에 있는 검출만 남깁니다. 보폭이 576 px로 고르면 코어들이 빈틈없이 화면을 나누고, 50 px 스크래치는 중심이 코어 안에 있는 한 끝까지 25 px만 필요하므로 32 px 여유 안에서 온전히 보입니다.

함정은 마지막 타일입니다. 5,472 px 폭에 보폭 576 px로 타일을 놓으면 열 번째 타일이 영상 밖으로 나가므로 시작 좌표를 4,832 px로 당겨야 하고, 그러면 아홉 번째 타일(4,608 px 시작)과 416 px이 겹칩니다. 코어를 가장자리 32 px 고정으로 두면 이 구간에서 두 코어가 겹쳐 같은 결함을 두 번 세게 되죠. 그래서 저는 코어 경계를 이웃 타일 겹침 구간의 한가운데로 다시 계산합니다. 일반 이음은 608 px, 1,184 px처럼 576 px 간격으로 놓이고 마지막 이음만 5,040 px로 옮겨 가서, 아홉 번째 타일의 코어는 400 px, 마지막 타일은 432 px이 됩니다.
NMS8만으로 중복을 지우는 방식은 반쪽 결함 앞에서 약합니다. 경계에서 잘린 두 박스는 서로 겹치는 면적이 작아 IoU9가 0.5에 못 미치고, 둘 다 살아남아 한 결함이 두 건으로 집계됩니다. 소유권으로 먼저 걸러 내고 클래스별 NMS(IoU 0.5)는 남은 중복만 정리하게 두는 순서가 계수 오류를 줄입니다.
타일 70장은 560 ms, 택트 400 ms를 넘는다
엣지 장치는 서버처럼 큰 배치로 처리량을 끌어올리기 어려워서 타일 수가 거의 그대로 지연으로 바뀝니다. 타일당 8 ms에 70장이면 순차 추론만 560 ms이고, 택트10 400 ms에 들어가지 않습니다. 전송과 후처리 시간은 아직 넣지도 않은 숫자예요.
여기서 쓰는 방법이 2단 구조입니다. 전체 영상을 640 px로 줄인 1회 추론(8 ms)으로 부품 누락처럼 769 μm보다 큰 결함을 보고, 솔더 브리지는 CAD 데이터의 패드 영역에 걸친 타일만 원해상도로 추론합니다. 패드가 걸친 타일이 전체의 40 %라고 가정하면 70장 중 28장, 224 ms라서 합계는 232 ms입니다. 남는 168 ms 안에 전송, 후처리, 판정 신호가 들어가는지는 단계별 p99로 따로 확인해야 하고, 그 분해 방법은 지연 예산 글에서 계산했습니다.
대가도 분명합니다. 솔더 브리지는 패드 사이에서만 생기지만 90 μm 이물은 패드 밖 기판 면에도 떨어집니다. 2단 구조에서 패드 밖 영역은 256 μm/px로만 보이므로 그 영역의 검출 하한은 769 μm로 올라갑니다. 저라면 이 숫자를 품질 기준서에 그대로 적고, 패드 밖 미세 이물을 허용하지 않는 제품이라면 타일을 덜어 내는 대신 연산 장치나 카메라 구성을 다시 봅니다.
결함 크기별로 경로를 나눈 조건표
결함 종류마다 최소 크기, 광학 셋업, 알고리즘 파라미터를 한 줄에 맞춰 놓았습니다. 광학 셋업은 세 줄이 같고, 차이는 어느 경로로 추론하느냐에서 갈립니다.
| 결함 | ① 최소 불량 크기 | ② 광학 셋업 · WD | ③ 알고리즘 파라미터 |
|---|---|---|---|
| 솔더 브리지 · 미세 이물 | 90 μm = 3.0 px (30 μm/px), 640 px 축소 시 0.35 px | 20 MP(5,472 × 3,648 px, 화소 2.4 μm), 35 mm 렌즈, FOV 164 × 109 mm, 확산 돔 조명, WD 450 mm 이상(주점 기준 물체 거리 약 472 mm) | 원해상도 640 × 640 타일, 패드 영역 28장 × 8 ms = 224 ms |
| 패드 스크래치 | 길이 1,500 μm = 50 px | 위와 같음 | 오버랩 64 px(보폭 576 px), 코어 경계 = 겹침 구간 가운데, 클래스별 NMS IoU 0.5 |
| 부품 누락 · 틀어짐 | 1,000 μm = 3.9 px (축소 경로 256 μm/px) | 위와 같음 | 전체 영상 640 px 1회, 8 ms |
| 라인 전체 | 패드 밖 이물 하한 769 μm (축소 경로) | WD는 돔 조명 높이까지 포함해 실측 | 2단 합계 232 ms, 전체 타일링 70장 560 ms, 택트 400 ms |
표가 말하는 것은 결함 크기가 추론 경로를 정한다는 점입니다. 3 px 하한인 769 μm를 경계로 큰 결함은 축소 경로가, 작은 결함은 원해상도 타일이 맡고, 오버랩 64 px은 가장 긴 결함 50 px을 덮으면서 타일 수 증가를 1.30배로 묶습니다. 전체 타일링 560 ms가 택트 400 ms를 넘는다는 계산이 2단 구조를 고르는 직접 근거이고, 그 대가인 패드 밖 하한 769 μm도 같은 표에 함께 적어 둬야 합니다.
전체 영상 한 번이 나은 경우
반대 선택이 맞는 자리도 있습니다. 대상 결함이 모두 769 μm보다 크다면 전체 영상 1회 추론이 빠르고 경계 문제도 없습니다. 연산 여유가 크면 입력이 더 큰 모델을 한 번 돌리는 편이 타일 병합 로직을 유지하는 것보다 단순한데, 연산량은 입력 변의 제곱에 가깝게 늘어 1,280 × 1,280 입력이면 640 입력의 약 4배입니다. 고배율 렌즈나 카메라 여러 대로 처음부터 FOV를 나누면 소프트웨어 분할 없이 분해능을 얻지만, 하드웨어 비용과 함께 렌즈와 조명이 WD11 안에서 서로 간섭하지 않는지 따로 따져야 합니다.
솔더 접합부처럼 정반사와 난반사가 섞이는 표면에서는 결함 콘트라스트가 조명 각도에 크게 흔들립니다. 원해상도 타일에서도 검출 여부가 갈릴 수 있어서, 위 숫자는 무광 솔더 마스크 기준으로만 읽어야 합니다. 반사가 강한 면의 결과는 샘플 테스트 전 확언 불가이고, 저는 이 구간만 따로 모은 샘플 기판으로 재현율을 먼저 확인합니다.
현장 노트
640 px 입력 모델을 PCB 라인에 올린다면 저는 영상을 줄이기 전에 최소 결함이 줄인 뒤 몇 px로 남는지부터 계산합니다. 1 px 아래로 내려가는 결함은 원해상도 타일 경로로 보내고, 오버랩은 가장 긴 결함 길이보다 넉넉하게 잡습니다. 마지막 타일의 시작 좌표로 코어 경계를 다시 긋고, 타일 수와 타일당 지연을 택트와 같은 표에 적어 둡니다. 검증 지표는 결함 크기 구간별로 나눠 집계합니다.
현장 체크포인트
라인에 올리기 전에 숫자 다섯 개와 표면 하나를 아래 순서로 확인합니다.
- WD 450 mm 이상이 돔 조명 높이와 카메라 개구 위치까지 포함해 실측으로 확보되는가? (주점 기준 물체 거리 약 472 mm)
- 솔더 마스크, 솔더 접합부, 금도금 패드의 반사율 차이를 샘플 기판으로 확인했는가?
- 모델 입력 기준 μm/px에서 최소 결함이 3 px 이상 남는가? (640 px 축소 경로는 256 μm/px)
- 오버랩이 가장 긴 결함 길이(px)보다 크고, 마지막 타일의 코어 경계를 겹침 구간 가운데로 다시 그었는가?
- 타일 수 × 타일당 지연이 택트 안에 드는가? (70장 × 8 ms = 560 ms, 2단 구조 232 ms)
- 검증 지표를 결함 크기 구간별로 나눠 집계하는가? (전체 평균은 미세 결함 누락을 가린다)
자주 묻는 질문
입력이 1,280 × 1,280인 모델을 쓰면 타일링이 필요 없나요?
1,280 px 폭이면 164 mm ÷ 1,280 = 128 μm/px라서 90 μm 결함은 0.70 px로 여전히 한 화소에 못 미칩니다. 연산량은 640 입력의 약 4배로 늘고요. 90 μm를 3 px로 보려면 30 μm/px가 필요하고, 그러려면 입력 폭이 5,467 px 안팎이어야 하니 원해상도와 거의 같아집니다.
오버랩을 두면 가장자리 점수 저하도 사라지나요?
오버랩 64 px은 결함이 잘리지 않게 하는 장치이고, 패딩 영향은 깊은 층으로 갈수록 더 넓은 범위에 퍼집니다. 코어 규칙을 쓰면 남는 검출의 중심은 타일 가장자리에서 32 px 이상 떨어지지만, 그래도 가장자리 근처 점수가 낮게 나오면 같은 영상을 오버랩 128 px(77장)로 다시 잘라 점수 차이를 잽니다. 차이가 작으면 64 px을 유지하고, 크면 늘어난 7장의 지연을 택트 안에서 감당할 수 있는지부터 따집니다.
용어 풀이
- [1] INT8 양자화 INT8 quantization
모델의 가중치와 연산을 8비트 정수로 바꿔 계산량과 메모리를 줄이는 방법입니다. 같은 장치에서 추론이 빨라지는 대신 정확도가 조금 떨어질 수 있어서, 양자화한 뒤에 다시 검증합니다. ↩ - [2] 화소 분해능 pixel resolution, μm/px
화소 하나가 물체 위에서 맡는 길이입니다. FOV 164 mm를 5,472 px로 나누면 약 30 μm/px입니다. ↩ - [3] 다운샘플 downsampling
영상의 화소 수를 줄이는 처리입니다. 여러 원화소를 평균해 한 화소로 만들기 때문에 작은 결함은 크기와 콘트라스트를 함께 잃습니다. ↩ - [4] 타일링 추론 tiled inference
큰 영상을 모델 입력 크기의 조각으로 잘라 조각마다 추론한 뒤 결과를 합치는 방식입니다. ↩ - [5] 패딩 padding
합성곱 연산이 영상 가장자리에서도 같은 크기를 유지하도록 바깥에 가상의 값을 채우는 처리입니다. 채운 값에는 실제 영상 정보가 없어서 가장자리 특징이 약해집니다. ↩ - [6] 오버랩 overlap
이웃한 타일이 서로 겹치는 폭입니다. 경계에 걸친 결함이 적어도 한 타일 안에 온전히 들어오게 하는 여유입니다. ↩ - [7] 보폭 tile stride
이웃한 타일의 시작 좌표 간격으로, 타일 폭에서 오버랩을 뺀 값입니다. 640 px 타일에 오버랩 64 px이면 576 px입니다. ↩ - [8] NMS non-maximum suppression
서로 많이 겹치는 검출 박스 가운데 점수가 가장 높은 하나만 남기고 나머지를 지우는 후처리입니다. ↩ - [9] IoU intersection over union
두 박스가 겹치는 면적을 두 박스를 합친 면적으로 나눈 값입니다. 0.5라면 합친 면적의 절반이 겹친다는 뜻입니다. ↩ - [10] 택트 takt time
라인이 부품 하나를 처리하도록 주어진 시간입니다. 검사는 이 시간 안에 촬영부터 판정까지 끝나야 합니다. ↩ - [11] WD working distance, 작동 거리
렌즈 앞면에서 검사할 면까지의 거리입니다. 본문의 물체 거리 472 mm는 얇은 렌즈 근사로 렌즈 주점을 기준으로 계산한 값이고, 렌즈 앞면 기준 거리는 렌즈 도면으로 확인합니다. ↩
참고 자료
- Akyon, Altinuc, Temizel, Slicing Aided Hyper Inference and Fine-tuning for Small Object Detection, arXiv:2202.06934 (2022, DOI 10.1109/ICIP46576.2022.9897990). 작은 객체 검출을 위해 기존 검출기에 슬라이싱 기반 추론과 미세조정을 더하는 공개 프레임워크입니다.
- 계산식: 화소 분해능 = FOV ÷ 픽셀 수, 축소 후 결함 크기(px) = 결함 크기 ÷ (FOV ÷ 입력 폭), 면적 평균 콘트라스트 비 ≈ (결함 크기 ÷ 축소 화소 크기)², 한 축 타일 수 = ⌈(영상 폭 − 타일 폭) ÷ 보폭⌉ + 1, 보폭 = 타일 폭 − 오버랩, 코어 경계 = 이웃 타일 겹침 구간의 중점, 순차 지연 = 타일 수 × 타일당 지연, 배율 m = 센서 폭 ÷ FOV 폭, 물체 거리 = f × (1 + 1/m)
- 계산 가정: 20 MP 카메라(5,472 × 3,648 px, 화소 2.4 μm), 35 mm 렌즈, FOV 164 × 109 mm, 최소 결함 90 μm, 가장 긴 결함 1,500 μm, 640 × 640 INT8 모델 타일당 8 ms, 택트 400 ms, 패드가 걸친 타일 비율 40 %
함께 읽으면 좋은 글 — 엣지 AI 비전이 현장에서 안 돌아가는 이유 · 딥러닝 검사 시대, 카메라 스펙보다 먼저 확인해야 할 것 · 평균 지연이 마감 안에 있어도 안전하지 않은 이유


