[AI 검사, 현장의 문제들 (5)] 결함 데이터를 생성해서 학습에 쓸 때 지켜야 할 것
결함 데이터가 부족한 제조 현장에서는 단순히 이미지를 오려 붙이거나 생성하는 것만으로는 실제 검사 성능을 높이기 어렵습니다. 5편에서는 배경과 결함의 물리적 관계를 고려해 결함 데이터를 생성하고, 현장 판정 기준과 다양한 생성 조건을 반영해 소수의 결함 샘플만으로도 실효성 있는 학습 데이터를 만드는 방법을 살펴봅니다.
2026.09.01
- 기술·제품
4편에서 파운데이션 모델이 학습 데이터 요구량을 줄여 준다고 썼습니다. 다만 그것도 결함 표본이 아예 없는 상태를 해결해 주지는 못합니다. 저희가 실제로 받는 데이터는 결함 유형당 4~10장인 경우가 많습니다.
여기서 선택지는 둘입니다. 결함이 자연 발생할 때까지 몇 달을 기다리거나, 결함을 만들어서 쓰거나.
오려 붙이면 왜 안 되는지부터
가장 먼저 떠오르는 방법은 결함 영역을 잘라 양품 이미지에 붙이는 것입니다. Copy-Paste 계열로 오랫동안 쓰여 온 방법이기도 합니다.
이렇게 만든 데이터로 학습시키면 검증 세트 지표는 다소 올라갈 수 있습니다. 그런데 현장에 넣으면 과검이 대폭 늘어납니다. 오려 붙인 결함은 그 자리의 조명 방향을 따르지 않고, 표면 곡률을 무시하며, 경계에 부자연스러운 선을 남깁니다. 모델이 결함 자체가 아니라 합성 흔적을 학습하기 때문에 실제 라인에서는 엉뚱한 곳에서 반응합니다.
Diffusion 기반 인페인팅을 그대로 쓰는 경우에도 비슷한 문제가 있습니다. 모델이 결함과 배경을 뒤섞인 상태로 학습하다 보니, 마스크 안에 무언가 생기기는 하는데 주변과 통합되지 않거나 마스크 모양에 과적합된 결함이 나옵니다.
배경에서 결함으로만 영향이 흐르게 합니다
필요한 것은 결함을 그려 넣는 일이 아니라 그 자리에 생겼을 법한 결함을 만드는 일입니다. 그러려면 모델이 대상 표면의 조명과 질감과 곡률을 먼저 이해해야 합니다.
그래서 저희는 학습 단계에서 비대칭 규칙을 강제했습니다.
![[그림1] 배경과 결함 사이의 단방향 영향 관계.png](/uploads/bac0655d-8568-4246-aed7-001022a51a44.png)
[그림 1] 배경과 결함 사이의 단방향 영향 관계
모델이 배경 정보를 결함 생성에 참고하도록 두되, 반대 방향은 차단합니다. 그러면 결함은 그 자리의 물리 조건에 맞춰 생성되고, 배경은 원본의 질감과 패턴이 그대로 보존됩니다. 이 알고리즘을 ‘Background-Aware Defect Generation for Robust Industrial Anomaly Detection’이라는 제목의 논문으로 아카이브에 공개했습니다. MVTec AD의 네 개 표준 지표 평균에서 동급 모델 중 1위를 기록했습니다.
이 비대칭에는 부수 효과가 있습니다. 생성 결과에서 원본 이미지를 역으로 복원할 수 없다는 점입니다. 반도체와 디스플레이, 이차전지처럼 데이터 반출 자체가 협의 대상인 공정에서, 실제 불량 시료를 외부로 내보내지 않고 소수 샘플의 특징만 활용해 사내 폐쇄망에서 증강할 수 있는 근거가 됩니다.
결함 네 장으로 생성 모델을 어떻게 학습시키는가
여기서 당연한 질문이 나옵니다. 결함이 네 장뿐인데 그것만으로 생성 모델을 어떻게 학습시키느냐는 것입니다. 생성 모델은 대체로 판별 모델보다 더 많은 데이터를 요구합니다.
답은 학습 대상을 둘로 나누는 데 있습니다. 배경을 그럴듯하게 재현하는 능력과 결함의 형태를 만드는 능력은 서로 다른 문제이고, 필요한 데이터 양도 다릅니다.
배경 쪽은 재료가 넉넉합니다. 1편과 4편에서 반복해서 말했듯 양품 이미지는 라인을 돌리기만 하면 쌓입니다. 대상 표면의 질감과 조명이 만드는 음영은 양품만으로 충분히 학습할 수 있습니다. 결함 표본이 필요한 것은 결함의 형태를 익히는 부분뿐이고, 그 부분만 소수 샘플로 경량 적응시킵니다. 모델 전체를 다시 학습시키지 않습니다.
4편에서 품종 차이를 얇은 계층이 흡수하게 했던 것과 같은 발상입니다. 많은 데이터로 배울 수 있는 것과 적은 데이터로만 배울 수 있는 것을 분리하고, 후자를 최대한 얇게 두는 것입니다.
앞 절에서 말한 배경과 결함의 분리는 그래서 생성 품질만의 문제가 아닙니다. 두 능력이 뒤엉켜 있으면 결함 네 장으로 배경 재현 능력까지 흔들게 되고, 그러면 소수 샘플 학습 자체가 성립하지 않습니다. 두 능력을 분리하는 것이 few-shot 학습을 가능하게 하는 조건입니다.
부수 효과도 있습니다. 같은 대상에서 새로운 결함 유형이 추가되면 배경 쪽 학습은 재사용하고 결함 쪽만 다시 적응시키면 됩니다. 유형 하나 늘 때마다 처음부터 시작하지 않아도 됩니다.
마스크는 입력이자 출력입니다
생성 모델에는 어디에 결함을 만들지를 알려 줘야 합니다. 그 입력이 마스크입니다.
이 마스크를 어디서 얻는지가 실무에서 갈립니다. 엔지니어가 보유한 실제 결함의 마스크를 변형해서 쓰기도 하고, 결함이 발생 가능한 영역을 지정해 두면 시스템이 그 안에서 마스크를 만들어 내기도 합니다. 중요한 것은 물리적으로 결함이 생길 수 없는 위치에는 만들지 않는 것입니다. 용접부에서만 나오는 결함을 평면부에 만들어 놓으면, 검출 모델이 평면부를 감시하도록 학습합니다. 데이터를 늘리고 성능을 깎는 셈입니다.
출력 쪽에서 체감이 큰 부분은 따로 있습니다. 어느 픽셀에 결함을 넣었는지 모델이 알고 있으므로 정답 마스크가 자동으로 따라옵니다. 데이터를 100배 늘려도 레이블링 공수는 추가되지 않습니다.
이 마스크는 세그멘테이션 모델 학습에 그대로 들어갑니다. 사람이 그린 마스크는 작업자마다 경계를 잡는 기준이 달라 편차가 생기는데, 생성 마스크에는 그 편차가 없습니다.
같은 결함을 1,000장 만들면 소용이 없습니다
수량만 늘리는 것은 의미가 없습니다. 1편에서 회전과 플립으로는 결함 형태의 다양성이 늘지 않는다고 썼는데, 생성에서도 같은 함정이 있습니다. 프롬프트와 마스크를 고정한 채 시드만 바꾸면 비슷한 결함이 반복해서 나옵니다.
그래서 저희는 생성 조건 자체를 흔듭니다. 결함이 놓일 위치와 크기, 방향, 강도를 정해진 범위 안에서 무작위로 바꿔 가며 생성합니다. 범위를 정하는 근거는 실제 공정입니다. 앞에서 말한 발생 가능 영역이 여기서 다시 쓰입니다.
공정 특성에 따라 전략이 갈립니다
저희는 같은 생성 엔진을 쓰더라도 입력을 처리하는 방식은 공정에 따라 나눕니다.
대면적 스캔 공정은 배경이 비교적 단순하고 결함 크기가 작습니다. 이미지를 축소하면 봐야 할 미세 질감이 뭉개지므로, 시스템이 이미지를 패치 단위로 잘라 원본 해상도 그대로 생성합니다. 금속 표면의 미세 질감을 픽셀 단위로 보존해야 검사 모델의 정밀도가 유지됩니다.
복합 구조 촬상은 해상도는 낮지만 맥락이 복잡하고 결함 크기가 큽니다. 부품 간 정렬 관계 같은 전역 컨텍스트가 더 중요하므로, 엔지니어가 결함 발생 가능 영역을 ROI로 지정한 뒤 그 안에서만 생성하게 합니다.
텍스트로 형태를 지정합니다
생성 결과가 원하는 형태가 아닐 때, 기존 방식은 엔지니어가 파라미터를 조정하거나 마스크를 다시 그리는 것이었습니다. 전문 지식이 필요하고 반복 횟수도 많습니다. 무엇보다 결함의 방향과 크기와 깊이를 직접 지정할 수단이 없었습니다.
그래서 저희는 입력을 자연어로 바꿨습니다.
![[그림2] 자연어 입력에서 생성까지의 처리 흐름.png](/uploads/2823b500-70c0-486e-a149-d494b892b25b.png)
[그림 2] 자연어 입력에서 생성까지의 처리 흐름
사용자가 넣은 문장을 LLM이 생성 모델이 받는 형태의 프롬프트로 변환하고, 그 지시가 결함 형태를 가이드합니다. 결과가 다르면 사용자가 텍스트만 고쳐서 다시 생성합니다.
아래는 동일 모델, 동일 마스크에서 프롬프트만 바꿔 생성한 결과입니다.
![[그림3] 프롬프트만 바꿔 생성한 결과 비교 (MVTec AD hazelnut).png](/uploads/c70e4d7b-e990-4ed1-a3f8-8cfb55a7ee99.png)
[그림 3] 프롬프트만 바꿔 생성한 결과 비교 (MVTec AD hazelnut)
방향과 크기, 음영 유무가 프롬프트대로 구분되어 나옵니다.
아직 완전하지는 않습니다. 기존 생성 구조에서는 마스크 사전 정보가 텍스트 조건을 압도하는 경향이 있어서, 텍스트 제어력이 마스크 형태에 제한됩니다. 저희는 배경과 전경의 텍스트 프롬프트 인코딩을 분리해 마스크를 동적으로 생성하는 방향으로 작업하고 있습니다.
판정 기준을 아는 사람이 직접 만들 수 있어야 합니다
입력을 텍스트로 바꾼 이유는 조작 편의성만이 아닙니다.
검사에서 어려운 것은 명백한 불량이 아니라 합격과 불합격 경계에 걸친 시료이고, 그 경계선을 가장 잘 아는 사람은 AI 엔지니어가 아니라 현장 품질 담당자입니다. 담당자가 생성 결과를 보고 “이렇게는 안 생긴다”거나 “이 정도 진하기면 합격이다”라고 피드백하면, 그 판단이 다음 생성에 반영됩니다. 경계 시료를 집중적으로 만들어 학습에 넣으면 모델의 판정선이 현장 기준에 가까워집니다.
1편에서 경계 시료를 미리 알기 어렵다고 썼는데, 생성은 그 순서를 뒤집습니다. 경계 시료를 찾는 대신 만들어서 담당자에게 보여 주고, 어디까지가 합격인지를 확인받습니다.
경험적 판정 기준을 선명도와 크기와 깊이 같은 수치 파라미터로 옮기는 작업이 현재 진행 중인 주제입니다.
도움이 됐는지는 검출 모델로 확인합니다
생성 이미지가 그럴듯해 보이는 것과 검사 성능이 올라가는 것은 다른 문제입니다. 육안으로 자연스러운지만 보면 판단이 어긋납니다.
그래서 저희는 검증을 검출 모델 쪽에서 합니다. 원본만으로 학습시킨 모델과 생성 데이터를 더해 학습시킨 모델을 동일한 실물 결함 세트로 평가해 비교합니다. 이때 평가 세트에는 생성 이미지를 절대 넣지 않습니다. 생성 분포에 맞춰 학습한 모델을 생성 분포로 평가하면 당연히 좋게 나오고, 그 숫자는 현장 성능과 무관해집니다.
앞서 말한 합성 흔적 학습도 이 비교에서 드러납니다. 검증 지표는 올라가는데 실물 세트에서 과검이 늘어난다면, 모델이 결함이 아니라 합성 방식을 학습한 것입니다.
원본과 생성 데이터의 비율도 저희가 실험으로 잡습니다. 생성 비중을 무한정 올리면 모델이 생성 분포 쪽으로 끌려가므로, 실물 세트 성능이 꺾이는 지점 앞에서 멈춥니다.
정리
결함 유형당 몇 장의 샘플로 수백에서 1,000장 규모의 학습셋을 만들 수 있고, 마스크가 함께 생성되므로 레이블링 공수가 늘지 않으며, 원본 역추적이 불가능해 폐쇄망 안에서 완결됩니다.
이렇게 만든 데이터는 3편의 하이브리드 구조로 들어갑니다. 비지도 모델이 Unknown으로 잡은 신종 결함의 표본이 부족할 때 생성 데이터로 보완해 지도 모델에 편입시키는 흐름입니다.
[AI검사, 현장의 문제들] 시리즈
1편. 불량 제품이 없는 상태에서 AI Inspection 시작하기
2편. 정상만 학습해서 이상을 찾을 때 막히는 지점들
3편. 지도학습과 비지도학습을 한 시스템에 같이 넣은 이유
4편. 품종 수천 종을 모델 하나로 처리하기까지
5편. 결함 데이터를 생성해서 학습에 쓸 때 지켜야 할 것 (현재글)
6편. 품종이 바뀔 때마다 사람이 광학계를 맞추는 문제


