SigLIP Skin Lesion Classifier
Fine-tuned SigLIP vision model for skin lesion classification and triage. Part of the
SkinTag project for equitable melanoma detection.
Model Details
Fine-tuning: Last 4 vision transformer layers unfrozen (~7% trainable parameters), with classification head. Trained with Fitzpatrick-balanced sampling for fairness across skin tones.
Training Data: 47,277 images from 5 dermatology datasets:
| Dataset | Samples | Type | Skin Tone Coverage |
|---|
| HAM10000 | 10,015 | Dermoscopic | Limited |
| DDI/Stanford | 656 | Clinical | Fitzpatrick I-VI |
| Fitzpatrick17k | 16,518 | Clinical | Fitzpatrick I-VI |
| PAD-UFES-20 | 2,298 | Smartphone | Brazilian population |
| BCN20000 | 17,790 | Dermoscopic | European population |
Performance
Binary Triage (Benign vs Malignant)
| Model | AUC | Accuracy | F1 |
|---|
| Fine-tuned XGBoost | 0.960 | 92.0% | 0.866 |
| Fine-tuned MLP | 0.945 | 91.2% | 0.856 |
| Frozen XGBoost (baseline) | 0.916 | 88.2% | 0.794 |
Clinical Thresholds:
- At 95% sensitivity: 82.5% specificity
- At 90% sensitivity: 88.3% specificity
Condition Estimation (10-class)
10 categories: Melanoma, BCC, SCC, Actinic Keratosis, Melanocytic Nevus, Seborrheic Keratosis, Dermatofibroma, Vascular Lesion, Non-Neoplastic, Other/Unknown.
Fairness
Tested across Fitzpatrick skin types I-VI with <5% sensitivity gap. See evaluation_results.json for per-group metrics.
Versioning
| Branch | Description | Model Format |
|---|
main | Production (current) -- EndToEndSigLIP v1 format | config.json + model_state.pt + head_state.pt |
v1-original | Snapshot of original upload for rollback | Same as main at time of branch creation |
To load a specific version:
1from huggingface_hub import snapshot_download
2# Latest (main)
3snapshot_download("skintaglabs/siglip-skin-lesion-classifier")
4# Rollback to v1
5snapshot_download("skintaglabs/siglip-skin-lesion-classifier", revision="v1-original")
Files
Root (Model Weights)
config.json -- Architecture configuration (model_name, hidden_dim, n_classes, dropout, unfreeze_layers)
head_state.pt -- Classification head weights (~1.2 MB)
model_state.pt -- Full fine-tuned model weights (~3.5 GB)
Misc/ (Pipeline Artifacts)
classifier.pkl, classifier_logistic.pkl, classifier_deep.pkl -- Binary classifiers (frozen embeddings)
classifier_deep_mlp.pkl -- Alias for classifier_deep.pkl (web app compatibility)
classifier_xgboost.pkl -- XGBoost binary classifier (frozen embeddings)
classifier_xgboost_finetuned.pkl -- XGBoost on fine-tuned embeddings (AUC 0.960)
xgboost_finetuned_binary.pkl, mlp_finetuned_binary.pkl -- Fine-tuned pipeline classifiers
xgboost_finetuned_condition.pkl -- 10-class condition classifier (fine-tuned)
classifier_condition.pkl, classifier_condition_deep.pkl, classifier_condition_logistic.pkl -- Condition classifiers
embeddings.pt -- Frozen SigLIP embeddings (~109 MB)
embeddings_finetuned_train.pt, embeddings_finetuned_test.pt -- Fine-tuned embeddings
metadata.csv, test_metadata.csv -- Dataset metadata with labels
evaluation_results.json, training_results.json -- Metrics
Usage
End-to-End Inference (Recommended)
1from src.model.deep_classifier import EndToEndClassifier
2model = EndToEndClassifier.load_for_inference("path/to/downloaded/model")
3probs = model.predict_proba(images) # Returns [benign_prob, malignant_prob]
Embedding + Classifier Head
1from transformers import AutoModel, AutoImageProcessor
2import pickle
3
4# Extract embeddings with frozen SigLIP
5processor = AutoImageProcessor.from_pretrained("google/siglip-so400m-patch14-384")
6model = AutoModel.from_pretrained("google/siglip-so400m-patch14-384")
7embeddings = model.vision_model(pixel_values=processed_images).pooler_output
8
9# Classify with downloaded head
10with open("Misc/classifier.pkl", "rb") as f:
11 clf = pickle.load(f)
12predictions = clf.predict_proba(embeddings.numpy())
Full Implementation
See the
SkinTag repository for the complete pipeline including web app, mobile distillation, and evaluation.
Citation
1@misc{skintag2026,
2 title={SkinTag: AI-Powered Skin Lesion Triage for Equitable Melanoma Detection},
3 author={SkinTag Labs},
4 year={2026},
5 url={https://github.com/skintaglabs/main}
6}
Base model (SigLIP):
1@misc{zhai2023sigmoid,
2 title={Sigmoid Loss for Language Image Pre-Training},
3 author={Xiaohua Zhai and Basil Mustafa and Alexander Kolesnikov and Lucas Beyer},
4 year={2023},
5 eprint={2303.15343},
6 archivePrefix={arXiv},
7 primaryClass={cs.CV}
8}
Attribution
- Base Model: SigLIP by Google (Apache 2.0)
- Fine-tuning: SkinTag Labs (MIT)
Medical Disclaimer
This model is for research and triage screening only, not clinical diagnosis. Users should consult healthcare professionals for medical advice.
License
MIT License (fine-tuned weights). Base model (SigLIP) is licensed under Apache 2.0 by Google.