Spaces:
Sleeping
A newer version of the Gradio SDK is available: 6.24.0
title: SRH Pathology Validation Study
emoji: 🔬
colorFrom: purple
colorTo: indigo
sdk: gradio
sdk_version: 4.44.1
python_version: '3.11'
app_file: app.py
pinned: false
SRH Pathology Validation Study annotation app
Blinded, resume-safe expert-validation app for the generate-to-discover study on Stimulated Raman Histology.
Two pre-registered arms (see ../protocol.md), one grading unit per screen:
- Task A - realism & memorization: one SRH patch, blinded to source; judge Real vs AI-generated, confidence, whether it looks copied, and clinical plausibility.
- Task B - discovered-category review: a grid of patches the model grouped as one discovered category; judge whether it is a coherent, clinically meaningful morphology (+ optional description). Includes hidden positive/negative controls.
Reused infrastructure
First-login self-setup auth (invite -> choose own username/password, pbkdf2-hashed in a private dataset), localStorage resume (closing the tab does not sign you out), append-only per-(reader,item) storage to a private dataset + local backup, per-image display-only zoom/brightness/contrast, blinded + deterministic per-reader randomization, and a fully on-screen self-explanatory UI.
Run locally
pip install -r requirements.txt
python build_cases_example.py # generates data/cases.json + placeholder SRH-like images (demo)
python app.py # http://127.0.0.1:7860 (demo invites reader1/changeme)
Deploy as a Hugging Face Space (Gradio)
Upload app.py, requirements.txt, README.md, and (for a demo) data/. Set secrets in Settings:
HF_TOKEN(write) for the private response/account dataset.READER_CREDENTIALS= JSON of one-time invites, e.g.{"Dr A":"<pw1>","Dr B":"<pw2>"}.RESPONSE_DATASET= e.g.DrSyedFaizan/srh-reader-responses(private, auto-created).CASES_DATASET(optional) = private dataset with the realcases.json+ images (pulled at boot).APP_SECRET(optional) = random string signing resume tokens.
Storage schema (robust)
Append-only per reader (responses/<reader>.jsonl), one record per graded item keyed by
(annotator, case_id) with arm and a dims dict of the arm's answers (Task A stores the hidden
true_source; Task B stores cluster_id and is_control). Layout/wording changes never overwrite prior data.
Real cases
Run build_cases_example.py and read its docstring for the exact schema, then replace the demo with real
generated/real SRH patches (Arm A) and discovered-cluster exemplars (Arm B) via a private CASES_DATASET.