VQ Metrics Logger (JSON)
The glue node that turns your scores into JSON you can save, diff, and plot
- json_output
Run enough quality checks and you'll end up with a pile of disconnected floats and no way to compare Monday's run against Friday's. This node is the tidy-up step: it collects your metrics into one structured JSON blob you can save, diff, or feed into analysis later. It doesn't measure anything itself - it's the plumbing, and plumbing nodes are underrated.
You reach for it once you've wired up a few of the pack's scoring nodes (PSNR/SSIM, warping, FVD, whatever you're tracking) and want the results in one place instead of scattered across summary strings. Wire its JSON output to a save-text node and you've got a run log.
How it works
Nothing clever under the hood - and that's fine. It takes whatever metric floats you hand it and assembles them into a JSON object organized by category: fidelity (psnr, ssim, ciede2000), temporal (warping_error, flickering_score, smoothness_score), and distributional (fvd, fid), tagged with a name. Zero values get filtered out, so unconnected inputs don't clutter the output. That's the one behavior to know: default zeros are silently dropped, meaning a metric you forgot to wire won't appear in the JSON at all.
Inputs and outputs
Required:
metric_name(STRING, default "video_quality") - the tag for this run. Set it to something likeupscale_v2_denoise0.4so you can tell logs apart later.
Optional (all FLOAT, all default 0, dropped when zero):
psnr,ssim,ciede2000- full-reference resultswarping_error,flickering_score,smoothness_score- temporal resultsfvd,fid- distributional results
Output:
json_output(STRING) - the assembled, indented JSON.
Installing
It's one node in ComfyUI-VideoQuality-Metrics:
cd ComfyUI/custom_nodes
git clone https://github.com/jajos12/ComfyUI-VideoQuality-Metrics
pip install -r ComfyUI-VideoQuality-Metrics/requirements.txt
Restart ComfyUI; it's under VideoQuality/Reporting. ComfyUI Manager handles the pack install too.
Common issues
- Metrics missing from the JSON. You forgot to wire them, and the default zero got filtered. Check your connections - a missing key in the output means an unwired input, not a bug.
- The JSON is nested, not flat. This matters if you feed it into the pack's own comparison node, which expects flat key→number JSON. The logger's output and the comparison node don't chain cleanly - if that's your goal, either flatten manually or log the values separately. (See the VQ Workflow Comparison article for the gory details.)
- Nothing is persisted automatically. "Logger" is a slight oversell - it produces a string. Saving it to disk is on you, via a text-save or Python node.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| metric_name | STRING | video_quality | — |
| psnropt | FLOAT | 0.00 | — |
| ssimopt | FLOAT | 0.00 | — |
| ciede2000opt | FLOAT | 0.00 | — |
| warping_erroropt | FLOAT | 0.00 | — |
| flickering_scoreopt | FLOAT | 0.00 | — |
| smoothness_scoreopt | FLOAT | 0.00 | — |
| fvdopt | FLOAT | 0.00 | — |
| fidopt | FLOAT | 0.00 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| json_output | STRING | — |