소속: (주)피아이이 · SW 개발팀 역할: CV Software Engineer 기간: 2021.08 – 2021.11 산업 도메인: 이차전지(Li-ion) 제조 검사 장비
Situation
원통형 이차전지 상부(Washing Top)의 금속 표면 결함 검사에 키엔스사의 LumiTrax 카메라 모듈을 사용하고 있었다. LumiTrax는 다방향 조명을 순차적으로 조사하여 3D Surface Image를 생성하는 방식이었으나, 두 가지 심각한 문제가 있었다.
첫째, 카메라 디바이스 내부에서 모든 처리를 수행한 뒤 이미지를 전송하기 때문에 속도가 느렸다. 여러 종류(Albedo, Gradient 등)의 이미지를 차례로 한 장씩 전송하는 방식이어서, 전송을 모두 기다린 후 검사를 시작하면 Tact Time을 초과했다.
둘째, 비주기적으로 Black Frame이 전송되는 문제가 있었다. 카메라 제조사 본사(일본)와 함께 트러블슈팅을 진행했으나(Jumbo Packet, Receive Buffer, GigE 전용 랜카드, CAT.7 Cable 등), 원인을 특정하지 못했다.
Washing Top 프로젝트에서 이 카메라 이슈를 해결하지 못한 것이 아쉬워서, 근본적으로 LumiTrax를 대체할 수 있는 자체 알고리즘 개발을 시작하게 되었다.
Task
- 팀 구성: CV Software Engineer 1명(본인). 단독 연구 개발.
- 담당 영역:
- 3, 4, 6 Light 광학계를 이용한 Photometric Stereo 형상 추출 알고리즘 개발
- Camera Position Error 보정을 위한 Calibration Program 개발
- 목표: LumiTrax와 동등한 품질의 Surface Normal 이미지를 자체 생성하되, 처리 속도를 검사에 사용 가능한 수준으로 확보. 동시에 Black Frame 문제를 구조적으로 해결.
Action
기술 스택 & 시스템 구성
| 분류 | 기술 |
|---|---|
| Language | C#, C++, C++/CLI |
| Library | OpenCV |
| Domain | Photometric Stereo, Surface Normal Estimation |
하드웨어 구성
논문(“금속 표면 미세 결함에 대한 신뢰성 있는 실시간 3차원 형상 추출 시스템 개발”)의 방법을 참고하여 광학계를 구성했다. 3, 4, 6개의 조명을 다방향으로 배치하고, 각 조명 조건에서 촬영한 이미지로부터 Surface Normal을 추정하는 구조다. 카메라를 두 개 사용해야 했는데, 구조상 두 카메라에 정확히 같은 상이 맺힐 필요가 있었다.
핵심 구현 사례
1. 기존 LumiTrax 대체 방안 탐색
문제: LumiTrax는 느리면서 Frame까지 누락되는 상황이었다. 장기적으로 더 많은 검사 항목이 추가되거나 더 정밀한 검사가 필요할 때 병목이 될 것이 명확했다.
검토한 선택지:
- 다각도 카메라 배치: 여러 대의 카메라를 다른 각도에 배치하여 검사 → 하드웨어 비용 증가, 공간 제약
- 다각도 조명 + 자체 알고리즘: 직접 다방향 조명을 구성하고 Photometric Stereo 알고리즘을 구현 → 초기 개발 비용이 있지만, LumiTrax 모듈 비용(약 1,000만원/모듈) 절감 가능하고 속도와 안정성을 직접 제어 가능
논문 탐색을 통해 Photometric Stereo 기반 접근이 현실적이라고 판단하고, 직접 광학계를 구성하여 Surface Normal을 자체 산출하는 방식을 선택했다.
2. 알고리즘 구현 및 단계적 최적화
Photometric Stereo의 핵심은 Lambert’s Law에 기반하여 다방향 조명 조건에서의 반사광 강도로부터 Surface Normal Vector를 추정하는 것이다. 최소 3장의 서로 다른 조명 방향 이미지가 필요하며, pseudo-inverse matrix를 사용하여 연립방정식을 풀어 픽셀별 Surface Normal을 산출했다.
Photometric Stereo는 이미 논문으로 공개되어 있는 알고리즘이었기 때문에 논문을 잘 읽으면 어려움 없이 구현할 수 있었고, 이 과정에서 Gradient X, Y Image를 획득할 수 있었다.
구현은 4단계에 걸쳐 단계적으로 최적화했다:
- Python Prototyping: Jupyter Notebook으로 빠르게 구현하여 알고리즘을 검증. 2MB Gray Scale 이미지 3장 기준 30초 이상 소요로, 프로덕션에는 사용 불가.
- C#으로 Porting: 기존 Framework가 C# 기반이어서 빠르게 Application에 통합. 400ms로 단축되었으나 여전히 부족.
- LUT Mapping 최적화: 미리 계산 가능한 부분(pseudo-inverse matrix 등)을 Caching하여 Look-Up Table을 구성. 200ms로 기존 대비 50% 단축.
- C++ Native 구현: Image는 byte 배열이며 C#에서 blittable type이므로 C++ DLL Wrapping이 효율적. C++/CLI를 통해 연동하여 40ms로 기존 대비 80% 단축. 프로덕션 투입 가능한 속도 확보.
3. Shape Image 복원
문제: Gradient X, Y Image는 Photometric Stereo 논문 구현으로 획득할 수 있었으나, Shape Image는 키엔스가 독자적인 알고리즘으로 만들어낸 것이어서 공개된 방법이 없었다.
구현: 시행착오를 거쳐 Shape Image를 생성하는 알고리즘을 자체 개발했으며, LumiTrax의 Shape Image와 완전히 동일한 결과(PSNR ∞) 를 달성했다. 다만 키엔스에서는 추가 파라미터를 통해 flat하지 않은 영역을 더 부각시킬 수 있는 기능이 있었는데, 이 부분까지는 구현하지 못했다.
4. Camera Position Error Calibration
문제: 카메라를 두 대 사용하는 구조에서, 두 카메라에 정확히 같은 상이 맺혀야 했다. Pixel Align이 틀어지면 Surface Normal 산출 결과가 왜곡된다.
구현: 두 카메라의 차영상(Difference Image)을 실시간으로 보여주는 캘리브레이션 프로그램을 개발했다. 차영상을 확인하면서 HW적으로 정렬 오차를 조정할 수 있게 설정하여, 다중 카메라 간 Pixel Align 정밀도를 확보했다.
Result
기술 성과
- C# 기반 LUT Mapping으로 처리 시간 50% 단축 (2MB 기준 400ms → 200ms)
- C++ Native 구현으로 처리 시간 80% 단축 (2MB 기준 200ms → 40ms)
- LumiTrax Shape Image와 완전 동일한 결과 달성 (PSNR ∞)
- 3, 4, 6 Light 광학계 모두 지원
비즈니스 임팩트
- 키엔스 LumiTrax 모듈 대체로 모듈당 약 1,000만원 원가 절감
- Black Frame 문제를 구조적으로 해결 (카메라 내부 처리 의존성 제거)
회고
잘한 점
Washing Top에서 해결하지 못한 카메라 이슈에 대해 근본적인 대안을 찾아 실행한 것이 핵심이었다. Photometric Stereo 논문 구현은 어렵지 않았지만, 키엔스 독자 알고리즘인 Shape Image를 시행착오를 통해 복원하여 PSNR ∞ 동일한 결과를 달성한 것은 의미 있는 성과였다.
아쉬운 점 / 다시 한다면
키엔스의 Shape Image에서 flat하지 않은 영역을 추가 파라미터로 부각시키는 기능까지는 구현하지 못했다. 이 기능이 있었다면 검사 민감도 조정에 더 유연했을 것이다.
배운 점
상용 제품(LumiTrax)의 기능을 논문과 시행착오를 통해 자체 구현하는 과정에서, 알고리즘의 원리를 깊이 이해하는 것과 실제 구현 사이의 간극을 체감했다. 특히 Gradient Image는 논문만으로 구현 가능했지만 Shape Image는 공개된 방법이 없어 직접 분석해야 했던 경험은, 문제 해결에 있어 이론적 이해와 실험적 접근을 병행하는 것의 중요성을 가르쳐주었다. 또한 Python → C# → LUT → C++로 이어지는 단계적 최적화 경험은 이후 TensorRT 최적화 작업의 기반이 되었다.
참고 자료
- 논문: 금속 표면 미세 결함에 대한 신뢰성 있는 실시간 3차원 형상 추출 시스템 개발
- GitHub: https://github.com/404Vector/Study.PhotometricStereo
- 상세 기록: Photometric Stereo를 사용한 형상추출 알고리즘 개발