엔지니어링 · 2024
용접 비드 폭 실시간 예측 프로그램
용접 중 CCD 영상과 분광 스펙트럼을 함께 수집해 비드 폭을 예측하는 데스크톱 앱
용접이 진행되는 동안 CCD 카메라 영상과 분광기 스펙트럼을 동시에 수집하고, 두 신호를 함께 입력받는 신경망으로 용접 비드 폭을 예측해 화면에 표시합니다. 측정이 끝나면 영상과 스펙트럼, 예측값을 같은 구간에 대해 파일로 남깁니다.
- 고객
- 한국생산기술연구원
- 분야
- 엔지니어링

개요
용접 공정 연구에 쓰는 Windows 데스크톱 프로그램입니다. 용접이 진행되는 동안 CCD 카메라로 용융풀을 촬영하고 분광기로 아크 스펙트럼을 측정해, 두 신호를 함께 입력받는 신경망으로 용접 비드 폭을 예측합니다.
한 화면에 카메라 영상과 스펙트럼, 예측된 비드 폭 그래프가 함께 놓입니다. 예측값은 현재치와 함께 구간 평균, 표준편차로도 보여 줍니다. 측정이 끝나면 영상과 스펙트럼, 예측 폭을 각각 파일로 저장해 나중에 다시 확인할 수 있습니다.
연구자가 장비 앞에서 직접 쓰는 프로그램이라, 장비 설정과 연결, 측정, 저장까지 프로그램 하나에서 끝나도록 구성했습니다.

과제
비드 폭을 예측하려면 카메라 프레임과 스펙트럼이 같은 시점의 것이어야 합니다. 그런데 두 장비는 각자의 주기로 동작합니다. 카메라는 설정한 FPS로, 분광기는 적분 시간으로 수집 간격이 정해지고 둘은 서로 맞물려 있지 않습니다. 장비가 데이터를 내놓는 시점도 설정값대로 정확히 떨어지지 않습니다.
여기에 더해, 수집이 진행되는 동안에도 화면은 계속 갱신되어야 합니다. 장비에서 데이터를 받아오는 일과 화면을 그리는 일이 서로를 기다리게 두면 둘 다 느려집니다.
해결 방법
프로그램은 세 화면으로 나뉩니다.
- 측정: 장비에 연결하고 영상, 스펙트럼, 예측 비드 폭을 실시간으로 확인하는 화면
- CCD: 카메라의 ROI, 노출시간, 감마, 게인, FPS와 영상 저장 설정
- Spectro / Width: 분광기 적분 시간과 스펙트럼, 예측 폭의 저장 위치
연결 버튼 하나로 두 장비를 함께 열고 수집을 시작합니다. 연결된 뒤에는 100밀리초마다 각 장비의 최신 데이터를 가져와 화면을 갱신하고 비드 폭을 예측합니다.
기록할 때는 저장 길이를 1초에서 9.9초 사이로 정한 뒤 저장 시작을 누릅니다. 그 길이만큼의 데이터가 모이면 수집을 멈추고, 시점을 맞춘 영상과 스펙트럼, 예측 폭을 파일로 씁니다.
장비 설정은 JSON 파일로 저장하고 불러올 수 있어, 같은 조건의 측정을 반복할 때 설정을 다시 입력하지 않아도 됩니다.

시스템 구조
구성 요소
- 카메라 계층:
pyueye로 iDS uEye 카메라를 제어합니다. ROI, 노출시간, 감마, 게인, 프레임레이트를 설정하고 8비트 모노 프레임을 받습니다 - 분광기 계층:
seabreeze로 Ocean Optics 분광기를 제어합니다. 적분 시간을 설정하고 파장축과 강도를 받습니다 - 예측 계층: 이미지와 스펙트럼 두 입력을 받는 Keras 모델이 비드 폭을 출력합니다
- UI 계층: wxPython으로 만든 화면. 그래프는 matplotlib을 창 안에 끼워 그립니다
데이터 흐름
- 장비마다 수집 스레드가 하나씩 돌면서, 받은 데이터를 타임스탬프와 함께 링 버퍼에 쌓습니다
- UI 타이머가 100밀리초마다 각 버퍼의 최신 샘플을 꺼내 화면에 그리고, 두 값을 모델에 넣어 비드 폭을 얻습니다
- 저장할 때는 두 버퍼의 타임스탬프를 비교해 짝을 맞추고, 지정한 길이만큼 잘라 파일로 씁니다

구현
두 장비의 시점 맞추기
수집 스레드는 데이터를 받은 시각을 time.perf_counter()로 함께 기록합니다. 저장 시점에는 샘플이 적은 쪽을 기준으로 삼고, 반대쪽 버퍼에서 시각이 가장 가까운 샘플을 골라 쌍을 만듭니다. 두 장비의 수집 주기가 달라도 같은 길이의 데이터가 나옵니다.
카메라는 설정한 FPS보다 빠르게 프레임을 받아 둡니다. 고속 촬영에서는 요청한 간격에 정확히 맞춰 프레임을 꺼내기 어렵기 때문에, 여유 있게 받아 두었다가 저장할 때 목표 시각에 가장 가까운 프레임만 골라 영상으로 만듭니다.
버퍼와 오류 처리
버퍼는 최대 길이를 지정한 deque라서 오래된 데이터가 자동으로 밀려납니다. 측정을 오래 켜 두어도 메모리 사용량이 일정하게 유지됩니다.
장비 스레드에서 생긴 예외는 그 자리에서 창을 띄우지 않고 문자열로 모아 둡니다. UI 타이머가 주기마다 이를 확인해, 오류가 있으면 사용자에게 내용을 보여 주고 두 장비의 연결을 정리합니다. 수집 스레드와 화면이 서로를 기다리지 않도록 한 구조입니다.
모델 배포
학습된 모델은 프로그램 안에 포함되어 있고, 모델 파일이 없으면 첫 실행 때 만들어 냅니다. 이 파일을 바꾸면 프로그램을 수정하지 않고도 다른 모델을 쓸 수 있습니다.
화면
버튼, 입력란, 콤보박스, 스핀 컨트롤은 wxPython의 기본 위젯 대신 직접 그렸습니다. 어두운 배경에서 모양과 색이 일관되게 나오도록 하기 위해서입니다. 카메라 영상은 창 크기에 따라 비율을 유지한 채 조정되고, ROI 설정은 전체 센서 영역 안에서 어느 부분을 쓰는지 그림으로 함께 보여 줍니다.

결과
용접이 진행되는 동안 예측 비드 폭을 화면에서 바로 확인할 수 있습니다. 측정을 멈추고 결과를 따로 계산할 필요가 없습니다.
한 번의 측정에서 영상과 스펙트럼, 예측 폭이 같은 구간에 대해 남습니다. 세 자료의 시점이 맞춰져 있어, 나중에 같은 데이터를 다시 분석하거나 모델을 다시 학습시키는 데 그대로 쓸 수 있습니다.
장비 설정을 파일로 저장해 두면 같은 조건의 측정을 반복할 수 있고, 모델 파일을 교체하는 것만으로 다른 예측 모델을 적용할 수 있습니다.
사용 기술
- Python
- wxPython
- Keras
- NumPy
- OpenCV
- matplotlib
화면



진행하려는 프로젝트가 있으신가요?
해결하려는 문제와 지금 상황을 알려 주시면, 어떤 방식이 맞을지 함께 검토합니다.
프로젝트 문의하기