본문으로 건너뛰기
Roboflow Blog조회 1

컴퓨터 비전으로 Torque seal을 검증하는 방법

RF-DETR과 Gemini를 결합해 Torque seal을 PASS·FAIL·UNREADABLE로 판정하는 Roboflow Workflow 구축법입니다.

이 요약은 AI가 원문을 분석해 생성했습니다. 정확한 내용은 원문 기준으로 확인하세요.

TL;DR

이 튜토리얼은 517장의 fastener 이미지에서 Torque seal을 인스턴스 분할로 검출하고 Google Gemini로 정렬 상태를 판정하는 Roboflow Workflow를 구축합니다. RF-DETR은 페인트 선의 mask를 만들고 Custom Python Block은 끊겨 검출된 조각을 Union-Find로 병합하며, Gemini는 aligned, misaligned, unclear 중 하나를 반환합니다. Seal Check는 이를 PASS, FAIL, UNREADABLE로 바꾸고 라벨 이미지와 JSON 보고서를 출력하며 Roboflow Vision Events에 검사 기록을 남깁니다. 검출 결과가 없거나 판정이 불명확한 경우에는 오판을 피하기 위해 UNREADABLE로 처리하고, 생산 환경에서는 hosted inference, Roboflow Inference, 파일, webcam, RTSP stream을 입력원으로 사용할 수 있습니다.

섹션별 상세

01
공장 출하 전에 체결 상태를 확인하는 Torque seal은 볼트와 표면을 가로지르는 페인트 선으로, 체결부가 회전하면 선이 이동하거나 끊어지는 방식으로 이상을 드러냅니다. 글은 2025년 12월 Toyota가 공장에서 규정 토크로 조이지 않은 인버터 볼트 문제로 약 55,400대의 하이브리드 차량을 리콜한 사례를 배경으로 삼습니다. 모든 선을 사람이 확인하면 희미하거나 부분적으로 끊긴 흔적을 놓칠 수 있으므로, 이미지 입력을 pass, fail, unreadable로 바꾸는 자동 검사 Workflow를 구축합니다.
Fastener를 스캔하고 seal을 검사한 뒤 pass, fail, unreadable로 나누는 품질 검사 흐름도입니다.
DiagramFastener 단계에서 mark를 스캔하고 Inspect 단계에서 mark의 위치와 상태를 판단한 뒤, 결과를 Pass, Fail, Unreadable 세 갈래로 분기합니다. Pass는 출하, Fail은 거부, Unreadable은 판정 불가 상태로 연결되어 글의 세 가지 최종 상태와 일치합니다. detector와 Gemini 판정 결과를 생산 품질 의사결정으로 변환하는 전체 의미를 한눈에 보여줍니다.
02
Torque seal 검출에는 517장의 fastener 이미지와 torque seal, reflection, objects 라벨이 포함된 Roboflow Universe 데이터셋을 사용합니다. reflection을 별도 클래스로 두면 모델이 실제 페인트 선과 빛 반사를 구분할 수 있고, 데이터셋을 Fork한 뒤 70/20/10 비율로 train, validation, test 세트를 나눠 RF-DETR을 학습시킵니다. 학습 전에는 모델 크기, 데이터셋 버전, 이미지 수, 입력 해상도, 예상 시간과 credit을 확인하고, 학습 후에는 보지 못한 이미지에서 mAP, precision, recall, F1을 점검합니다.
Roboflow Universe에서 Torque seal Detection 데이터셋과 학습된 segmentation 모델의 개요를 확인하는 화면입니다.
Screenshot화면에는 Torque seal Detection Computer Vision Model이라는 프로젝트와 517개 이미지, 데이터셋 버전 9개, 모델 6개가 표시됩니다. torque seal과 reflection이 클래스로 분리되어 있어 실제 페인트 선과 반사광을 구별하는 학습 구성을 시각적으로 뒷받침합니다. 글에서 데이터셋을 Fork하고 RF-DETR 학습을 시작하는 단계와 직접 연결됩니다.
Roboflow에서 학습 엔진과 모델 아키텍처를 선택하는 화면입니다.
ScreenshotCustom Training과 Neural Architecture Search 중 학습 방식을 고르고, Roboflow RF-DETR, YOLO26, Roboflow 3.0, YOLOv11 중 아키텍처를 선택할 수 있습니다. RF-DETR에는 실시간 처리와 높은 정확도, 적은 데이터로 빠른 수렴에 관한 설명이 붙어 있으며 모델 크기는 Small로 설정되어 있습니다. 글의 RF-DETR 선택 단계와 모델 크기 결정 과정을 구체화합니다.
517개 이미지로 Roboflow RF-DETR Small 모델을 학습하기 전 예상 자원과 데이터 분할을 확인하는 화면입니다.
Screenshot화면은 v1 데이터셋의 517개 이미지를 362 train, 103 validation, 52 test로 나누고 입력 크기를 384×384로 설정한 상태를 보여줍니다. 예상 Roboflow credit은 0.98이며 학습 예상 시간은 12분에서 29분으로 표시됩니다. 글에서 학습 전에 모델 크기, 데이터셋 버전, 이미지 수, 분할, 해상도, 예상 비용과 시간을 검토하라는 안내를 뒷받침합니다.
RF-DETR 학습 중 epoch별 mAP와 mAP@50:95, box location loss, class loss, box overlap loss를 표시한 그래프입니다.
Chart상단 그래프는 1~23 epoch 구간에서 mAP와 mAP@50:95가 변화하는 모습을 보여주며, 하단 그래프는 위치·분류·box overlap 손실의 추이를 나눠 표시합니다. mAP 곡선은 학습 진행에 따라 대체로 상승하지만 중간에 등락이 있어 epoch별 성능 변화를 확인할 수 있습니다. 글에서 학습 종료 후 mAP, precision, recall, F1을 테스트 세트에서 검토해야 한다는 설명과 연결되는 학습 모니터링 자료입니다.
03
Workflow의 첫 단계인 Instance Segmentation Model은 이미지에서 Torque seal을 찾아 각 조각의 mask와 confidence를 반환하며, 글은 희미한 seal을 놓치지 않도록 Custom confidence threshold를 0.3으로 설정합니다. Custom Python Block은 torque seal 클래스만 남긴 뒤 인접한 조각을 Union-Find 방식으로 묶어 한 물리적 seal당 하나의 detection과 seal_count를 만듭니다. 이렇게 병합한 결과는 이후의 라벨 표시와 개수 계산에 사용하고, 전체 detector 출력은 mask 시각화에 사용합니다.
python
def run(self, predictions):
    if predictions is None or len(predictions) == 0:
        return {"merged": predictions, "seal_count": 0}

    names = list(predictions.data.get("class_name", []))
    keep = [i for i, n in enumerate(names) if str(n).lower() == "torque seal"]
    if not keep:
        return {"merged": predictions[[]], "seal_count": 0}

    dets = predictions[keep]
    boxes = dets.xyxy
    n = len(boxes)
    has_mask = dets.mask is not None
    parent = list(range(n))

    def find(a):
        while parent[a] != a:
            parent[a] = parent[parent[a]]
            a = parent[a]
        return a

    def union(a, b):
        parent[find(a)] = find(b)

    GAP = 80

    def near(b1, b2):
        dx = max(0, max(b1[0], b2[0]) - min(b1[2], b2[2]))
        dy = max(0, max(b1[1], b2[1]) - min(b1[3], b2[3]))
        return dx }

분할된 Torque seal detection을 필터링하고 가까운 조각을 Union-Find로 묶어 하나의 seal로 병합하는 Custom Python Block입니다.

Roboflow Workflow 편집기의 입력 블록과 출력 블록을 배치한 빈 캔버스입니다.
Screenshot화면에는 Image 입력을 받는 Inputs 블록과 아직 연결된 블록이 없는 Outputs 블록이 보입니다. 중앙 캔버스에 모델 검출, 병합, VLM 판정, 시각화 블록을 연결해 이미지 입력을 최종 결과로 바꾸는 구조를 만들게 됩니다. 글의 Workflow 생성과 블록 연결 단계에서 출발점으로 사용하는 화면입니다.
Instance Segmentation Model 블록의 confidence threshold와 추가 추론 속성을 설정하는 화면입니다.
Screenshotseal_detector 블록은 입력 이미지와 Roboflow 모델 식별자를 받고 Confidence Mode를 Custom으로 설정한 뒤 Custom confidence를 0.3으로 지정합니다. 추가 속성에는 Class Filter, IoU Threshold, Max Detections, Class Agnostic NMS 등이 있어 검출 결과를 조정할 수 있습니다. 글에서 0.3 threshold로 희미한 seal을 포착하고 predictions를 후속 블록에 전달하는 설정을 구체적으로 보여줍니다.
fragmented Torque seal detection을 하나의 seal로 병합하는 Custom Python Block의 입력·출력과 코드 편집 화면입니다.
ScreenshotMerge Seals 블록은 predictions를 입력으로 받아 merged와 seal_count를 출력하며, 블록 설명은 여러 조각 detection을 실제 seal 하나당 하나의 detection으로 묶는다고 적혀 있습니다. 코드 영역에는 torque seal 클래스 필터링, bounding box 추출, Union-Find parent 배열, 인접 조각 판정에 사용되는 GAP 값이 보입니다. 이 처리가 여러 조각으로 끊겨 검출된 페인트 선을 후속 Gemini 판정과 개수 계산에 적합한 단위로 바꾸는 핵심 구현입니다.
04
병합된 seal은 Google Gemini에 전달해 seam offset과 선의 연속성을 바탕으로 aligned, misaligned, unclear 중 하나로 판정합니다. VLM as Classifier가 Gemini의 JSON 응답을 세 클래스로 변환하고, Seal Check 블록이 aligned를 PASS, misaligned를 FAIL, unclear 또는 검출 결과가 없는 경우를 UNREADABLE로 매핑해 report, display_text, qc_result를 생성합니다. 여러 fastener가 한 이미지에 있으면 seal마다 판단하도록 먼저 crop해야 하며, 현재 Workflow는 한 이미지에서 하나의 seal을 평가하는 구조입니다.
Google Gemini를 이용해 Torque seal 이미지를 판정하는 블록과 Open Prompt 설정 화면입니다.
Screenshotseal_judge 블록은 입력 이미지와 Google Gemini 모델을 사용하며 Task Type은 Open Prompt로 설정되어 있습니다. Prompt에는 fastener의 Torque seal을 검사하는 품질 검사자 역할과 판정 기준이 들어가고, 결과는 VLM as Classifier를 거쳐 seal_class로 변환됩니다. 글에서 Gemini가 aligned, misaligned, unclear를 JSON으로 반환하고 이후 Seal Check가 최종 상태로 매핑하는 구조를 뒷받침합니다.
05
후속 블록은 원본 mask와 병합된 seal 라벨을 이미지에 겹친 뒤 상태 텍스트를 반투명 검은 배경 위에 표시하고, Roboflow Vision Events로 각 검사와 결과를 기록합니다. 최종 출력은 라벨이 추가된 이미지와 status, verdict, seal_count를 담은 JSON 보고서이며, 예시에서는 어긋난 선이 FAIL, seal이 검출되지 않은 경우가 UNREADABLE, 끊어지지 않고 seam을 정확히 가로지른 선이 PASS로 반환됩니다. 판정 기준은 고정된 코드가 아니라 Gemini prompt에 들어가므로 다른 결함으로 확장할 때 detector와 prompt를 함께 바꿀 수 있지만, 정확도는 prompt 품질에 좌우됩니다.
python
def run(self, classification, predictions, seal_count):
    def top_class(obj):
        # dict-style payload from vlm_as_classifier
        if isinstance(obj, dict):
            for k in ("top", "top_class", "class_name", "predicted_class"):
                v = obj.get(k)
                if isinstance(v, str): return v
            preds = obj.get("predictions")
            if isinstance(preds, list) and preds:
                best = max(preds, key=lambda p: float(p.get("confidence", 0) or 0))
                return best.get("class_name") or best.get("class")
        # object-style payload
        for attr in ("top", "top_class", "class_name", "predicted_class"):
            v = getattr(obj, attr, None)
            if isinstance(v, str): return v
        data = getattr(obj, "data", None)
        return top_class(data) if isinstance(data, dict) else None

    verdict = str(top_class(classification) or "unclear").strip().lower()
    if verdict not in ("aligned", "misaligned", "unclear"):
        verdict = "unclear"
    try:
        seal_count = int(seal_count)
    except Exception:
        seal_count = len(predictions) if predictions is not None else 0
    if seal_count == 0 or verdict == "unclear":
        status = "UNREADABLE"
    elif verdict == "misaligned":
        status = "FAIL"
    else:
        status = "PASS"
    report = {"status": status, "verdict": verdict, "seal_count": seal_count}
    return {
        "report": report,
        "display_text": f"Status: {status}
Seal: {verdict}",
        "qc_result": status,
    }

Gemini의 분류 결과와 seal 개수를 정규화한 뒤 aligned, misaligned, unclear를 PASS, FAIL, UNREADABLE 상태와 JSON 보고서로 변환합니다.

용어 해설

인스턴스 분할(Instance Segmentation)
인스턴스 분할은 이미지 안의 객체를 찾아내는 데 그치지 않고 각 객체에 해당하는 픽셀 영역을 개별 마스크로 구분하는 컴퓨터 비전 기법입니다. 이 글에서는 Torque seal의 위치와 윤곽을 얻어 여러 조각을 하나의 seal로 합치고, 시각언어 모델의 판정 결과를 실제 검사용 이미지에 겹쳐 표시하는 데 사용합니다.
시각언어 모델(Vision-Language Model)
시각언어 모델은 이미지와 텍스트를 함께 입력받아 시각적 상태를 언어 형태로 판단하는 모델입니다. 이 글에서는 RF-DETR이 추출한 Torque seal 이미지를 Gemini에 전달하고, seal이 정렬됐는지 어긋났는지 또는 판독 불가능한지를 JSON으로 반환하게 합니다.
평균 정밀도(mAP)
mAP는 객체 검출 모델이 예측한 위치와 분류의 정확도를 종합하는 평가 지표입니다. 학습이 끝난 뒤 보지 못한 테스트 이미지에서 mAP, precision, recall, F1을 확인해 RF-DETR이 Torque seal과 reflection을 얼마나 구분하는지 평가하는 데 사용합니다.
Union-Find
Union-Find는 서로 가까운 항목을 같은 집합으로 묶고 각 집합의 대표를 빠르게 찾는 자료구조입니다. 이 글의 Custom Python Block은 분할된 Torque seal 조각의 위치를 비교해 인접한 조각을 하나의 seal detection으로 병합하고, 물리적 seal 개수를 계산하는 데 이를 활용합니다.
RTSP 스트림(RTSP Stream)
RTSP Stream은 네트워크를 통해 실시간 영상 프레임을 전달하는 방식입니다. 글에서는 고정형 컨베이어 카메라나 생산 라인에서 들어오는 이미지 소스로 RTSP 스트림을 사용할 수 있으며, 각 프레임을 Workflow에 보내 pass, fail, unreadable 결과를 downstream tracking에 전달하는 구성을 언급합니다.

기술

  • Roboflow Universe
  • Roboflow RF-DETR
  • Google Gemini
  • Roboflow Workflows
  • Roboflow Vision Events
  • Roboflow Inference
  • Python
  • Instance Segmentation
  • VLM as Classifier
  • Mask Visualization
  • Label Visualization
  • Text Display
  • RTSP streams

활용 사례

  • 자동차 생산 라인의 Torque seal 검사
  • 고정형 컨베이어 카메라를 이용한 체결부 품질 검사
  • 수동 검사대의 fastener 이미지 판정
  • pass, fail, unreadable 결과를 downstream tracking에 전달하는 품질 관리
  • 판독 불가능한 이미지를 향후 학습 데이터로 수집하는 검사 시스템
AI 분석 전체 내용 보기

AI 요약 · 북마크 · 개인 피드 설정 — 무료

출처 · 인용 안내

원문 발행 2026. 08. 19.수집 2026. 08. 19.출처 타입 RSS

인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.