2lambda123 / lartpang-PySODEvalToolkit

MIT License
0 stars 0 forks source link

基于Python的图像二值分割测评工具箱

A Python-based image binary segmentation evaluation toolbox.

基于Python的图像二值分割测评工具箱

一些规划

特性

使用方法

安装依赖

先安装相关依赖库: pip install -r requirements.txt .

其中指标评估是基于本人的另一个项目: PySODMetrics, 欢迎捉BUG!

配置数据集与方法预测的路径信息

本项目依赖于json文件存放数据, ./examples 中已经提供了数据集和方法配置的例子: config_dataset_json_example.jsonconfig_method_json_example.json , 可以至直接修改他们用于后续步骤.

[注意]

关于配置的更多细节 例子 1: 数据集配置 注意, 这里的 "image" 是非必要的. 实际评估仅仅读取 "mask". ```json { "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: 方法配置 ```json { "Method1": { "PASCAL-S": { "path": "Path_Of_Method1/PASCAL-S", "prefix": "some_method_prefix", "suffix": ".png" }, "ECSSD": { "path": "Path_Of_Method1/ECSSD", "prefix": "some_method_prefix", "suffix": ".png" }, "HKU-IS": { "path": "Path_Of_Method1/HKU-IS", "prefix": "some_method_prefix", "suffix": ".png" }, "DUT-OMRON": { "path": "Path_Of_Method1/DUT-OMRON", "prefix": "some_method_prefix", "suffix": ".png" }, "DUTS-TE": { "path": "Path_Of_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: 数据集配置 ```json { "dataset1": { "mask": { "path": "path/Mask", "prefix": "gt_", "suffix": ".png" } } } ``` 例子 4: 方法配置 ```json { "method1": { "dataset1": { "path": "path/dataset1", "prefix": "method1_", "suffix": ".jpg" } } } ```

执行评估过程

为灰度图像的评估绘制曲线

可以使用 plot.py 来读取 .npy 文件按需对指定方法和数据集的结果整理并绘制 PR , F-measureE-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:

PRCurves

F-measure Curve:

fm-curves

E-measure Curve:

em-curves

相关文献

@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}
}

小提示

编程参考

更新日志