Repository navigation
VideoHighlighter 0.13.1
- Matching by name is broad, not precise. On that video "punching person (boxing)" found a fighting stance, and also someone gesturing with a clenched fist. Where that matters, teach it by example.
- 4 or 8 frames per window. Advanced → Action Recognition → Frames per window. 4 is the default; 8 is about 1.5× slower and stricter. On the same video 8 frames took 31 s against 21 s and found nothing 4 frames missed; for "punching person (boxing)" it kept 20 of the 30 seconds, and the 10 it dropped were two people talking, someone crouching after a fight and a transformation effect.
- Or teach it by example. Train → Actions, or the From videos tab, trains a model on folders of your own clips. It looks at the people in each window rather than the whole frame, and trains inside the app, so it works in the installed build; Stop is checked between clips, and when a model is saved the panel says where.
- Choose which model a run uses. Advanced → Action Recognition has a Model list: the newest trained model (the default), any installed model by name, or none, for actions by name. A model you just trained or imported is chosen for you, and if a chosen model is removed, the run falls back to the newest and the panel says so.
- Import a model made elsewhere with Import… next to that list. It takes a folder, checks it with the app's own reader before it goes live, never overwrites an installed model, and refuses a folder it cannot use with a sentence saying why. Only model files are copied.
- Fine-tuned action models run on their own image tower. A model whose top SigLIP2 layers were trained along with it carries its own copy of them, stored at half precision (186 MB), and the app runs it on that while search and actions by name keep the shared one. On held-out videos, fine-tuning the top 4 layers raised top-1 accuracy from 53% to 60%.
- Painted action videos. With "Draw action labels" on, and from the overlay's Generate Actions, the app writes
<video>_actions_annotated.mp4, the timeline viewer's Actions source: each action's box and label, a panel with up to three actions and their bars, and the time. When matching by name, people are found and boxed, while the score still comes from the whole frame. Boxes stay inside the picture, so a close-up's label is on screen. It adds 39 s on the 23-minute video. - The progress bar shows the action pass live: window, detections, speed, inference rate, backend and model.
- The speed line counts every frame read. It used to show analysed frames per second, so raising the frame skip made a run faster while the number went down (frame skip 5 → 10: 21.2 s → 12.4 s, shown as 324 → 277 FPS). The log now also gives the model's own rate, for example "Speed: 3952 fps (1 in 31 analysed), 9 s; inference: 485 frames/s on OpenVINO GPU".
- A blank action field no longer means no actions. With action points set and nothing typed, the action pass used to be skipped entirely, which is why a run could finish with nothing on the timeline's action lane.
- The Intel and R3D action models are gone, with their trainers and their settings. Their trainers checked themselves on clips from the same videos they trained on, so the scores they reported were better than what they did on new footage. Action models trained with them no longer load; train again from the same folders under Train → Actions.
- The action model is a one-time download, about 590 MB once unpacked. Advanced → Action Recognition offers it, and so does Run when a run needs it.
- Videos analysed before with actions are analysed again the first time, since their cached actions came from the old models. Runs without actions keep their caches.
Windows installer
- A real installer, with PyTorch as separate packs. CUDA PyTorch was 4.4 GB of the 6.9 GB install and only changes when torch does, so it is no longer rebuilt and repacked with every release. Setup is now about 560 MB. It installs the app with PyTorch for the processor, and downloads NVIDIA acceleration and the visual search model during setup, each checked against its SHA-256. A failed or declined download still leaves an app that runs.
- Install for me or for all users. Per user needs no admin rights; all users goes to Program Files with one UAC prompt.
- The NVIDIA checkbox names the card it found, or says it found none, so you can see why it is ticked or not.
- Setup and the uninstaller wait for the app to close. Run while the app was open, they deleted what they could and left the files the app held behind, in a folder Apps & features no longer listed. They now ask you to close the app first.
- The portable download fetches the same packs. The first time you pick the NVIDIA backend or visual search, the app offers the download, with a progress bar and pause, and resumes an interrupted one.
macOS
- Object detection runs on the Apple GPU through Core ML. Before, a Mac ran every model on the processor. Set
VH_COREML=offto turn it off. - The Compute setting lists only what the machine has. A Mac was offered NVIDIA, Intel and DirectML; it now shows Automatic, Apple GPU and Processor. A PC no longer shows Core ML.
Export to an editor
Contributed by @ethiebaut.
- EDL and FCPXML from the edit timeline. A CMX 3600 EDL and an FCPXML 1.9 sequence, timed on the video's real frame rate, 120 and 240 fps included, with audio events when the file has sound.
- Markers come with the cut. Speech, detections and faces from the analysis are written as EDL locators and FCPXML markers on the clips they overlap.
- The export dialog shows the real frame rate and how many markers it found, and lets you start the sequence at 00:00:00:00 or 01:00:00:00. CSV replaces JSON as the clip spreadsheet.
Settings
Contributed by @orangeqoon.
- Name the highlight file. The output name you type is now the file name. It used to be replaced with
<video>_highlight.mp4on every run. Leave it empty to keep that name. - Presets. Save the current settings under a name, and load or delete them later. They are stored in
presets/besideconfig.yaml. - The tooltips on the scoring and duration controls describe what the scorer actually does.
Composition rules
- Rules on outlines, not only boxes. A rule can ask whether one thing is inside, overlaps or touches another, measured on its traced outline rather than its box. Outlines are traced only where two boxes meet, and only for rules that ask for them.
- Rules about body parts.
person.handtouching something is decided on the wrists, not the whole person's box. Any body keypoint works, and so do the groups hand, foot, head, knee, elbow, shoulder and hip. - The player draws traced outlines, and the rule tables in the Advanced tab and the web UI have Relation and Outline columns. Saving rules no longer drops fields the table has no column for.
Experimental
- Object detection on the Intel NPU, the "AI Boost" in Core Ultra processors, which leaves the processor and graphics card to whatever else is running. On a Core Ultra 7 265K, YOLOX-s costs about 1 ms of processor time per frame on the NPU against 235 ms on the processor, with the same boxes. For now it is a separate command for people running from source (
python -m npu_obs), which can scan a recording or watch a running OBS and mark where things appear; it is not in the app's settings yet.
Fixes
- The app no longer hangs at 10% on some videos. The motion pass reads frames on a second thread. When that thread hit an error (a damaged frame, memory on a large file) it stopped without telling the pass, which then waited forever; the same happened at the very end of a video when a slow GPU batch made the reader give up on saying it was done. The pass now ends either way, and a reading error says in the log which frame it stopped at.
- A run says at the start what Ollama will not be able to do at the end. Chapter and clip narration and subtitle translation need Ollama, and both run last. Without it, narration was skipped with one line an hour into the log, and subtitles were written untranslated under the target language's name, with the reason only in the debug log. Now the first lines of a run say when Ollama is not running, when a model is not pulled (with the
ollama pullcommand), or when the narration model cannot see pictures. Untranslated subtitles are named for the language they are in. - Subtitle translation no longer downloads its model mid-run. When
llama3was not pulled,ollama runstarted downloading several gigabytes inside a two-minute timeout, again for every batch and every line, which could look like hours stuck at 95–99%. It now checks for the model first. - A large Whisper model on the processor is called out. "medium" and "large" on a CPU can take longer than the video itself, and the bar moves only every 30 seconds of audio; the log now says so when transcription starts, and what is faster.
- The scoring settings show each box once. Speech, Objects & actions, Face expression and Where in the video appeared twice, and the first copy had only its buttons, no number fields. This had been there since 0.10.
- Pose on Intel Arc. At the GPU's default precision every pose output was NaN, so the cropper could not confirm a person. Pose now runs at full precision on every device.
- Auto-crop sees people again. A lost loop left every zone counting zero people, so crops fell back to fixed positions. Crops now take a person whole, and one action stays in one crop: on 62 hand-reviewed windows, 37 of 40 single-action windows stayed whole (was 26), and two actions side by side were split in 1 of 18 (was 9).
- DirectML on a machine with no graphics card (a VM, a remote desktop) is no longer reported as available. The machine's adapters are now listed, and DirectML binds to a real card instead of always adapter 0.
- The update check asks every channel and takes the newest version, rather than stopping at the first that answers.
- The chat panel moves between the Simple and Detailed views without losing the conversation.
- The batch cropper no longer stops at the end to ask whether to delete the original videos, except when run from the command line.
Under the hood
- OpenVINO 2026.4.0. Every model's output is bit-identical to 2026.2.1. YOLOX-s is about 5% faster on GPU and 5–10% slower on the processor.
docs/BENCHMARKS.mdhas the measurement and how to repeat it. - The free edition mentions Pro's 14-day trial at two moments only: when a composition rule finds nothing, and when a report lists claims this build has no engine to measure. Never at startup and never in the report itself. Each moment speaks at most once a month, and "Don't suggest Pro" turns it off. Nothing is sent anywhere.
Thanks
- @ethiebaut (Eric Thiebaut-George) for the EDL and FCPXML export (#24).
- @orangeqoon for the highlight file name, presets and tooltips (#34).
The project
VideoHighlighter is owned and maintained jointly by Przemysław Kreft (@Aseiel) and Meric Donmezer (@mericdonmezer-ops), its two copyright holders.
Full Changelog: 0.12.1...0.13.1
Download
Install VideoHighlighter for Windows
One file. Run it, click through, done. It installs the app with PyTorch for the processor, and downloads NVIDIA GPU acceleration (ticked when an NVIDIA card is found) and the visual search model during setup. Installs per user, no admin rights needed.
| Installer | Portable | |
|---|---|---|
| Windows (desktop app) | Setup .exe | .7z.001 |
| Windows (web UI) | — | .7z.001 + .7z.002 |
| macOS | — | .dmg |
The installer is not signed yet, so Windows SmartScreen shows "Windows protected your PC" on first run — More info → Run anyway.
The desktop app's portable download is one part now that PyTorch is a pack. It runs on the processor out of the box and offers NVIDIA acceleration and visual search as downloads the first time you pick them. Extract it with 7-Zip.
The web UI comes in two parts: put both .7z.0NN files in one folder and extract the .001 with 7-Zip. Downloading one part alone fails. It is the Tauri shell around the React frontend with the Python engine bundled, and has no installer because no installer can hold a 1.7 GB sidecar.
00-VideoHighlighter-Windows-Setup.zip is the older script-based installer, kept as a fallback.