PySODMetrics: A Simple and Efficient Implementation of Grayscale/Binary Segmentation Metrics
See the code[!important]
Our exploration in this field continues with PyIRSTDMetrics, a project born from the same core motivation. Think of them as twin initiatives: this project maps the landscape of current evaluation, while its sibling takes the next step to expand upon and rethink it. We'd love your star! 🌟
A simple and efficient implementation of SOD metrics.
numpy and scipyYour improvements and suggestions are welcome.
If you use this library in your research, please consider citing the following paper:
@misc{PySODMetrics,
title={Beyond Pixel Overlap: A Framework for Decomposing Segmentation Evaluation Metrics},
author={Youwei Pang and Xiaoqi Zhao},
year={2026},
eprint={2607.00886},
archivePrefix={arXiv},
primaryClass={cs.CV},
url={https://arxiv.org/abs/2607.00886},
}
| Metric | Sample-based | Whole-based | Related Class |
|---|---|---|---|
| MAE | soft,si-soft | MAE | |
| S-measure $S_{m}$ | soft | Smeasure | |
| weighted F-measure ($F^{\omega}_{\beta}$) | soft | WeightedFmeasure | |
| Human Correction Effort Measure | soft | HumanCorrectionEffortMeasure | |
| Context-Measure ($C_{\beta}$, $C^{\omega}_{\beta}$) | soft | ContextMeasure, CamouflageContextMeasure | |
| Multi-Scale IoU | max,avg,adp,bin | MSIoU | |
| E-measure ($E_{m}$) | max,avg,adp | Emeasure | |
| F-measure (old) ($F_{\beta}$) | max,avg,adp | Fmeasure (Will be removed!) | |
| F-measure (new) ($F_{\beta}$, $F_{1}$) | max,avg,adp,bin,si-max,si-avg,si-adp,si-bin | bin,si-max,si-avg,si-bin | FmeasureV2+FmeasureHandler |
| BER | max,avg,adp,bin,si-max,si-avg,si-adp,si-bin | bin,si-max,si-avg,si-bin | FmeasureV2+BERHandler |
| Dice | max,avg,adp,bin,si-max,si-avg,si-adp,si-bin | bin,si-max,si-avg,si-bin | FmeasureV2+DICEHandler |
| FPR | max,avg,adp,bin,si-max,si-avg,si-adp,si-bin | bin,si-max,si-avg,si-bin | FmeasureV2+FPRHandler |
| IoU | max,avg,adp,bin,si-max,si-avg,si-adp,si-bin | bin,si-max,si-avg,si-bin | FmeasureV2+IOUHandler |
| Kappa | max,avg,adp,bin,si-max,si-avg,si-adp,si-bin | bin,si-max,si-avg,si-bin | FmeasureV2+KappaHandler |
| Overall Accuracy | max,avg,adp,bin,si-max,si-avg,si-adp,si-bin | bin,si-max,si-avg,si-bin | FmeasureV2+OverallAccuracyHandler |
| Precision | max,avg,adp,bin,si-max,si-avg,si-adp,si-bin | bin,si-max,si-avg,si-bin | FmeasureV2+PrecisionHandler |
| Recall | max,avg,adp,bin,si-max,si-avg,si-adp,si-bin | bin,si-max,si-avg,si-bin | FmeasureV2+RecallHandler |
| Sensitivity | max,avg,adp,bin,si-max,si-avg,si-adp,si-bin | bin,si-max,si-avg,si-bin | FmeasureV2+SensitivityHandler |
| Specificity | max,avg,adp,bin,si-max,si-avg,si-adp,si-bin | bin,si-max,si-avg,si-bin | FmeasureV2+SpecificityHandler |
| TNR | max,avg,adp,bin,si-max,si-avg,si-adp,si-bin | bin,si-max,si-avg,si-bin | FmeasureV2+TNRHandler |
| TPR | max,avg,adp,bin,si-max,si-avg,si-adp,si-bin | bin,si-max,si-avg,si-bin | FmeasureV2+TPRHandler |
NOTE:
si- variants calculate the sample-specific mean/maximum based on the sample-based fm sequence with a shape of (num_targets, 256).si- variants calculate the mean/maximum based on the average fm sequence across all targets from all samples.*adp variants are specialized for sample-based computation, they do not support whole-based computation.The core files are in the folder py_sod_metrics.
pip install git+https://github.com/lartpang/PySODMetrics.gitpip install pysodmetricstest folder), the result is consistent with the code.
Bi_sal(sal>threshold)=1; to Bi_sal(sal>=threshold)=1; in https://github.com/DengPingFan/CODToolbox/blob/910358910c7824a4237b0ea689ac9d19d1958d11/Onekey_Evaluation_Code/OnekeyEvaluationCode/main.m#L102. For related discussion, please see the issue.1.3.0): Due to the difference between numpy and matlab, in version 1.2.x, there are very slight differences on some metrics between the results of the matlab code and ours. The recent PR alleviated this problem. However, there are still very small differences on E-measure. The results in most papers are rounded off to three or four significant figures, so, there is no obvious difference between the new version and the version 1.2.x for them.@inproceedings{Fmeasure,
title={Frequency-tuned salient region detection},
author={Achanta, Radhakrishna and Hemami, Sheila and Estrada, Francisco and S{\"u}sstrunk, Sabine},
booktitle=CVPR,
number={CONF},
pages={1597--1604},
year={2009}
}
@inproceedings{Smeasure,
title={Structure-measure: A new way to evaluate foreground maps},
author={Fan, Deng-Ping and Cheng, Ming-Ming and Liu, Yun and Li, Tao and Borji, Ali},
booktitle=ICCV,
pages={4548--4557},
year={2017}
}
@inproceedings{Emeasure,
title="Enhanced-alignment Measure for Binary Foreground Map Evaluation",
author="Deng-Ping {Fan} and Cheng {Gong} and Yang {Cao} and Bo {Ren} and Ming-Ming {Cheng} and Ali {Borji}",
booktitle=IJCAI,
pages="698--704",
year={2018}
}
@inproceedings{wFmeasure,
title={How to evaluate foreground maps?},
author={Margolin, Ran and Zelnik-Manor, Lihi and Tal, Ayellet},
booktitle=CVPR,
pages={248--255},
year={2014}
}
@inproceedings{MSIoU,
title = {Multiscale IOU: A Metric for Evaluation of Salient Object Detection with Fine Structures},
author = {Ahmadzadeh, Azim and Kempton, Dustin J. and Chen, Yang and Angryk, Rafal A.},
booktitle = ICIP,
year = {2021},
}
@inproceedings{SizeInvarianceVariants,
title = {Size-invariance Matters: Rethinking Metrics and Losses for Imbalanced Multi-object Salient Object Detection},
author = {Feiran Li and Qianqian Xu and Shilong Bao and Zhiyong Yang and Runmin Cong and Xiaochun Cao and Qingming Huang},
booktitle = ICML,
year = {2024}
}
@inproceedings{HumanCorrectionEffortMeasure,
title = {Highly Accurate Dichotomous Image Segmentation},
author = {Xuebin Qin and Hang Dai and Xiaobin Hu and Deng-Ping Fan and Ling Shao and Luc Van Gool},
booktitle = ECCV,
year = {2022}
}
@article{ContextMeasure,
title={Context-measure: Contextualizing Metric for Camouflage},
author={Wang, Chen-Yang and Ji, Gepeng and Shao, Song and Cheng, Ming-Ming and Fan, Deng-Ping},
journal={arXiv preprint arXiv:2512.07076},
year={2025}
}
Python
100.0%
PySODMetrics: A Simple and Efficient Implementation of Grayscale/Binary Segmentation Metrics
See the code[!important]
Our exploration in this field continues with PyIRSTDMetrics, a project born from the same core motivation. Think of them as twin initiatives: this project maps the landscape of current evaluation, while its sibling takes the next step to expand upon and rethink it. We'd love your star! 🌟
A simple and efficient implementation of SOD metrics.
numpy and scipyYour improvements and suggestions are welcome.
If you use this library in your research, please consider citing the following paper:
@misc{PySODMetrics,
title={Beyond Pixel Overlap: A Framework for Decomposing Segmentation Evaluation Metrics},
author={Youwei Pang and Xiaoqi Zhao},
year={2026},
eprint={2607.00886},
archivePrefix={arXiv},
primaryClass={cs.CV},
url={https://arxiv.org/abs/2607.00886},
}
| Metric | Sample-based | Whole-based | Related Class |
|---|---|---|---|
| MAE | soft,si-soft | MAE | |
| S-measure $S_{m}$ | soft | Smeasure | |
| weighted F-measure ($F^{\omega}_{\beta}$) | soft | WeightedFmeasure | |
| Human Correction Effort Measure | soft | HumanCorrectionEffortMeasure | |
| Context-Measure ($C_{\beta}$, $C^{\omega}_{\beta}$) | soft | ContextMeasure, CamouflageContextMeasure | |
| Multi-Scale IoU | max,avg,adp,bin | MSIoU | |
| E-measure ($E_{m}$) | max,avg,adp | Emeasure | |
| F-measure (old) ($F_{\beta}$) | max,avg,adp | Fmeasure (Will be removed!) | |
| F-measure (new) ($F_{\beta}$, $F_{1}$) | max,avg,adp,bin,si-max,si-avg,si-adp,si-bin | bin,si-max,si-avg,si-bin | FmeasureV2+FmeasureHandler |
| BER | max,avg,adp,bin,si-max,si-avg,si-adp,si-bin | bin,si-max,si-avg,si-bin | FmeasureV2+BERHandler |
| Dice | max,avg,adp,bin,si-max,si-avg,si-adp,si-bin | bin,si-max,si-avg,si-bin | FmeasureV2+DICEHandler |
| FPR | max,avg,adp,bin,si-max,si-avg,si-adp,si-bin | bin,si-max,si-avg,si-bin | FmeasureV2+FPRHandler |
| IoU | max,avg,adp,bin,si-max,si-avg,si-adp,si-bin | bin,si-max,si-avg,si-bin | FmeasureV2+IOUHandler |
| Kappa | max,avg,adp,bin,si-max,si-avg,si-adp,si-bin | bin,si-max,si-avg,si-bin | FmeasureV2+KappaHandler |
| Overall Accuracy | max,avg,adp,bin,si-max,si-avg,si-adp,si-bin | bin,si-max,si-avg,si-bin | FmeasureV2+OverallAccuracyHandler |
| Precision | max,avg,adp,bin,si-max,si-avg,si-adp,si-bin | bin,si-max,si-avg,si-bin | FmeasureV2+PrecisionHandler |
| Recall | max,avg,adp,bin,si-max,si-avg,si-adp,si-bin | bin,si-max,si-avg,si-bin | FmeasureV2+RecallHandler |
| Sensitivity | max,avg,adp,bin,si-max,si-avg,si-adp,si-bin | bin,si-max,si-avg,si-bin | FmeasureV2+SensitivityHandler |
| Specificity | max,avg,adp,bin,si-max,si-avg,si-adp,si-bin | bin,si-max,si-avg,si-bin | FmeasureV2+SpecificityHandler |
| TNR | max,avg,adp,bin,si-max,si-avg,si-adp,si-bin | bin,si-max,si-avg,si-bin | FmeasureV2+TNRHandler |
| TPR | max,avg,adp,bin,si-max,si-avg,si-adp,si-bin | bin,si-max,si-avg,si-bin | FmeasureV2+TPRHandler |
NOTE:
si- variants calculate the sample-specific mean/maximum based on the sample-based fm sequence with a shape of (num_targets, 256).si- variants calculate the mean/maximum based on the average fm sequence across all targets from all samples.*adp variants are specialized for sample-based computation, they do not support whole-based computation.The core files are in the folder py_sod_metrics.
pip install git+https://github.com/lartpang/PySODMetrics.gitpip install pysodmetricstest folder), the result is consistent with the code.
Bi_sal(sal>threshold)=1; to Bi_sal(sal>=threshold)=1; in https://github.com/DengPingFan/CODToolbox/blob/910358910c7824a4237b0ea689ac9d19d1958d11/Onekey_Evaluation_Code/OnekeyEvaluationCode/main.m#L102. For related discussion, please see the issue.1.3.0): Due to the difference between numpy and matlab, in version 1.2.x, there are very slight differences on some metrics between the results of the matlab code and ours. The recent PR alleviated this problem. However, there are still very small differences on E-measure. The results in most papers are rounded off to three or four significant figures, so, there is no obvious difference between the new version and the version 1.2.x for them.@inproceedings{Fmeasure,
title={Frequency-tuned salient region detection},
author={Achanta, Radhakrishna and Hemami, Sheila and Estrada, Francisco and S{\"u}sstrunk, Sabine},
booktitle=CVPR,
number={CONF},
pages={1597--1604},
year={2009}
}
@inproceedings{Smeasure,
title={Structure-measure: A new way to evaluate foreground maps},
author={Fan, Deng-Ping and Cheng, Ming-Ming and Liu, Yun and Li, Tao and Borji, Ali},
booktitle=ICCV,
pages={4548--4557},
year={2017}
}
@inproceedings{Emeasure,
title="Enhanced-alignment Measure for Binary Foreground Map Evaluation",
author="Deng-Ping {Fan} and Cheng {Gong} and Yang {Cao} and Bo {Ren} and Ming-Ming {Cheng} and Ali {Borji}",
booktitle=IJCAI,
pages="698--704",
year={2018}
}
@inproceedings{wFmeasure,
title={How to evaluate foreground maps?},
author={Margolin, Ran and Zelnik-Manor, Lihi and Tal, Ayellet},
booktitle=CVPR,
pages={248--255},
year={2014}
}
@inproceedings{MSIoU,
title = {Multiscale IOU: A Metric for Evaluation of Salient Object Detection with Fine Structures},
author = {Ahmadzadeh, Azim and Kempton, Dustin J. and Chen, Yang and Angryk, Rafal A.},
booktitle = ICIP,
year = {2021},
}
@inproceedings{SizeInvarianceVariants,
title = {Size-invariance Matters: Rethinking Metrics and Losses for Imbalanced Multi-object Salient Object Detection},
author = {Feiran Li and Qianqian Xu and Shilong Bao and Zhiyong Yang and Runmin Cong and Xiaochun Cao and Qingming Huang},
booktitle = ICML,
year = {2024}
}
@inproceedings{HumanCorrectionEffortMeasure,
title = {Highly Accurate Dichotomous Image Segmentation},
author = {Xuebin Qin and Hang Dai and Xiaobin Hu and Deng-Ping Fan and Ling Shao and Luc Van Gool},
booktitle = ECCV,
year = {2022}
}
@article{ContextMeasure,
title={Context-measure: Contextualizing Metric for Camouflage},
author={Wang, Chen-Yang and Ji, Gepeng and Shao, Song and Cheng, Ming-Ming and Fan, Deng-Ping},
journal={arXiv preprint arXiv:2512.07076},
year={2025}
}
Python
100.0%