Detect and confirm page orientation during automatic splitting

Bundle the trained heatmap/image orientation model and run it after provisional
blank-page and split analysis. Confirm candidates with Gemini using low thinking;
resolve mixed A3 sheet ordering with the complete statement and medium thinking.
Keep A4 scans independent and export paired A3 scans in booklet reading order.

Reanalyse uniformly inverted source sheets, validate ordering permutations, and
preserve source provenance, corrected rotations and reading slots in manual review.
Document the experiments, rejected approaches, calibration and runtime limits.

Validation: focused splitting/orientation regression suites pass; bundled model
checksum and wheel assets verified. Full Interro07 offline run: 44.26 seconds,
eight candidates, mocked upright confirmations, source hashes and geometry intact.
This commit is contained in:
sebastien committed 2026-11-04 21:07:20 +01:00
1 parent 78f3e4b2f0
commit 0a4f4a80d0
21 files changed
+1574 -51

No files matched your search

+77 -3
View File
@@ -5,7 +5,9 @@
The “Séparer et réordonner les pages” step now offers **Manuellement** and
**Automatiquement**. Automatic processing runs in the background using the
standard splitter, publishes PDFs in `Copies`, and preserves source scans in
`Copies Originales`. It retains source-page order. The parallel-copy setting
`Copies Originales`. A4 scans keep their positions; consecutive A3 scans are paired
and exported in booklet reading order (outer right, inner left, inner right,
outer left). The parallel-copy setting
appears only for automatic processing. Existing single-copy and marked-copy
selection work in both modes.
@@ -14,7 +16,7 @@ preserved original. The editor displays independent overlapping output crops
and crosses out removed blank pages. Advancing accepts the displayed decision;
the existing keep/discard shortcuts override it. Moving a splitter resumes
manual splitting on that page. Reviewing automatic proposals preserves their
source-page order; the original manual workflow retains its booklet ordering.
saved reading order, source rotations and individual-half corrections.
Proposals are reused only while both source and output fingerprints still match.
Each automatic run saves its inputs, report/gallery, and previous outputs under
@@ -59,10 +61,82 @@ run may leave partial outputs; use a new output directory for a subsequent run.
## Decisions
### Orientation and physical sheets
After provisional blank/middle detection, each nonblank logical page is screened
using the bundled conservative orientation model. Model weights and dependencies
are included in the installed package; no runtime model download is required.
Gemini confirms only candidates, returning `upright`, `inverted` or `inconclusive`.
An inconclusive reply is treated as upright for the remainder of the run.
`MODEL_FOR_PAGE_ORIENTATION` can select the confirmation model; its default `None`
inherits `MODEL_FOR_LABEL_ID`. Orientation confirmations use low thinking;
page-ordering requests use medium thinking. Both use structured responses.
A4 scans are independent, even when adjacent: correct a confirmed inversion and
keep its position. A3 scans are paired only when consecutive; an unpaired A3 scan
is flagged for manual review. Once an A3 inversion is confirmed, Gemini checks
all other nonblank pages on that sheet, including pages the local model did not
flag. Blank logical slots remain available until sheet ordering is resolved.
- If every logical page is blank or confirmed inverted, turn both source faces
180°, recompute blank/middle/overlap decisions, then apply normal booklet order.
- Otherwise turn only the inverted logical pages. Send the full evaluation
`enonce.pdf` (including supported filename aliases) and all sheet images,
including blanks, to Gemini for a reading-order permutation. Validate that every
slot occurs exactly once, then remove blank pages from the final export.
A request failure, malformed orientation reply, invalid permutation or missing
énoncé for mixed-sheet ordering aborts analysis before publication. These errors
are not interpreted as inconclusive handwriting. Existing copies and originals
remain untouched. The report stores screen scores, replies, source/logical
rotations, physical-sheet grouping and final page numbers. Manual acceptance
preserves that order; reinstating a blank proposal restores its reading-order slot.
The standalone analysis tool remains a geometry-only baseline by default. To
exercise orientation and booklet ordering without publishing into `Copies`:
```sh
python -m copienator.auto_page_split 'EVALUATION/Copies Originales' tmp/oriented-review \
--workers 4 --orientation --statement EVALUATION/enonce.pdf
```
See [the decision record](page_orientation.md) for the trained model, rejected
approaches and calibration limits. Its earlier timings exclude live Gemini latency.
### Integration verification (2026-11-04)
The maintained implementation passes 65 focused tests, including A4 independence,
A3 booklet order, blank siblings, inconclusive replies, full-source reanalysis,
mixed-sheet image rotation and full-statement ordering payloads, invalid response
rejection, failure preservation, and manual acceptance/reinstatement/secondary cuts.
Wheel inspection confirms that weights, settings, ONNX model and license ship with
the package.
An isolated full Interro07 run took **44.26 seconds** with four workers: 47 PDFs,
214 scans, 347 kept pages, 73 blank halves removed, eight detector candidates.
Gemini replies were mocked as upright; no live requests were sent. Source hashes,
blank decisions and boundaries match the reference; output page mappings match
the new reading order. This checks local computation and request routing, not
live Gemini accuracy or latency. The evidence is under
`tmp/orientation-implemented-interro07-verified/` (`timing.json`, `report.json`,
`verification.json`).
A subsequent one-off live check of precisely those eight candidates used
`gemini-3.8-flash`, thinking `low`, four concurrent workers and no retries.
Gemini classified **all eight as upright**, with no inconclusive or inverted
verdicts. Request wall time was **9.64 s**, with individual calls taking
**3.33–5.96 s**. No sibling investigations or ordering calls were needed, and no
evaluation PDFs were modified. This was a separate confirmation-only run, not a
measured complete splitting run with live latency included. Exact source crops,
per-page scores/verdicts/times and unchanged-source verification are saved under
`tmp/orientation-eight-live-flash/` (`results.json`).
Displayed physical dimensions distinguish A3 landscape spreads from A4 sheets,
with a 5% tolerance. A4 landscape sheets are also retained whole. Unexpected
sizes and portrait A3 pages are retained whole and flagged. PDF rotation is
respected; handwriting orientation is not inferred.
respected. Automatic evaluation processing additionally applies the orientation
and physical-sheet rules above; standalone analysis requires `--orientation`.
The standard splitter renders a 75 dpi overview, accepts clearly written pages,
and analyses a central 10% strip at the requested 200 dpi for overflow ownership.