Visual features
Low-level static visual properties
Per-frame low-level image statistics (luminance, RMS contrast, color in RGB/HSV/CIELAB, colorfulness, spatial-frequency power spectra, edge/orientation energy, entropy, clutter) are a mature, well-understood domain that is best served by classic computer-vision libraries and a handful of vision-science toolboxes rather than learned models. The recommended core is scikit-image + OpenCV + NumPy for the bulk of pixel/color/edge/frequency statistics, a steerable-pyramid library (pyrtools / plenoptic) for biologically motivated orientation-energy and spatial-frequency banks, SHINE for canonical luminance/contrast/Fourier-amplitude measures aligned with the vision-science literature, and the Rosenholtz Feature-Congestion/Subband-Entropy code for visual clutter. GIST provides a compact holistic spatial-envelope descriptor that bridges low- and mid-level. Learned descriptors add little over these analytic features for this specific subclass; the main “modern” gain is wrapping the classic operators in a per-frame pipeline (e.g. pliers) and running them at 1-25 fps over a video. All of these run on CPU and are trivially feasible for a small lab; the practical work is timeline alignment and per-frame batching, not compute.
| Tool | Measures | Per-timepoint output | Modality | Granularity | Local | Rating | Rec |
|---|---|---|---|---|---|---|---|
| scikit-image (skimage) 0.24/0.25 + NumPy | In plain terms: per-frame image statistics anyone can picture — how bright the frame is (luminance), light-to-dark variation (RMS contrast), average red/green/blue and hue/saturation, how colorful it is, how many edges/how cluttered (edge density, entropy), and whether detail is coarse or fine (spatial-frequency slope); the pipeline stores 12 such scalars per second. General-purpose per-frame pixel statistics: luminance/intensity, RMS contrast (std of luminance), color-space conversions (rgb2hsv, rgb2lab, rgb2gray), Shannon entropy (skimage.measure.shannon_entropy and local entropy filter), edge maps (Sobel, Scharr, Canny, edge density), texture (GLCM via greycomatrix/graycoprops, local binary patterns), and frequency content via skimage.filters and FFT helpers. | Per-frame scalars and maps: mean luminance, RMS contrast (Michelson/Weber/std-based), per-channel R/G/B and H/S/V and L*/a*/b* means and stds, global/local Shannon entropy (bits), edge-pixel fraction (edge density), GLCM contrast/energy/homogeneity/correlation, LBP histograms. All reducible to 1 value/frame. | video-frame | frame | yes-cpu | best-in-class | include |
| OpenCV (cv2) 4.x | Fast per-frame image statistics and primitives: color-space conversion (cvtColor to HSV/Lab/YCrCb/Gray), histograms, Sobel/Laplacian/Canny edges, Gabor kernels (getGaborKernel) for orientation/spatial-frequency energy, DFT/magnitude spectra, Laplacian-variance sharpness/blur, and efficient video frame I/O (VideoCapture) for timeline-locked extraction. | Per-frame: mean/std luminance, per-channel color means in any space, color histograms, edge density, Laplacian variance (focus/sharpness scalar), Gabor-bank response energy per orientation/frequency, FFT radial power-spectrum slope. Plus the frame-grabbing layer that timestamps every frame. | video-frame | frame | yes-cpu | best-in-class | include |
| SHINE toolbox (+ SHINE_color fork) | Canonical vision-science measurement and control of low-level image properties: mean luminance, RMS contrast, luminance histogram, and the rotational (orientation-averaged) Fourier amplitude spectrum / energy at each spatial frequency. Primarily a control/equalization tool but its measurement functions are the field-standard definitions. | Per-frame (per-image): mean luminance, RMS contrast, full luminance histogram, 1-D rotationally averaged Fourier amplitude spectrum (energy vs spatial frequency) and amplitude-spectrum slope. SHINE_color extends to color channels. | video-frame | frame | yes-cpu | strong | include |
| pyrtools (LabForComputationalVision) / matlabPyrTools | Multi-scale, multi-orientation steerable-pyramid and Laplacian/QMF/wavelet decompositions. Provides biologically motivated orientation-energy and spatial-frequency subband responses (the V1-like Gabor/steerable filter bank) at multiple scales and orientations. | Per-frame: per-subband (scale x orientation) coefficient energy/variance, total energy per orientation band (orientation-energy histogram), energy per spatial-frequency scale, oriented-edge energy. Yields a compact vector of orientation x scale energies per frame. | video-frame | frame | yes-cpu | strong | include |
| Rosenholtz Feature Congestion + Subband Entropy clutter measures | Two complementary models of visual clutter. Feature Congestion captures local variability of color, luminance-contrast, and orientation (via Gaussian-pyramid covariance of feature maps); Subband Entropy captures clutter as the entropy/information in wavelet luminance and chrominance subbands. | Per-frame: a global Feature-Congestion clutter scalar (and a dense per-pixel clutter map), and a global Subband-Entropy clutter scalar; optionally split into color, contrast, and orientation clutter sub-components. | video-frame | frame | yes-cpu | strong | include |
| Hasler & Susstrunk colorfulness metric (+ warmth from CIELAB) | In plain terms: a single “how colorful is this frame” score validated against human colorfulness judgments; one value per second. Perceptual colorfulness of a natural image from opponent-color statistics, validated against human colorfulness ratings (>90% correlation). Trivially paired with CIELAB-based ‘warmth’ (a* red-green / b* yellow-blue means or hue distribution) and saturation from HSV. | Per-frame scalars: colorfulness index M = sqrt(std_rg^2 + std_yb^2) + 0.3sqrt(mean_rg^2 + mean_yb^2); plus mean a/b* (warmth/coolness), mean HSV saturation, dominant-hue summaries. | video-frame | frame | yes-cpu | strong | include |
| GIST / spatial envelope descriptor (lear-gist-python, pyGist, LMgist) | Holistic low-to-mid-level scene descriptor: orientation x spatial-frequency energy (Gabor filter bank, typically 8 orientations x 4 scales) pooled over a 4x4 spatial grid, summarizing global scene structure (openness, roughness, naturalness-related dimensions). | Per-frame fixed-length vector (e.g. 512-d for 8 orientations x 4 scales x 4x4 grid) of windowed orientation-energy values; a compact global texture/structure signature usable directly as a per-frame feature vector. | video-frame | frame | yes-cpu | usable | include-if-resources |
| pliers (PsychoinformaticsLab) low-level image extractors | Orchestration framework that runs low-level image extractors (BrightnessExtractor, SharpnessExtractor, VibranceExtractor, SaliencyExtractor, plus wrappers to scikit-image/OpenCV) over video frames with automatic timestamping and a tidy long-format output, instead of hand-rolling the per-frame loop. | Per-frame, timestamped: brightness (mean value/luminance), sharpness (Laplacian-variance), vibrance (variance across RGB channels), saliency summary; emits an onset/duration-tagged dataframe ready for fMRI/timeline alignment. | video-frame | frame | yes-cpu | usable | include |
Recommended (best-in-class): scikit-image + OpenCV + NumPy as the core per-frame engine (luminance, RMS contrast, RGB/HSV/CIELAB color, entropy, edges, FFT power spectrum); pyrtools / plenoptic steerable pyramid for orientation-energy and spatial-frequency banks; SHINE for canonical, literature-matched luminance/contrast/Fourier-amplitude-spectrum definitions; Rosenholtz Feature-Congestion + Subband-Entropy for visual clutter; Hasler-Susstrunk colorfulness formula (implemented directly) for perceptual color; pliers as the timestamping/orchestration layer feeding the movie timeline
Likely redundant:
- OpenCV Gabor-kernel bank is superseded by pyrtools/GIST for principled orientation-energy (keep OpenCV mainly for speed and video decoding)
- Global Shannon entropy and raw edge density are weaker clutter proxies superseded by Rosenholtz Feature-Congestion / Subband-Entropy
- GIST overlaps heavily with pyrtools orientation-energy; only one is needed unless a compact fixed-length holistic vector is specifically wanted
- Learned low-level descriptors / CNN early-layer activations add little over analytic luminance/contrast/color/frequency features for this subclass and are better reserved for mid/high-level visual subclasses
- pliers built-in extractors duplicate scikit-image/OpenCV computations; it is an orchestration convenience, not an independent feature source
- scikit-image and OpenCV themselves overlap substantially in color/edge/FFT ops
References
- scikit-image (skimage) 0.24/0.25 + NumPy — scikit-image.org; van der Walt et al. 2014 PeerJ
- OpenCV (cv2) 4.x — opencv.org; pyimagesearch colorfulness/blur tutorials
- SHINE toolbox (+ SHINE_color fork) — Willenbockel et al. 2010 Behav Res Methods 42:671; mapageweb.umontreal.ca/gosselif/shine
- pyrtools (LabForComputationalVision) / matlabPyrTools — github.com/LabForComputationalVision/pyrtools; Simoncelli & Freeman 1995; plenoptic (Duong et al.)
- Rosenholtz Feature Congestion + Subband Entropy clutter measures — Rosenholtz, Li & Nakano 2007 J Vision; persci.mit.edu/research/clutter
- Hasler & Susstrunk colorfulness metric (+ warmth from CIELAB) — Hasler & Susstrunk 2003, SPIE Human Vision; pyimagesearch colorfulness post
- GIST / spatial envelope descriptor (lear-gist-python, pyGist, LMgist) — Oliva & Torralba 2001 IJCV; github.com/whitphx/lear-gist-python; davidmwatson/pyTools pyGist
- pliers (PsychoinformaticsLab) low-level image extractors — McNamara et al. 2017; github.com/PsychoinformaticsLab/pliers; Neuroscout (de la Vega 2022 eLife)
High-level static visual: objects, scenes, places, attributes
For per-frame movie/audio-story annotation of objects, scenes, places, and attributes, the field has consolidated around a few foundation-model families. Two complementary backbones cover most needs: contrastive vision-language encoders (OpenCLIP, SigLIP 2) that give open-vocabulary probe scores and zero-shot scene/place/object/attribute labels via text prompts, and self-supervised encoders (DINOv2/DINOv3) that give label-free dense semantic embeddings. For explicit localized labels, open-vocabulary detectors (Grounding DINO 1.5/1.6, YOLO-World) and promptable/panoptic segmenters (SAM 2, Mask2Former) emit per-object boxes/masks. For rich natural-language scene descriptions and attribute/relation reasoning, open VLMs (Qwen2.5-VL, InternVL3, LLaVA-OneVision) caption frames or answer structured VQA. A small lab can run most of these locally on a single 24-48GB GPU; the main tradeoff is fixed-vocabulary classifiers (Places365, ImageNet backbones) being largely superseded by open-vocabulary CLIP-family probing, except where a frozen, reproducible, interpretable category vector is explicitly wanted.
| Tool | Measures | Per-timepoint output | Modality | Granularity | Local | Rating | Rec |
|---|---|---|---|---|---|---|---|
| OpenCLIP (ViT-L/14, ViT-H/14, ViT-bigG/14; LAION-2B / DataComp checkpoints) | Open-vocabulary semantic content of a frame: similarity between the image and arbitrary text prompts for objects, scenes, places, attributes, actions. | Per-frame: (a) 768-1280 dim L2-normalized image embedding; (b) cosine-similarity / softmax scores against any user-defined label set (e.g. zero-shot Places365 categories, ImageNet-1k classes, attribute prompts). Continuous probe scores per concept per frame. | video-frame | frame (run on sampled frames, e.g. 1-4 fps, aligned to timeline) | yes-gpu | best-in-class | include |
| SigLIP 2 (google/siglip2 ViT-B/L/So400m, NaFlex variants) | In plain terms: turns each frame into a 768-number semantic “fingerprint,” and by comparing the frame to short text prompts also scores 16 easy-to-read scene tags (indoor/outdoor, nature, people, text, …); this is the model the pipeline runs (siglip2-base). Open-vocabulary image-text alignment (same role as CLIP) with sigmoid loss, stronger zero-shot classification, localization, multilingual (109 languages) and improved dense features. | Per-frame: image embedding (768-1152 dim) plus per-prompt sigmoid/logit scores for object/scene/place/attribute label sets; supports native-resolution (NaFlex) and better patch-level dense features for localized attribute probing. | video-frame | frame | yes-gpu | best-in-class | include |
| DINOv2 / DINOv3 (ViT-S/B/L/g, self-supervised) | In plain terms: a 384-number, label-free visual “fingerprint” of the frame learned without any human labels — a general description of objects, texture, and layout used for frame matching and brain-encoding models (the pipeline runs DINOv2-small). Label-free general-purpose visual semantics and structure; strong dense (patch-level) features for objects/parts/scenes without needing any text vocabulary. | Per-frame: global CLS embedding (384-1536 dim) and per-patch dense feature maps. No human-readable labels by default; used as representational similarity (RSA) features, for linear-probe classifiers, or as the backbone for downstream attribute/scene probes. DINOv3 adds Gram-anchored high-resolution dense maps. | video-frame | frame | yes-gpu | best-in-class | include |
| Grounding DINO 1.5 / 1.6 (Pro and Edge) | Open-vocabulary object DETECTION: localizes arbitrary objects/categories given free-text prompts (category names or referring expressions). | Per-frame: list of detected objects with bounding boxes, free-text class label (from the prompt vocabulary), and confidence score. Yields per-frame object presence/counts/positions for any concept list. | video-frame | frame | yes-gpu | best-in-class | include |
| YOLO-World (v2, S/M/L/X) | Real-time open-vocabulary object detection (CLIP-text-conditioned YOLO). | Per-frame: bounding boxes + open-vocabulary class labels + confidence scores; very fast, so practical to run densely (every frame) across long films. | video-frame | frame | yes-gpu | strong | alternative |
| Qwen2.5-VL (3B / 7B / 72B) | Natural-language scene description, structured VQA over objects/scenes/attributes/relations, grounded captioning with coordinates; the workhorse open VLM for semantic frame annotation. | Per-frame (or per-shot keyframe): free-text caption; structured/JSON answers to fixed question schemas (e.g. setting=indoor/outdoor, place type, salient objects list, attributes, people count); optional grounded boxes for referenced objects. Convert to categorical/ordinal time series. | video-frame | frame / per-shot (run on sampled keyframes; also natively handles short clips) | yes-gpu | best-in-class | include |
| InternVL3 (1B-78B; InternVL3-8B/14B common) | Same scene-description / VQA / grounded-captioning role as Qwen2.5-VL; among the strongest open MLLMs on perception and reasoning benchmarks. | Per-frame: free-text captions and structured VQA outputs (scene/place classification, object inventory, attributes, spatial relations); supports grounding. | video-frame | frame / per-shot | yes-gpu | strong | alternative |
| Places365 CNN (ResNet-50-places365) and ImageNet backbones (ConvNeXt-V2, EVA-02, BEiT-3) | Closed-vocabulary scene/place recognition (365 scene categories) and object classification (ImageNet-1k/-21k) with fixed, reproducible, interpretable label posteriors. | Per-frame: 365-dim scene-category probability vector (Places365) and/or 1000/21841-dim ImageNet class posteriors; also scene attributes (SUN-attribute head) and indoor/outdoor + naturalness. Fully interpretable per-category time series. | video-frame | frame | yes-cpu | usable | include-if-resources |
| Mask2Former / OneFormer (panoptic, COCO/ADE20K/Cityscapes) | Panoptic / semantic / instance segmentation: pixel-level labeling of every region into ‘thing’ (objects) and ‘stuff’ (sky, road, wall, vegetation) categories. | Per-frame: per-pixel class map plus per-instance masks with class labels; derive per-frame area fractions per category (e.g. % sky, % person, % building), object counts, scene composition vectors. | video-frame | frame | yes-gpu | strong | include |
| SAM 2 (Segment Anything Model 2, hiera-tiny/small/base/large) | Class-agnostic promptable segmentation of objects in images and video; produces masks but NOT semantic labels by itself. | Per-frame: high-quality instance masks (from points/boxes/auto ‘everything’ mode), with video temporal mask propagation/tracking. Pair with CLIP/Grounding DINO to attach labels (Grounded-SAM); yields per-object segmented regions, sizes, counts, and consistent track IDs. | video-clip | frame (with temporal mask propagation across the clip) | yes-gpu | strong | include-if-resources |
Recommended (best-in-class): SigLIP 2 (or OpenCLIP ViT-L) as the primary open-vocabulary text-probe encoder for object/scene/place/attribute scores; DINOv2/DINOv3 as the complementary label-free dense embedding for RSA and linear probes; Qwen2.5-VL-7B as the primary captioning/VQA VLM for structured scene descriptions; Grounding DINO (1.6 Pro via API for accuracy, or open 1.0 / YOLO-World locally) for open-vocabulary per-object detection; Mask2Former/OneFormer panoptic for scene-composition (thing+stuff area fractions)
Likely redundant:
- OpenCLIP and SigLIP 2 fill the same text-probe role - run one as primary (SigLIP 2 generally stronger), not both
- Qwen2.5-VL, InternVL3, and LLaVA-OneVision are interchangeable captioning/VQA VLMs - pick one primary after benchmarking your prompt schema
- YOLO-World is superseded on accuracy by Grounding DINO 1.6 Pro; keep only when per-frame throughput/density is the constraint
- Places365 CNN and ImageNet-trained backbones are largely superseded by zero-shot CLIP/SigLIP2 probing of the same label sets - keep only for a frozen, reproducible fixed-taxonomy probability vector
- SAM 2 alone produces no labels and overlaps Mask2Former for static panoptic needs; only adds value via video-consistent tracking or as Grounded-SAM
Open questions:
- Frame sampling rate to hit true second-by-second alignment vs compute budget (1 fps probing vs shot-level keyframes for heavy VLMs)
- Whether to derive scene/place labels via zero-shot CLIP/SigLIP2 prompting or keep a frozen Places365 head for reproducibility/citation in fMRI work
- DINOv3 licensing (research/non-commercial terms) may restrict use vs Apache-2.0 DINOv2
- Grounding DINO 1.6 Pro best accuracy is API-only - acceptable for a small lab, or fall back to open 1.0/YOLO-World?
- Need for an aggregation/parsing layer to convert free-text VLM captions into consistent categorical per-second feature vectors (schema + JSON-constrained decoding)
References
- OpenCLIP (ViT-L/14, ViT-H/14, ViT-bigG/14; LAION-2B / DataComp checkpoints) — github.com/mlfoundations/open_clip; LAION-2B / DataComp-1B; Radford et al. 2021 CLIP
- SigLIP 2 (google/siglip2 ViT-B/L/So400m, NaFlex variants) — Tschannen et al. 2025 arXiv:2502.14786; hf.co/google (siglip2)
- DINOv2 / DINOv3 (ViT-S/B/L/g, self-supervised) — Oquab et al. 2023 DINOv2; DINOv3 2025 arXiv:2508.10104
- Grounding DINO 1.5 / 1.6 (Pro and Edge) — Liu et al. 2023; Ren et al. 2024 Grounding DINO 1.5 arXiv:2405.10300; IDEA-Research/GroundingDINO
- YOLO-World (v2, S/M/L/X) — Cheng et al. 2024 arXiv:2401.17270; docs.ultralytics.com/models/yolo-world
- Qwen2.5-VL (3B / 7B / 72B) — Qwen2.5-VL Technical Report 2025; hf.co/Qwen
- InternVL3 (1B-78B; InternVL3-8B/14B common) — InternVL3 2025 arXiv:2504.10479; hf.co/OpenGVLab
- Places365 CNN (ResNet-50-places365) and ImageNet backbones (ConvNeXt-V2, EVA-02, BEiT-3) — Zhou et al. 2017 Places365; github.com/CSAILVision/places365; huggingface timm
- Mask2Former / OneFormer (panoptic, COCO/ADE20K/Cityscapes) — Cheng et al. 2022 Mask2Former; Jain et al. 2023 OneFormer
- SAM 2 (Segment Anything Model 2, hiera-tiny/small/base/large) — Ravi et al. 2024 SAM 2 arXiv:2408.00714; Grounded-SAM (IDEA-Research)
Faces, bodies, gaze, and facial expression
This subclass covers per-frame extraction of where faces and bodies are, who they are, where they look, and what they express. The mature open-source stack is: a detector/tracker (RetinaFace/InsightFace, MediaPipe) feeding identity (ArcFace), landmarks, head pose and gaze (OpenFace 3.0, L2CS-Net), facial action units and discrete/continuous emotion (Py-Feat, OpenFace 3.0, HSEmotion/EmotiEffLib, EmoNet), and body/hand keypoints (MMPose’s RTMPose/RTMW, ViTPose, MediaPipe Holistic). As of 2025, OpenFace 3.0 (arXiv 2506.02891) consolidates landmarks+AUs+gaze+emotion into one lightweight CPU-capable multitask model, and MMPose RTMPose/RTMW dominate real-time 2D/whole-body pose; these are the recommended defaults for a small lab. All major components run on a single consumer GPU (often CPU), making second-by-second annotation of long films feasible.
| Tool | Measures | Per-timepoint output | Modality | Granularity | Local | Rating | Rec |
|---|---|---|---|---|---|---|---|
| InsightFace (RetinaFace detector + ArcFace ‘buffalo_l’ pack, ResNet50@WebFace600K) | Face detection, 5-point + 2D-106/3D-68 landmark alignment, and 512-d face identity embeddings for recognition/tracking across frames. | Per detected face per frame: bounding box (x,y,w,h) + detection score; 5 or 106 2D landmark coords; 68 3D landmark coords; coarse head pose (yaw/pitch/roll from 3D fit); age estimate; binary sex; 512-dim L2-normalized ArcFace embedding (cosine-comparable for identity clustering/tracking). | video-frame | per-frame (per detected face) | yes-gpu | best-in-class | include |
| RetinaFace (standalone, serengil/retinaface or InsightFace detector) | Single-stage dense face detection with facial landmark localization; the detection backbone underneath most modern pipelines. | Per frame: face bounding boxes + confidence; 5 facial landmarks (eyes, nose, mouth corners) per face. No identity/AUs. | video-frame | per-frame | yes-cpu | strong | alternative |
| MediaPipe Tasks (Face Detector, Face Landmarker w/ blendshapes, Pose Landmarker, Hand Landmarker; legacy Holistic) | Lightweight on-device face, body, and hand keypoints plus 52 ARKit-style blendshape expression coefficients and approximate head pose. | Per frame: 478 3D face mesh landmarks; 52 blendshape coefficients (0-1) covering brow/eye/mouth/jaw expression primitives; 4x4 facial transform matrix (head pose); 33 3D body pose landmarks with visibility; 21 3D hand landmarks per hand. Emits normalized + world coords. | video-frame | per-frame | yes-cpu | strong | include |
| OpenFace 3.0 (lightweight multitask, RetinaFace MobileNet-0.25 frontend) | Unified per-frame facial behavior: landmarks, facial action units, eye-gaze, and discrete emotion from a single shared-backbone model. | Per face per frame: dense 2D facial landmarks; AU detection (presence/intensity, FACS-style set); eye-gaze direction (gaze vectors / yaw-pitch); head pose; discrete facial emotion class + probabilities. Time-series CSV per video. | video-frame | per-frame | yes-cpu | best-in-class | include |
| OpenFace 2.0 (TadasBaltrusaitis/OpenFace) | Classic CLM/CE-CLM facial landmark, head pose, gaze, and AU intensity/presence regression; long the field standard for FACS-based AU time series. | Per frame: 68 2D+3D landmarks; head pose (Tx,Ty,Tz, pitch/yaw/roll); eye-gaze vectors (gaze_0, gaze_1) + gaze angle; 17 AU intensities (AU01-AU45, 0-5) + 18 AU presence binaries; per-frame confidence and success flag. Outputs tidy CSV. | video-frame | per-frame | yes-cpu | usable | alternative |
| Py-Feat (cosanlab/py-feat) | Modular Python facial expression pipeline: face detection, landmarks, head pose, AUs, and 7-class emotion, with built-in visualization and analysis (Fex data class). | Per face per frame: bbox + score; 68 landmarks; head pose (pitch/yaw/roll); ~20 AU probabilities/intensities (selectable detectors, e.g. XGBoost/SVM on landmark+HOG); 7 emotion probabilities (anger, disgust, fear, happy, sad, surprise, neutral); optional identity embedding. Returns a pandas-like Fex time-series. | video-frame | per-frame | yes-gpu | strong | include |
| L2CS-Net (Ahmednull/L2CS-Net) | Appearance-based 3D gaze direction estimation in unconstrained, full-360 settings from the face crop (no eye-tracker hardware). | Per face per frame: gaze yaw and pitch angles (radians/degrees) -> 3D gaze direction vector. SOTA 3.92 deg (MPIIGaze), 10.41 deg (Gaze360). | video-frame | per-frame | yes-gpu | strong | include-if-resources |
| MMPose: RTMPose / RTMW / RTMW3D (open-mmlab/mmpose) | Real-time top-down multi-person 2D body, whole-body (body+face+hands+feet), and 3D whole-body keypoint estimation. | Per detected person per frame: 17 COCO body keypoints (RTMPose) OR 133 COCO-WholeBody keypoints (RTMW: 23 body+foot, 68 face, 42 hand), each with (x,y) + confidence; RTMW3D adds 3D (x,y,z). Yields per-person skeletons -> derived posture, hand gesture, head orientation signals. | video-frame | per-frame (per person) | yes-gpu | best-in-class | include |
| ViTPose / ViTPose++ (ViTAE-Transformer/ViTPose, in MMPose) | Vision-transformer top-down human pose estimation; highest-accuracy 2D body keypoints when accuracy outranks speed. | Per person per frame: 17 (COCO) or up to 133 (whole-body via ViTPose+) keypoints with (x,y)+confidence heatmap-derived coords. ViTPose-G reaches >80 AP on COCO. | video-frame | per-frame (per person) | yes-heavy-gpu | strong | alternative |
| HSEmotion / EmotiEffLib (EmotiEffNet, av-savchenko / sb-ai-lab) | Fast EfficientNet/MobileViT-based facial expression classification, valence-arousal regression, and AU prediction from face crops; tuned for video. | Per face per frame: 8-class emotion probabilities (anger, contempt, disgust, fear, happy, neutral, sad, surprise); continuous valence and arousal scalars (-1..1); AU activations; plus reusable face embedding features for downstream temporal models. | video-frame | per-frame (aggregable per-utterance/clip) | yes-cpu | strong | include |
| EmoNet (face-analysis/emonet) | Continuous valence-arousal plus discrete emotion estimation from faces in naturalistic conditions (AffectNet-trained). | Per face per frame: continuous valence and arousal (-1..1); discrete emotion class (5- or 8-class model) + probabilities; facial landmarks. Includes demo_video.py for video face-detect + emotion. | video-frame | per-frame | yes-gpu | usable | alternative |
Recommended (best-in-class): OpenFace 3.0 (landmarks + AUs + gaze + emotion in one CPU-capable multitask model) as the primary face-behavior extractor; InsightFace buffalo_l (RetinaFace + ArcFace) for face detection, tracking, and identity embeddings; MMPose RTMPose / RTMW for real-time 2D and whole-body (body+face+hands+feet) keypoints; MediaPipe Tasks for cheap CPU-only body/hand/face landmarks + blendshapes as a fallback/redundancy layer; HSEmotion/EmotiEffLib for fast continuous valence-arousal and expression, and L2CS-Net when high-accuracy 360-degree gaze is a primary signal
Likely redundant:
- OpenFace 2.0 -> superseded by OpenFace 3.0 (faster, multitask, better accuracy); keep only for reproducing legacy pipelines or its validated AU intensity scale
- Standalone RetinaFace -> redundant with InsightFace, which bundles it; and with detectors inside OpenFace 3.0 / Py-Feat
- ViTPose -> redundant with MMPose RTMPose/RTMW for typical lab use; only worth it for max-accuracy keypoints on a strong GPU
- EmoNet -> valence-arousal largely superseded by HSEmotion (faster, newer, more outputs); keep as a citable cross-check
- L2CS-Net gaze and Py-Feat/HSEmotion emotion overlap OpenFace 3.0’s bundled gaze/emotion -> run separately only when those specific signals need best-in-class accuracy
- MediaPipe body/hand keypoints overlap MMPose (lower accuracy, single-best-effort) -> use MediaPipe for cheap CPU-only or redundancy, MMPose for accuracy/multi-person
References
- InsightFace (RetinaFace detector + ArcFace ‘buffalo_l’ pack, ResNet50@WebFace600K) — github.com/deepinsight/insightface; RetinaFace (arXiv 1905.00641); ArcFace (arXiv 1801.07698)
- RetinaFace (standalone, serengil/retinaface or InsightFace detector) — arXiv 1905.00641; github.com/serengil/retinaface
- MediaPipe Tasks (Face Detector, Face Landmarker w/ blendshapes, Pose Landmarker, Hand Landmarker; legacy Holistic) — ai.google.dev/edge/mediapipe; developers.google.com/mediapipe
- OpenFace 3.0 (lightweight multitask, RetinaFace MobileNet-0.25 frontend) — arXiv 2506.02891; huggingface.co/papers/2506.02891
- OpenFace 2.0 (TadasBaltrusaitis/OpenFace) — github.com/TadasBaltrusaitis/OpenFace; OpenFace 2.0 (FG 2018)
- Py-Feat (cosanlab/py-feat) — Cheong et al., Behavior Research Methods 2023; github.com/cosanlab/py-feat
- L2CS-Net (Ahmednull/L2CS-Net) — arXiv 2203.03339; github.com/Ahmednull/L2CS-Net
- MMPose: RTMPose / RTMW / RTMW3D (open-mmlab/mmpose) — RTMPose arXiv 2303.07399; RTMW arXiv 2407.08634; github.com/open-mmlab/mmpose
- ViTPose / ViTPose++ (ViTAE-Transformer/ViTPose, in MMPose) — ViTPose arXiv 2204.12484; ViTPose++ arXiv 2212.04246
- HSEmotion / EmotiEffLib (EmotiEffNet, av-savchenko / sb-ai-lab) — Savchenko, HSEmotion (CVPR 2023 workshops; arXiv 2403.11590); github.com/av-savchenko/hsemotion; github.com/sb-ai-lab/EmotiEffLib
- EmoNet (face-analysis/emonet) — Toisoul et al., Nature Machine Intelligence 2021; github.com/face-analysis/emonet
Dynamic visual: motion, optical flow, motion energy
This subclass covers low-level dynamic visual signal: dense optical flow (per-pixel motion vectors), aggregate motion energy from spatiotemporal filter banks, camera-vs-object motion separation, shot/cut boundaries, and frame-to-frame visual change/novelty. These are deliberately pre-semantic features (how much/which-direction things move, when the camera cuts) distinct from semantic action recognition. The field is mature and largely open-source: RAFT and its 2024 successor SEA-RAFT dominate dense flow, MemFlow/VideoFlow add multi-frame temporal smoothing, pymoten provides the canonical neuroscience motion-energy pyramid, and TransNetV2 plus PySceneDetect cover shot detection. For a small lab, a practical default pipeline is: PySceneDetect/TransNetV2 for cuts, pymoten for a brain-aligned motion-energy regressor, and SEA-RAFT (or RAFT) for dense flow from which you derive global/mean flow magnitude (proxy for camera motion) and residual flow (object motion).
| Tool | Measures | Per-timepoint output | Modality | Granularity | Local | Rating | Rec |
|---|---|---|---|---|---|---|---|
| SEA-RAFT (Princeton-VL, ECCV 2024) | Dense per-pixel optical flow (2D motion vector field) between consecutive frames; current best accuracy/speed tradeoff among open flow models | Per-pixel (u,v) displacement field at full resolution; derivable per-frame scalars: mean/median flow-vector magnitude, flow-orientation histogram, divergence/curl, global-motion (camera) estimate via robust fit and residual (object) motion magnitude | video-frame | frame (per consecutive frame pair) | yes-gpu | best-in-class | include |
| RAFT (Teed & Deng, ECCV 2020) | In plain terms: measures how much and which way things move between frames; the pipeline (which runs RAFT) summarizes this each second as overall optical-flow magnitude, camera motion, and left-over object motion. Dense per-pixel optical flow via recurrent all-pairs correlation; the long-standing reliable baseline, widely wrapped (torchvision, ptlflow) | Per-pixel (u,v) flow field; same derived per-frame scalars as SEA-RAFT (mean magnitude, orientation entropy, camera/object decomposition) | video-frame | frame | yes-gpu | strong | alternative |
| MemFlow (Dong et al., CVPR 2024) | Multi-frame optical flow with a memory module that aggregates historical motion, giving temporally smoother flow and large-motion robustness; real-time | Per-pixel (u,v) flow field, temporally coherent across the clip; same derived scalars, with less frame-to-frame jitter useful for second-by-second time series | video-clip | frame (with temporal context) | yes-gpu | strong | include-if-resources |
| VideoFlow (Shi et al., ICCV 2023) | Multi-frame (tri-frame TROF + propagation) optical flow exploiting temporal cues; high accuracy on Sintel/KITTI | Bi-directional per-pixel (u,v) flow across multiple frames; derived per-frame motion magnitude/orientation series | video-clip | frame (multi-frame context) | yes-gpu | usable | drop |
| pymoten (Gallant Lab; Nunez-Elizalde et al. 2021) | Motion energy from a pyramid of spatiotemporal Gabor quadrature filters at multiple spatial/temporal frequencies, directions, positions, sizes — the canonical low-level motion model for fMRI encoding (Nishimoto & Gallant 2011) | Per-frame high-dimensional (hundreds-to-thousands-dim) vector of filter activation energies, one value per Gabor channel (spatial freq x temporal freq x direction x location). Directly usable as a voxelwise encoding-model regressor or reducible to summary motion-energy scalars | video-frame | frame (configurable; commonly downsampled to per-second or TR) | yes-cpu | best-in-class | include |
| TransNetV2 (Soucek & Lokoc 2020) | In plain terms: finds the cuts between shots. The pipeline uses a lightweight histogram-based cut detector as a stand-in for TransNetV2, flagging each shot change and numbering the shots. Shot/cut boundary detection including hard cuts and gradual transitions (dissolves, fades, wipes) via a deep dilated-3D-CNN; current open SOTA for shot boundaries | Per-frame cut probability (0-1); thresholded list of shot boundary frame indices and shot segments; handles gradual transitions, flashes, motion blur | video-clip | per-frame probability yielding per-shot segmentation | yes-gpu | best-in-class | include |
| PySceneDetect (v0.6+) | Shot/cut detection via content-aware HSV histogram change (ContentDetector) or adaptive/threshold detectors; lightweight CPU tool | List of cut frame/timecode boundaries and scene segments; per-frame content-change score time series (the raw HSV-delta signal is itself a usable visual-change/novelty feature) | video-frame | per-frame change score; per-shot segmentation | yes-cpu | strong | include |
| AutoShot (Zhu et al., CVPRW 2023) | Shot boundary detection trained on the SHOT/short-video dataset; reports SOTA on short-form/social video where TransNetV2 was trained on different distribution | Per-frame shot-boundary scores and shot segments | video-clip | per-frame / per-shot | yes-gpu | usable | alternative |
| OpenCV Farneback / DIS dense optical flow | Classical (non-deep) dense optical flow — Farneback polynomial expansion or DISOpticalFlow; CPU-only fallback when no GPU is available | Per-pixel (u,v) flow field; derived per-frame mean magnitude and orientation histograms | video-frame | frame | yes-cpu | usable | alternative |
Recommended (best-in-class): SEA-RAFT (dense optical flow; derive global camera-motion vs residual object-motion and mean flow magnitude); pymoten (neuroscience-standard motion-energy pyramid feature for direct fMRI encoding); TransNetV2 (shot/cut boundary detection incl. gradual transitions); PySceneDetect (fast CPU cut detection + continuous per-frame visual-change/novelty score)
Likely redundant:
- RAFT -> superseded by SEA-RAFT (better accuracy and ~2.3x faster); keep only as easy torchvision fallback
- VideoFlow -> superseded by MemFlow (faster, fewer params, higher accuracy for multi-frame flow)
- AutoShot -> overlaps TransNetV2; only preferable for short-form/social video stimuli
- OpenCV Farneback/DIS -> superseded by SEA-RAFT/RAFT in accuracy; keep only as no-GPU fallback
- GMFlow/FlowFormer family -> covered in spirit by SEA-RAFT as the chosen single dense-flow model; no need to run multiple deep flow nets
Open questions:
- Camera-vs-object motion separation is not a turnkey tool: it must be derived from a dense-flow model (e.g. robust homography/affine global-motion fit on the flow field, then residual = object motion). Decide whether to implement this or adopt a SLAM/egomotion package.
- Choose the temporal aggregation strategy: flow and motion-energy are per-frame, so define how to bin/downsample to per-second or per-TR (mean, RMS, or HRF-convolved) for the neuroimaging timeline.
- For long narrative films, decide between per-pair flow (SEA-RAFT) vs temporally-smoothed multi-frame flow (MemFlow) depending on whether jitter in the second-by-second series is a problem.
- Confirm SEA-RAFT vs MemFlow generalization on your actual stimulus domain (animation, archival film, low light) since flow models are trained mostly on Sintel/KITTI/Spring.
References
- SEA-RAFT (Princeton-VL, ECCV 2024) — github.com/princeton-vl/SEA-RAFT ; arXiv 2405.14793 ; Spring benchmark EPE 3.69
- RAFT (Teed & Deng, ECCV 2020) — github.com/princeton-vl/RAFT ; pytorch.org/vision optical_flow
- MemFlow (Dong et al., CVPR 2024) — github.com/dqiaole/MemFlow ; CVPR 2024 ; dqiaole.github.io/MemFlow
- VideoFlow (Shi et al., ICCV 2023) — arXiv 2303.08340 ; github.com/XiaoyuShi97/VideoFlow
- pymoten (Gallant Lab; Nunez-Elizalde et al. 2021) — github.com/gallantlab/pymoten ; Nishimoto & Gallant 2011 J Neurosci ; gallantlab.org/voxelwise_tutorials
- TransNetV2 (Soucek & Lokoc 2020) — github.com/soCzech/TransNetV2 ; arXiv 2008.04838
- PySceneDetect (v0.6+) — github.com/Breakthrough/PySceneDetect ; scenedetect.com
- AutoShot (Zhu et al., CVPRW 2023) — arXiv 2304.06116 ; github.com/wentaoyu/AutoShot
- OpenCV Farneback / DIS dense optical flow — docs.opencv.org optical flow tutorial; Kroeger et al. DIS ECCV 2016
Action and activity recognition (video understanding)
Computational action/activity recognition for a movie/audio-story timeline splits into three usable layers: (1) clip-level recognition backbones that emit Kinetics/Something-Something class posteriors and/or pooled spatiotemporal embeddings over short sliding windows (VideoMAE V2, InternVideo2, V-JEPA 2, TimeSformer, VideoSwin, SlowFast), best run at a fixed window stride (e.g. 16 frames / 1-2 s) to produce per-second features; (2) temporal action localization (TAL) heads (ActionFormer / OpenTAD, typically fed InternVideo2 or VideoMAE features) that turn those per-window embeddings into start-end action segments with confidence; and (3) video-LLMs (Qwen3-VL, VideoLLaMA3, InternVL3, Video-LLaVA) that produce open-vocabulary dense event descriptions with timestamps, valuable for naturalistic film where a fixed label set is too restrictive. For a small lab the most leverage comes from: VideoMAE V2 / InternVideo2 as frozen feature extractors on a sliding window, X-CLIP for zero-shot open-vocabulary action probabilities, and one video-LLM for dense captioning. The pure clip classifiers (TimeSformer/VideoSwin/SlowFast) are now largely superseded as standalone choices but remain valuable as the standard, well-documented MMAction2/PySlowFast backbones and as TAL feature sources.
| Tool | Measures | Per-timepoint output | Modality | Granularity | Local | Rating | Rec |
|---|---|---|---|---|---|---|---|
| VideoMAE V2 (OpenGVLab, CVPR 2023; ViT-B/L/g, UnlabeledHybrid-1M pretrain, K400/K710 finetune) | In plain terms: recognizes what people are doing from a short clip, scored over 400 everyday action categories (e.g. running, dancing, cooking, shaking hands, playing guitar); the pipeline stores the full 400-value probability vector plus the single top action each second (deployed model: VideoMAE-base fine-tuned on Kinetics-400). Self-supervised masked-autoencoder video backbone; clip-level human action class and a strong pooled spatiotemporal embedding over a short window | Per-window (16 frames) 400-dim Kinetics-400 (or 710) action softmax posteriors AND/OR a frozen pooled embedding (768-dim ViT-B, 1024-dim ViT-L, 1408-dim ViT-g) used as the de facto feature for downstream TAL | video-clip | per-clip (sliding 16-frame window; emit per-second by striding) | yes-gpu | best-in-class | include |
| InternVideo2 (OpenGVLab, ECCV 2024; Stage2 1B & 6B, video-text contrastive) | Large multimodal video foundation model; SOTA clip-level action recognition, zero-shot/open-vocabulary action classification via video-text matching, and the strongest published TAL feature extractor | Per-window video embedding (aligned to a text embedding space) giving zero-shot similarity scores to an arbitrary action-label vocabulary; supervised K400/SSv2 class posteriors; pooled features (1B/6B) feeding ActionFormer-style TAL | multimodal | per-clip (sliding window; emit per-second by striding) | yes-heavy-gpu | best-in-class | include |
| V-JEPA 2 (Meta AI, June 2025; ViT-L/H/g, facebook/vjepa2-vitl-fpc64-256) | Self-supervised (non-generative, latent-prediction) video world model; motion-centric spatiotemporal representations strong on temporal/motion understanding and action anticipation | Frozen per-window spatiotemporal embedding (attentive-probe gives action class posteriors, e.g. SSv2/EK100); supports action-anticipation (recall@5) outputs; embeddings usable as motion-rich timeline features | video-clip | per-clip (16-/64-frame window; stride for per-second) | yes-gpu | strong | include-if-resources |
| X-CLIP (Microsoft, ECCV 2022; microsoft/xclip-base-patch16/32, zero-shot variant) | CLIP extended to video with cross-frame attention; open-vocabulary / zero-shot clip-level action classification via video-text similarity | Per-window similarity score (softmax) over an ARBITRARY user-supplied list of action phrases; or 512-dim joint video embedding for retrieval | multimodal | per-clip (8-frame window; stride for per-second) | yes-gpu | strong | include |
| ActionFormer + OpenTAD (ECCV 2022 / CVPR-W 2025; TAL on InternVideo2/VideoMAE features) | Temporal action localization: converts per-window backbone features into time-stamped action segments with class and confidence (single-shot, anchor-free, multiscale local attention) | List of (start_time, end_time, action_class, confidence) segments per video; densely covers the timeline, directly alignable to a movie clock | video-clip | per-shot / per-segment (boundaries at sub-second precision) | yes-gpu | best-in-class | include |
| Qwen3-VL (Alibaba, 2025; 4B/8B/30B/235B, video; predecessor Qwen2.5-VL) | Video-LLM for open-vocabulary dense event description and temporal grounding; describes what people are doing and localizes it in time via text-timestamp alignment | Free-text dense captions and event segmentations with explicit start/end timestamps (Text-Timestamp Alignment); answers ‘what action happens between t1-t2’; temporal grounding outputs (Charades-STA style) | multimodal | per-utterance / per-event (model-emitted timestamps, ~second precision) | yes-gpu | best-in-class | include |
| VideoLLaMA3 (DAMO/Alibaba, 2025; 2B/7B) | Unified image+video LLM specialized for temporal grounding and dense video captioning | Dense captions with start-end token timestamps; temporal grounding on ActivityNet/YouCook2/Charades-STA/Ego4D/COIN; open-vocabulary action/event descriptions per timestamped span | multimodal | per-event / per-utterance (start-end token timestamps) | yes-gpu | strong | alternative |
| InternVL3 (video) (OpenGVLab/Shanghai AI Lab, 2025; 1B-78B) | General multimodal LLM with competitive video understanding; open-vocabulary event/action description and video QA over sampled frames | Free-text descriptions of actions/activities for a queried window; video QA answers; can be prompted for timestamped event lists (weaker native timestamp grounding than Qwen3-VL) | multimodal | per-clip / per-event (prompt-dependent) | yes-gpu | strong | alternative |
| TimeSformer / VideoSwin / SlowFast (via MMAction2 + PySlowFast) | Classic supervised clip-level action classifiers (divided space-time attention / hierarchical 3D-window transformer / dual-pathway 3D-CNN); emit Kinetics/SSv2 action posteriors | Per-window action softmax posteriors (e.g. 400-dim K400, 174-dim Something-Something v2) and pooled clip embeddings; SlowFast features were the long-time standard TAL input before VideoMAE/InternVideo2 | video-clip | per-clip (8-32 frame window; stride for per-second) | yes-gpu | usable | include-if-resources |
Recommended (best-in-class): VideoMAE V2 (ViT-L/g) or InternVideo2-1B as the frozen sliding-window feature extractor + Kinetics classifier; X-CLIP for lightweight zero-shot open-vocabulary action probabilities over a custom film vocabulary; ActionFormer/OpenTAD over InternVideo2/VideoMAE features for timestamped action segments; Qwen3-VL (8B) as the primary video-LLM for open-vocabulary dense, timestamped event description
Likely redundant:
- TimeSformer / VideoSwin / SlowFast as standalone recognizers -> superseded by VideoMAE V2 and InternVideo2 (keep only for the convenient MMAction2/PySlowFast pipeline or as legacy TAL features)
- InternVL3 (video) and VideoLLaMA3 -> overlap with Qwen3-VL for dense captioning/temporal grounding; pick one video-LLM as primary (Qwen3-VL has the strongest native timestamp grounding)
- X-CLIP zero-shot vs InternVideo2 zero-shot -> same open-vocabulary role; InternVideo2 is more accurate but far heavier, X-CLIP is the cheap default
- V-JEPA 2 vs VideoMAE V2 -> both self-supervised backbones; V-JEPA 2 is the more motion/temporal-biased complement, not a strict duplicate
Open questions:
- Licensing: VideoMAE V2 and InternVideo2 weights are non-commercial/research only; confirm this is acceptable for the project’s use and publication plans.
- Window stride and temporal resolution: clip backbones natively output per-16-frame (~0.5-1 s) features; the target second-by-second cadence requires choosing stride/overlap and a pooling rule that needs to be standardized across features.
- Label taxonomy: Kinetics-400/700 and Something-Something classes are everyday/atomic actions and may map poorly onto narrative-film events; decide whether to rely on TAL with a custom taxonomy vs open-vocabulary X-CLIP/video-LLM outputs.
- Video-LLM timestamp reliability: Qwen3-VL/VideoLLaMA3 emit timestamps but their second-level accuracy on long naturalistic films is not well validated; may need calibration against TAL or manual spot-checks.
- Compute budget: InternVideo2-6B and Qwen3-VL-30B+ exceed a single-GPU small-lab setup; confirm whether 1B/8B-class models suffice for the required annotation quality.
References
- VideoMAE V2 (OpenGVLab, CVPR 2023; ViT-B/L/g, UnlabeledHybrid-1M pretrain, K400/K710 finetune) — arXiv:2303.16727; HF OpenGVLab/VideoMAEv2-giant; github.com/OpenGVLab/VideoMAEv2
- InternVideo2 (OpenGVLab, ECCV 2024; Stage2 1B & 6B, video-text contrastive) — arXiv:2403.15377; ECCV 2024; HF collection OpenGVLab/InternVideo2
- V-JEPA 2 (Meta AI, June 2025; ViT-L/H/g, facebook/vjepa2-vitl-fpc64-256) — arXiv:2506.09985; ai.meta.com/blog/v-jepa-2-world-model-benchmarks; HF facebook/vjepa2-vitl-fpc64-256
- X-CLIP (Microsoft, ECCV 2022; microsoft/xclip-base-patch16/32, zero-shot variant) — arXiv:2208.02816; HF docs/transformers model_doc/xclip
- ActionFormer + OpenTAD (ECCV 2022 / CVPR-W 2025; TAL on InternVideo2/VideoMAE features) — arXiv:2202.07925; OpenTAD arXiv:2502.20361; github.com/OpenGVLab/OpenTAD
- Qwen3-VL (Alibaba, 2025; 4B/8B/30B/235B, video; predecessor Qwen2.5-VL) — Qwen3-VL Technical Report arXiv:2511.21631; github.com/QwenLM/Qwen3-VL
- VideoLLaMA3 (DAMO/Alibaba, 2025; 2B/7B) — arXiv:2501.13106; HF DAMO-NLP-SG/VideoLLaMA3
- InternVL3 (video) (OpenGVLab/Shanghai AI Lab, 2025; 1B-78B) — arXiv:2504.10479; HF OpenGVLab/InternVL3
- TimeSformer / VideoSwin / SlowFast (via MMAction2 + PySlowFast) — TimeSformer arXiv:2102.05095; Video Swin arXiv:2106.13230; SlowFast arXiv:1812.03982; github.com/open-mmlab/mmaction2
Visual saliency, attention, aesthetics, depth
This subclass produces per-frame attention/complexity proxies: predicted human fixation/saliency maps (static and video), monocular depth maps, and scalar image-level scores for aesthetics, technical quality, and memorability. For a movie/audio-story timeline, the most timeline-relevant outputs are spatiotemporal video-saliency maps (one map per frame, summarizable to scalars like saliency concentration/entropy and number-of-salient-regions) and depth maps (mean/range/foreground-fraction per frame). The field is mature and overwhelmingly open-source: DeepGaze IIE/III for static fixation, ViNet/TASED-Net/UNISAL for video saliency, Depth-Anything-V2 (and Apple Depth Pro for metric) for depth, and CLIP/LMM-based scorers (Q-Align, LAION-Aesthetics, ResMem) for aesthetics/quality/memorability. All run on a single consumer GPU; most also run on CPU slowly. Recommend one video-saliency model + one depth model + one aesthetics/quality scorer + memorability as the core, with static-image saliency only as an alternative.
| Tool | Measures | Per-timepoint output | Modality | Granularity | Local | Rating | Rec |
|---|---|---|---|---|---|---|---|
| DeepGaze IIE (Linardos et al., ICCV 2021) | Static per-image predicted human fixation density (free-viewing saliency), well-calibrated in/out-of-domain | Single-channel probabilistic saliency/fixation-density map per frame (log-density, normalizes to a spatial probability distribution); derive scalars: saliency entropy/dispersion, peak saliency, center-of-mass, top-k salient-region count | video-frame | frame (applied independently per frame) | yes-gpu | strong | alternative |
| TASED-Net (Min & Corso, ICCV 2019) | Video spatiotemporal saliency: predicted fixation map for the current frame given a clip, capturing motion-driven attention | Per-frame single-channel saliency map (0-1); scalars: saliency concentration/entropy, peak location & value, salient-area fraction, frame-to-frame saliency-shift (proxy for attention reorienting) | video-clip | frame (sliding window of ~32 frames -> one output map per frame) | yes-gpu | strong | alternative |
| ViNet / ViNet-S+ViNet-A ensemble (Jain et al., IROS 2021; updated) | Video (and audio-visual) saliency: predicted dynamic fixation maps, current SOTA on multiple DHF1K/Hollywood2/AViMoS-style benchmarks | Per-frame single-channel saliency map; scalars as for TASED-Net (concentration/entropy, peak, salient-area fraction, temporal saliency shift). Audio-visual variant (ViNet-A) integrates the soundtrack | video-clip | frame (clip-based, one map per frame) | yes-gpu | best-in-class | include |
| UNISAL (Droste et al., ECCV 2020) | Unified image+video saliency with one model; predicted fixation maps for both stills and clips | Per-frame saliency map (0-1) plus same derived scalars; handles static frames and video in one network | video-clip | frame (video) / per-image (stills) | yes-gpu | strong | alternative |
| Depth-Anything-V2 (Yang et al., NeurIPS 2024) | In plain terms: estimates how near or far each part of the frame is (a depth map), summarized per second as average depth, depth range, depth complexity, and how much of the frame is close-up foreground. Monocular (relative, optionally metric) depth per pixel; foundation MDE model, robust across scenes | Dense per-pixel depth/inverse-depth map per frame; scalars: mean/median depth, depth range, foreground-fraction (near-camera pixels), depth entropy/layering, depth gradient (spatial complexity). Metric checkpoints give meters | video-frame | frame (per frame independently) | yes-gpu | best-in-class | include |
| Apple Depth Pro (Bochkovskii et al., 2024) | Sharp zero-shot metric (absolute, in meters) monocular depth with high-frequency boundary detail, no camera intrinsics needed | Per-pixel metric depth map (meters) per frame; same scalars as Depth-Anything plus true-scale foreground distance and absolute depth-range in meters | video-frame | frame | yes-gpu | strong | include-if-resources |
| Q-Align / OneAlign (Wu et al., ICML 2024) | Image (and video) technical quality (IQA) and aesthetic quality (IAA) via an LMM scoring against discrete text-defined levels; SOTA unified scorer | Per-frame scalar quality score and scalar aesthetic score (continuous, derived from rating-level probabilities); VQA variant gives per-clip quality | video-frame | frame (per frame) / per-clip (VQA mode) | yes-heavy-gpu | best-in-class | include |
| LAION-Aesthetics Predictor V2 (improved-aesthetic-predictor) | Image aesthetic appeal as a single scalar (the score used to filter LAION/Stable-Diffusion training data) | Per-frame scalar aesthetic score (~1-10); cheap aesthetics proxy over a timeline | video-frame | frame | yes-cpu | usable | alternative |
| CLIP-IQA / QualiCLIP | No-reference technical image quality (and perceptual attributes) via CLIP text-image alignment, opinion-unaware | Per-frame scalar quality score (0-1); antonym-prompt variants also yield attribute scores (sharp/blurry, bright/dark, natural) | video-frame | frame | yes-gpu | usable | alternative |
| ResMem (Needell & Bainbridge, 2022) | Intrinsic image memorability: predicted probability an image will be remembered | Per-frame scalar memorability score (0-1, LaMem-calibrated) | video-frame | frame | yes-cpu | strong | include |
| IQA-PyTorch (toolkit, chaofengc) | Not a single model: a unified library exposing 40+ no-reference IQA/IAA metrics (CLIP-IQA, MUSIQ, NIMA, DBCNN, LAION-AES, MANIQA, etc.) under one API | Per-frame scalar quality/aesthetic scores from whichever metric is selected; convenient for emitting several quality scalars at once | video-frame | frame | yes-gpu | strong | include-if-resources |
Recommended (best-in-class): ViNet (or ViNet-A for audio-visual) for per-frame video saliency maps -> saliency concentration/entropy, peak, salient-area, temporal shift; Depth-Anything-V2 for per-frame relative depth (add Apple Depth Pro only if metric/meters depth is needed) -> mean/range depth, foreground-fraction, depth complexity; Q-Align/OneAlign for combined per-frame aesthetic + technical-quality scalars (subsample to ~1 fps), with IQA-PyTorch (MUSIQ/NIMA/LAION-AES) as a lightweight fallback; ResMem for per-frame image-memorability scalar
Likely redundant:
- MiDaS / DPT / ZoeDepth — superseded by Depth-Anything-V2 (relative) and Apple Depth Pro (metric)
- TASED-Net and UNISAL — same video-saliency output as ViNet; pick one (ViNet best accuracy, UNISAL lightest)
- DeepGaze IIE/III (static fixation) — for video timelines superseded by motion-aware video-saliency models; keep only as a pure static-image attention proxy
- LAION-Aesthetics V2 and CLIP-IQA/QualiCLIP — subsumed by Q-Align’s IAA/IQA branches (use them only as lightweight substitutes when the 7B LMM is too heavy)
- MemNet / ResMem-Net — older or less-standardized memorability predictors superseded by the maintained, pip-installable ResMem
References
- DeepGaze IIE (Linardos et al., ICCV 2021) — arXiv:2105.12441; github.com/matthias-k/DeepGaze
- TASED-Net (Min & Corso, ICCV 2019) — arXiv:1908.05786; github.com/MichiganCOG/TASED-Net
- ViNet / ViNet-S+ViNet-A ensemble (Jain et al., IROS 2021; updated) — arXiv:2012.06170; github.com/samyak0210/ViNet; AIM 2024 Video Saliency Challenge (ECCV-W)
- UNISAL (Droste et al., ECCV 2020) — arXiv:2003.05477; github.com/rdroste/unisal
- Depth-Anything-V2 (Yang et al., NeurIPS 2024) — arXiv:2406.09414; github.com/DepthAnything/Depth-Anything-V2
- Apple Depth Pro (Bochkovskii et al., 2024) — arXiv:2410.02073; github.com/apple/ml-depth-pro
- Q-Align / OneAlign (Wu et al., ICML 2024) — arXiv:2312.17090; github.com/Q-Future/Q-Align; q-align.github.io
- LAION-Aesthetics Predictor V2 (improved-aesthetic-predictor) — github.com/christophschuhmann/improved-aesthetic-predictor; LAION-5B
- CLIP-IQA / QualiCLIP — CLIP-IQA arXiv:2207.12396; QualiCLIP github.com/miccunifi/QualiCLIP; IQA-PyTorch
- ResMem (Needell & Bainbridge, 2022) — Needell & Bainbridge 2022; github.com/Brain-Bridge-Lab/resmem; LaMem dataset
- IQA-PyTorch (toolkit, chaofengc) — github.com/chaofengc/IQA-PyTorch (pyiqa)