Revert the detection floor: it guards the wrong resolution

Reverts 53f7cdf and e92d22d. The floor those added sat on
Detector::detect, refusing any buffer under 1025px on the reasoning that
a small buffer finds no faces. That reasoning does not survive §4.1:
the detector letterboxes every input to 640x640, so a face occupying 2%
of the frame presents at 12px to the model whether it is handed a 1024px
buffer or a 6000px one. Detector input is precisely the quantity that
does not matter.

Worse than merely useless, it blocks the design FR-CULL-8 now specifies,
where the detector is deliberately fed a downscale and the crop is taken
from the native render. A guard on detect() rejects exactly that call.

What the measurement actually supports is a floor on the *crop* source,
which is where resolution converts into embedding quality, and which
faces.crop_px already records: 47% of the reference library's faces were
upsampled to reach 112x112. That floor is a separate change against the
native-resolution path and does not belong on the detector.

The 23x faces-per-image gap by source_edge that motivated the original
commit is kept in faces.md §7b, restated as the unexplained observation
it is rather than the causal claim it was written as. V12 stands: those
runs cropped at 1024 whatever detection did, and that is reason enough
to look at them again.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-30 19:41:12 +02:00
co-authored by Claude Opus 5
parent 41c655c176
commit 144d2e4e84
4 changed files with 15 additions and 93 deletions
+1 -12
View File
@@ -14,7 +14,7 @@
use ndarray::Array4;
use crate::{install_backend, FaceError, MIN_DETECT_EDGE};
use crate::{install_backend, FaceError};
/// The graph's input edge, in pixels. See the module note: not configurable.
pub const INPUT_EDGE: usize = 640;
@@ -213,17 +213,6 @@ impl Detector {
if width == 0 || height == 0 {
return Ok(Vec::new());
}
// Refused, not merely unproductive. Returning `Ok(vec![])` here would
// let the caller write a run marker meaning "looked, found nothing",
// which is the state that makes the image permanently invisible to
// every later pass. See [`MIN_DETECT_EDGE`].
let edge = width.max(height) as u32;
if edge < MIN_DETECT_EDGE {
return Err(FaceError::ProxyTooSmall {
edge,
needed: MIN_DETECT_EDGE,
});
}
if rgb.len() != width * height * 3 {
return Err(FaceError::ImageShape {
expected: width * height * 3,