Tri-Netra-AI / web_dashboard /openapi.yml
anannyavyas1's picture
Upload folder using huggingface_hub (part 2)
3366f95 verified
Raw
History Blame Contribute Delete
7.8 kB
openapi: 3.0.3
info:
title: NeuroLens AI - Local Dashboard API
version: '2.0.0'
description: |
Local HTTP API served by dashboard.py. Endpoints below match the actual
server implementation (not aspirational). The earlier 1.0.0 spec described
endpoints and response fields that the server never implemented.
servers:
- url: /
paths:
/metrics:
get:
summary: Aggregate evaluation metrics for all classifier models
description: |
Returns the per-model entry computed by load_model_metrics() in
dashboard.py. No query parameters. Returns metrics for cnn, transfer,
and vit if their respective <model>_evaluation_metrics.json files exist
under real_eval_fixed/, real_eval_current/, or artifacts/.
responses:
'200':
description: Per-model metrics map
content:
application/json:
schema:
type: object
additionalProperties:
$ref: '#/components/schemas/ModelEntry'
/predict:
post:
summary: Run tumor / no-tumor classification on an uploaded image
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
required: [model, image]
properties:
model:
type: string
description: Classifier to run. Use 'all' to run cnn + transfer + vit.
enum: [cnn, transfer, vit, all]
image:
type: string
format: binary
description: PNG or JPG MRI image. DICOM/NIfTI not supported.
responses:
'200':
description: Prediction result
content:
application/json:
schema:
type: object
properties:
success: { type: boolean }
result:
oneOf:
- $ref: '#/components/schemas/PredictionResult'
- type: object
description: Map of model_name -> PredictionResult when model=all
additionalProperties:
$ref: '#/components/schemas/PredictionResult'
'400':
description: Bad request (missing model or image, or unparseable form)
'500':
description: Server error during prediction
/segment:
post:
summary: Run U-Net segmentation on an uploaded image
description: |
Returns a binary tumor mask plus a coloured overlay. Backed by the
Attention U-Net trained in segmentation_artifacts/. Implementation lives
in dashboard.py via src.segmentation_torch.
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
required: [image]
properties:
image:
type: string
format: binary
threshold:
type: number
format: float
default: 0.5
description: Probability threshold for binarising the predicted mask.
responses:
'200':
description: Segmentation result
content:
application/json:
schema:
$ref: '#/components/schemas/SegmentationResult'
components:
schemas:
ModelEntry:
type: object
properties:
model: { type: string }
label: { type: string }
weights_found: { type: boolean }
metrics_found: { type: boolean }
metrics:
nullable: true
type: object
properties:
accuracy: { type: number, nullable: true }
precision: { type: number, nullable: true }
recall: { type: number, nullable: true }
f1_score: { type: number, nullable: true }
roc_auc: { type: number, nullable: true }
confusion_matrix:
nullable: true
type: object
properties:
tn: { type: integer }
fp: { type: integer }
fn: { type: integer }
tp: { type: integer }
PredictionResult:
type: object
properties:
probability:
type: number
format: float
description: Sigmoid output of the classifier (tumor class).
confidence:
type: number
format: float
description: Confidence in the predicted label (max of p and 1-p).
label:
type: string
enum: [tumor, no_tumor]
display_label:
type: string
weights:
type: string
description: Filename of the weights file actually loaded.
image:
type: string
nullable: true
description: data:image/png;base64,... of the uploaded input.
gradcam:
type: string
nullable: true
description: |
data:image/png;base64,... of the Grad-CAM overlay. Returned only
for cnn and transfer (vit is set to null because the hybrid ViT
has no single 'final conv layer' suitable for Grad-CAM).
error:
type: string
nullable: true
hint:
type: string
nullable: true
SegmentationResult:
type: object
properties:
success: { type: boolean }
model: { type: string }
threshold: { type: number }
mask:
type: string
description: data:image/png;base64,... binary mask (white = tumor).
overlay:
type: string
description: data:image/png;base64,... input with green tumor overlay.
dice:
type: number
nullable: true
description: Optional Dice vs. ground truth (only if 'mask' file was provided).
iou:
type: number
nullable: true
tumor_area_px:
type: integer
description: Number of predicted-positive pixels in the resized 256x256 mask.
error:
type: string
nullable: true
# 4-signal ensemble verdict (added 2026-06-03b). Sourced from the
# v9b advisory; v8 mask area alone no longer drives the verdict.
verdict:
type: string
enum: [TUMOR, no_tumor]
description: Final ensemble verdict. Source of truth for the UI Diagnosis card.
confidence:
type: string
enum: [high, low]
description: high if 2+ ensemble signals fired; low if only one branch of the OR.
rule:
type: string
description: Ensemble rule that produced the verdict, e.g. "(v9c AND sym) OR (v8 AND andi)".
signals_used:
type: string
description: Which signal set was available, e.g. "4-signal v9c+v8+sym+andi" or "2-signal v8+sym".
operating_point:
type: string
enum: [balanced, high_recall, high_specificity, fallback]
description: Active operating point. balanced (default) gives 97% recall / 6% FPR / 0.83 F1.
review_recommended:
type: boolean
description: True when the positive is low-confidence and a radiologist should review.
v9b_advisory:
type: object
description: Full advisory payload with per-signal scores, thresholds, and measured performance metadata.