실시간 보안 카메라 시스템 구축: Local Vision LLMs 활용

발행: (2026년 3월 31일 PM 09:19 GMT+9)
12 분 소요
원문: Dev.to

I’m ready to translate the article for you, but I need the full text you’d like translated. Could you please paste the content (or the portion you want translated) here? I’ll keep the source line, formatting, markdown, and any code blocks exactly as they are.

시스템 다이어그램

3× Lorex 4K cameras (RTSP)

gate_monitor.py (Mac Studio, M2 Ultra)
    ├── OpenCV: frame capture every 5 s per camera
    ├── OpenCV: contour‑based motion detection (frame N vs N‑1)
    ├── Crop: extract largest changed region
    ├── VLM: qwen2.5vl‑7b on DGX Spark (Blackwell, 10 GbE link)
    │   └── "Classify this crop: ALERT or CLEAR?"
    ├── Alert: annotate frame with contour boxes
    │   ├── WiiM speaker announcement (TTS)
    │   └── WhatsApp message with image
    └── Audio: faster‑whisper transcription (gate camera only)
        └── Gated by visual confirmation (120 s window)

세 대의 카메라 — 정문, 뒷마당, 차도 — 각각 병렬 스레드에서 실행됩니다. 시스템은 하루에 약 50 000개의 VLM 추론 호출을 처리하며 몇 주 동안 24 시간 연속 가동되고 있습니다.

왜 VLM인가?

전통적인 객체 탐지기(YOLO, SSD)는 프레임에 무엇이 있는지 알려줍니다. 비전‑언어 모델은 무슨 일이 일어나고 있는지 알려줍니다.

SituationYOLO outputVLM decision
배달 기사(배달 운전사)가 소포를 놓는 상황personALERT
보행자가 공공 인도에서 걷는 상황personCLEAR
나뭇가지 그림자가 지나가는 상황person?CLEAR

핵심 통찰: VLM은 빠를 필요가 없습니다 (≈ 15 tok/s); 똑똑함이 필요합니다.
OpenCV 컨투어 감지를 빠른 사전 필터로 사용함으로써, VLM은 실제로 변화가 있는 잘라낸 영역만 보게 됩니다 — 일반적으로 분당 카메라당 2–5회 호출 정도이며, 기존 12회보다 적습니다.

OpenCV 전처리 (“핵심 작업”)

  1. 프레임 캡처 → 그레이스케일 → 가로 640 px로 리사이즈.
  2. 이전에 분석한 프레임과 절대 차이 계산.
  3. 이진 임계값 (25) 적용 후 팽창 (3 회 반복)으로 인접한 변화를 합침.
  4. 컨투어 찾기, 면적으로 필터링:
    • min_area = 150 px²
    • max_area = 프레임 크기의 40 %
  5. 인접한 바운딩 박스 병합 (거리 50 px 이내).
  • 컨투어가 없을 경우CLEAR (VLM 호출 0회). 이는 전체 시간의 > 70 %에서 발생 (정지 프레임, 작은 조명 변화).
  • 컨투어가 발견될 경우 → 가장 큰 영역을 잘라 VLM에 전송해 분류.

60 초마다 폴백 전체 프레임 검사를 수행해 프레임 사이에 나타났지만 움직이지 않은 객체(예: 주차된 차, 가만히 서 있는 사람)를 잡아냅니다.

Zone Editor (Web UI: /zones)

다각형 존 편집기를 사용하면 각 카메라 뷰에 제외포함 존을 그릴 수 있습니다 — 마치 전문 NVR 소프트웨어처럼.

현재 제외 구역

카메라제외 영역
Gate게이트 너머 도로 (프레임 상단) – 지나가는 차량은 보안 이벤트가 아님
Driveway증기 파이프 및 돌벽 부속물로, 지속적으로 잘못된 경보를 유발함
Backyard카마도 바베큐 그릴 및 바람에 흔들리는 나뭇가지

존은 JSON 폴리곤으로 저장됩니다. 런타임에 cv2.fillPoly가 이진 마스크를 생성하여 임계값이 적용된 차이에 적용됩니다(컨투어 검출 전에). 마스크된 픽셀은 0으로 설정되어, 제외 영역의 컨투어가 형성되지 않습니다.

VLM 환각 처리

Vision LLM은 환각을 일으켜 가짜 경보를 생성할 수 있습니다. 아래는 제가 관찰한 패턴과 적용한 해결책입니다.

문제예시해결책
부정 문제“프레임에 사람, 차량, 동물이 보이지 않습니다” → classifier sees “people, vehicles, animals” → ALERT부정어 뒤를 보는 범위를 25 → 60 문자로 확대하고 문장 수준 탐지를 추가했습니다: 문장이 no / not / without 로 시작하고 visible / present / found 로 끝나면 → CLEAR.
완화 표현 문제“사람처럼 보이지만 그림자일 수도 있습니다” (ALERTCLEAR 가 모두 포함)같은 줄에 두 키워드가 모두 나타나면 CLEAR 가 우선합니다 (새벽 3시의 오경보보다 놓치는 것이 낫습니다).
위치 혼동 문제“게이트 너머 도로에 차량이 있습니다” (도로는 내 재산이 아님)위치 기반 부정 패턴을 추가했습니다: “beyond the gate”, “past the gate”, “on the road”, “on the street” → CLEAR.
그림자/반사 문제“사람의 그림자”“shadow of” 를 부정 패턴으로 추가했습니다.
밤 프레임에서의 환각 설명거의 검은 밤 프레임 → VLM이 사람/차량을 환각밤에 윤곽선 검출이 0개가 되므로 VLM이 호출되지 않습니다. 사전 필터가 이 오류 유형을 완전히 제거합니다.

오디오 전사 (게이트 카메라)

게이트 카메라에 마이크가 장착되어 있습니다.

  1. 캡처 RTSP에서 PCM 오디오를 → WAV로 변환.
  2. 전사 faster-whisper (medium.en 모델)로 15‑초 청크 단위 처리.
  3. 게이트 시각적 확인을 통해 오디오 알림 제어: 시각적으로 확인된 알림이 지난 120 s 이내에 발생한 경우에만 전사가 트리거됨.
  4. 긴급 키워드 (help, emergency, fire)는 시각적 게이트를 우회.

파이프라인:

PCM → WAV → faster-whisper → filter noise phrases
      ("thank you for watching", street chatter)
      → if visually gated → WiiM speaker announcement + WhatsApp message (OGG audio clip)

Daily Review Tool (/alerts/review)

하루에 약 50 000개의 VLM 호출이 발생하면서 방대한 분류 데이터가 생성됩니다. 저는 다음과 같은 웹 UI를 만들었습니다:

  1. Parses 로그에서 지난 24 시간 동안의 CONFIRMED ALERT 라인을 파싱합니다.
  2. Groups 카메라와 정규화된 설명을 기준으로 그룹화합니다.
  3. Sends 모든 패턴을 qwen3.5‑35b에 보내 메타‑분류(REAL / FALSE_POSITIVE / NOISE)를 수행합니다.
  4. Displays 탭을 표시합니다: Needs Review, AI Flagged, Suppressed, Acknowledged.
  5. One‑click suppress 한 번 클릭으로 패턴을 영구적으로 차단하여 향후 알림에서 제외합니다.

LLM 분류는 컨텍스트를 받습니다(예: “Calgary 눈 내리는 상황”, “알려진 영구적 특징: kamado BBQ, stone wall”).

요약

  • Fast pre‑filter (contour detection) 은 리콜을 유지하면서 VLM 호출을 크게 줄입니다.
  • Zone polygons 은 명백한 오탐지를 감소시킵니다.
  • Negation & location heuristics 은 VLM이 환상을 일으키는 것을 방지합니다.
  • Audio gating 은 가짜 소리 알림을 방지합니다.
  • Daily review 와 메타‑LLM 을 활용하면 시스템을 깔끔하게 유지하고 정밀도를 지속적으로 향상시킵니다.

결과: 조용하고 스마트한 보안 파이프라인으로, 오직 정말 중요한 경우에만 알림을 보냅니다.

시스템 개요

The solution monitors a typical residential environment (e.g., driveway, garden, wall, gate‑post lights) and correctly flags 80 %+ of false positives for one‑click suppression.

주요 지표

지표
카메라3 (4K, RTSP)
프레임 간격5 seconds per camera
VLM 호출 수 / 일~50 000
VLM 모델qwen2.5vl:7b-4k (14.5 GB on DGX Spark)
추론 지연 시간~200 ms per crop (10 GbE link)
오탐률< 5 % after zone exclusions + negation fixes
전체 시스템 비용$0 /month (all local hardware)

교훈

  • VLM이 아니라 윤곽선 감지부터 시작하세요.

    • 모든 프레임을 VLM에 전송하면 Ollama에서 70.8 GB 메모리 누수가 발생했습니다(별도 블로그 게시물 참고).
    • 윤곽선 사전 필터링으로 VLM 호출을 70 %+ 감소시켜 시스템을 실용화했습니다.
  • 모델 크기 전략.

    • 이진 ALERT/CLEAR 분류에는 작은 VLM(예: 3 B)을 사용합니다.
    • WhatsApp 알림에 표시되는 상세 설명을 생성하기 위해 7 B 모델을 예약합니다.
  • 야간 모드 고려사항.

    • IR 카메라는 흑백 영상을 출력해 색상 이미지로 학습된 비전‑LLM을 혼란스럽게 합니다.
    • 열화상 카메라나 전용 야간 시야 모델이 저조도 환경에서 더 좋은 성능을 보입니다.

스택

ComponentRole
Mac Studio M2 Ultra (128 GB)카메라 캡처, OpenCV, 오디오 처리, 웹 UI
NVIDIA DGX Spark (120 GB)Ollama를 통한 VLM 추론
10 GbE direct link두 머신 간 고속 연결
Raspberry PiWhatsApp 게이트웨이
WiiM speaker음성 알림
Python 3.9 (stdlib only)모든 프로덕션 스크립트에서 pip 의존성 없음
Cloud클라우드 API 전혀 없음, 구독도 없음 – 완전한 프라이버시

전체 파이프라인 코드와 영역 편집기는 제 GitHub에서 확인할 수 있습니다. 홈 자동화를 위해 로컬 비전 모델을 사용하고 계시다면, 어떤 모델과 사전 필터가 가장 효과적인지 알려주시면 감사하겠습니다.

0 조회
Back to Blog

관련 글

더 보기 »

TurboQuant MoE 0.3.0

v0.3.0의 주요 기능 - True 3-bit PolarQuant: 물리적 비트‑패킹 8 × 3‑bit를 3바이트에 담아 기본 KV 스토리지의 압축률을 5.8×‑6.0× 달성하고 정확도는 <0.1 %.