1제조 비전 AI 개요
비전 AI(Computer Vision AI)는 제조 품질 검사의 핵심 기술입니다. 카메라를 통해 획득한 이미지에서 결함을 자동으로 탐지하고 분류하여, 사람의 육안 검사를 대체하거나 보완합니다.
제조 환경의 비전 AI는 일반적인 이미지 인식과 다른 특징을 가집니다. 미세 결함 탐지(마이크론 단위), 극도로 불균형한 데이터(정상 99% 이상), 실시간 처리 요구사항(ms 단위), 그리고 높은 신뢰도 요구(99.9% 이상)가 필수적입니다.
분류 (Classification)
이미지 전체를 OK/NG로 판정. 가장 빠르고 간단한 방법
탐지 (Detection)
결함 위치를 바운딩 박스로 표시. YOLO 계열 모델 사용
세그멘테이션
픽셀 단위로 결함 영역 분리. 정밀 측정 가능
이상 탐지
정상 데이터만으로 학습. 새로운 결함 유형 탐지
2데이터셋 구축과 라벨링
고품질 데이터셋은 비전 AI의 성패를 결정합니다. 제조 환경에서는 결함 샘플이 극히 적기 때문에, 전략적인 데이터 수집과 증강이 필수입니다.
# 결함 데이터셋 클래스 구조
class DefectDataset:
# 초기화: 이미지 경로, 어노테이션 파일, 태스크 유형 설정
init(root_dir, annotation_file, task):
annotations = load_json(annotation_file)
class_names = ['normal', 'scratch', 'dent', 'crack', 'contamination']
# 태스크별 데이터 반환
get_item(idx):
image = load_image(annotations[idx].filename)
if task == 'classification':
return (image, label) # 분류: 이미지 + 클래스
elif task == 'detection':
return (image, boxes, labels) # 탐지: 이미지 + 바운딩박스
elif task == 'segmentation':
return (image, mask) # 세그멘테이션: 이미지 + 마스크
# 데이터 증강 파이프라인
augmentation_train:
# 기하학적 변환 (제조 환경 시뮬레이션)
- Resize(640, 640)
- RandomRotate90, Flip
- ShiftScaleRotate (shift=0.1, scale=0.2, rotate=15도)
# 조명 변화 시뮬레이션
- RandomBrightnessContrast (밝기/대비 ±20%)
- HueSaturationValue (색상 변화)
# 센서 노이즈 시뮬레이션
- GaussNoise / ISONoise / MotionBlur
# 정규화 (ImageNet 기준)
- Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
# 불균형 데이터 샘플러
class ImbalancedSampler:
# 클래스별 빈도의 역수로 샘플링 가중치 계산
# 희귀 클래스(불량)가 더 자주 샘플링됨
weights = 1.0 / class_count[label]
sample = weighted_random_sampling(weights)
제조 환경에서는 물리적 현실성을 유지한 증강이 중요합니다. 과도한 왜곡은 오히려 성능을 저하시킵니다. 조명 변화, 약간의 회전, 노이즈 추가 등 실제 촬영 환경을 시뮬레이션하는 증강을 우선 적용하세요.
3CNN 기반 결함 분류 모델
결함 분류는 이미지 전체를 정상/비정상 또는 결함 유형별로 분류하는 태스크입니다. ResNet, EfficientNet 등 검증된 CNN 아키텍처를 사용하여 빠르고 정확한 분류기를 구축할 수 있습니다.
# 결함 분류 모델 구조
class DefectClassifier:
# 사전학습 백본 + 커스텀 분류 헤드
backbone = load_pretrained('efficientnet_b3' or 'resnet50')
classifier = Sequential(
AdaptiveAvgPool2d(1) # 글로벌 풀링
Linear(feature_dim → 512) # 은닉층
BatchNorm + ReLU + Dropout(0.3)
Linear(512 → num_classes) # 출력층
)
forward(image):
features = backbone(image) # 특징 추출
logits = classifier(features) # 클래스 예측
return logits
# Focal Loss: 불균형 데이터에 효과적
class FocalLoss:
# 쉬운 샘플의 기여도를 낮추고, 어려운 샘플에 집중
loss = -alpha * (1 - p_t)^gamma * log(p_t)
# gamma=2: 잘 분류된 샘플의 Loss를 크게 감소
# 학습 흐름
train_epoch:
for batch in dataloader:
outputs = model(images)
loss = FocalLoss(outputs, labels)
loss.backward()
clip_grad_norm(max=1.0) # 그래디언트 폭발 방지
optimizer.step()
scheduler.step() # CosineAnnealing 학습률 조정
ResNet50
EfficientNet-B3
ConvNeXt-Tiny
4YOLO 기반 결함 탐지
YOLO(You Only Look Once)는 실시간 객체 탐지의 표준입니다. YOLOv8을 사용하면 결함의 위치와 클래스를 동시에 추론할 수 있으며, 한 이미지에 여러 결함이 있어도 모두 탐지할 수 있습니다.
# YOLOv8 기반 결함 탐지기
class DefectDetector:
# 모델 초기화
init(model_size='m', conf=0.25, iou=0.45):
model = YOLO(f'yolov8{model_size}.pt') # n/s/m/l/x 선택
# 학습 설정
train(data_yaml, epochs=100):
model.train(
data=data_yaml,
epochs=epochs,
imgsz=640,
# 최적화
optimizer='AdamW', lr0=0.001,
# 증강 (제조 환경)
hsv_h=0.015, degrees=10, flipud=0, fliplr=0.5,
mosaic=1.0, mixup=0.1,
# Loss 가중치
box=7.5, cls=0.5, dfl=1.5
)
# 추론: 결함 위치 + 클래스 동시 예측
predict(image):
results = model.predict(image, conf=conf_threshold)
detections = []
for box in results.boxes:
detections.append({
'class_name': box.cls, # scratch, dent, crack...
'confidence': box.conf, # 신뢰도 (0~1)
'bbox': [x1, y1, x2, y2] # 바운딩 박스
})
return detections
# 배포용 ONNX 변환
export_onnx():
model.export(format='onnx', dynamic=True, simplify=True)
# YOLO 데이터셋 설정 파일 (YAML)
defect_detection.yaml:
path: data/defects
train: train/images
val: val/images
nc: 5 # 클래스 수
names: ['normal', 'scratch', 'dent', 'crack', 'contamination']
작은 결함 탐지: 이미지 크기 확대(1280px), 모자이크 증강 비율 감소 | 빠른 추론: YOLOv8n/s 사용, FP16 추론 | 높은 정확도: YOLOv8l/x 사용, TTA(Test-Time Augmentation) 적용
5세그멘테이션 모델
세그멘테이션은 픽셀 단위로 결함 영역을 분리합니다. 결함의 정확한 크기, 면적, 형태를 측정해야 하는 경우 필수적입니다. U-Net 아키텍처가 제조 비전에 널리 사용됩니다.
# U-Net 아키텍처: 인코더-디코더 + 스킵 연결
class UNet:
# 인코더 (다운샘플링)
encoder:
x1 = DoubleConv(3 → 64) # 입력
x2 = MaxPool + DoubleConv(64 → 128)
x3 = MaxPool + DoubleConv(128 → 256)
x4 = MaxPool + DoubleConv(256 → 512)
x5 = MaxPool + DoubleConv(512 → 1024) # 병목층
# 디코더 (업샘플링 + 스킵 연결)
decoder:
up1 = UpConv(1024) + concat(x4) → 512
up2 = UpConv(512) + concat(x3) → 256
up3 = UpConv(256) + concat(x2) → 128
up4 = UpConv(128) + concat(x1) → 64
output = Conv1x1(64 → num_classes) # 픽셀별 분류
# DoubleConv 블록
DoubleConv = Conv3x3 → BatchNorm → ReLU → Conv3x3 → BatchNorm → ReLU
# Dice Loss: 세그멘테이션에 효과적
class DiceLoss:
# 예측과 실제의 겹치는 영역 비율 최대화
dice = 2 * intersection / (pred_area + target_area)
loss = 1 - dice
# 학습: CrossEntropy + Dice 복합 손실
total_loss = CE_loss + Dice_loss
# 평가 지표: IoU (Intersection over Union)
IoU = intersection / union # 클래스별 계산
U-Net: 의료/제조 이미지에 최적화, 적은 데이터로 학습 가능 | DeepLabV3+: 높은 정확도, 느린 추론 | Segment Anything (SAM): Zero-shot 세그멘테이션, 프롬프트 기반 추론