A Python-based image binary segmentation evaluation toolbox.
基于Python的图像二值分割测评工具箱
pathlib.Path
替换 os.path
.utils/recorders/metric_recorder.py
.
eval.py
请指定指标 fmeasure
)eval.py
请指定指标 em
)eval.py
请指定指标 precision
和 recall
,这一点不同于以前的版本,因为 precision
和 recall
的计算被从 fmeasure
中独立出来了).npy
文件导出 LaTeX 表格代码, 同时支持对最优的前三个方法用不同颜色进行标记.先安装相关依赖库: pip install -r requirements.txt
.
其中指标评估是基于本人的另一个项目: PySODMetrics, 欢迎捉BUG!
本项目依赖于json文件存放数据, ./examples
中已经提供了数据集和方法配置的例子: config_dataset_json_example.json
和 config_method_json_example.json
, 可以至直接修改他们用于后续步骤.
[注意]
tools/check_path.py
来检查下json文件中的路径信息是否正常.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
# --curves-npy 输出曲线数据到 output/rgb_sod/curves.npy
# --record-txt 输出评估结果文本到 output/rgb_sod/results.txt
# --record-xlsx 输出评估结果到excel文档 output/rgb_sod/results.xlsx
# --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曲线;fm: 绘制的是fm曲线
# --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曲线;fm: 绘制的是fm曲线
# --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
Precision-Recall Curve:
F-measure Curve:
E-measure Curve:
@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{MAE,
title={Saliency filters: Contrast based filtering for salient region detection},
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={Structure-measure: A new way to eval 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 eval foreground maps?},
author={Margolin, Ran and Zelnik-Manor, Lihi and Tal, Ayellet},
booktitle=CVPR,
pages={248--255},
year={2014}
}
tools/rename.py
来批量修改文件名.请小心使用, 以避免数据被覆盖.rename
, Windows 上的 Microsoft PowerToys
readme.md
和示例文件。examples
文件夹中的config_method_json_example.json
),现在搭配后缀,基本上可以应对所有可能的情形了。但是需要说明的是,目前不支持使用文件提供的映射关系,请确保预测名字中包含真值(不包含扩展名)名字。sharey
,这可以用来辅助绘制独立的示例图。具体使用可见examples
中的plot_results.py
文件。include_
与 exclude_
类选项的相关函数.examples
中提供的配置文件统一命名为config_
.json
配置文件中读取键来作为绘图中显示的名字,这对于名字有特殊标记(例如名字中想补充年份或者会议名字)时的使用不太方便和灵活。所以当前支持了使用额外的 json
配置文件来配置映射关系。例子可见 examples
中的 alias_for_plotting.json
。eval_all.py
和plot_results.py
的配置和调用方式发生了变化,所以为了便于大家的使用和修改,我提供了两个简单调用的sh
文件,里面提供了这怒地各个选项的基本配置案例。linux用户可以直接使用bash <sh_name>.sh
来执行,而windows用户麻烦些,还是自己参考着其中的配置项在终端自行配置吧!有问题欢迎提问,当然,如果大家可以提供windows直接调用的bat
文件倒也欢迎PR哦!tools/converter.py
,使其支持横竖两种格式的表格, 并补充对应的文档.tools/converter.py
), 并提供了配置文件示例(examples/converter_config.py
).metrics/cal_sod_matrics.py
), cosod的代码由于使用频率较小, 没有改写, 欢迎PR.examples/eval_all.py
),readme.md
文件中补充文档.requirements.txt
文件.:=
tools
中的文件, 并修改readme.md.examples
中补充了数据集配置和方法配置的python文件示例.eval_all.py
中的include_methods
指定特定方法即可实现目的.rename.py
, 以及用于检查json文件中路径的合法性的check_path.py
(建议每次修改完json后, 用该工具检查下).tabulate
处理, 更加方便, 输出的格式配置更丰富, 详见https://github.com/astanin/python-tabulatecal_sod_matrics
的skipped_datasets
为:
get_datasets_info
的exclude_datasets/include_datasets
;get_methods_info
的exclude_methods/include_methods
../utils/misc.py
中的colored_print
.