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:
1 parent
78f3e4b2f0
commit
0a4f4a80d0
21 files changed
+1574
-51
No files matched your search
+77
-3
@@ -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.
|
||||
|
||||
Reference in new issue
Block a user