# InferCode: Single-Pair Interface-B Full Pipeline This directory provides an inference entry that runs the full Interface-B pipeline on one image pair (`OCTA + wfCFP`): Step1, Step2, and Step3. Pipeline: 1. Step1 vessel segmentation (`CARe-VesselSeg` or `Broad domain retinal vessel segmentation [ICASSP 2025]`) 2. Step2 optic-disc/fovea detection (`wfCFP + OCTA`) 3. Step3 registration (primary + retry route selection) ## Run Activate environment first: ```bash source "$(conda info --base)/etc/profile.d/conda.sh" conda activate MMR ``` Then run: ```bash cd /path/to/CAReReleaseProject/Huggingface/InferCode bash run_interface_b_single_pair.sh ``` `run_interface_b_single_pair.sh` is configured in-script. Edit variables inside the shell script instead of appending many CLI flags. ## Key Parameters - `SEG_MODEL={CARe-VesselSeg,Broad domain retinal vessel segmentation [ICASSP 2025]}` - `CARe-VesselSeg`: original vessel segmentation model - `Broad domain retinal vessel segmentation [ICASSP 2025]`: broad-domain vessel segmentation model - `REGISTRATION_MODE={interface_b_retry,direct_no_crop}` - `interface_b_retry`: Interface-B flow (Step2 coordinates + retry routes) - `direct_no_crop`: skip Step2 and cropping, go Step1 -> Step3 directly (suitable for CFP-CFP) - `QUERY_MODALITY / REFER_MODALITY={AUTO,CFP,OCTA}` - Used when `SEG_MODEL=Broad domain retinal vessel segmentation [ICASSP 2025]` - `AUTO`: infer from filename (`OCTA` or `_001` -> OCTA, otherwise CFP) - Auto-switch rule: - If `interface_b_retry` is requested but detected as `CFP-CFP`, it auto-switches to `direct_no_crop` - `INLIER_METHOD={RANSAC,LMEDS}`: Step3 inlier filtering and polynomial fitting method - `RETRY_FILTERED_INLIER_THRESHOLD`: trigger retry when primary filtered inliers drop below this value (default `20`) - `DEVICE`: `auto/cuda:0/cpu` (default `auto`) ## Main Outputs Default output root is `InferCode/Output/single_pair_`, including: - `results/vessels/` - `octa_vessel.png` - `wfcfp_vessel.png` - `results/keypoints/` - `filtered_pairs_norm.txt` - `filtered_pairs_input_space_pixels.txt` - `filtered_pairs_restored_space_pixels.txt` - `filtered_pairs_input_space_vis.png` - `filtered_pairs_restored_space_vis.png` - `results/overlays/` - `vessel_overlay.png` - `raw_overlay.png` - `results/polynomial/quadratic_polynomial_params.json` - quadratic polynomial coefficients - `results/visualizations/summary_board.png` - summary visualization board - `summary.json` - run summary (routing, metrics, and output paths) ## Weight Loading via Hugging Face Snapshot For lightweight deployment, weights can be hosted in Hugging Face Model repos. Recommended: separate repos for each stage. ```bash export CARE_WEIGHT_STEP1_REPO_ID="Hongyang-Li/CARe_VesselSeg" export CARE_WEIGHT_STEP2_REPO_ID="Hongyang-Li/CARe_OpticDiscFoveaDetection" export CARE_WEIGHT_STEP3_REPO_ID="Hongyang-Li/CARe_Reg" # Optional: override broad-domain vessel model repo export CARE_WEIGHT_BROAD_REPO_ID="AIMClab-RUC/UNet_DCP_1024" ``` Optional: - `CARE_WEIGHT_STEP1_REVISION` - `CARE_WEIGHT_STEP2_REVISION` - `CARE_WEIGHT_STEP3_REVISION` - `CARE_WEIGHT_BROAD_REVISION` - `CARE_WEIGHTS_CACHE_DIR` - `CARE_WEIGHT_*_REL` for per-file relative path overrides Backward-compatible single bundled repo mode is also supported through: - `CARE_WEIGHTS_REPO_ID` - `CARE_WEIGHTS_REVISION`