diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..c57f26c55a9c643555da583119a9734096433d2d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,77 @@ +# Tri-Netra AI AI - HuggingFace Spaces (Docker SDK) image. +# +# Build target: a small public demo of the layered brain-MRI tumor pipeline. +# Inference is ONNX-only (~430 MB total for v3 UNet + T1c specialist + 3 +# classifiers), so CPU on free Spaces is fast enough (~30-40 ms/image). +# The LLM explanation defaults to HuggingFace Inference Providers (open-weight +# Llama 3.3 70B + Gemma 3 27B IT via $HF_TOKEN Space secret); if no token is +# set the dashboard falls back to the deterministic radiology report which is +# rich on its own and zero-hallucination by construction. +# +# Model weights are NOT bundled into this image (the HF Space free-tier 1 GB +# repo cap is too small). dashboard.py downloads them from a separate HF +# Model repo (default: anannyavyas1/Tri-Netra-AI-Models) on first boot via +# huggingface_hub. See scripts/upload_models_to_hf.py for how to populate +# that Model repo from your local .pt -> .onnx exports. + +FROM python:3.11-slim + +# System deps: libgl/libglib for OpenCV (cv2), libgomp for ONNXruntime +# parallelism, curl for the Spaces health probe. +RUN apt-get update && apt-get install -y --no-install-recommends \ + libgl1 \ + libglib2.0-0 \ + libgomp1 \ + curl \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /app + +# Install Python deps first so Docker layer caching speeds up rebuilds when +# code changes but requirements don't. +COPY requirements-spaces.txt /app/requirements-spaces.txt +RUN pip install --no-cache-dir --upgrade pip \ + && pip install --no-cache-dir -r requirements-spaces.txt + +# Copy application code. We intentionally do NOT copy datasets, training +# scripts, or any model weights; only what the dashboard actually needs at +# request time. ONNX weights are fetched from anannyavyas1/Tri-Netra-AI-Models on +# first boot - see _ensure_onnx_models_downloaded() in dashboard.py. +COPY dashboard.py /app/dashboard.py +COPY src /app/src +COPY web_dashboard /app/web_dashboard +# Empty per-model directories so .pt/.onnx downloads land in predictable +# paths (find_weights_path searches these). Also drop in any small +# metrics .json that's present (for /metrics) - missing is fine. +COPY real_eval_current /app/real_eval_current +COPY segmentation_artifacts /app/segmentation_artifacts + +# Spaces convention: PORT=7860 and bind 0.0.0.0. The dashboard reads both from +# environment so no CLI flag is needed. +ENV PORT=7860 \ + HOST=0.0.0.0 \ + PYTHONUNBUFFERED=1 \ + PYTHONIOENCODING=utf-8 \ + LOG_LEVEL=INFO + +# Prefer ONNX over PyTorch on the inference path. Override with ONNX_DISABLE=1 +# to debug-fall-back to the PyTorch path. +ENV ONNX_DISABLE= + +# LLM defaults for the public demo. The deployer adds HF_TOKEN as a Space +# secret to enable the layered LLM pipeline; without it the dashboard returns +# the deterministic radiology report (still very rich + zero hallucinations). +ENV HF_MODEL_TEXT="meta-llama/Llama-3.3-70B-Instruct" \ + HF_MODEL_VISION="google/gemma-3-27b-it" + +# Where to fetch ONNX weights from on first boot. Point at your own Model +# repo if you forked. +ENV HF_MODELS_REPO="anannyavyas1/Tri-Netra-AI-Models" + +EXPOSE 7860 + +# HF Spaces health probes /health (we expose it explicitly in dashboard.py). +HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \ + CMD curl -fs http://localhost:${PORT}/health || exit 1 + +CMD ["python", "dashboard.py"] diff --git a/Documentation/NeuroLens AI A Comparative Deep Learning Framework.pdf b/Documentation/NeuroLens AI A Comparative Deep Learning Framework.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d3b6979bb7930c113752b49bed39c455069d3db8 --- /dev/null +++ b/Documentation/NeuroLens AI A Comparative Deep Learning Framework.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a33aa8b71bd014fa7db56777c980280743196f84a381f1330c8ea451b8866fe4 +size 652834 diff --git a/Documentation/NeuroLens_AI_Report.docx b/Documentation/NeuroLens_AI_Report.docx new file mode 100644 index 0000000000000000000000000000000000000000..a96a2a1290546193b106963f9285018aab13738a Binary files /dev/null and b/Documentation/NeuroLens_AI_Report.docx differ diff --git a/Documentation/NeuroLens_AI_Research_Article.docx b/Documentation/NeuroLens_AI_Research_Article.docx new file mode 100644 index 0000000000000000000000000000000000000000..cd322a9564f1a8391ca2df04cbcb200633505b06 Binary files /dev/null and b/Documentation/NeuroLens_AI_Research_Article.docx differ diff --git a/dataset_real/val/tumor/tumor_00130.jpg b/dataset_real/val/tumor/tumor_00130.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c6d1fa0b80ef119620ecaab04c567de11d1fae72 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00130.jpg differ diff --git a/dataset_real/val/tumor/tumor_00131.jpg b/dataset_real/val/tumor/tumor_00131.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e778a88c72f7e3d6b154930063049060a70ff140 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00131.jpg differ diff --git a/dataset_real/val/tumor/tumor_00132.jpg b/dataset_real/val/tumor/tumor_00132.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0231d8d8a3a6ed72e017541a95f83baf43f1784f Binary files /dev/null and b/dataset_real/val/tumor/tumor_00132.jpg differ diff --git a/dataset_real/val/tumor/tumor_00133.jpg b/dataset_real/val/tumor/tumor_00133.jpg new file mode 100644 index 0000000000000000000000000000000000000000..283a68aa4ea6c52adc17dd527435d752d838a32c Binary files /dev/null and b/dataset_real/val/tumor/tumor_00133.jpg differ diff --git a/dataset_real/val/tumor/tumor_00134.jpg b/dataset_real/val/tumor/tumor_00134.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e333353ac45a31eca231c786aa2815f55de56015 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00134.jpg differ diff --git a/dataset_real/val/tumor/tumor_00135.jpg b/dataset_real/val/tumor/tumor_00135.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8a0bb28153de2e43fc6c4420a950ede44fbc0efb Binary files /dev/null and b/dataset_real/val/tumor/tumor_00135.jpg differ diff --git a/dataset_real/val/tumor/tumor_00136.jpg b/dataset_real/val/tumor/tumor_00136.jpg new file mode 100644 index 0000000000000000000000000000000000000000..71fc8939988ee30490275402dc15783bdc653dcf Binary files /dev/null and b/dataset_real/val/tumor/tumor_00136.jpg differ diff --git a/dataset_real/val/tumor/tumor_00137.jpg b/dataset_real/val/tumor/tumor_00137.jpg new file mode 100644 index 0000000000000000000000000000000000000000..140316521a9a76d522929dc357d8edd8144e96e4 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00137.jpg differ diff --git a/dataset_real/val/tumor/tumor_00138.jpg b/dataset_real/val/tumor/tumor_00138.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e7ec4cdc97f16e5037addbd79f29dcf18a25b5ea Binary files /dev/null and b/dataset_real/val/tumor/tumor_00138.jpg differ diff --git a/dataset_real/val/tumor/tumor_00139.jpg b/dataset_real/val/tumor/tumor_00139.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c699470c0f06b039039cbfadcfb921910191141e Binary files /dev/null and b/dataset_real/val/tumor/tumor_00139.jpg differ diff --git a/dataset_real/val/tumor/tumor_00140.jpg b/dataset_real/val/tumor/tumor_00140.jpg new file mode 100644 index 0000000000000000000000000000000000000000..94f9bad014323c9a7cbdf7479bf12c3b70a9b07c Binary files /dev/null and b/dataset_real/val/tumor/tumor_00140.jpg differ diff --git a/dataset_real/val/tumor/tumor_00141.jpg b/dataset_real/val/tumor/tumor_00141.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fd8cebfccb7f3b21de43c413a036150a119c2cec Binary files /dev/null and b/dataset_real/val/tumor/tumor_00141.jpg differ diff --git a/dataset_real/val/tumor/tumor_00142.jpg b/dataset_real/val/tumor/tumor_00142.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7b5dc2f7c13178fc9f243c7d825dac36abb63b38 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00142.jpg differ diff --git a/dataset_real/val/tumor/tumor_00143.jpg b/dataset_real/val/tumor/tumor_00143.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4eeeeb1e8e1d87d50c392a7c8cd7923ecf1f29b9 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00143.jpg differ diff --git a/dataset_real/val/tumor/tumor_00144.jpg b/dataset_real/val/tumor/tumor_00144.jpg new file mode 100644 index 0000000000000000000000000000000000000000..127afbf30ed3d3104e5992d99819d7880b3c7e4b Binary files /dev/null and b/dataset_real/val/tumor/tumor_00144.jpg differ diff --git a/dataset_real/val/tumor/tumor_00145.jpg b/dataset_real/val/tumor/tumor_00145.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a28d8886caa937c3432f993bb436e1de0bbd233c Binary files /dev/null and b/dataset_real/val/tumor/tumor_00145.jpg differ diff --git a/dataset_real/val/tumor/tumor_00146.jpg b/dataset_real/val/tumor/tumor_00146.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b4a079940fb89bd82559ea1206c5f51ddcefe17b Binary files /dev/null and b/dataset_real/val/tumor/tumor_00146.jpg differ diff --git a/dataset_real/val/tumor/tumor_00147.jpg b/dataset_real/val/tumor/tumor_00147.jpg new file mode 100644 index 0000000000000000000000000000000000000000..50db9b8bd1607edd82fdd0c98fe091af31297d86 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00147.jpg differ diff --git a/dataset_real/val/tumor/tumor_00148.jpg b/dataset_real/val/tumor/tumor_00148.jpg new file mode 100644 index 0000000000000000000000000000000000000000..df08a4a677f42c34fc260e0d5644a02b6d2b8c06 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00148.jpg differ diff --git a/dataset_real/val/tumor/tumor_00149.jpg b/dataset_real/val/tumor/tumor_00149.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f877171df1e9e216cfbab17186b94f932052d17f Binary files /dev/null and b/dataset_real/val/tumor/tumor_00149.jpg differ diff --git a/dataset_real/val/tumor/tumor_00150.jpg b/dataset_real/val/tumor/tumor_00150.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9d3eba5c4d5c84c833f2fcace7e67da429a56d37 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00150.jpg differ diff --git a/dataset_real/val/tumor/tumor_00151.jpg b/dataset_real/val/tumor/tumor_00151.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f6d4628ccc53683e43e88e8b9757991dc17ce3e4 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00151.jpg differ diff --git a/dataset_real/val/tumor/tumor_00152.jpg b/dataset_real/val/tumor/tumor_00152.jpg new file mode 100644 index 0000000000000000000000000000000000000000..989b9135e64f3659da269e712c36094a47bf8dab Binary files /dev/null and b/dataset_real/val/tumor/tumor_00152.jpg differ diff --git a/dataset_real/val/tumor/tumor_00153.jpg b/dataset_real/val/tumor/tumor_00153.jpg new file mode 100644 index 0000000000000000000000000000000000000000..42c68ae73ed90f464d5a03b7ef7f970b33346ffc Binary files /dev/null and b/dataset_real/val/tumor/tumor_00153.jpg differ diff --git a/dataset_real/val/tumor/tumor_00154.jpg b/dataset_real/val/tumor/tumor_00154.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8f3c610a010f03df7c0d1521bfba6897f436f65e Binary files /dev/null and b/dataset_real/val/tumor/tumor_00154.jpg differ diff --git a/dataset_real/val/tumor/tumor_00155.jpg b/dataset_real/val/tumor/tumor_00155.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f05ca861980a8722bac560d764582c37173bbe12 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00155.jpg differ diff --git a/dataset_real/val/tumor/tumor_00156.jpg b/dataset_real/val/tumor/tumor_00156.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7f365257dd9740ed6be3a252b40f1ec93c1a693e Binary files /dev/null and b/dataset_real/val/tumor/tumor_00156.jpg differ diff --git a/dataset_real/val/tumor/tumor_00157.jpg b/dataset_real/val/tumor/tumor_00157.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9b75eef18c72606461bc405eec02d9459fab7ccb Binary files /dev/null and b/dataset_real/val/tumor/tumor_00157.jpg differ diff --git a/dataset_real/val/tumor/tumor_00158.jpg b/dataset_real/val/tumor/tumor_00158.jpg new file mode 100644 index 0000000000000000000000000000000000000000..13347daa5ea12aa18caf77611473f5f7448f36f2 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00158.jpg differ diff --git a/dataset_real/val/tumor/tumor_00159.jpg b/dataset_real/val/tumor/tumor_00159.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bf6dd0ad0261aaf1c8096ec04855e6cd2750c618 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00159.jpg differ diff --git a/dataset_real/val/tumor/tumor_00160.jpg b/dataset_real/val/tumor/tumor_00160.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4b1eaa46f3bd794f4482eb9b613715e8cb72ba38 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00160.jpg differ diff --git a/dataset_real/val/tumor/tumor_00161.jpg b/dataset_real/val/tumor/tumor_00161.jpg new file mode 100644 index 0000000000000000000000000000000000000000..847b69475df5fe2e98e3fb5a8dc66e26f9390834 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00161.jpg differ diff --git a/dataset_real/val/tumor/tumor_00162.jpg b/dataset_real/val/tumor/tumor_00162.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9a854b412ac4265c85901abb60bc032ea40efcb9 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00162.jpg differ diff --git a/dataset_real/val/tumor/tumor_00163.jpg b/dataset_real/val/tumor/tumor_00163.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fdb4f0b34c6b63875261b9c36eb42025e1c2be29 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00163.jpg differ diff --git a/dataset_real/val/tumor/tumor_00164.jpg b/dataset_real/val/tumor/tumor_00164.jpg new file mode 100644 index 0000000000000000000000000000000000000000..55665b3f11eced56f4d834c2f7a48562bba63ddc Binary files /dev/null and b/dataset_real/val/tumor/tumor_00164.jpg differ diff --git a/dataset_real/val/tumor/tumor_00165.jpg b/dataset_real/val/tumor/tumor_00165.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6adb856f531b72f58063063f91d31865f27fa3ca Binary files /dev/null and b/dataset_real/val/tumor/tumor_00165.jpg differ diff --git a/dataset_real/val/tumor/tumor_00166.jpg b/dataset_real/val/tumor/tumor_00166.jpg new file mode 100644 index 0000000000000000000000000000000000000000..52bd3b069e0a37ace8d77fc9b5d46629b839d76c Binary files /dev/null and b/dataset_real/val/tumor/tumor_00166.jpg differ diff --git a/dataset_real/val/tumor/tumor_00167.jpg b/dataset_real/val/tumor/tumor_00167.jpg new file mode 100644 index 0000000000000000000000000000000000000000..00dd46fab56f1594cc555a22789bd4ab3fe4dd3a Binary files /dev/null and b/dataset_real/val/tumor/tumor_00167.jpg differ diff --git a/dataset_real/val/tumor/tumor_00168.jpg b/dataset_real/val/tumor/tumor_00168.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fa5d7fa3136ea04c2a611a93ddb4d03b34050723 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00168.jpg differ diff --git a/dataset_real/val/tumor/tumor_00169.jpg b/dataset_real/val/tumor/tumor_00169.jpg new file mode 100644 index 0000000000000000000000000000000000000000..867efb5f88f255bcf8b57617fe9532738112e2db Binary files /dev/null and b/dataset_real/val/tumor/tumor_00169.jpg differ diff --git a/dataset_real/val/tumor/tumor_00170.jpg b/dataset_real/val/tumor/tumor_00170.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7cffa19f87e5cca89b04e16127f0dd66f3c83c4a Binary files /dev/null and b/dataset_real/val/tumor/tumor_00170.jpg differ diff --git a/dataset_real/val/tumor/tumor_00171.jpg b/dataset_real/val/tumor/tumor_00171.jpg new file mode 100644 index 0000000000000000000000000000000000000000..df0333e8012e5fc744c0666b3ee49d7e6998fd3c Binary files /dev/null and b/dataset_real/val/tumor/tumor_00171.jpg differ diff --git a/dataset_real/val/tumor/tumor_00172.jpg b/dataset_real/val/tumor/tumor_00172.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4280833d6f5655e235ce63eae7d135a7a633c555 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00172.jpg differ diff --git a/dataset_real/val/tumor/tumor_00173.jpg b/dataset_real/val/tumor/tumor_00173.jpg new file mode 100644 index 0000000000000000000000000000000000000000..be8bcacd5756befaeb67f9fe30fb047419bc320d Binary files /dev/null and b/dataset_real/val/tumor/tumor_00173.jpg differ diff --git a/dataset_real/val/tumor/tumor_00174.jpg b/dataset_real/val/tumor/tumor_00174.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0c0084fb3f89fe69d21ce249c6ce812df93dccb1 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00174.jpg differ diff --git a/dataset_real/val/tumor/tumor_00175.jpg b/dataset_real/val/tumor/tumor_00175.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ec9344d258906c5b1d7ba4326e3b123bd2a475a7 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00175.jpg differ diff --git a/dataset_real/val/tumor/tumor_00176.jpg b/dataset_real/val/tumor/tumor_00176.jpg new file mode 100644 index 0000000000000000000000000000000000000000..10f79e640cfe86de2553ae8bfc265f146ce49918 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00176.jpg differ diff --git a/dataset_real/val/tumor/tumor_00177.jpg b/dataset_real/val/tumor/tumor_00177.jpg new file mode 100644 index 0000000000000000000000000000000000000000..48f9974c97c290182f4c9b8207c0c33c757f69e6 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00177.jpg differ diff --git a/dataset_real/val/tumor/tumor_00178.jpg b/dataset_real/val/tumor/tumor_00178.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2ba16b9502d725e519d04f9de227ef86626182f4 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00178.jpg differ diff --git a/dataset_real/val/tumor/tumor_00179.jpg b/dataset_real/val/tumor/tumor_00179.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c7871bc63327ef4cef411031fc014a1f771568ef Binary files /dev/null and b/dataset_real/val/tumor/tumor_00179.jpg differ diff --git a/dataset_real/val/tumor/tumor_00180.jpg b/dataset_real/val/tumor/tumor_00180.jpg new file mode 100644 index 0000000000000000000000000000000000000000..712e5e9c37932beed6d0b16872e4592fc809af44 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00180.jpg differ diff --git a/dataset_real/val/tumor/tumor_00181.jpg b/dataset_real/val/tumor/tumor_00181.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b2ddb43213fbdd29698cc95d7a9aab11d300daa5 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00181.jpg differ diff --git a/dataset_real/val/tumor/tumor_00182.jpg b/dataset_real/val/tumor/tumor_00182.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7cb7915b451405ed3eef13e4195dc78173f690ad Binary files /dev/null and b/dataset_real/val/tumor/tumor_00182.jpg differ diff --git a/dataset_real/val/tumor/tumor_00183.jpg b/dataset_real/val/tumor/tumor_00183.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cc30e30b8336b69e55598a6283dbfc02b0cb19fb Binary files /dev/null and b/dataset_real/val/tumor/tumor_00183.jpg differ diff --git a/dataset_real/val/tumor/tumor_00184.jpg b/dataset_real/val/tumor/tumor_00184.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0659a4413322e3447ce0cf6b8215c841048029ca Binary files /dev/null and b/dataset_real/val/tumor/tumor_00184.jpg differ diff --git a/dataset_real/val/tumor/tumor_00185.jpg b/dataset_real/val/tumor/tumor_00185.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cfdcfefc860279804e5192d9d8a9a615a771a166 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00185.jpg differ diff --git a/dataset_real/val/tumor/tumor_00186.jpg b/dataset_real/val/tumor/tumor_00186.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d2f6dd718748479fbf1257ecdc7ed5a09653442f Binary files /dev/null and b/dataset_real/val/tumor/tumor_00186.jpg differ diff --git a/dataset_real/val/tumor/tumor_00187.jpg b/dataset_real/val/tumor/tumor_00187.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c161d95b120bc988b1f7d0cff7ec0ea1b0b62bd Binary files /dev/null and b/dataset_real/val/tumor/tumor_00187.jpg differ diff --git a/dataset_real/val/tumor/tumor_00188.jpg b/dataset_real/val/tumor/tumor_00188.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4a3fe29ea398f8196665185924552b2fd8e71208 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00188.jpg differ diff --git a/dataset_real/val/tumor/tumor_00189.jpg b/dataset_real/val/tumor/tumor_00189.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d90ced70153db379115c33ee32f0ea240ba6193e Binary files /dev/null and b/dataset_real/val/tumor/tumor_00189.jpg differ diff --git a/dataset_real/val/tumor/tumor_00190.jpg b/dataset_real/val/tumor/tumor_00190.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4bd10355b82bdfafac78400f643efa8ecae51247 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00190.jpg differ diff --git a/dataset_real/val/tumor/tumor_00191.jpg b/dataset_real/val/tumor/tumor_00191.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5a2d9a38483b29a9ae277c853089612784e0b419 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00191.jpg differ diff --git a/dataset_real/val/tumor/tumor_00192.jpg b/dataset_real/val/tumor/tumor_00192.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9c6b101e802e4b31990126342e221ba35bb7efe9 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00192.jpg differ diff --git a/dataset_real/val/tumor/tumor_00193.jpg b/dataset_real/val/tumor/tumor_00193.jpg new file mode 100644 index 0000000000000000000000000000000000000000..54214a47598da4d7d7090936bc4ed077da567bc3 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00193.jpg differ diff --git a/dataset_real/val/tumor/tumor_00194.jpg b/dataset_real/val/tumor/tumor_00194.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a7f56b96c176531af9504a2cbbc9745a0bc70621 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00194.jpg differ diff --git a/dataset_real/val/tumor/tumor_00195.jpg b/dataset_real/val/tumor/tumor_00195.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a9590d57e6bad7ab93e2a6693eeceaf6e8226752 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00195.jpg differ diff --git a/dataset_real/val/tumor/tumor_00196.jpg b/dataset_real/val/tumor/tumor_00196.jpg new file mode 100644 index 0000000000000000000000000000000000000000..225db1f02416be1bc9aa80b0ed3b4169e438edd3 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00196.jpg differ diff --git a/dataset_real/val/tumor/tumor_00197.jpg b/dataset_real/val/tumor/tumor_00197.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3ac2bb3c1f7936294c568a1a7d56a3457f3eff3d Binary files /dev/null and b/dataset_real/val/tumor/tumor_00197.jpg differ diff --git a/dataset_real/val/tumor/tumor_00198.jpg b/dataset_real/val/tumor/tumor_00198.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d720cc83af75af2c212662dec90aa05d04a3b419 Binary files /dev/null and b/dataset_real/val/tumor/tumor_00198.jpg differ diff --git a/dataset_real/val/tumor/tumor_00199.jpg b/dataset_real/val/tumor/tumor_00199.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8640d9768a205126c209d27af4df3bf5b6cd45ac Binary files /dev/null and b/dataset_real/val/tumor/tumor_00199.jpg differ diff --git a/db.py b/db.py new file mode 100644 index 0000000000000000000000000000000000000000..3fa8b8db2397155676080b1647afb79f91f403cd --- /dev/null +++ b/db.py @@ -0,0 +1,99 @@ +import os +import psycopg2 +from psycopg2.extras import RealDictCursor +import time +import logging + +logger = logging.getLogger('trinetra.db') + +def get_connection(): + db_url = os.environ.get('DATABASE_URL', 'postgresql://neondb_owner:npg_qTz5RJ3ALUGy@ep-frosty-resonance-adeowc34-pooler.c-2.us-east-1.aws.neon.tech/neondb?sslmode=require&channel_binding=require') + try: + conn = psycopg2.connect(db_url) + return conn + except Exception as e: + logger.error(f"Failed to connect to DB: {e}") + return None + +def init_db(): + conn = get_connection() + if not conn: + return + try: + with conn.cursor() as cur: + cur.execute(""" + CREATE TABLE IF NOT EXISTS scans ( + id SERIAL PRIMARY KEY, + scan_id VARCHAR(50) NOT NULL, + patient_name VARCHAR(100), + verdict VARCHAR(50), + confidence VARCHAR(20), + risk_level VARCHAR(20), + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + ) + """) + conn.commit() + logger.info("Database initialized successfully.") + except Exception as e: + logger.error(f"DB Init error: {e}") + finally: + conn.close() + +def get_total_scans(): + conn = get_connection() + if not conn: + return 0 + try: + with conn.cursor() as cur: + cur.execute("SELECT COUNT(*) FROM scans") + result = cur.fetchone() + return result[0] if result else 0 + except Exception as e: + logger.error(f"Error getting total scans: {e}") + return 0 + finally: + conn.close() + +def save_scan(scan_id, patient_name, verdict, confidence, risk_level): + conn = get_connection() + if not conn: + return + try: + with conn.cursor() as cur: + cur.execute(""" + INSERT INTO scans (scan_id, patient_name, verdict, confidence, risk_level) + VALUES (%s, %s, %s, %s, %s) + """, (scan_id, patient_name, verdict, confidence, risk_level)) + conn.commit() + except Exception as e: + logger.error(f"Error saving scan: {e}") + finally: + conn.close() + +def search_scans(query=""): + conn = get_connection() + if not conn: + return [] + try: + with conn.cursor(cursor_factory=RealDictCursor) as cur: + if query: + search_term = f"%{query}%" + cur.execute(""" + SELECT * FROM scans + WHERE patient_name ILIKE %s OR scan_id ILIKE %s + ORDER BY created_at DESC LIMIT 50 + """, (search_term, search_term)) + else: + cur.execute("SELECT * FROM scans ORDER BY created_at DESC LIMIT 50") + + results = cur.fetchall() + # Convert timestamp to string for JSON serialization + for row in results: + if row.get('created_at'): + row['created_at'] = row['created_at'].isoformat() + return results + except Exception as e: + logger.error(f"Error searching scans: {e}") + return [] + finally: + conn.close()