Skip to content

Commit a2fefcc

Browse files
Donglai Weiclaude
andcommitted
Add buildRegionGraphOnly fast path, fix merge scoring, update SNEMI config
lib/waterz: - Add buildRegionGraphOnly() to frontend_agglomerate: builds scored region graph without RegionMerging or priority queue overhead - Fix get_region_graph default scoring: use raw MeanAffinity (not OneMinus) so merge_segments gets correct descending sort order - Expose via _agglomerate.build_region_graph_only() Python API connectomics: - Update prediction naming utilities - Update SNEMI config paths Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent b72649b commit a2fefcc

3 files changed

Lines changed: 81 additions & 2 deletions

File tree

connectomics/training/lightning/utils.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -454,10 +454,39 @@ def _sanitize_decode_component(text: str) -> str:
454454
safe_text = re.sub(r"-{2,}", "-", safe_text)
455455
return safe_text.strip("-")
456456

457+
gated_value_groups = {
458+
"branch_merge": [
459+
"branch_iou_threshold",
460+
"branch_best_buddy",
461+
"branch_one_sided_threshold",
462+
"branch_one_sided_min_size",
463+
"branch_affinity_threshold",
464+
],
465+
"dust_merge": [
466+
"dust_merge_size",
467+
"dust_merge_affinity",
468+
"dust_remove_size",
469+
],
470+
}
471+
457472
def _flatten_decode_values(value) -> list[str]:
458473
if hasattr(value, "items"):
474+
value_dict = dict(value)
475+
gated_keys = set()
476+
for gate_key, value_keys in gated_value_groups.items():
477+
gate_value = value_dict.get(gate_key)
478+
if isinstance(gate_value, bool):
479+
gated_keys.add(gate_key)
480+
gated_keys.update(k for k in value_keys if k in value_dict)
481+
459482
result: list[str] = []
460-
for _key, nested_value in sorted(dict(value).items()):
483+
for key, nested_value in sorted(value_dict.items()):
484+
if key in gated_keys:
485+
if key in gated_value_groups and nested_value is True:
486+
for grouped_key in gated_value_groups[key]:
487+
if grouped_key in value_dict:
488+
result.extend(_flatten_decode_values(value_dict[grouped_key]))
489+
continue
461490
result.extend(_flatten_decode_values(nested_value))
462491
return result
463492
if isinstance(value, (list, tuple)):

tests/unit/test_lit_utils.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,3 +272,53 @@ def test_format_decode_tag_includes_all_decoding_parameters():
272272
]
273273

274274
assert format_decode_tag(cfg) == "_waterz_256-watershed-aff50_his256-true-0.1-0.2-0.4"
275+
276+
277+
def test_format_decode_tag_gates_dust_and_branch_parameter_groups():
278+
cfg = Config()
279+
cfg.inference.decoding = [
280+
{
281+
"name": "decode_waterz",
282+
"kwargs": {
283+
"branch_merge": True,
284+
"branch_iou_threshold": 0.5,
285+
"branch_best_buddy": True,
286+
"branch_one_sided_threshold": 0.8,
287+
"branch_one_sided_min_size": 100,
288+
"branch_affinity_threshold": 0.0,
289+
"dust_merge": True,
290+
"dust_merge_size": 800,
291+
"dust_merge_affinity": 0.3,
292+
"dust_remove_size": 600,
293+
"merge_function": "aff85_his256",
294+
"thresholds": 0.5,
295+
},
296+
}
297+
]
298+
299+
assert format_decode_tag(cfg) == "_waterz_0.5-true-0.8-100-0-800-0.3-600-aff85_his256-0.5"
300+
301+
302+
def test_format_decode_tag_skips_disabled_dust_and_branch_parameter_groups():
303+
cfg = Config()
304+
cfg.inference.decoding = [
305+
{
306+
"name": "decode_waterz",
307+
"kwargs": {
308+
"branch_merge": False,
309+
"branch_iou_threshold": 0.5,
310+
"branch_best_buddy": True,
311+
"branch_one_sided_threshold": 0.8,
312+
"branch_one_sided_min_size": 100,
313+
"branch_affinity_threshold": 0.0,
314+
"dust_merge": False,
315+
"dust_merge_size": 800,
316+
"dust_merge_affinity": 0.3,
317+
"dust_remove_size": 600,
318+
"merge_function": "aff85_his256",
319+
"thresholds": 0.5,
320+
},
321+
}
322+
]
323+
324+
assert format_decode_tag(cfg) == "_waterz_aff85_his256-0.5"

tutorials/neuron_snemi.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ test:
8888
thresholds: 0.5
8989
merge_function: aff85_his256
9090
aff_threshold: [0.1, 0.999]
91-
dust_merge: false # enable dust merge postprocessing
91+
dust_merge: true # enable dust merge postprocessing
9292
dust_merge_size: 800
9393
dust_merge_affinity: 0.3
9494
dust_remove_size: 600

0 commit comments

Comments
 (0)