使用CocoEval时accumulate()意外打印结果的原因及解决方法
COCO Eval 打印问题排查与解决
问题背景
使用基于GitHub官方demo修改的COCO eval脚本时,执行cocoEval.accumulate()步骤会在控制台打印评估结果:调试/交互模式下每次执行都打印,脚本模式下虽仅打印一次但不符合预期。经排查,打印触发点在cocoeval.py第411行的字典定义——当字典包含precision字段时触发打印,移除该字段打印停止但脚本报错;在cocoEval.summarize()后执行cocoEval.eval = {}可停止后续打印,precision为普通numpy数组。
a) 为何cocoEval.eval字典中的precision字段会导致打印行为变化?
核心原因有两种可能:
- 官方COCO eval脚本的
accumulate()方法内部,存在针对precision字段的调试打印逻辑未被移除,当该字段被加入eval字典后,直接触发了预设的print()语句。 - 在交互/调试模式下,Python解释器会自动输出当前赋值的复杂变量的字符串表示,
precision是维度较高的numpy数组,包含它的eval字典在被赋值时,其repr()/str()操作会生成大量输出,从而被控制台打印;脚本模式下的单次打印,则是脚本中某个隐式输出逻辑(如误写的print(cocoEval.eval))被触发。
b) 如何彻底阻止该打印?
提供三种可行方案:
- 直接修改源码:找到
cocoeval.py第411行附近触发打印的代码,将对应的print()语句注释或删除,从根源上消除打印逻辑。 - 清空
eval字典:在调用cocoEval.summarize()后立即执行cocoEval.eval = {},但需确保后续代码不再依赖eval字典中的内容;若后续仍需使用,可先将precision等关键字段临时保存,用完再清空字典。 - 临时重定向输出:利用Python的上下文管理器临时重定向标准输出,避开打印内容,示例代码如下:
import sys from contextlib import redirect_stdout # 执行评估时临时屏蔽输出 with redirect_stdout(open('/dev/null', 'w')): cocoEval.accumulate() cocoEval.summarize() # 后续代码恢复正常输出
内容的提问来源于stack exchange,提问作者Eypros
相关产品推荐
相关产品推荐

