DiaFoot.AI — Diabetic Foot Ulcer Triage & Wound Segmentation
Cascaded multi-task model for diabetic foot images: it triages a foot photo into
Healthy / Non-DFU / DFU, segments the wound when present, and measures wound
area in mm². Both stages use a frozen DINOv2 ViT-B/14 backbone with a trainable head
(classifier) / UPerNet decoder (segmenter).
Code: https://github.com/Ruthvik-Bandari/DiaFoot.AI
Honesty note. Every number below is from leakage-audited clean-split evaluation (
results/*.jsonin the repo). They are lower than an earlier headline (Dice 85.89%) that was a DFU-only subgroup measured before a data-leakage fix. These are the honest numbers.
Files
| File | Stage | Backbone |
|---|---|---|
dinov2_classifier.pt |
3-class triage (Healthy/Non-DFU/DFU) | DINOv2 ViT-B/14 + linear head |
dinov2_segmenter.pt |
Binary wound segmentation | DINOv2 ViT-B/14 + UPerNet decoder |
Results (leakage-audited test set, n = 1,161)
Triage classification
| Metric | Value |
|---|---|
| Accuracy | 0.984 |
| Macro F1 | 0.981 |
| Macro AUROC | 0.999 |
| DFU sensitivity | 0.966 |
| Healthy specificity | 0.995 |
| ECE (after temperature scaling) | 0.007 |
| Defer @ 0.95 confidence | 93.5% coverage, 99.7% accuracy on kept |
Wound segmentation
| Slice | Dice | IoU | HD95 (px) |
|---|---|---|---|
| DFU wounds only (n = 263) | 0.891 | 0.829 | 11.3 |
| Full mixed test set, mean | 0.718 | 0.673 | 66.1 |
| Full mixed test set, median | 0.929 | 0.868 | 5.0 |
| 5-fold CV (DFU) | 0.853 ± 0.009 | 0.785 ± 0.010 | — |
The mixed-set mean is far below the median because healthy/non-DFU images have empty masks (any false-positive pixel scores Dice ≈ 0). Judge wound quality from the DFU-only / median rows.
Intended use
Research and education on diabetic-foot-ulcer imaging. Not a medical device; no regulatory clearance. Do not use for diagnosis or treatment.
Limitations (read before use)
- The triage classifier does not generalize across image sources. On unseen datasets, external accuracy drops to ~21% and DFU sensitivity to 0%. Re-validate on any new source before use. The segmenter transfers well (external DFU Dice 0.893).
- Fairness is under-powered by the test split (effectively one ITA skin-tone group); the DFU-only fairness gap is 0.00, but broad skin-tone fairness is unproven.
- Clinical wound-area agreement was measured on only n = 3 (indicative, not validated).
How to use
import torch
from huggingface_hub import hf_hub_download
repo = "Ruthvik-Bandari/DiaFoot.AI"
clf = hf_hub_download(repo, "dinov2_classifier.pt")
seg = hf_hub_download(repo, "dinov2_segmenter.pt")
# Load with the model definitions in src/models/ from the GitHub repo:
# DINOv2Classifier(backbone="dinov2_vitb14"), DINOv2Segmenter(backbone="dinov2_vitb14")
# Or run the end-to-end CLI:
# python scripts/predict.py --image foot.jpg \
# --classifier-checkpoint dinov2_classifier.pt \
# --segmenter-checkpoint dinov2_segmenter.pt --device cpu
Input size 518×518 (DINOv2). See the GitHub repo for the full inference pipeline, FastAPI service, and ONNX export.
Training data
~8,105 images across three categories (2,119 DFU incl. AZH · 3,300 healthy · 2,686 non-DFU),
aggregated from FUSeg, AZH, Kaggle, and Mendeley sources. Splits are 70/15/15, doubly
stratified by ITA skin tone and class, and audited to zero train/test leakage
(has_any_leakage: False). The raw images are not redistributed here (third-party
licenses + patient privacy).
Citation
Bandari, R. DiaFoot.AI v2: Diabetic Foot Ulcer Detection, Segmentation & Wagner Staging. 2026. https://github.com/Ruthvik-Bandari/DiaFoot.AI
Built on DINOv2 (Meta AI, Apache-2.0). Fine-tuned weights released under MIT.
Model tree for RuthvikBandari/DiaFoot.AI
Base model
facebook/dinov2-base