엔지니어링 · 2024
반도체 SEM 이미지 AI 학습·검사 데스크톱 툴
레이아웃 기반 SEM 이미지 생성과 SEM 이미지 이상 판정을 한 창에서 다루는 Windows 앱
반도체 SEM 이미지를 다루는 AI 모델의 데이터 준비, 학습, 추론을 명령줄 없이 수행할 수 있도록 만든 데스크톱 앱입니다. 계측 장비가 내보낸 데이터를 그대로 열어 라벨을 붙이고, 학습 설정을 고치고, 추론 결과를 이미지와 함께 확인하는 과정을 하나의 창에 모았습니다.
- 고객
- 비공개 고객
- 분야
- 엔지니어링

개요
반도체 SEM(주사전자현미경) 이미지를 다루는 AI 모델을, 모델 코드를 직접 건드리지 않고도 운용할 수 있게 만든 Windows 데스크톱 앱입니다. 학습에 쓸 데이터를 고르고 가공하는 일, 학습을 실행하는 일, 추론 결과를 이미지와 함께 확인하는 일을 하나의 창에서 처리합니다.
앱은 두 모듈로 나뉩니다. GDS to SEM은 칩 설계 레이아웃 이미지에서 SEM 이미지를 생성하는 모델을 다루고, Image Warning은 SEM 이미지가 정상인지 이상인지 판정하는 모델을 다룹니다. 두 모듈 모두 추론, 데이터 준비, 학습 탭을 갖고, Image Warning에는 데이터 탐색기 탭이 더 있습니다.
AI 모델 코드는 연구 조직에서 별도로 개발합니다. 이 앱은 모델을 직접 품지 않고, 약속된 명령줄 인자로 외부 Python 스크립트를 실행한 뒤 그 표준 출력과 결과 파일을 읽어 화면에 보여 줍니다.
과제
모델과 UI를 묶지 않기
모델 코드는 연구가 진행되면서 계속 바뀝니다. 앱이 모델 라이브러리를 직접 import하면 모델 쪽 의존성이 바뀔 때마다 앱도 함께 묶입니다. UI가 모델의 변화와 무관하게 동작할 방법이 필요했습니다.
계측 장비 데이터의 폴더 구조가 하나가 아님
장비가 내보내는 MSR 파일과 이미지 폴더의 배치가 세 가지로 갈립니다. MSR 파일과 이미지 폴더가 같은 레벨에 있는 경우, MSR 파일이 이미지 폴더 안에 있는 경우, 이미지가 측정 포인트 번호(pno) 하위 폴더로 한 단계 더 나뉘는 경우입니다. 어느 쪽이 들어와도 같은 화면에서 열려야 했습니다.
좌표계가 다른 두 이미지의 대조
GDS 레이아웃은 설계 도면이고 SEM은 실제 촬영 이미지라 배율과 위치가 맞지 않습니다. 학습 쌍을 만들려면 사람이 눈으로 맞춰 보면서 같은 영역을 잘라내야 합니다.
큰 이미지에서도 끊기지 않는 조작
SEM 이미지와 레이아웃 이미지는 한 변이 수천 픽셀입니다. 확대와 이동이 버벅이면 정렬 작업 자체가 성립하지 않습니다.
해결 방법
GDS to SEM
- Inference — 레이아웃 이미지를 띄우고 크롭 박스로 영역을 지정해 잘라낸 뒤, Canny 엣지·회색조·좌우 반전·상하 반전을 미리 적용해 보고 생성 모델에 넘깁니다. 생성된 이미지는 아래 칸에 표시하고 파일로 저장합니다
- Data Preparation — 레이아웃과 SEM 이미지를 한 캔버스에 겹쳐 놓고 각각의 배율과 투명도를 조절해 맞춘 뒤, 같은 크롭 박스로 레이아웃·SEM·합성 이미지 세 장을 동시에 잘라 저장합니다
- Training — 학습 설정을 YAML 편집기에서 고치고, 학습 스크립트의 출력을 옆 칸에서 실시간으로 받습니다

Image Warning
- Inference — SEM 이미지 폴더와 모델 경로를 지정해 추론을 실행하면 결과 CSV를 표로 읽어 보여 주고, 행을 고르면 해당 결과 이미지를 띄웁니다
- Data Preparation — 이미지 모델용으로는 원본에 왜곡을 입힌 데이터를 생성하고 원본과 생성본을 나란히 넘겨 가며 확인합니다. 마커 모델용으로는 이미지를 분류하고, 마커를 분리하고, 결과를 목록에서 정리합니다
- Training — 이미지 모델과 마커 모델 각각에 대해 설정 편집, 학습 실행, 로그 확인을 제공합니다
- Explorer — MSR 파일을 읽어 로트와 측정 포인트 트리로 데이터를 펼치고, 이미지마다 Normal/Abnormal/None 라벨을 지정합니다. 라벨은 CSV로 쓰고 읽으며, 데이터는 앞서의 세 폴더 구조 중 원하는 형태로 다시 저장할 수 있습니다


시스템 구조
계층
- UI 계층 — 탭별 패널. 바깥 탭이 모듈, 안쪽 탭이 작업 단계인 중첩 노트북 구조
- 위젯 계층 — 이미지 캔버스, 크롭 박스, 중첩 캔버스, 히스토그램, YAML 편집기, 디렉터리 트리, 탐색기
- 유틸 계층 — MSR 파싱, 이미지 탐색, 배열 변환
- 스크립트 계층 — 학습과 추론 스크립트. 앱은
subprocess로만 호출
데이터 흐름
사용자가 경로를 고르면 UI가 인자를 조립해 외부 스크립트를 실행합니다. 스크립트는 결과 CSV와 이미지 파일을 지정된 폴더에 씁니다. 앱은 실행 중에 표준 출력을 읽어 진행 상태와 로그를 갱신하고, 작업이 끝나면 결과 파일을 다시 읽어 표와 이미지로 보여 줍니다. 모델과 앱 사이의 계약은 명령줄 인자와 파일 포맷뿐이며, 앱은 모델 라이브러리를 전혀 import하지 않습니다.
구현
GPU 캔버스
이미지 표시는 전부 VisPy 씬 그래프 위에 올렸습니다. PanZoomCamera를 상속해 뷰가 바뀔 때 콜백을 받도록 하고, 그 콜백으로 지금 보이는 영역의 좌표를 화면에 표시합니다. 탐색기의 동기화는 두 캔버스의 카메라를 link로 묶어 처리해서, 한쪽을 확대하거나 옮기면 다른 쪽이 같은 위치를 따라옵니다.

크롭 박스
크롭 박스는 캔버스 픽셀 좌표에 그리고, 실제로 자를 때 node_transform으로 이미지 좌표로 변환합니다. 확대·축소 상태와 무관하게 화면에서 보이는 사각형이 곧 잘려 나올 영역이 되도록 하기 위해서입니다.
두 이미지 겹치기
정렬 화면의 캔버스는 이미지 두 장을 각각 독립된 STTransform으로 올립니다. Ctrl+드래그는 레이아웃을, Alt+드래그는 SEM을 움직이고, 배율과 투명도는 슬라이더로 따로 조절합니다. 자를 때는 두 이미지를 각자의 변환만큼 되돌려 잘라낸 뒤, 알파 합성으로 겹친 이미지까지 함께 만들어 세 장을 저장합니다.

MSR 파싱
$result 줄에서 측정 포인트 번호를, &mp_image_name 줄에서 이미지 파일명을 읽습니다. 그다음 앞서의 세 가지 폴더 배치를 순서대로 시도해 실제 파일을 찾아냅니다. 내보낼 때는 Save data as 대화상자에서 세 구조 중 하나를 고르면 그 형태로 복사합니다.
진행 상태와 오류 처리
오래 걸리는 작업은 자식 프로세스의 표준 출력을 한 줄씩 읽습니다. 분류 작업은 출력에서 [3/20] 형태를 정규식으로 찾아 진행 막대를 채우고, 학습 작업은 출력 전체를 로그 칸으로 흘려보냅니다. 이벤트 핸들러는 공통 데코레이터로 감싸, 예기치 않은 예외가 나면 앱이 종료되는 대신 traceback을 대화상자로 보여 줍니다.

오픈소스 라이선스 표기
배포본에 포함되는 오픈소스(wxPython, Pillow, NumPy, VisPy)의 라이선스 전문을 메뉴에서 바로 열어 볼 수 있게 넣었습니다.
결과
모델 스크립트를 직접 실행하지 않고도 데이터 준비부터 학습, 추론, 결과 확인까지 한 창에서 처리할 수 있습니다. 장비가 내보낸 폴더 구조를 손으로 맞출 필요 없이 MSR 파일을 그대로 열 수 있고, 라벨은 CSV로 남아 다음 학습에 그대로 들어갑니다.
레이아웃과 SEM 이미지를 겹쳐 맞춘 결과는 잘라낸 이미지 세 장으로 저장되므로, 학습 쌍을 어떻게 만들었는지가 파일로 남습니다. 데이터는 세 가지 폴더 구조 중 원하는 형태로 다시 내보낼 수 있어, 모델 쪽이 기대하는 배치에 맞춰 넘길 수 있습니다.
모델과 앱이 명령줄 인자와 파일 포맷으로만 연결되어 있어, 모델 코드가 바뀌어도 같은 인터페이스를 지키는 한 앱은 그대로 씁니다.
사용 기술
- Python
- wxPython
- VisPy
- OpenCV
- Pillow
- NumPy
화면






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