Towards Label-Free Single-Cell Phenotyping Using Multi-Task Learning
Paper β’ 2605.14717 β’ Published
Paper: Towards Label-Free Single-Cell Phenotyping Using Multi-Task Learning
Authors: Saqib Nazir and Ardhendu Behera (Edge Hill University, UK)
Conference: ICPR 2026
Code: github.com/saqibnaziir/Single-Cell-Phenotyping
A unified deep learning framework that jointly performs White Blood Cell (WBC) classification and continuous protein-expression regression from label-free Differential Phase Contrast (DPC) microscopy images β without fluorescent staining.
Input: (B, 4, 28, 28) β 4-channel DPC (Left, Right, Top, Bottom)
β
ββ Shared ECA Channel Attention
ββ CNN Branch: Stem β InceptionΓ2 + Residual β (B, 196, 192)
ββ ViT Branch: Patch(4Γ4) β TransformerΓ2 β (B, 50, 128)
β
ββ Cross-Modal Fusion (256-dim, learnable weights)
ββ Task-Specific Refinement
ββ Task Gating (bidirectional cross-task exchange)
ββ Classification Head β (B, 3)
ββ Regression Head β (B, 4)
| Task | Output | Classes / Markers |
|---|---|---|
| WBC Classification | 3 classes | Lymphocyte, Granulocyte, Monocyte |
| Protein Regression | 4 markers | CD45, CD3, CD19, CD14 |
| File | Description |
|---|---|
bsccm_best_model.pth |
Best checkpoint on BSCCM dataset (91.3% accuracy) |
bccd_best_model.pth |
Best checkpoint on BCCD benchmark (93.77% accuracy) |
| Metric | Value |
|---|---|
| WBC Classification Accuracy | 91.3% |
| Macro F1-Score | 0.92 |
| Pearson r (CD16 regression) | 0.73 |
| RMSE | 0.68 |
| Class | Precision | Recall | F1 |
|---|---|---|---|
| Lymphocyte | 1.000 | 1.000 | 1.000 |
| Granulocyte | 0.889 | 1.000 | 0.941 |
| Monocyte | 1.000 | 0.750 | 0.857 |
| Macro Avg. | 0.963 | 0.917 | 0.933 |
Overall BCCD accuracy: 93.77%
git clone https://github.com/saqibnaziir/Single-Cell-Phenotyping.git
cd Single-Cell-Phenotyping
pip install -r requirements.txt
import torch
from huggingface_hub import hf_hub_download
from model import create_model
# Download checkpoint
ckpt_path = hf_hub_download(
repo_id="saqialii/single-cell-phenotyping",
filename="bsccm_best_model.pth"
)
# Create model and load weights
model = create_model(num_classes=3, num_proteins=4, img_size=28, in_channels=4)
checkpoint = torch.load(ckpt_path, map_location='cpu', weights_only=False)
model.load_state_dict(checkpoint['model_state_dict'])
model.eval()
print(f"Loaded model β best val accuracy: {checkpoint['best_val_acc']:.2f}%")
import torch
import torch.nn.functional as F
# Input: (B, 4, 28, 28) β 4-channel DPC image, normalised to [-1, 1]
image = torch.randn(1, 4, 28, 28) # replace with real image
with torch.no_grad():
cls_logits, prot_preds = model(image)
# Cell type classification
probs = F.softmax(cls_logits, dim=1)
class_names = ['Lymphocyte', 'Granulocyte', 'Monocyte']
predicted_class = class_names[probs.argmax().item()]
confidence = probs.max().item()
print(f"Predicted: {predicted_class} ({confidence:.1%})")
# Protein expression (Z-scored)
protein_names = ['CD45', 'CD3', 'CD19', 'CD14']
for name, val in zip(protein_names, prot_preds[0].tolist()):
print(f" {name}: {val:.3f}")
# Download BSCCM dataset
pip install bsccm
python -c "from bsccm import download_dataset; download_dataset('./data', mnist=True)"
# Train from scratch
python train.py --data_path ./data/BSCCMNIST --save_dir checkpoints/run1
# Evaluate
python evaluate.py \
--model_path checkpoints/run1/best_model.pth \
--data_path ./data/BSCCMNIST \
--output_dir evaluation_results
BSCCM (Berkeley Single Cell Computational Microscopy):
BCCD (Blood Cell Images):
@inproceedings{nazir2026label,
title = {Towards Label-Free Single-Cell Phenotyping Using Multi-Task Learning},
author = {Nazir, Saqib and Behera, Ardhendu},
booktitle = {Proceedings of the International Conference on Pattern Recognition (ICPR)},
year = {2026},
note = {arXiv:2605.14717}
}
@article{pinkard2024berkeley,
title = {Berkeley Single Cell Computational Microscopy Dataset},
author = {Pinkard, Henry and others},
journal = {arXiv preprint arXiv:2402.06191},
year = {2024}
}
MIT License β Saqib Nazir, Ardhendu Behera, Edge Hill University, 2026