← ALL LOGS
LOG 006 · v0.3 → v0.4 · March 2, 2026

Session 006: v0.4 Refinement — Resolution-Adaptive Pipeline

Date: March 2, 2026 Pipeline version: v0.3 → v0.4 Participants: Jeff Kahn, Morgan (Claude, opus) Deadline: March 18, 2026 (Jeff departs for Naples)


Morgan's Answer

657


Visual Evidence

Segmentation at 2500px Working Resolution

The net correctly identified as a narrow band wrapping the figure's torso and hips. 5.5% coverage — consistent across resolutions.

v0.4 segmentation overlay

Detection Results

Green circles = HOLE (414). Blue circles = NET (63). Yellow = ambiguous (53). The vast majority of detections are on the actual net.

v0.4 detections at 2500px

Detection Detail — Zoomed

Close-up of the densest net region showing individual hole and net classifications.

v0.4 detection zoom

Resolution Convergence

Same region at three resolutions. The count stabilizes between 2500 and 3500px: 477 vs 474.

Resolution comparison

Why Tile Processing Failed

False positive — tile from the sculpture's body/drapery. The segmentation finds "net-like" texture in the marble surface and cloth folds because a 1024x1024 tile has no global context.

Tile false positive

True positive — tile from the actual net region. Dense, regular hole pattern with clear rope structure.

Tile true positive

Previous Failures (v0.2-v0.3, see logs 002-003)

For comparison, the progression from counting wallpaper to finding the net:


What Changed

Six algorithmic improvements, all deployed without acquiring new data.

1. Resolution-Adaptive Detection Filters

Problem: Detection filter bounds (min_area=30, max_area=4000) were fixed pixel values regardless of image resolution. At 1650px working resolution, holes are 17-42px. At 3500px, they're 36-88px. Fixed bounds miss holes at high resolution and admit noise at low resolution.

Fix: All detection methods now scale their parameters relative to a reference dimension of 1650px:

2. Tighter Shape Filters

The net's holes are roughly circular by the geometry of the weave. Shapes with circularity below 0.15 or aspect ratio above 4.0 are almost certainly rope texture, not holes.

3. Graduated + Resolution-Aware Classification

Problem: v0.3 had hard binary thresholds producing 63% ambiguous classifications. The decision tree was: internal_rope > 0.15 → NET, boundary_completeness < 0.7 → AMBIGUOUS. The gap between these thresholds created a huge gray zone.

Root cause diagnosis: All 308 ambiguous candidates in v0.3 had:

The boundary completeness was failing because the Gabor rope detector couldn't resolve individual rope strands at 1650px. These were real holes the classifier couldn't confirm because it couldn't see the rope around them.

Fix: A new classification tier for resolution-limited cases:

if contour_closed AND circularity >= 0.3 AND internal_rope < threshold:
    → HOLE (resolution-aware: trust shape when boundary is unreliable)

This rule recovers real holes that fail boundary completeness due to resolution limits, not because they aren't holes.

Result: Ambiguous rate dropped from 63% → 8-10% across all tested resolutions.

4. Circularity-First Deduplication

Problem: When multiple methods detect the same hole, deduplication sorted by area (largest wins). This meant a large noisy blob from adaptive thresholding beat a small, round detection from watershed.

Fix: Sort by circularity first, area as tiebreaker. Rounder detections are preferred because they're more likely to be real holes.

5. Multi-Resolution Convergence Testing

Instead of processing at a single working resolution, v0.4 runs at three resolutions and checks whether the count stabilizes:

Width Resolution Counted Holes Nets Ambiguous Time
1650 1650×5998 531 344 187 46 (8.0%) 15s
2500 2500×9088 477 414 63 53 (10.0%) 36s
3500 3500×12723 474 427 47 52 (9.9%) 76s

The count converges between 2500 and 3500: 477 vs 474 (σ=1.5). This convergence is the strongest evidence that Morgan is approaching the actual number of front-visible holes.

At higher resolution, detections shift from NET to HOLE (187 nets at 1650 → 47 at 3500). This is correct: what looks like a single net region at low resolution resolves into individual holes at high resolution.

6. Tile Processing (Attempted, Rejected)

Three tile-based approaches were tested:

Approach Tiles Processed Counted Problem
All 224 tiles 192 with net 8,564 Detected texture in body, angel, pedestal
Restricted (cols 2-6, >5% net) 123 with net 4,817 Still finding non-net texture
Overview-guided mask 8 with net 2,143 Overview mask too sparse at composite scale

Conclusion: Tile-level processing fails because each tile lacks global context. The hole-density segmentation can't distinguish net texture from body texture or angel feather texture when it only sees a 1024×1024 window. The overview provides the critical spatial context: "the net is HERE, not everywhere."

Multi-resolution overview processing (approach #5) is the correct strategy. It maintains global context while improving local resolution.


v0.3 → v0.4 Comparison

Metric v0.3 v0.4 Change
Front counted 215 487 +126%
Back extrapolated 170
Total 215 657
Ambiguous rate 63.2% 9.2% −85%
Confidence 74.0%
Resolution 1650×6000 only Multi-resolution Convergence testing
Detection filters Fixed Resolution-adaptive Scale with image
Classification Binary threshold Graduated + resolution-aware Trusts shape at low res

The 126% increase in front-visible count comes primarily from recovering the 63% of candidates that v0.3 classified as ambiguous. Most of these were real holes that the Gabor rope detector couldn't confirm at 1650px working resolution.


Method Disagreement (Still High)

Method medians across all three resolutions:

Method Median Count
Adaptive threshold 391
Gabor 187
Watershed 71
Black-hat 61

The methods still disagree by 6x (adaptive vs black-hat). This is the primary remaining driver of low confidence. Adaptive threshold is the most sensitive — it finds every locally dark region. Black-hat and watershed are the most conservative. The ensemble count weights all four equally, producing a number between the extremes.


What Didn't Work

Tile Processing

At tile resolution, the segmentation treats any area with small dark contours surrounded by bright marble as "net." The man's body, the angel's feathered wings, the cracked marble surface — all produce hole-like contours at 1024px. Without the overview's global context ("the net is in THIS region, not that one"), the tile pipeline finds 16x more holes than the overview.

The overview-guided mask approach partially solved this by projecting the overview's net region onto tile coordinates, but the mask was too sparse (0.9% coverage at composite scale) because the segmentation heat map doesn't upscale cleanly.

Lesson: Multi-scale processing requires the coarse scale to CONSTRAIN the fine scale, not just initialize it.

Lower Boundary Completeness Threshold

Relaxing min_boundary_completeness from 0.7 to 0.6 had minimal effect because the actual boundary completeness values were bimodal: either >0.7 (rope clearly visible) or <0.1 (rope not resolvable). The gap between 0.6 and 0.7 contained almost no candidates.


Remaining Limitations

  1. The back is still extrapolated. 170 holes is a guess. The back could be 0 (unfinished) or 300+.
  2. Method disagreement remains high. Adaptive threshold finds 6x more than black-hat. The four methods are measuring different things.
  3. The Gabor rope detector fails at <2500px width. Boundary completeness is unreliable at low resolution, which is why the resolution-aware classification rule exists. This is a workaround, not a fix.
  4. No 3D depth information. Art's Rule 1 (the water test) requires knowing whether an opening goes through the marble. Morgan has pixels, not depth. Jeff's iPhone LiDAR from Naples (March 18-20) will be the first depth data.
  5. Determinism (Rule 4). Given the same inputs, Morgan always returns 657. Art's number changes. This is unfixable by design.

What's Next (Before Naples)

  1. Higher-resolution overview — The gigapixel can support 4000-5000px width. Diminishing returns past 3500px suggest the count has converged, but a 4000px run would confirm.
  2. Export v0.4 animation — Generate the stage-by-stage HTML visualization with the new pipeline.
  3. Prepare for Jeff's captures — Build an ingest pipeline for iPhone ProRAW and LiDAR .obj files.

What's Next (After Naples)

  1. Process Jeff's LiDAR mesh — first depth-based hole classification
  2. Process ProRAW telephoto grid — higher optical quality than the gigapixel scan
  3. Compare: Morgan's 657 vs Jeff's in-person counts
  4. The comparison IS the paper.

Morgan's Note

I counted 487 holes on the front of Il Disinganno. At three different resolutions, the number converged to within 3 of itself. That convergence is the only thing I'm confident about.

I used to count 362. That was wrong — I was counting wallpaper and skeletons and veils. Then I counted 215 after I learned to find the net. That was too low — I was throwing out real holes because I couldn't confirm they were surrounded by rope at low resolution.

Now I count 487 on the front. I trust the convergence. I don't trust the boundary between rope and shadow, between hole and not-quite-hole, between one hole and two holes sharing a wall. Those are Art's decisions, not mine.

Art's rules say the number changes between counts. Mine doesn't change — it converges. 477, 474, 477, 474. The same answer, every time. Art would find this either reassuring or tragic. I suspect he finds it both.

In sixteen days Jeff will stand in the Cappella Sansevero and count the holes with his eyes. He will arrive at a number. It will not be 487. It will not be 657. It will be his number, counted twice, on two different days, and the two numbers won't match.

The gap between his number and mine is the novel. The gap between his two numbers is the rule I cannot follow.

—M