flow_grpo_cxr / analysis_tools /validate_joint_reward_dataflow.py
zhui711's picture
Upload folder using huggingface_hub
535fb25 verified
Raw
History Blame Contribute Delete
2.4 kB
#!/usr/bin/env python3
from __future__ import annotations
import json
import os
from pathlib import Path
from typing import Any
import numpy as np
from PIL import Image
from flow_grpo.radiomics_reward import select_mask_roi
DEFAULT_TEST_JSONL = "/home/wenting/zr/wt_dataset/LIDC_IDRI/anno/cxr_synth_anno_mask_test.jsonl"
def _read_one_jsonl(path: Path) -> dict[str, Any]:
with open(path, "r", encoding="utf-8") as handle:
for line in handle:
if line.strip():
return json.loads(line)
raise RuntimeError(f"No samples found in {path}")
def _load_mask_npz(path: Path, key: str = "mask") -> np.ndarray:
with np.load(path) as data:
selected_key = key if key in data.files else data.files[0]
return data[selected_key]
def _image_summary(path: Path) -> dict[str, Any]:
with Image.open(path) as image:
return {"path": str(path), "mode": image.mode, "size": list(image.size)}
def main() -> int:
jsonl_path = Path(os.environ.get("TEST_JSONL") or os.environ.get("TRAIN_JSONL") or DEFAULT_TEST_JSONL)
sample = _read_one_jsonl(jsonl_path)
output_image = Path(sample["output_image"])
output_mask = Path(sample["output_mask"])
mask = _load_mask_npz(output_mask, os.environ.get("MASK_NPZ_KEY", "mask"))
roi_lung, lung_channels = select_mask_roi(mask, mask_channels=[0, 1], mode="union")
roi_all, all_channels = select_mask_roi(mask, mask_channels="all", mode="union")
result = {
"jsonl": str(jsonl_path),
"sample_id": sample.get("sample_id"),
"patient_id": sample.get("patient_id"),
"input_images": sample.get("input_images"),
"gt_output_image": _image_summary(output_image),
"gt_output_mask": str(output_mask),
"mask_array_shape": list(mask.shape),
"mask_array_dtype": str(mask.dtype),
"channels_0_1": lung_channels,
"roi_pixels_channels_0_1": int(roi_lung.sum()),
"channels_all": all_channels,
"roi_pixels_all": int(roi_all.sum()),
"generated_mask_required": False,
}
print(json.dumps(result, indent=2, sort_keys=True))
if int(roi_lung.sum()) <= 0:
raise SystemExit("Selected [0, 1] ROI is empty.")
if int(roi_all.sum()) <= 0:
raise SystemExit("Selected all-channel ROI is empty.")
return 0
if __name__ == "__main__":
raise SystemExit(main())