Skip to content

Feat root pe - #789

Open
anna-grim wants to merge 9 commits into
mainfrom
feat-root-pe
Open

anna-grim wants to merge 9 commits into
mainfrom
feat-root-pe

Conversation

@anna-grim

Copy link
Copy Markdown
Collaborator

No description provided.

Anna Grim and others added 9 commits September 25, 2026 22:14
…ts GCS calls

- models/joint_model.py: JointProofreader with shared CNN3D backbone, Arborist
  merge head, and HGAT split head; routes batches by task at forward time
- models/new_gnn_models.py: NewVisionHGAT for standalone split correction
- split_datasets.py: replace list_gcs_subdirectories(bucket, prefix) calls with
  list_gcs_subprefixes(full_gcs_path) to match the current util API

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… fixes

- models/joint_model.py: add JointProofreader (joint split+merge model with
  shared CNN3D backbone, Arborist merge head, and 3-layer HGAT split head)
- models/new_gnn_models.py: add gat3 (3rd HGAT layer), bump gnn_hidden_dim
  and img_embed_dim defaults 64→96, add ProposalTreeEncoder
- split_proofreading/new_split_feature_extraction.py: add ArboristSplitDataset
  (prefetched iterator with Arborist tree features alongside image patches)
- split_proofreading/split_inference.py: route to ArboristSplitDataset when
  use_tree_features=True (required by JointProofreader split head)
- configs.py: add fov_merge to ImageConfig (load at fov, resize to patch_shape
  for merge detection); add modality to MergeInferenceConfig; add
  model_config_path and use_tree_features to SplitInferenceConfig; add
  keys/__getitem__ to Config base class
- machine_learning/image_dataloader.py: DetectionPatchLoader loads at
  fov_merge when set, then resizes to patch_shape before returning
- machine_learning/train.py: add n_mistake_mips reservoir-sampled mistake MIP
  saving per val epoch
- utils/img_util.py: cast img to float32 before np.percentile to fix NaN on
  float16 arrays (all-white MIP bug)
- merge_proofreading/search_datasets.py: fix subgraph_to_tree_sample root arg
- proofreading_pipeline.py: pass modality and use_tree_features from configs
- proposal_graph.py: accept **kwargs in __init__ for forward-compat
- utils/geometry_util.py: guard is_double against empty query_nodes

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…mask

new_split_feature_extraction.py: replaces old _build_line_graph_edge_index
+ manual root detection with build_tree_sample, removes per-curve
self.transform (graph_transform already covers rotation/flip before
decomposition), and switches to in-place backward differencing.

image_dataloader.py: removes dead get_foreground_nodes call in
create_mask — the result only fed annotate_foreground which was
commented out (TEMP). At inference scale this was a full kdtree query
per proposal with no effect on output.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
proposal_graph.py + groundtruth_generation.py: groundtruth run() now
also returns on_gt_ids (fragments that have GT alignment); proposals
where either fragment is off-GT are discarded before training so their
unknown labels don't corrupt the loss.

split_feature_extraction.py: stub create_segment_mask to zeros (old
implementation used graph.kdtree which is being removed from the
critical path); bump branch fill_val from 0.5 to 1.

ml_util.py: BinaryMetricAccumulator.compute now accepts min_precision
alongside min_recall and reports f1_at_precision from the PR curve.

merge_datamodules.py, point_cloud_models.py: remove unused code.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
CNN3D with use_output_head=True already provides the same capability;
callers can import it directly from new_vision_models.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The eval path constructed a bare TreeSample, so edge_type, hop_dist,
heat basis, curve_endpoints and curve_geom were missing. Route through
the arborist factory so inference sees the same structural fields as
training.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- JointProofreader merge path concatenates the Arborist CLS embedding with
  the mean of the root-adjacent curve embeddings. The merge site is the
  root, so the local geometry of the curves meeting there is read out
  directly instead of only through CLS attention. merge_head input grows
  by arborist_latent_dim.
- Mask channel: img_util.soften_mask renders exp(-d^2 / 2 sigma^2) of the
  distance to the skeleton after resizing to patch_shape, controlled by
  ImageConfig.mask_sigma (default 1.5 voxels; 0/None keeps binary). A
  one-voxel skeleton was nearly erased by the first pooling layer. Applied
  in both DetectionPatchLoader (merge) and PatchFeatureExtractor (split);
  mask_sigma is threaded through FragmentsDataset -> ImageExtractor.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
FragmentsDataset stored img_config.transform but never applied it, so
split training ran without any image augmentation. Thread `transform`
through FeaturePipeline -> ImageFeatureExtractor -> PatchFeatureExtractor
and apply it to the stacked (2, D, H, W) patch after resizing and mask
softening, before the float16 cast.

Also fixes the previous commit: split_datasets passed mask_sigma to
FeaturePipeline, which did not accept it yet.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Each ts.open without an explicit context created its own 8 GB cache
pool, so memory scaled linearly with the number of brains and blocks
loaded. A single module-level context bounds the decoded-chunk cache
and GCS request concurrency globally.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant