尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

imagededup 去重质量评估指南:用 evaluate API 量化去重算法与阈值效果

imagededup 去重质量评估指南:用 evaluate API 量化去重算法与阈值效果 计算机视觉图像处理人工智能【免费下载链接】imagededup Finding duplicate images made easy!项目地址https://gitcode.com/gh_mirrors/im/imagededup点击查看免费下载本文面向使用 imagededup 进行图片去重的开发者系统讲解项目内置的评估框架imagededup.evaluation.evaluate如何基于人工标注的 ground truth 与算法检索结果一键计算 MAP、NDCG、Jaccard 以及逐类别 Precision/Recall/F1-score 六类指标。读完本文你将掌握评估框架的输入契约、metric 参数用法、两类指标在对称关系处理上的本质差异并能在自己的图片目录上复现端到端的去重质量评估。为什么需要评估去重质量imagededup 提供了 PHash、AHash、DHash、WHash 与 CNN 等多种去重方法见 find_duplicates 使用指南。每种方法都有阈值参数哈希方法使用max_distance_threshold海明距离默认 10CNN 方法使用min_similarity_threshold余弦相似度默认 0.9。阈值调得太宽松会漏掉真正的重复图片漏报调得太严格又会产生大量误报。要客观地回答当前算法 当前阈值到底表现如何这个问题就需要一个评估框架给定一份人工标注的 ground truth与算法实际检索出的 duplicates 映射计算一组可量化的指标。这正是imagededup.evaluation模块存在的意义。核心 API一行代码拿到全部指标评估框架的入口是imagededup.evaluation包中的evaluate函数导出定义见 imagededup/evaluation/init.py调用方式如下from imagededup.evaluation import evaluate metrics evaluate(ground_truth_map, retrieved_map, metricmetric-name)返回的metrics是一个字典包含以下键{ map: map, # 平均精度均值单个浮点数 ndcg: mean ndcg, # 平均 NDCG单个浮点数 jaccard: mean jaccard index, # 平均 Jaccard 指数单个浮点数 precision: numpy array having per class precision, # 逐类别精确率 recall: numpy array having per class recall, # 逐类别召回率 f1-score: numpy array having per class f1-score, # 逐类别 F1 值 support: numpy array having per class support # 逐类别样本数 }其中precision、recall、f1-score、support均为 numpy 数组每个数组有两个元素第一个对应类别 0非重复图片对第二个对应类别 1重复图片对。参数说明Optionsground_truth_map字典类型键为文件名值为该文件的重复文件名字符串列表代表标准答案。retrieved_map字典类型键为文件名值为算法检索出的重复文件名字符串列表即去重算法的输出。metric字符串决定计算哪些指标可选值如下map仅计算 MAPndcg仅计算 NDCGjaccard仅计算 Jaccard 指数classification返回逐类别 precision、recall、f1-score、supportall默认值返回上述全部指标。从 evaluation.py 的分派逻辑 可以看到metric参数在入口处会被统一转为小写再匹配前三个值走信息检索指标分支mean_metricclassification走分类指标分支classification_metricsall则同时调用get_all_metrics与classification_metrics合并返回传入任何其他值会抛出ValueError。测试 test_evaluator.py 与 test_evaluator.py 分别验证了非法参数报错与大小写不敏感如MAP、Ndcg的行为。输入数据契约两份映射字典的硬性要求评估的输入是两份结构完全对称的字典框架在计算前会做严格校验校验逻辑实现在 evaluation.py 的_check_map_correctness中主要包括三条规则所有出现在 value 中的文件名必须同时是 map 的 key。即不能出现某文件的重复文件不在键集合中的情况否则抛出AssertionError信息为 Ground/Retrieved map has filenames that are not in the key filename of the map!。重复关系必须对称transpose。_transpose_checker见 evaluation.py会遍历每个 key 的 value 列表断言key也出现在mapping[v]中否则抛出AssertionError提示 transpose 关系被破坏。例如如果i的重复列表里包含j那么j的重复列表里也必须包含i。ground_truth_map 与 retrieved_map 必须具有完全相同的键集合。若不一致抛出Exception并在报错信息中列出两组键的对称差symmetric_difference便于定位问题。这三条规则都有对应测试test_evaluator.py 中的test__transpose_checker、test__check_map_correctness_extra_gt_vals、test__check_map_correctness_extra_ret_vals与test__check_map_correctness_different_keys。注意目前的框架要求 ground truth 由用户手动准备框架并不自动生成。同时由于第 2 条校验的存在手动标注时必须把双向关系都写全——若图片i是图片j的重复则j也必须被标记为i的重复缺失对称关系会直接导致异常。信息检索类指标把每个 key 当作一次独立查询map、ndcg、jaccard属于信息检索Information Retrieval类指标。在 information_retrieval.py 中mean_metric通过一个metric_lookup字典把指标名映射到对应的单查询函数然后遍历 ground truth 的每个 key以ground_truth[k]为正确结果、retrieved[k]为检索结果计算该查询的指标最后对所有查询取算术平均。MAP单查询平均精度的均值avg_precinformation_retrieval.py对单个查询计算 Average Precision对 retrieved 列表中每个元素标注相关性是否在 correct 列表中计算逐位置的累积精确率precisionk只对相关位置的精确率求和再除以正确重复总数。其边界行为值得注意当检索列表与正确列表都为空时返回 1.0当一方为空而另一方非空时返回 0.0。最终 MAP 是所有查询 AP 的均值。NDCG考虑排序位置的归一化折损累积增益ndcginformation_retrieval.py先对检索列表计算 DCG增益使用二值相关性、折损使用log2(k2)再除以理想排序下的 IDCG 完成归一化若 DCG 为 0 则直接返回 0.0。与 AP 不同NDCG 对相关项排在列表前部给予额外奖励更适合衡量排序质量。Jaccard集合重合度的简单度量jaccard_similarityinformation_retrieval.py即检索集合与正确集合的交集大小除以并集大小完全忽略排序信息是最直观的重复检索重合度指标。三个指标对检索数与正确数不相等的鲁棒性由单元测试覆盖见 test_information_retrieval.py其中包含了检索数等于 / 少于 / 多于正确数、零检索、双零、仅检索无正确等边界场景的期望数值。分类类指标把重复问题重构成二分类precision、recall、f1-score则由 classification.py 提供。它的思路是把哪些图片对互为重复重构成一个二分类问题实现分三步生成全部唯一图片对_make_all_unique_possible_pairsclassification.py对 ground truth 的所有 key 做笛卡尔积后去掉同元素对再经_get_unique_ordered_tuples排序去重得到所有无序图片对。分别提取正样本对_make_positive_duplicate_pairsclassification.py分别从 ground truth 与 retrieved 映射中把每个 key 与其 value 组成对同样做排序去重得到两套正样本对集合。构造标签并计算_prepare_labelsclassification.py对全部唯一图片对若该对在 ground truth 正样本集合中则y_true1否则为 0在 retrieved 正样本集合中则y_pred1否则为 0。最后调用 scikit-learn 的precision_recall_fscore_support得到逐类别的 precision、recall、f1-score 与 support。值得注意的是classification_metrics内部还会调用 scikit-learn 的classification_report打印一份完整的分类报告到日志见 classification.py便于直接阅读。其返回结构precision/recall/f1_score/support 各为长度 2 的数组由集成测试 test_evaluator.py 给出精确断言对一组故意漏检的数据期望值为precision[0.5, 1.0]、recall[1.0, 0.5]、f1_score[0.66666667, 0.66666667]、support[2, 4]。关键差异信息检索与分类指标如何对待对称关系这是评估框架中最容易踩坑、也最值得理解的一点两类指标对重复关系中对称性的计次方式不同。考虑下面的例子ground_truth_map { 1.jpg: [2.jpg, 4.jpg], 2.jpg: [1.jpg], 3.jpg: [], 4.jpg: [1.jpg] } retrieved_map { 1.jpg: [2.jpg], 2.jpg: [1.jpg], 3.jpg: [], 4.jpg: [] }可以看出去重算法没有发现1.jpg与4.jpg互为重复。信息检索指标按查询计次每个 key 都是一次独立查询。在 ground truth 中4.jpg是查询1.jpg的重复未被检索出来就是查询1.jpg的一次 miss同理1.jpg也是查询4.jpg的重复未被检索出来就是查询4.jpg的一次 miss。于是缺失的关系被计了两次每条对称边缺失会同时惩罚两个方向的查询。这也正是框架要求两个映射都必须满足对称关系的深层原因——不对称会让按查询计数的指标失真。分类指标按图片对计次它把(1.jpg, 2.jpg)、(1.jpg, 3.jpg)、(1.jpg, 4.jpg)、(2.jpg, 3.jpg)、(2.jpg, 4.jpg)、(3.jpg, 4.jpg)这 6 个唯一图片对作为样本每对只计一次。基于 ground truth 生成的标签为Image PairLabel(1.jpg, 2.jpg)1(1.jpg, 3.jpg)0(1.jpg, 4.jpg)1(2.jpg, 3.jpg)0(2.jpg, 4.jpg)0(3.jpg, 4.jpg)0基于 retrieved 生成的预测标签为Image PairLabel(1.jpg, 2.jpg)1(1.jpg, 3.jpg)0(1.jpg, 4.jpg)0(2.jpg, 3.jpg)0(2.jpg, 4.jpg)0(3.jpg, 4.jpg)0可以看到缺失的(1.jpg, 4.jpg)关系在分类指标中只被计一次ground truth 侧为 1、retrieved 侧为 0。因此两份指标的结果并不等价选择何种指标取决于业务视角如果想关注以任意一张图为查询的检索完整性用 MAP/NDCG/Jaccard如果想关注整个目录中重复图片对判定的整体准确率用分类指标。端到端实战在真实图片目录上评估 CNN 去重仓库中的 examples/Evaluation.ipynb 给出了一条完整的评估链路我们在此展开复述。第一步用 CNN 方法获取去重结果。以tests/data/mixed_images目录为例该目录包含原图、水平翻转、缩放、旋转、损坏等变体见 tests/data/mixed_imagesfrom imagededup.methods import CNN cnn_encoder CNN() duplicates_cnn cnn_encoder.find_duplicates( image_dirtests/data/mixed_images, min_similarity_threshold0.97 )得到的结果形如{ukbench00120.jpg: [ukbench00120_resize.jpg], ukbench00120_hflip.jpg: [], ukbench00120_resize.jpg: [ukbench00120.jpg], ukbench00120_rotation.jpg: [], ukbench09268.jpg: []}注意该结果天然满足对称性ukbench00120.jpg与ukbench00120_resize.jpg互为重复且无法解码的损坏图片ukbench09268_corrupt.jpg被自动忽略、不出现在结果中——这与 find_duplicates 文档 中无法加载的图片不参与去重的约定一致。第二步人工标注 ground truth。必须包含对称关系ground_truth { ukbench00120.jpg: [ukbench00120_hflip.jpg, ukbench00120_resize.jpg], ukbench00120_hflip.jpg: [ukbench00120.jpg, ukbench00120_resize.jpg], ukbench00120_resize.jpg: [ukbench00120.jpg, ukbench00120_hflip.jpg], ukbench00120_rotation.jpg: [], ukbench09268.jpg: [] }第三步调用 evaluate。使用默认的metricallfrom imagededup.evaluation import evaluate metrics evaluate(ground_truth_mapground_truth, retrieved_mapduplicates_cnn)运行时会依次打印日志Validating ground truth map ..、Ground truth map validated、Validating retrieved map ..、Duplicate map validated、Validating ground truth map and retrieved map consistency..、Ground truth map and retrieved map found to be consistent.对应 evaluation.py 的校验流程随后输出 scikit-learn 的分类报告。最终metrics内容为{map: 0.6, ndcg: 0.8, jaccard: 0.6, precision: array([0.77777778, 1. ]), recall: array([1. , 0.33333333]), f1_score: array([0.875, 0.5 ]), support: array([7, 3])}解读在该阈值下CNN 对重复对class 1的召回率只有 0.33——说明min_similarity_threshold0.97过于严格漏掉了缩放与水平翻转变体而对非重复对class 0召回率 1.0未产生误报。此时即可依据这些数字下调阈值例如min_similarity_threshold0.9重新评估直到 MAP/NDCG 与 class 1 的 F1 达到业务可接受的水平。这就是评估框架在调阈值场景中的核心用法evaluate只负责量化阈值迭代由你根据指标自主决策。边界行为与局限从源码与测试可以归纳出以下需要留意的行为边界完美检索时指标为 1.0当 retrieved_map 与 ground_truth_map 完全一致时map、ndcg、jaccard均为 1.0见 test_information_retrieval.py。空列表的宽容处理单个查询若检索列表与正确列表都为空AP/NDCG/Jaccard 均记为 1.0该查询无需检索即满分若只有一方为空则记为 0.0。测试见 test_information_retrieval.py。metric大小写不敏感MAP、Ndcg、Classification均可正常使用底层会统一小写。ground truth 必须人工准备框架当前不提供自动生成 ground truth 的能力标注时务必保证对称性与键集合一致否则校验阶段直接抛异常。对于大目录可借助find_duplicates的scoresTrue输出见 find_duplicates 文档辅助人工复核再构造标准答案。指标输出维度信息检索指标返回单一浮点数分类指标返回长度为 2 的 numpy 数组class 0 非重复对class 1 重复对support给出各类别的真实样本数量便于评估类别不平衡程度。小结imagededup.evaluation.evaluate用一份代码覆盖了去重效果度量的全部场景信息检索视角的 MAP / NDCG / Jaccard分类视角的逐类 Precision / Recall / F1 / Support并内置了对称性与键一致性的输入校验。掌握它你就能用可复现、可对比的数字回答哪种方法、哪个阈值更适合我的图片集——这是把 imagededup 从能跑通推进到可调优、可信赖的关键一步。赞分享计算机视觉图像处理人工智能【免费下载链接】imagededup Finding duplicate images made easy!项目地址https://gitcode.com/gh_mirrors/im/imagededup点击查看免费下载相关推荐imagededup 评估框架使用指南如何科学评估去重效果imagededup 评估框架使用指南如何科学评估去重效果 imagededup 是一个强大的 Python 库专门用于图像去重。但仅仅找到重复图片还不够计算机视觉图像处理人工智能终极指南LangExtract实体去重算法如何解决重复提取难题并提升结果质量终极指南LangExtract实体去重算法如何解决重复提取难题并提升结果质量 LangExtract是一个基于LLM的Python库用于从非结构化文本中提取人工智能大模型NLPAI 应用Captura视频去模糊效果评估主观质量与客观指标对比Captura视频去模糊效果评估主观质量与客观指标对比 1. 引言视频去模糊的技术挑战与评估意义 在屏幕录制Screen Recording领域视频模桌面应用屏幕录制音视频上一篇Go Chi 自定义中间件开发终极指南编写可重用中间件的 10 个核心技巧下一篇GerberTools高级技巧如何批量处理与优化Gerber文件创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表