Spaces:
Running
on
Zero
Running
on
Zero
| # Aeon Model Test Script | |
| # This script runs the Aeon cancer subtype prediction model on test slides | |
| # for reproducibility and validation. | |
| set -e # Exit on error | |
| # Configuration | |
| TEST_SAMPLES_FILE="test_slides/test_samples.json" | |
| RESULTS_DIR="test_slides/results" | |
| LOG_DIR="test_slides/logs" | |
| SEGMENTATION_CONFIG="Biopsy" | |
| NUM_WORKERS=4 | |
| # Colors for output | |
| GREEN='\033[0;32m' | |
| YELLOW='\033[1;33m' | |
| RED='\033[0;31m' | |
| NC='\033[0m' # No Color | |
| echo "=========================================" | |
| echo "Aeon Model Test Suite" | |
| echo "=========================================" | |
| echo "" | |
| # Create directories | |
| mkdir -p "${RESULTS_DIR}" | |
| mkdir -p "${LOG_DIR}" | |
| # Check if test samples file exists | |
| if [ ! -f "${TEST_SAMPLES_FILE}" ]; then | |
| echo -e "${RED}Error: Test samples file not found: ${TEST_SAMPLES_FILE}${NC}" | |
| exit 1 | |
| fi | |
| # Read test samples | |
| echo "Reading test samples from ${TEST_SAMPLES_FILE}..." | |
| SLIDE_IDS=$(python3 -c " | |
| import json | |
| with open('${TEST_SAMPLES_FILE}') as f: | |
| samples = json.load(f) | |
| for sample in samples: | |
| slide_id = sample.get('slide_id') or sample.get('image_id') | |
| print(slide_id) | |
| ") | |
| # Count slides | |
| NUM_SLIDES=$(echo "${SLIDE_IDS}" | wc -l) | |
| echo -e "${GREEN}Found ${NUM_SLIDES} test slides${NC}" | |
| echo "" | |
| # Process each slide | |
| CURRENT=0 | |
| PASSED=0 | |
| FAILED=0 | |
| for SLIDE_ID in ${SLIDE_IDS}; do | |
| CURRENT=$((CURRENT + 1)) | |
| echo "=========================================" | |
| echo -e "${YELLOW}Processing slide ${CURRENT}/${NUM_SLIDES}: ${SLIDE_ID}${NC}" | |
| echo "=========================================" | |
| # Get slide metadata | |
| METADATA=$(python3 -c " | |
| import json | |
| with open('${TEST_SAMPLES_FILE}') as f: | |
| samples = json.load(f) | |
| for sample in samples: | |
| slide_id = sample.get('slide_id') or sample.get('image_id') | |
| if slide_id == '${SLIDE_ID}': | |
| cancer_subtype = sample.get('cancer_subtype') or sample.get('cancer_type') | |
| print(f\"{cancer_subtype}|{sample['site_type']}|{sample['sex']}|{sample['tissue_site']}\") | |
| break | |
| ") | |
| IFS='|' read -r CANCER_SUBTYPE SITE_TYPE SEX TISSUE_SITE <<< "${METADATA}" | |
| echo "Ground Truth:" | |
| echo " Cancer Subtype: ${CANCER_SUBTYPE}" | |
| echo " Site Type: ${SITE_TYPE}" | |
| echo " Sex: ${SEX}" | |
| echo " Tissue Site: ${TISSUE_SITE}" | |
| echo "" | |
| # Find slide file | |
| SLIDE_FILE=$(find test_slides -name "${SLIDE_ID}.svs" -o -name "${SLIDE_ID}.tiff" -o -name "${SLIDE_ID}.ndpi" 2>/dev/null | head -1) | |
| if [ -z "${SLIDE_FILE}" ]; then | |
| echo -e "${RED}Error: Slide file not found for ${SLIDE_ID}${NC}" | |
| FAILED=$((FAILED + 1)) | |
| continue | |
| fi | |
| echo "Slide file: ${SLIDE_FILE}" | |
| echo "" | |
| # Run Mosaic pipeline with Aeon inference | |
| LOG_FILE="${LOG_DIR}/${SLIDE_ID}_aeon_test.log" | |
| echo "Running Mosaic pipeline..." | |
| if uv run python -m mosaic.cli \ | |
| --input-slide "${SLIDE_FILE}" \ | |
| --output-dir "${RESULTS_DIR}/${SLIDE_ID}" \ | |
| --cancer-subtype "Unknown" \ | |
| --site-type "${SITE_TYPE}" \ | |
| --sex "${SEX}" \ | |
| --tissue-site "${TISSUE_SITE}" \ | |
| --segmentation-config "${SEGMENTATION_CONFIG}" \ | |
| --num-workers "${NUM_WORKERS}" \ | |
| > "${LOG_FILE}" 2>&1; then | |
| # Check if results exist | |
| AEON_RESULTS="${RESULTS_DIR}/${SLIDE_ID}/${SLIDE_ID}_aeon_results.csv" | |
| if [ -f "${AEON_RESULTS}" ]; then | |
| # Extract prediction | |
| PREDICTION=$(python3 -c " | |
| import pandas as pd | |
| df = pd.read_csv('${AEON_RESULTS}') | |
| if not df.empty: | |
| print(f\"{df.iloc[0]['Cancer Subtype']}|{df.iloc[0]['Confidence']:.4f}\") | |
| ") | |
| IFS='|' read -r PRED_SUBTYPE CONFIDENCE <<< "${PREDICTION}" | |
| echo "" | |
| echo "Aeon Prediction:" | |
| echo " Predicted: ${PRED_SUBTYPE}" | |
| echo " Confidence: ${CONFIDENCE}" | |
| echo "" | |
| # Check if prediction matches ground truth | |
| if [ "${PRED_SUBTYPE}" == "${CANCER_SUBTYPE}" ]; then | |
| echo -e "${GREEN}✓ PASS: Prediction matches ground truth${NC}" | |
| PASSED=$((PASSED + 1)) | |
| else | |
| echo -e "${RED}✗ FAIL: Prediction does not match ground truth${NC}" | |
| echo " Expected: ${CANCER_SUBTYPE}" | |
| echo " Got: ${PRED_SUBTYPE}" | |
| FAILED=$((FAILED + 1)) | |
| fi | |
| else | |
| echo -e "${RED}✗ FAIL: Aeon results file not found${NC}" | |
| FAILED=$((FAILED + 1)) | |
| fi | |
| else | |
| echo -e "${RED}✗ FAIL: Mosaic pipeline failed${NC}" | |
| echo "Check log file: ${LOG_FILE}" | |
| FAILED=$((FAILED + 1)) | |
| fi | |
| echo "" | |
| done | |
| # Summary | |
| echo "=========================================" | |
| echo "Test Summary" | |
| echo "=========================================" | |
| echo "Total slides: ${NUM_SLIDES}" | |
| echo -e "${GREEN}Passed: ${PASSED}${NC}" | |
| if [ ${FAILED} -gt 0 ]; then | |
| echo -e "${RED}Failed: ${FAILED}${NC}" | |
| else | |
| echo "Failed: ${FAILED}" | |
| fi | |
| echo "" | |
| if [ ${FAILED} -eq 0 ]; then | |
| echo -e "${GREEN}All tests passed!${NC}" | |
| exit 0 | |
| else | |
| echo -e "${RED}Some tests failed. Check logs in ${LOG_DIR}${NC}" | |
| exit 1 | |
| fi | |