files / tools /lesion_editor /explore_f1.py
milkyroad's picture
Upload folder using huggingface_hub (part 5)
d13c6ce verified
Raw
History Blame Contribute Delete
3.71 kB
"""Explore the current dataset to understand lesion_id, target3, and NROI mixing."""
import json
from datasets import load_from_disk
from collections import defaultdict, Counter
dd = load_from_disk('sandbox/datasets/F_hf_dataset_lesion')
ALL = []
for split in ['train', 'validation', 'test']:
ds = dd[split]
for idx, r in enumerate(ds):
ALL.append({
'split': split, 'idx': idx,
'lesion_id_auto': r['lesion_id'],
'patient_id': r['patient_id'],
'source_dataset': r['source_dataset'],
'track_id': r['track_id'],
'target3': r['target3'],
'filename': r['original_filename'],
})
with open('sandbox/tools/lesion_editor/edits.json') as f:
EDITS = json.load(f)
def edit_key(split, idx):
return f'{split}:{idx}'
def eff_lesion(rec):
k = edit_key(rec['split'], rec['idx'])
if k in EDITS:
return EDITS[k]['lesion_id']
return rec['lesion_id_auto']
# target3 mapping: 0=MT, 1=NML, 2=NROI
TARGET3_NAMES = {0: 'MT', 1: 'NML', 2: 'NROI'}
# 1. What does lesion_id look like for NROI images?
nroi_records = [r for r in ALL if r['target3'] == 2]
nroi_lesion_ids = Counter()
for r in nroi_records:
lid = eff_lesion(r)
nroi_lesion_ids[lid] += 1
print(f'=== NROI (target3=2) images: {len(nroi_records)} ===')
print(f'How many have non-null lesion_id: {sum(1 for r in nroi_records if eff_lesion(r) is not None and eff_lesion(r) != "")}')
print(f'How many have null/empty lesion_id: {sum(1 for r in nroi_records if eff_lesion(r) is None or eff_lesion(r) == "")}')
print(f'Unique lesion_ids among NROI: {len(nroi_lesion_ids)}')
print(f'Sample NROI lesion_ids: {list(nroi_lesion_ids.most_common(10))}')
print()
# 2. Check the raw lesion_id for NROI (before edits)
nroi_auto_lids = Counter(r['lesion_id_auto'] for r in nroi_records)
print(f'NROI auto lesion_ids (top 10): {list(nroi_auto_lids.most_common(10))}')
print()
# 3. Find groups that mix NROI with lesions (MT/NML)
# Build group -> target3 counts
group_targets = defaultdict(Counter)
group_size = defaultdict(int)
for r in ALL:
lid = eff_lesion(r)
group_targets[lid][r['target3']] += 1
group_size[lid] += 1
# Groups with both NROI and non-NROI
mixed_groups = {}
for lid, counts in group_targets.items():
if counts[2] > 0 and (counts[0] > 0 or counts[1] > 0):
mixed_groups[lid] = dict(counts)
print(f'=== Groups mixing NROI with lesions (MT/NML): {len(mixed_groups)} ===')
for lid, counts in sorted(mixed_groups.items()):
total = sum(counts.values())
names = {TARGET3_NAMES[k]: v for k, v in counts.items()}
print(f' {lid}: {total} imgs — {names}')
print()
# 4. Groups that are ALL NROI
all_nroi_groups = {}
for lid, counts in group_targets.items():
if counts[2] > 0 and counts[0] == 0 and counts[1] == 0:
all_nroi_groups[lid] = dict(counts)
print(f'=== Groups that are ALL NROI: {len(all_nroi_groups)} ===')
for lid, counts in sorted(all_nroi_groups.items()):
total = sum(counts.values())
print(f' {lid}: {total} imgs — all NROI')
print()
# 5. Distribution of target3 overall
print(f'=== Overall target3 distribution ===')
overall = Counter(r['target3'] for r in ALL)
for k in sorted(overall):
print(f' {TARGET3_NAMES[k]}: {overall[k]}')
print()
# 6. What are the lesion_id values like? Show some samples
print(f'=== Sample lesion_id values (first 20 unique) ===')
unique_lids = sorted(set(eff_lesion(r) for r in ALL))
print(f'Total unique lesion_ids: {len(unique_lids)}')
for lid in unique_lids[:20]:
counts = group_targets[lid]
names = {TARGET3_NAMES[k]: v for k, v in counts.items()}
print(f' {lid}: {group_size[lid]} imgs — {names}')