본문으로 건너뛰기

Roboflow Workflows로 시선 감지와 추적 파이프라인 구축하기

얼굴 검출·추적과 L2CS-Net 시선 추정을 결합해 영상 속 시선 궤적을 만드는 방법

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

TL;DR

시선 감지는 한 순간의 시선 방향이나 대상을 추정하고, 시선 추적은 여러 프레임의 예측을 연결해 시선 이동 경로와 시각적 주의를 파악합니다. Roboflow Workflows로 SAM 3 기반 얼굴 검출, OC-SORT 또는 BoT-SORT 기반 얼굴 추적, Detections Stabilizer를 구성한 뒤, Roboflow Inference의 L2CS-Net이 얼굴 crop에서 yaw와 pitch를 추정하도록 파이프라인을 나눕니다. 프레임별 검출 결과는 tracker ID와 함께 JSON으로 저장하고, 각 얼굴에 독립적인 지수 평활화를 적용해 시선 화살표를 그린 다음 원래 FPS의 영상으로 다시 결합합니다. 실시간 처리 속도, 가려진 눈, 빠른 시선 이동, 조명과 motion blur, 프레임 간 ID 유지가 정확도와 안정성을 좌우합니다.

섹션별 상세

01
시선 감지는 특정 순간에 사람이 바라보는 방향이나 대상을 분류하는 반면, 시선 추적은 프레임마다 나온 예측을 시간 순서로 연결해 시선의 이동 경로를 기록합니다. 시스템은 눈 위치와 동공·홍채 방향, 머리 자세, 얼굴 특징점을 입력으로 사용하며, 시선이 처음 향한 곳과 머문 시간, 다음 이동 위치, 특정 영역으로 돌아오는 빈도를 축적합니다. 따라서 화면 응시 여부처럼 넓은 범주만 필요한 작업과 사용자의 시각적 주의 변화를 분석하는 작업은 서로 다른 출력 수준을 요구합니다.
얼굴 상단과 양쪽 눈을 감싸는 바운딩 박스에 시선 방향을 나타내는 "up 80%" 라벨이 표시된 이미지입니다.
Screenshot눈 영역을 검출하고 시선 방향을 범주와 신뢰도 형태로 표시하는 예시입니다. 본문에서 설명한 얼굴·눈 특징 기반 시선 감지와, 단순한 방향 분류가 가능한 gaze detection의 출력을 시각적으로 연결합니다.
02
시선 추정은 얼굴을 찾는 기능이나 특정 화면 좌표를 반환하는 기능과 동일하지 않습니다. 모델은 준비된 얼굴 crop에서 facial appearance, eye orientation, head pose의 관계를 학습해 yaw와 pitch 같은 각도를 출력하지만, 이 각도만으로 어떤 버튼이나 물체를 보는지는 결정하지 못합니다. 실제 주시점을 얻으려면 화면 좌표와 연결하는 calibration 또는 learned mapping을 적용하거나, 장면의 기하 정보와 물체 검출 결과를 시선 방향과 결합해야 합니다.
03
전체 처리는 카메라 또는 녹화 영상의 프레임 입력에서 시작해 얼굴 검출, 얼굴 crop과 정규화, 시선 방향 추정, 주시점 변환, 시간축 추적 순서로 이어집니다. 입력 해상도와 FPS, 조명, 머리 위치, motion blur, 카메라와 사람 사이의 거리가 얼굴과 눈 특징의 품질을 바꾸므로 각 단계의 결과가 다음 단계의 정확도에 직접 영향을 줍니다. Roboflow InferencePipeline은 사전 녹화 영상과 live stream을 같은 in-process 인터페이스로 처리할 수 있게 하며, Roboflow Workflows는 여러 처리 블록을 연결하는 방식으로 파이프라인 구성을 단순화합니다.
python
import os
from inference_sdk import InferenceHTTPClient
from inference_sdk.webrtc import VideoFileSource, StreamConfig, VideoMetadata

client = InferenceHTTPClient.init(
    api_url="https://serverless.roboflow.com",
    api_key=os.getenv("ROBOFLOW_API_KEY")
)

# WebRTC stream configuration
config = StreamConfig(
    stream_output=[],
    data_output=[
        "output_image",              # Frame with bounding boxes visualized
        "stabilized_predictions"     # Stabilized face predictions with tracker IDs
    ],
    requested_plan="webrtc-gpu-medium",
    requested_region="us"
)

INPUT_VIDEO = "input.mp4"
source = VideoFileSource(INPUT_VIDEO, realtime_processing=False)

# Start WebRTC session
session = client.webrtc.stream(
    source=source,
    workflow="human-face-detection-1788782690880",
    workspace="dikshants-blog-workspace",
    image_input="image",
    config=config
)

Roboflow Workflow에서 시각화된 프레임과 추적·안정화된 얼굴 예측을 함께 받아 후속 시선 추정에 사용할 WebRTC 세션을 구성합니다.

python
# Run workflow
session.run()

import json

# Save face predictions for entire video to JSON
FACE_PREDICTIONS_JSON = "face_predictions.json"
with open(FACE_PREDICTIONS_JSON, "w", encoding="utf-8") as f:
    json.dump(face_predictions_by_frame, f, indent=2)

print("Roboflow processing completed.")

영상의 모든 프레임을 처리한 뒤 프레임별 얼굴 바운딩 박스와 tracker ID를 JSON 파일로 저장합니다.

Roboflow Workflows 편집기에 입력과 출력 블록을 배치할 수 있는 빈 Workflow 캔버스가 표시된 화면입니다.
ScreenshotWorkflow Editor에서 영상 처리 블록을 연결하는 출발점을 보여줍니다. 본문에서 설명한 low-code 방식의 컴퓨터 비전 파이프라인 구성과 입력·출력 설계를 시각적으로 뒷받침합니다.
Roboflow Agent 입력창에 사람 얼굴을 검출하는 Workflow를 생성해 달라는 요청이 입력된 화면입니다.
Screenshot자연어 요청을 바탕으로 얼굴 검출 Workflow를 생성하는 Agent 사용 흐름을 보여줍니다. 본문에서 Agent가 필요한 모델과 시각화 블록을 자동으로 연결해 초기 파이프라인 구축을 단축한다는 내용과 연결됩니다.
SAM 3 얼굴 검출 블록 뒤에 바운딩 박스와 라벨 시각화 블록을 연결하고 출력으로 보내는 Workflow 그래프입니다.
Diagram입력 이미지가 SAM 3를 거쳐 검출 결과와 시각화 이미지로 나뉘는 처리 구조를 보여줍니다. 얼굴 검출 결과를 이후 추적과 시선 추정에 넘기기 전에 사람이 확인할 수 있는 박스와 라벨을 함께 생성하는 단계입니다.
SAM 3 검출 블록의 class names가 "human face"로 설정된 추가 속성 패널입니다.
Screenshot검출 대상 클래스를 사람 얼굴로 제한하는 설정을 보여줍니다. 본문에서 SAM 3에 "human face"를 detection class로 지정해 얼굴 검출 Workflow를 구성한 절차와 직접 연결됩니다.
SAM 3 블록에서 confidence threshold 0.6과 NMS 활성화 설정을 확인하는 화면입니다.
Screenshot검출 신뢰도 하한과 겹친 바운딩 박스 제거 여부를 조정하는 실제 파라미터 화면입니다. 본문은 이 설정이 낮은 신뢰도의 결과와 중복 검출을 후처리하는 데 사용된다고 설명합니다.
얼굴 검출 Workflow의 실행 결과 이미지와 predictions JSON을 함께 보여주는 화면입니다.
Screenshot검출된 얼굴의 좌표, 크기, confidence가 구조화된 JSON으로 반환되는 결과를 보여줍니다. 이 결과는 이후 프레임별 얼굴 crop과 tracker ID 연결에 사용되는 데이터 흐름을 나타냅니다.
Workflow 실행 결과 패널에서 얼굴 바운딩 박스와 라벨이 표시된 영상 프레임을 재생하는 화면입니다.
Screenshot영상 프레임마다 얼굴 검출 결과를 시각적으로 확인하는 과정을 보여줍니다. 본문에서 이미지와 영상 입력을 테스트하고, 영상에서는 프레임별 예측을 결합해 결과 영상을 생성한다고 설명한 부분과 연결됩니다.
04
얼굴 검출 Workflow는 SAM 3를 사용해 class를 "human face"로 설정하고 Bounding Box Visualization과 Label Visualization을 연결하는 형태로 구성할 수 있습니다. Roboflow Agent에 자연어로 요청하면 해당 블록과 연결을 만들고, 글의 예시에서는 confidence threshold 0.6과 NMS를 활성화해 겹치는 검출을 정리하며 NMS threshold를 0.6으로 설정했습니다. production 환경에서는 작업에 맞춰 fine-tuned face detection model을 학습할 수 있고, Roboflow Train은 데이터 수집·주석·학습 과정의 인프라 부담을 줄이는 역할을 합니다.
Roboflow Agent 입력창에 OC-SORT Tracker를 Workflow에 추가하라는 요청이 입력된 화면입니다.
Screenshot얼굴 검출 결과 뒤에 객체 추적 블록을 추가하는 자연어 기반 구성 단계를 보여줍니다. 본문에서 프레임별로 달라지는 얼굴 식별자를 OC-SORT가 일관된 tracker ID로 연결하는 이유를 시각적으로 보완합니다.
입력 이미지, SAM 3 얼굴 검출, OC-SORT Tracker, 바운딩 박스 시각화가 순서대로 연결된 Workflow 그래프입니다.
Diagram얼굴 검출과 추적을 결합한 처리 순서를 한눈에 보여줍니다. SAM 3가 프레임별 얼굴을 찾고 OC-SORT가 연속 프레임의 동일 얼굴에 ID를 유지한 뒤 시각화 블록으로 결과를 출력하는 구조입니다.
05
프레임마다 독립적으로 생성된 얼굴 검출에는 동일 인물의 ID가 계속 유지된다는 보장이 없으므로 OC-SORT, BoT-SORT 또는 SORT를 검출 결과 뒤에 배치해야 합니다. OC-SORT는 각 얼굴에 일관된 tracker ID를 부여해 후속 gaze prediction을 같은 사람에게 연결하며, 예시 설정에서는 Minimum IoU Threshold 0.2, Minimum Consecutive Frames 2, Lost Track Buffer 90을 사용합니다. 이어 Detections Stabilizer를 연결하면 연속 프레임에서 흔들리는 바운딩 박스를 완화해 얼굴 중심과 crop 위치가 더 안정적으로 유지됩니다.
python
# Gaze tracking configuration
GAZE_SMOOTHING_ALPHA = 0.18
FACE_CENTER_SMOOTHING_ALPHA = 0.30

# Smoothing function for gaze and face center values
def smooth_value(previous, current, alpha):
    if previous is None:
        return current
    return alpha * current + (1.0 - alpha) * previous

연속 프레임에서 변동하는 yaw·pitch와 얼굴 중심 좌표를 이전 값과 현재 값의 가중 평균으로 평활화합니다.

06
Python 단계에서는 Workflow의 output_image와 stabilized_predictions를 WebRTC 세션에서 받아 각 프레임의 시각화 이미지와 tracker ID·바운딩 박스를 저장합니다. 이후 inference_models의 "l2cs-net/rn50"을 불러와 얼굴별 crop을 추론하고, tracker_id마다 yaw·pitch와 얼굴 중심의 이전 상태를 따로 유지하면서 GAZE_SMOOTHING_ALPHA 0.18과 FACE_CENTER_SMOOTHING_ALPHA 0.30으로 지수 평활화를 적용합니다. 평활화한 방향 벡터를 얼굴 중심에서 시작하는 화살표로 그린 뒤 JPEG 프레임을 원래 FPS와 해상도의 output.mp4로 결합하면 검출 박스, 추적 ID, 시선 방향이 시간에 따라 표시됩니다.

용어 해설

시선 감지(Gaze Detection)
시선 감지는 눈 위치, 동공과 홍채 방향, 머리 자세, 얼굴 특징점 등을 결합해 사람이 어느 방향이나 대상을 바라보는지 추정하는 기술입니다. 순간적인 시선 위치만 분류하면 되므로 연속적인 움직임을 기록하는 Gaze Tracking보다 요구되는 시간 정보가 적습니다.
시선 추적(Gaze Tracking)
시선 추적은 여러 프레임의 시선 예측을 시간 순서대로 연결해 사람이 처음 바라본 위치, 머문 시간, 다음 이동 지점과 시선 경로를 기록하는 처리 방식입니다. 얼굴 추적과 시간적 평활화를 함께 적용해 시각적 주의의 변화를 연속적인 궤적으로 바꿉니다.
주시점(Point of Regard)
주시점은 사람이 바라보는 방향을 화면의 특정 좌표나 장면 속 물체 위치로 변환한 결과입니다. 시선 모델이 출력한 yaw·pitch만으로는 실제 대상이 정해지지 않으므로 카메라와 환경 정보, 화면 보정 또는 장면의 물체 검출을 함께 사용합니다.
비최대 억제(Non-Maximum Suppression)
비최대 억제는 같은 물체를 가리키는 겹친 바운딩 박스 중 신뢰도가 낮은 결과를 제거하는 후처리 기법입니다. 이 글의 Workflow에서는 confidence threshold 0.6과 함께 사용되며, NMS IoU threshold가 겹침 허용 범위를 결정합니다.
지수 평활화(Exponential Smoothing)
지수 평활화는 현재 예측과 이전에 누적한 값을 가중 평균해 프레임 사이의 흔들림을 줄이는 방법입니다. 글의 코드에서는 gaze angle에 0.18, 얼굴 중심 좌표에 0.30을 적용해 급격한 시선 변화와 검출 위치의 jitter를 완화합니다.

기술

  • Roboflow Workflows
  • Roboflow Agent
  • Roboflow Inference
  • Roboflow InferencePipeline
  • Roboflow Train
  • SAM 3
  • RF-DETR
  • YOLO
  • L2CS-Net
  • OC-SORT
  • BoT-SORT
  • SORT
  • OpenCV
  • Python
  • WebRTC
  • inference-sdk
  • inference_models

활용 사례

  • Human-Computer Interaction
  • Accessibility and Assistive Technology
  • Gaming and Virtual Reality
  • User Experience and Usability Research
  • Medical and Psychological Research
  • Automotive and Aviation
AI 분석 전체 내용 보기

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

출처 · 인용 안내

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

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