Instructions to use will702/acne-cv-models with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Scikit-learn
How to use will702/acne-cv-models with Scikit-learn:
from huggingface_hub import hf_hub_download import joblib model = joblib.load( hf_hub_download("will702/acne-cv-models", "sklearn_model.joblib") ) # only load pickle files from sources you trust # read more about it here https://skops.readthedocs.io/en/stable/persistence.html - Notebooks
- Google Colab
- Kaggle
Acne Severity Detection β 42-Dim Handcrafted Feature Models
21 trained sklearn/CatBoost classifiers for acne severity classification (Grade I / II / III). Part of the Acne CV Playground β an interactive web tool that walks through every pipeline stage from raw pixels to prediction, with live parameter sliders and a 42-dim feature inspector.
Model Description
Each model is a sklearn.pipeline.Pipeline of [StandardScaler β Classifier], trained on a 42-dimensional handcrafted feature vector extracted from face photos:
| Group | Dims | Description |
|---|---|---|
| Structural | 8 | Lesion count, total area, intensity mean/std, area max/std, density, circularity |
| Multi-scale LBP | 27 | Uniform LBP histograms at radii R=1,2,3 (9 bins Γ 3 scales, last bin dropped) |
| GLCM Texture | 3 | Contrast, homogeneity, energy (4 angles, 64 levels, dissimilarity removed) |
| Global Redness | 4 | Mean + std of LAB a* and YCrCb Cr over all skin pixels |
Preprocessing pipeline (OpenCV)
- Resize to 512Γ512
- CLAHE (clipLimit=3.0, tileGridSize=8Γ8) on grayscale
- Haar cascade face detection β 4-attempt fallback chain (frontal default + alt2)
- ROI mask β eyes, nose, lips blacked out via sub-cascades
- YCrCb skin segmentation + morphological close/open
- Adaptive lesion thresholding β requires both Cr > thr_cr AND a* > thr_a simultaneously
- Connected-component shape filtering β aspect ratio, fill ratio, local a* contrast
Training Data
Subset of the ACNE04 dataset β 3-class balanced split:
| Split | acne1 (mild) | acne2 (moderate) | acne3 (severe) |
|---|---|---|---|
| Train | 300 | 300 | 300 |
| Test | 218 | 61 | 34 |
Results (42-dim feature set, 3-class)
| Rank | Model | Accuracy | Precision | Recall | F1 |
|---|---|---|---|---|---|
| π₯ 1 | SGD Classifier | 0.7542 | 0.7530 | 0.7542 | 0.7504 |
| 2 | CatBoost | 0.7318 | 0.7796 | 0.7318 | 0.7494 |
| 3 | Calibrated Linear SVM | 0.7486 | 0.7503 | 0.7486 | 0.7466 |
| 4 | SVM (RBF) | 0.7263 | 0.7605 | 0.7263 | 0.7399 |
| 5 | LDA | 0.7207 | 0.7615 | 0.7207 | 0.7371 |
| 6 | Logistic Regression | 0.7207 | 0.7588 | 0.7207 | 0.7360 |
| 7 | MLP | 0.7151 | 0.7558 | 0.7151 | 0.7301 |
| 8 | Stacking Ensemble (top-5) | 0.7151 | 0.7511 | 0.7151 | 0.7297 |
| 9 | Ridge Classifier | 0.7207 | 0.7309 | 0.7207 | 0.7233 |
| 10 | KNN | 0.7095 | 0.7394 | 0.7095 | 0.7222 |
| 11β21 | (see Evaluation_Summary(42dim).txt) |
Per-class note: acne2 (moderate) is the hardest class β best F1 only 0.456 (SVM RBF). Severe acne3 best F1 0.553 (CatBoost). Full per-class rankings in the summary file.
Files
model_42dim/
acne_sgd_classifier_model.pkl β overall champion (F1=0.7504)
acne_catboost_model.pkl β best precision (0.7796)
acne_svm_rbf_model.pkl β best acne2 F1 (0.456)
acne_stacking_ensemble_model.pkl β top-5 stacking
acne_voting_ensemble_model.pkl β top-3 soft voting
acne_extra_trees_model.pkl
acne_random_forest_model.pkl
acne_bagging_svm_model.pkl
acne_gradient_boosting_model.pkl
acne_histgradientboosting_model.pkl
acne_adaboost_model.pkl
acne_knn_model.pkl
acne_lda_model.pkl
acne_logistic_regression_model.pkl
acne_mlp_model.pkl
acne_qda_model.pkl
acne_gaussian_nb_model.pkl
acne_ridge_classifier_model.pkl
acne_calibrated_linear_svm_model.pkl
acne_svm_linear_model.pkl
acne_svm_polynomial_model.pkl
Evaluation_Summary(42dim).txt β full per-class metrics table
Usage
import joblib
import numpy as np
# Load champion model
model = joblib.load("model_42dim/acne_sgd_classifier_model.pkl")
# feature_vec: 42-dim numpy array from the extraction pipeline (see preprocessing above)
label = model.predict(feature_vec.reshape(1, -1))[0]
# Returns: 'acne1_1024' (mild) | 'acne2_1024' (moderate) | 'acne3_1024' (severe)
# Confidence (available on most models)
proba = model.predict_proba(feature_vec.reshape(1, -1))[0]
Download via huggingface_hub
from huggingface_hub import snapshot_download
path = snapshot_download(repo_id="will702/acne-cv-models")
# models at: path/model_42dim/*.pkl
Requirements
scikit-learn==1.7.2 # must match training version exactly
catboost
joblib
numpy
opencv-python-headless
scikit-image
Limitations
- Trained on ACNE04 (Asian skin tones, studio lighting). May underperform on other demographics or lighting conditions.
- acne2 (moderate) classification is substantially weaker than acne1/acne3 β class imbalance in test set.
- No CNN/deep features β intentionally classical for interpretability and the interactive playground.
Citation
If you use these models, please cite the ACNE04 dataset:
@inproceedings{wu2019joint,
title={Joint Acne Image Grading and Counting via Label Distribution Learning},
author={Wu, Xiaoping and Liang, Wen and Yu, Kezhou and Xu, Fei and Liang, Weiwei and others},
booktitle={ICCV},
year={2019}
}
- Downloads last month
- -