Skip to content

Tune a cull profile

krites' judgement — how harshly it flags blur, exposure, closed eyes and near-duplicates — lives in a cull profile, not in the code. krites init seeds a wedding-default profile as a starting point; tuning it to your taste is expected.

What a profile controls

A profile sets, per signal:

  • hard gates — conditions that force a reject (e.g. badly out of focus);
  • soft penalties — weighted marks that pull a frame toward maybe;
  • dedup aggressiveness — how tightly near-duplicate bursts are grouped.

The judgement is config-driven and hot-reloaded, so edits take effect on the next cull.

Global default, per-shoot override

The profile cascades: a global default every shoot inherits, and optional per-shoot overrides on top. Tune the global once and every un-customised shoot follows; override a threshold in one shoot without disturbing the rest.

The easiest way is the studio — the Settings gear edits the global default, and a shoot's Cull profile panel toggles per-shoot overrides with a checkbox per control. See Configure krites from the studio.

Adjust and re-cull (CLI)

The thresholds are cull.profile.* config keys. Set a global default:

krites config set cull.profile.soft_sharpness 180
krites cull --shoot ~/Pictures/smith-wedding

A per-shoot override is the same key in that shoot's own <shoot>/.krites/config.yaml; unset it to re-inherit the global. Because verdicts are non-destructive records, you can re-cull with a revised profile as often as you like without touching originals — compare the outcomes and keep the profile that matches your eye.

Where the knobs live

Every threshold, with its type and default, is in the configuration reference. The eye/smile/facing thresholds the face provider feeds are in the face/eye section.

Why re-culling after a tweak is instant

Changing a threshold does not re-measure anything. The measurements — sharpness, exposure, perceptual hashes, face signals — are cached in .krites/analysis.yaml, and re-culling re-derives verdicts from them. On a four-thousand-frame shoot that is the difference between minutes and seconds.

A handful of settings do invalidate the cache, min_face_box among them. Which ones, and why, is in The analysis cache.

What you cannot do

There is only one profile. wedding-default is it. --profile is an assertion checked against the shoot's resolved profile, not a selector — passing a different name fails with unknown profile "x" — this shoot uses "wedding-default". Keeping several named rulesets and switching between them is not supported today.

aesthetic_floor does nothing. The key is real and the ranking tier exists, but no aesthetic scorer backend ships, so setting it will not move a verdict. See Limitations.

Nothing learns from your tuning. The learning loop that would adapt a profile to your keep/reject history is still ahead, with no release date. For now, profiles are tuned by hand — and every decision you make is being banked for it.