밝기 증강은 그림자 방향과 하이라이트 위치를 옮기지 못한다
EDGE AI
밝기와 감마, 노이즈 증강은 픽셀 값만 바꿀 뿐 그림자 방향과 하이라이트 위치는 옮기지 못합니다. 고도각을 45°에서 30°로 낮추면 반지름 1 mm 모따기의 하이라이트 띠가 약 0.12 mm, 8 px 옮겨 갑니다.
절삭 가공 알루미늄 부품을 14.9 μm/px로 찍는 엣지 모델에서 증강이 흉내 내지 못하는 변화, 하이라이트 이동량, 촬영 매트릭스 크기, 조건 단위 홀드아웃 검증을 차례로 계산했습니다.
읽는 시간 약 11분
절삭 가공 알루미늄 부품의 찍힘과 스크래치를 학습한 엣지 모델이, 조명 브래킷을 다시 조이거나 설비를 옆 라인으로 옮긴 뒤 갑자기 성능이 떨어지는 경우가 있습니다. 학습 단계에서 밝기와 감마, 노이즈 증강을 충분히 넣었는데도 그렇죠. 원인을 따라가 보면 대개 조명의 밝기가 아니라 조명 각도가 바뀐 경우입니다. 재촬영과 재라벨링, 재배포를 되풀이하는 동안 검사 신뢰도가 떨어진 구간이 생기고, 과검출을 줄이려고 판정 임계를 올리면 가장 가는 스크래치부터 조용히 빠져나갑니다.
표면부터 봅니다. 절삭 가공한 알루미늄은 빛을 거의 거울처럼 돌려보내면서도 가공 결을 따라 일부를 흩뜨려, 정반사와 난반사가 한 화면에 섞입니다. 같은 찍힘이라도 조명이 오는 방향에 따라 밝은 면과 어두운 면이 바뀌고, 모서리의 둥근 모따기에서는 하이라이트 띠가 조명 각도를 따라 자리를 옮깁니다. 그래서 아래 하이라이트 이동량과 촬영 조건 수는 가공 조도와 곡률에 묶이며, 실제 값은 샘플 테스트 전 확언 불가입니다.
가정은 이렇습니다. 4,096 × 3,000 px, 화소 3.45 μm 카메라에 35 mm 렌즈를 달아 렌즈 주점에서 약 186 mm 떨어진 곳(WD1 160 mm 이상 확보)에서 FOV 61 mm × 45 mm를 14.9 μm/px로 찍고, 카메라는 부품을 수직으로 내려다봅니다. 조명은 고도각2을 30°, 45°, 60°로 바꿀 수 있는 저각 방향성 바 조명 네 방향이고, 가장 가는 결함은 폭 45 μm 스크래치, 모서리는 반지름 1 mm의 둥근 모따기입니다. 영상은 512 × 512 px 타일 48장(8 × 6)으로 축소 없이 추론합니다.
단조 변환은 명암 순서를 뒤집지 못한다
밝기 증강은 I′ = aI + b, 감마 증강은 I′ = Iγ 꼴이라 각 픽셀의 새 값이 그 픽셀의 원래 값에만 달려 있습니다. a > 0인 밝기 변환과 감마 변환은 단조 증가 함수3라서 두 픽셀의 밝기 순서를 뒤집지 못하고, 노이즈 증강도 픽셀마다 독립적인 요동을 더할 뿐 구조를 옮기지 않습니다. 셋 다 픽셀별 증강4입니다.
저각 방향 조명에서 찍힘은 조명 쪽 경사면이 밝고 반대쪽 경사면이 어두운 명암 쌍으로 찍힙니다. 조명 방위각5이 180° 바뀌면 이 명암 쌍의 좌우가 뒤바뀌는데, 밝던 픽셀이 어두워지고 어둡던 픽셀이 밝아지는 순서 역전은 어떤 단조 변환으로도 만들 수 없어요. 방위각 0° 영상에 밝기 ±20 %, 감마 0.8~1.25, 가우시안 노이즈 σ = 2 DN을 걸어도 명암 쌍의 방향은 모든 샘플에서 조명 쪽 밝음으로 고정되고, 모델은 찍힘을 그 방향의 명암 쌍으로 배웁니다.
좌우 뒤집기 증강이 방향을 일부 흉내 내기는 하지만, 가공 결의 방향까지 함께 뒤집혀 실제로는 없는 영상을 만듭니다. 그래서 저는 증강 목록을 짤 때 항목마다 이것이 값의 변화인지 위치의 변화인지부터 묻고, 위치의 변화는 증강 대신 촬영으로 확보합니다.
고도각 15° 차이에 하이라이트는 8 px 옮겨 간다
가공 금속 표면에서는 그림자보다 정반사 하이라이트의 위치 이동이 모델을 더 크게 흔듭니다. 정반사6는 입사각과 반사각이 같은 방향으로만 강하게 돌아오므로, 카메라가 수직으로 내려다볼 때 하이라이트는 표면 법선이 수직에서 (90° − 고도각) ÷ 2만큼 기운 자리에 맺힙니다. 고도각 60°면 15°, 45°면 22.5°, 30°면 30° 기운 자리입니다.
반지름 1 mm 둥근 모따기를 위에서 보면, 법선 기울기가 θ인 지점은 모서리 시작점에서 r × sin θ만큼 떨어져 있습니다. 고도각을 45°에서 30°로 낮추면 그 거리가 1 mm × (sin 30° − sin 22.5°) ≈ 0.117 mm, 14.9 μm/px로 약 7.9 px 옮겨 가고, 60°에서 45°로 바뀔 때도 0.124 mm, 8.3 px를 움직입니다. 반지름이 0.5 mm라면 이동은 절반인 4 px 안팎이죠. 45 μm 스크래치가 3 px인 셋업에서 8 px짜리 하이라이트 이동은 결함 하나를 통째로 덮거나 드러낼 만한 크기입니다.

포화된 픽셀에는 결함 정보가 원리적으로 남지 않으니, 하이라이트가 옮겨 간 자리의 결함은 소프트웨어가 되살리지 못합니다. 45° 데이터만 배운 모델은 모따기 중간의 밝은 띠를 정상 외관으로 기억하고, 30° 조건에서는 띠가 옮겨 간 자리를 이상 패턴으로 볼 수 있어요. 밝기 증강으로 띠를 어둡게 하거나 밝게 해도 띠의 위치는 그대로입니다.
각도 축은 촬영으로만 채운다
조명 각도 변화에 대한 일반화는 증강 강도를 올려서 얻어지지 않고, 조명 조건을 축으로 한 촬영 매트릭스7를 설계해야 얻어집니다. 여러 조건을 계획 없이 섞어 찍으면 촬영량만 늘고 어떤 조건이 성능을 떠받치는지 알 수 없지만, 매트릭스로 설계하면 고도각, 방위각, 광량 축이 명시되어 조건 단위로 학습과 검증을 나눌 수 있습니다.
고도각 3단계(30°, 45°, 60°) × 방위각 4방향(0°, 90°, 180°, 270°) × 광량 2단계 = 24조건을 두고, 조건당 정상 40장과 불량 20장을 찍으면 총 1,440장입니다. 광량 축은 밝기 증강으로 일부 대신할 수 있으니, 촬영 예산이 모자라면 저는 광량을 1단계로 줄여 12조건 720장으로 시작하되 각도 축은 줄이지 않습니다. 밝기와 감마, 노이즈 증강은 조건 사이의 광량 편차와 센서 잡음을 메우는 보조 역할로만 둡니다.
매트릭스는 데이터 수집 계획이면서 조명 설치 공차의 명세서이기도 합니다. 브래킷을 다시 조일 때 생길 수 있는 각도 범위가 매트릭스 안에 들어 있어야 하고, 매트릭스 밖의 각도로 설치되었다면 그 조건은 아직 검증되지 않은 조건이라는 뜻입니다.
무작위 분할은 처음 보는 조명을 재지 못한다
검증은 무작위 분할 대신 조건 단위 홀드아웃8으로 합니다. 한 방위각을 통째로 학습에서 빼고 평가해야 처음 보는 조명 조건에 대한 일반화를 실제로 잴 수 있어요. 무작위 분할에서는 같은 조건의 이웃 샘플이 학습과 검증에 함께 들어가 성능이 부풀려집니다.
1,440장 매트릭스에서 방위각 하나는 고도 3 × 광량 2 × 60장 = 360장이고, 이것이 홀드아웃 검증 1회분입니다. 네 방위각을 차례로 빼며 4회 돌리고 같은 데이터의 무작위 분할 결과를 나란히 적어 두면, 두 결과의 차이가 처음 보는 조명에 대한 일반화 여유를 숫자로 보여 줍니다. 저는 이 차이를 45 μm 스크래치 클래스의 재현율로 따로 적습니다.
45 μm 스크래치 기준으로 촬영 조건을 한 표에 놓으면
결함 크기와 광학 셋업, 증강과 촬영 조건을 한 표에 모았습니다. 하이라이트 이동량은 반지름 1 mm 둥근 모따기를 가정한 값입니다.
| 구분 | ① 최소 불량 크기 | ② 광학 셋업 · WD | ③ 알고리즘 파라미터 |
|---|---|---|---|
| 스크래치 | 폭 45 μm ≈ 3.0 px (14.9 μm/px) | 4,096 × 3,000 px, 화소 3.45 μm, 35 mm 렌즈(배율 약 0.23), FOV 61 × 45 mm, WD 160 mm 이상(주점 기준 물체 거리 약 186 mm, 고도각 30° 바 조명 설치 공간 포함 실측) | 512 × 512 px 타일 48장(8 × 6), 축소 없음 |
| 찍힘 | 직경 100 μm ≈ 6.7 px, 명암 쌍 각 3 px 안팎 | 저각 방향성 바 조명 4방위, 고도각 30° / 45° / 60° | 픽셀별 증강: 밝기 ±20 %, 감마 0.8~1.25, 노이즈 σ 2 DN(광량 편차 보조용) |
| 모따기 버 | 길이 150 μm ≈ 10 px | 반지름 1 mm 모따기 하이라이트 이동: 45°→30° 약 0.117 mm(7.9 px), 60°→45° 약 0.124 mm(8.3 px) | 촬영 매트릭스 24조건 × 60장 = 1,440장, 예산이 모자라면 광량 축부터 축소(12조건 720장) |
| 검증 | 45 μm 스크래치 재현율 별도 집계 | 조명 브래킷 설치 공차 범위를 매트릭스에 포함 | 방위각 단위 홀드아웃 4회(회당 360장), 무작위 분할 결과와 나란히 기록 |
이 표가 가리키는 위험은 크기의 차이입니다. 14.9 μm/px에서 45 μm 스크래치는 약 3.0 px인데, 고도각이 15°만 바뀌어도 하이라이트 띠는 8 px 안팎을 옮겨 가니 결함보다 두 배 넘게 큰 변화가 화면에 생깁니다. 그래서 각도 축은 촬영 매트릭스로 채우고, 방위각 홀드아웃 360장에서 스크래치 재현율이 무작위 분할보다 얼마나 떨어지는지로 처음 보는 조명에 대한 여유를 잽니다.
촬영 매트릭스 없이도 되는 경우
반대 접근이 나은 조건도 분명합니다. 조명이 고정 지그로 공차 관리되고 대상이 확산 표면이라면 각도 변화가 거의 생기지 않아 단일 조건 촬영과 픽셀별 증강만으로 충분하고, 촬영 매트릭스 비용이 과잉이 됩니다. 표면 반사 특성을 측정해 렌더링할 수 있다면 반사 모델(BRDF9)로 합성 영상을 만들어 각도 변화를 일부 대신할 수 있지만, 반사 모델의 측정과 검증 비용이 따로 듭니다. 돔 조명처럼 전방위 확산 조명을 쓸 수 있다면 그림자와 하이라이트의 방향성 자체를 하드웨어로 없애는 편이 촬영 매트릭스보다 저렴할 수 있고, 대신 찍힘의 명암 콘트라스트도 함께 약해집니다.
가공 금속처럼 난반사와 정반사가 섞이는 표면에서는 조명 각도에 따른 외관 변화의 폭이 가공 조도와 곡률에 크게 좌우됩니다. 그래서 필요한 촬영 조건의 수는 샘플 테스트 전 확언 불가이고, 저는 새 부품마다 고도각과 방위각을 바꾼 샘플 몇 장으로 하이라이트 이동량부터 잽니다.
현장 노트
조명이 바뀔 수 있는 라인에 엣지 모델을 올린다면 저는 바 조명의 고도각과 방위각을 바꾼 조건에서 모델을 따로 검증합니다. 브래킷이 45°보다 낮게 다시 조립되면 모따기 부위의 하이라이트 띠가 학습 데이터에 없던 자리로 옮겨 갈 수 있고, 밝기 증강은 그 위치 변화를 흉내 내지 못하기 때문입니다. 방위각 단위 홀드아웃을 기본 검증으로 두고, 새 부품은 조명 각도별 샘플 매트릭스를 먼저 찍어 촬영 조건 수를 정합니다.
현장 체크포인트
새 부품이나 새 라인에 모델을 올리기 전에 아래 항목을 확인합니다. 각도와 관련된 항목은 증강으로 대신하지 않습니다.
- WD 160 mm 이상이 고도각 30° 바 조명의 설치 공간과 브래킷 간섭까지 포함해 실측으로 확보되는가? (주점 기준 물체 거리 약 186 mm)
- 가공 조도와 모따기 반지름을 확인하고, 고도각을 바꿔 하이라이트 이동량을 샘플로 쟀는가? (반지름 1 mm, 45°→30°면 약 8 px)
- 증강 목록의 항목마다 값의 변화인지 위치의 변화인지 나눴는가?
- 조명 브래킷의 설치 공차로 생길 수 있는 각도 범위가 촬영 매트릭스 안에 들어 있는가?
- 검증을 무작위 분할 대신 방위각 단위 홀드아웃으로 하고, 두 결과를 나란히 기록하는가?
- 45 μm 스크래치가 3 px 이상을 차지하는지, 하이라이트 이동 구간의 재현율을 따로 집계하는가?
자주 묻는 질문
텔레센트릭 렌즈를 쓰면 하이라이트 이동이 줄어드나요?
35 mm 렌즈로 186 mm 거리에서 찍으면 FOV 가장자리의 주광선은 수직에서 약 9.3° 기울어, 같은 고도각에서도 화면 가운데와 가장자리의 하이라이트 조건이 다릅니다. 텔레센트릭 렌즈는 이 화면 안의 차이를 없애 주지만, 조명 각도가 바뀌어 생기는 이동은 그대로 남습니다. FOV 61 mm를 덮는 텔레센트릭 렌즈는 크고 비싸므로 화면 안의 균일성이 정말 필요한지부터 따집니다.
광량 2단계를 밝기 증강으로 대신해도 되나요?
광량 변화는 대부분 픽셀 값의 변화라 밝기 증강이 꽤 잘 흉내 냅니다. 다만 광량을 낮췄을 때 포화됐던 하이라이트 안의 결함이 드러나는 변화는 증강으로 만들 수 없으니, 하이라이트가 포화되는 부품이라면 저는 광량 축도 2단계는 찍어 둡니다.
용어 풀이
- [1] WD working distance, 작동 거리
렌즈 앞면에서 검사할 면까지의 거리입니다. 본문의 약 186 mm는 얇은 렌즈 근사로 렌즈 주점을 기준으로 계산한 물체 거리이고, 렌즈 앞면 기준 거리는 렌즈 도면으로 확인합니다. ↩ - [2] 고도각 elevation angle
조명이 수평면에서 위로 들린 각도입니다. 30°는 낮게 비스듬히, 60°는 높게 비추는 조명입니다. ↩ - [3] 단조 증가 함수 monotonically increasing function
입력이 커지면 출력도 커지거나 같은 값을 유지하는 함수입니다. 두 값의 크기 순서를 바꾸지 못합니다. ↩ - [4] 픽셀별 증강 per-pixel augmentation
각 픽셀의 새 값을 그 픽셀의 원래 값만으로 정하는 학습 데이터 증강입니다. 밝기, 감마, 노이즈 증강이 여기에 속합니다. ↩ - [5] 방위각 azimuth angle
조명이 수평면에서 어느 방향에서 오는지를 나타내는 각도입니다. 180°가 바뀌면 반대편에서 비춥니다. ↩ - [6] 정반사 specular reflection
빛이 입사각과 같은 각도로 한 방향에만 강하게 반사되는 현상입니다. 카메라가 그 방향에 있으면 하이라이트로 찍힙니다. ↩ - [7] 촬영 매트릭스 capture matrix
고도각, 방위각, 광량 같은 조명 조건을 축으로 놓고 모든 조합을 계획해 찍는 촬영 설계입니다. ↩ - [8] 조건 단위 홀드아웃 condition-level holdout
한 조건의 데이터를 학습에서 통째로 빼 두고 그 조건으로만 평가하는 검증 방식입니다. ↩ - [9] BRDF bidirectional reflectance distribution function
빛이 들어오는 방향과 나가는 방향에 따라 표면이 얼마나 반사하는지 나타내는 함수입니다. 측정해 두면 각도별 외관을 합성할 수 있습니다. ↩
참고 자료
- 계산식: 화소 분해능 = FOV ÷ 픽셀 수, 결함 크기(px) = 결함 크기 ÷ 화소 분해능, 정반사 조건(카메라 수직)의 법선 기울기 θ = (90° − 고도각) ÷ 2, 둥근 모따기의 하이라이트 위치 = r × sin θ, 이동량 = r × (sin θ₂ − sin θ₁), 매트릭스 장수 = 고도각 수 × 방위각 수 × 광량 단계 × 조건당 장수, 홀드아웃 1회분 = 고도각 수 × 광량 단계 × 조건당 장수, 가장자리 주광선 각 = atan(FOV 반폭 ÷ 물체 거리), 배율 m = 센서 폭 ÷ FOV 폭, 물체 거리 = f × (1 + 1/m)
- 계산 가정: 4,096 × 3,000 px 카메라(화소 3.45 μm), 35 mm 렌즈, FOV 61 × 45 mm, 카메라 수직 배치, 최소 결함 45 μm, 둥근 모따기 반지름 1 mm(비교 0.5 mm), 고도각 30° / 45° / 60°, 방위각 4방향, 광량 2단계, 조건당 정상 40장과 불량 20장
함께 읽으면 좋은 글 — 포토메트릭 스테레오는 움직이는 부품에서 정지 조건을 0.5 ms로 옮긴다 · 경량 모델은 왜 가장 가는 결함부터 놓칠까 · 엣지 검사의 입력 드리프트는 정확도보다 먼저 보인다


