基于Python的图像灰度/二值分割评估工具箱
[中文文档](https://github.com/lartpang/PySODEvalToolkit/blob/master/./readme_zh.md
待办事项
- 更灵活的配置脚本。
- 使用符合matplotlib要求的yaml文件来控制绘图格式。
- 将json替换为更灵活的配置格式,如yaml或toml。
- 添加测试脚本。
- 添加更详细的注释。
- 优化导出评估结果的代码。
- 实现将结果导出到XLSX文件的代码。
- 优化导出到XLSX文件的代码。
- 考虑使用CSV等文本格式是否更好?可以作为文本文件打开,也可以用Excel整理。
- 用
pathlib.Path
替换os.path
。 - 改进数据分组代码,支持CoSOD、视频二值分割等任务。
- 支持并发策略以加快计算速度。保留多线程支持,移除之前的多进程代码。
- 目前由于使用多线程,存在额外日志信息写入的问题,需要进一步优化。
- 将USVOS代码分离到另一个仓库PyDavis16EvalToolbox。
- 使用更快速、准确的度量代码PySODMetrics作为评估基准。
[!tip]
- 一些方法提供的结果名称与原始数据集的真值名称不匹配。
- [注意] (2021-11-18) 目前已支持
prefix
和suffix
名称,因此用户通常无需自行更改名称。- [可选] 提供的脚本tools/rename.py可用于批量重命名文件。请谨慎使用,以避免数据覆盖。
- [可选] 其他工具,如Linux上的
rename
,Windows上的Microsoft PowerToys
。
特性
- 得益于PySODMetrics,支持更丰富的度量指标。详见
utils/recorders/metric_recorder.py
。- 支持评估灰度图像,如显著性目标检测(SOD)和伪装目标检测(COD)任务的预测结果。
- MAE
- Emeasure
- Smeasure
- 加权Fmeasure
- 最大/平均/自适应Fmeasure
- 最大/平均/自适应精确率
- 最大/平均/自适应召回率
- 最大/平均/自适应IoU
- 最大/平均/自适应Dice
- 最大/平均/自适应特异性
- 最大/平均/自适应BER
- Fmeasure-阈值曲线(运行
eval.py
时使用度量fmeasure
) - Emeasure-阈值曲线(运行
eval.py
时使用度量em
) - 精确率-召回率曲线(运行
eval.py
时使用度量precision
和recall
,这与之前版本不同,因为precision
和recall
的计算已从fmeasure
中分离)
- 支持评估二值图像,如常见的二值分割任务。
- 二值Fmeasure
- 二值精确率
- 二值召回率
- 二值IoU
- 二值Dice
- 二值特异性
- 二值BER
- 支持评估灰度图像,如显著性目标检测(SOD)和伪装目标检测(COD)任务的预测结果。
- 更丰富的功能。
- 支持根据配置评估模型。
- 支持根据配置和评估结果绘制
PR曲线
、F-measure曲线
和E-measure曲线
。 - 支持将结果导出到TXT文件。
- 支持将结果导出到XLSX文件(2021年1月4日重新支持)。
- 支持从生成的
.npy
文件导出LaTeX表格代码,并用不同颜色标记前三名方法。 - … :>.
使用方法
安装依赖
安装所需库:pip install -r requirements.txt
度量评估基于我的另一个项目:PySODMetrics。欢迎报告错误!
配置数据集和方法预测的路径
本项目依赖json文件存储数据。./examples
中提供了数据集和方法配置的示例:config_dataset_json_example.json
和config_method_json_example.json
。您可以直接修改它们以进行后续步骤。
[!note]
- 请注意,由于本项目依赖OpenCV读取图像,请确保路径字符串不包含非ASCII字符。
- 确保数据集配置文件中的数据集名称与方法配置文件中的数据集名称匹配。准备好json文件后,建议使用提供的
tools/check_path.py
检查json文件中的路径信息是否正确。
配置的更多详细信息
示例1:数据集配置
注意,这里"image"不是必需的。实际评估只读取"mask"。
{
"LFSD": {
"image": {
"path": "Path_Of_RGBDSOD_Datasets/LFSD/Image",
"prefix": "some_gt_prefix",
"suffix": ".jpg"
},
"mask": {
"path": "Path_Of_RGBDSOD_Datasets/LFSD/Mask",
"prefix": "some_gt_prefix",
"suffix": ".png"
}
}
}
示例2:方法配置
{
"Method1": {
"PASCAL-S": {
"path": "Method1路径/PASCAL-S",
"prefix": "某方法前缀",
"suffix": ".png"
},
"ECSSD": {
"path": "Method1路径/ECSSD",
"prefix": "某方法前缀",
"suffix": ".png"
},
"HKU-IS": {
"path": "Method1路径/HKU-IS",
"prefix": "某方法前缀",
"suffix": ".png"
},
"DUT-OMRON": {
"path": "Method1路径/DUT-OMRON",
"prefix": "某方法前缀",
"suffix": ".png"
},
"DUTS-TE": {
"path": "Method1路径/DUTS-TE",
"suffix": ".png"
}
}
}
这里,path
表示存储图像数据的目录。prefix
和suffix
分别指预测图像和实际真实图像名称中公共部分之外的前缀和后缀。
在评估过程中,方法预测和数据集真实值的匹配是基于文件名的共享部分。它们的命名模式预设为[prefix]+[shared-string]+[suffix]
。例如,如果有预测图像如method1_00001.jpg
、method1_00002.jpg
、method1_00003.jpg
和真实图像gt_00001.png
、gt_00002.png
、gt_00003.png
,则可以按如下方式配置:
示例3:数据集配置
{
"dataset1": {
"mask": {
"path": "path/Mask",
"prefix": "gt_",
"suffix": ".png"
}
}
}
示例4:方法配置
{
"method1": {
"dataset1": {
"path": "path/dataset1",
"prefix": "method1_",
"suffix": ".jpg"
}
}
}
运行评估
- 一旦前面所有步骤正确完成,你就可以开始评估了。关于评估脚本的使用,请参考命令
python eval.py --help
的输出。 - 根据你的需求添加配置选项并执行命令。如果没有异常,它将生成指定文件名的结果文件。
- 如果没有指定所有文件,它将直接输出结果,详见
eval.py
的帮助信息。 - 如果指定了
--curves-npy
,与绘图相关的指标信息将保存在相应的.npy
文件中。
- 如果没有指定所有文件,它将直接输出结果,详见
- [可选]你可以使用
tools/converter.py
直接从生成的npy文件导出LaTeX表格代码。
绘制灰度图像评估的曲线
你可以使用plot.py
读取.npy
文件,根据需要组织并绘制指定方法和数据集的PR
、F-measure
和E-measure
曲线。这个脚本的用法可以在python plot.py --help
的输出中看到。根据你的要求添加配置项并执行命令。
最基本的指示是根据子图的数量合理地指定配置文件中figure.figsize
项的值。
基本执行过程
这里我将以我本地configs文件夹中的RGB SOD配置为例(应根据实际情况进行必要的修改)。
# 检查配置文件
python tools/check_path.py --method-jsons configs/methods/rgb-sod/rgb_sod_methods.json --dataset-jsons configs/datasets/rgb_sod.json
# 确保输出信息中没有不合理的地方后,可以用以下命令开始评估:
# --dataset-json: 设置`configs/datasets/rgb_sod.json`为数据集配置文件
# --method-json: 设置`configs/methods/rgb-sod/rgb_sod_methods.json`为方法配置文件
# --metric-npy: 设置`output/rgb_sod/metrics.npy`存储npy格式的指标信息
# --curves-npy: 设置`output/rgb_sod/curves.npy`存储npy格式的曲线信息
# --record-txt: 设置`output/rgb_sod/results.txt`存储文本格式的结果信息
# --record-xlsx: 设置`output/rgb_sod/results.xlsx`存储Excel格式的结果信息
# --metric-names: 指定`fmeasure em precision recall`作为要计算的指标
# --include-methods: 指定要评估的`configs/methods/rgb-sod/rgb_sod_methods.json`中的方法
# --include-datasets: 指定要评估的`configs/datasets/rgb_sod.json`中的数据集
python eval.py --dataset-json configs/datasets/rgb_sod.json --method-json configs/methods/rgb-sod/rgb_sod_methods.json --metric-npy output/rgb_sod/metrics.npy --curves-npy output/rgb_sod/curves.npy --record-txt output/rgb_sod/results.txt --record-xlsx output/rgb_sod/results.xlsx --metric-names sm wfm mae fmeasure em precision recall --include-methods MINet_R50_2020 GateNet_2020 --include-datasets PASCAL-S ECSSD
# 一旦你获得了曲线数据文件,在这个例子中是'output/rgb_sod/curves.npy'文件,你就可以开始绘图了。
# 对于一个简单的例子,执行以下命令后,结果将保存为 'output/rgb_sod/simple_curve_pr.pdf':
# --style-cfg:指定样式配置文件 `examples/single_row_style.yml`,由于只有少量子图,可以直接使用单行配置。
# --num-rows:图中子图的数量。
# --curves-npys:使用曲线数据文件 `output/rgb_sod/curves.npy` 绘制图表。
# --mode:使用 `pr` 绘制 `pr` 曲线,`em` 绘制 `E-measure` 曲线,`fm` 绘制 `F-measure` 曲线。
# --save-name:只提供图像保存路径,不包括文件扩展名;代码会根据您之前在 `--style-cfg` 中指定的 `savefig.format` 添加文件扩展名。
# --alias-yaml:一个yaml文件,指定在图中使用的方法和数据集别名。
python plot.py --style-cfg examples/single_row_style.yml --num-rows 1 --curves-npys output/rgb_sod/curves.npy --mode pr --save-name output/rgb_sod/simple_curve_pr --alias-yaml configs/rgb_aliases.yaml
# 更复杂的例子,执行以下命令后,结果将保存为 'output/rgb_sod/complex_curve_pr.pdf'。
# --style-cfg:指定样式配置文件 `examples/single_row_style.yml`,由于只有少量子图,可以直接使用单行配置。
# --num-rows:图中子图的数量。
# --curves-npys:使用曲线数据文件 `output/rgb_sod/curves.npy` 绘制图表。
# --our-methods:指定的方法 `MINet_R50_2020` 在图中用粗红色实线高亮显示。
# --num-col-legend:图例的列数。
# --mode:使用 `pr` 绘制 `pr` 曲线,`em` 绘制 `E-measure` 曲线,`fm` 绘制 `F-measure` 曲线。
# --separated-legend:绘制一个共享的单独图例。
# --sharey:共享y轴,只在每行的第一个图中显示刻度值。
# --save-name:只提供图像保存路径,不包括文件扩展名;代码会根据您之前在 `--style-cfg` 中指定的 `savefig.format` 添加文件扩展名。
python plot.py --style-cfg examples/single_row_style.yml --num-rows 1 --curves-npys output/rgb_sod/curves.npy --our-methods MINet_R50_2020 --num-col-legend 1 --mode pr --separated-legend --sharey --save-name output/rgb_sod/complex_curve_pr
相应结果
精确度-召回率曲线:
F-measure曲线:
E-measure曲线:
编程参考
openpyxl
库:https://www.cnblogs.com/programmer-tlh/p/10461353.htmlre
模块:https://www.cnblogs.com/shenjianping/p/11647473.html
相关文献
@inproceedings{Fmeasure,
title={频率调谐显著区域检测},
author={Achanta, Radhakrishna and Hemami, Sheila and Estrada, Francisco and S{\"u}sstrunk, Sabine},
booktitle=CVPR,
number={CONF},
pages={1597--1604},
year={2009}
}
@inproceedings{MAE,
title={显著性过滤器:基于对比度的显著区域检测过滤},
author={Perazzi, Federico and Kr{\"a}henb{\"u}hl, Philipp and Pritch, Yael and Hornung, Alexander},
booktitle=CVPR,
pages={733--740},
year={2012}
}
@inproceedings{Smeasure,
title={结构度量:评估前景图的新方法},
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="增强对齐度量:二值前景图评估",
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={如何评估前景图?},
author={Margolin, Ran and Zelnik-Manor, Lihi and Tal, Ayellet},
booktitle=CVPR,
pages={248--255},
year={2014}
}