Light-Level Anomaly Detection

Property Value
Category Image-Quality Analytics (classical computer vision)
Base Model Not applicable -- uses luminance statistics
Source Framework OpenCV
Supported Precisions Not applicable
Inference Engine OpenCV (CPU)
Hardware CPU, GPU (OpenCV UMat optional)
Detected Class(es) Underexposure, overexposure, sudden light change

Overview

Light-Level Anomaly Detection is a Metro Analytics use case that monitors the overall brightness of a camera feed and flags abnormal lighting conditions: the scene going dark (lights off, lens covered, night), the scene blowing out (glare, headlights, overexposure), or a sudden change in light level. It tracks the mean luminance of each frame against a rolling baseline and raises an event when the level leaves the acceptable band or jumps sharply.

A global luminance signal is best measured directly from pixels, so this use case intentionally avoids a neural model. It is a strong building block for real-time alerting use cases.

Typical Metro deployments include:

  • Lighting Fault Detection -- alert when platform or tunnel lighting fails.
  • Day/Night Transition Handling -- switch analytics profiles by light level.
  • Exposure QA -- flag cameras that are blown out or too dark to analyze.
  • Tamper Indicator -- a covered lens shows up as a sudden drop in light.

Prerequisites

  • Python 3.11+
  • OpenCV and NumPy

Create and activate a Python virtual environment before running the sample:

python3 -m venv .venv
source .venv/bin/activate
pip install opencv-python numpy

Getting Started

Download the Sample Video

This use case does not export or quantize a model. Run the provided script to download the sample test video:

chmod +x export_and_quantize.sh
./export_and_quantize.sh

The script downloads test_video.mp4 into the current directory.

OpenCV Sample

The sample below computes the mean luminance of each frame from the V channel of HSV, compares it against fixed dark/bright bounds and against a rolling baseline, and classifies each frame as normal, dark, bright, or sudden-change. The annotated frames are written to output_opencv.mp4.

import cv2
import numpy as np

INPUT_VIDEO = "test_video.mp4"
DARK_BOUND = 40.0    # mean luminance below this is underexposed
BRIGHT_BOUND = 215.0  # mean luminance above this is overexposed
JUMP_BOUND = 35.0    # frame-to-frame luminance jump that counts as sudden

cap = cv2.VideoCapture(INPUT_VIDEO)
fps = cap.get(cv2.CAP_PROP_FPS) or 30.0
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
writer = cv2.VideoWriter(
    "output_opencv.mp4", cv2.VideoWriter_fourcc(*"mp4v"), fps, (width, height))

prev_level = None
frame_idx = 0
anomalies = 0
while True:
    ok, frame = cap.read()
    if not ok:
        break
    frame_idx += 1

    v = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)[:, :, 2]
    level = float(np.mean(v))

    status = "normal"
    if level < DARK_BOUND:
        status = "dark"
    elif level > BRIGHT_BOUND:
        status = "bright"
    elif prev_level is not None and abs(level - prev_level) >= JUMP_BOUND:
        status = "sudden-change"
    prev_level = level

    if status != "normal":
        anomalies += 1
        print(f"Frame {frame_idx}: LIGHT ANOMALY ({status}) level={level:.1f}",
              flush=True)
    color = (0, 255, 0) if status == "normal" else (0, 0, 255)
    label = f"level={level:.1f} {status}"
    (_, text_height), _ = cv2.getTextSize(
        label, cv2.FONT_HERSHEY_SIMPLEX, 5.0, 2)
    cv2.putText(frame, label, (10, text_height + 10),
                cv2.FONT_HERSHEY_SIMPLEX, 5.0, color, 2)
    writer.write(frame)

cap.release()
writer.release()
print(f"Light-level anomalies detected: {anomalies}", flush=True)

Device targets:

  • "CPU" -- default for OpenCV luminance statistics.
  • "GPU" -- wrap frames in cv2.UMat to use the OpenCV transparent API on Intel GPUs.
  • "NPU" -- not applicable; luminance statistics are not a neural workload.

Expected Output

OpenCV expected output


License

Licensed under the MIT License. See LICENSE for details.

References

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Collection including Intel/light-level-anomaly-detection