运行TensorFlow目标检测时遇matplotlib.use()无效警告求助
首先明确你遇到的警告信息:
/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/erdogan/PycharmProjects/CNN/tens/model/research/object_detection/object_detection_tutorial.py
/Users/erdogan/PycharmProjects/CNN/tens/model/research/object_detection/utils/visualization_utils.py:25: UserWarning: This call to matplotlib.use() has no effect because the backend has already been chosen; matplotlib.use() must be called before pylab, matplotlib.pyplot, or matplotlib.backends is imported.
这是个很常见的Matplotlib初始化顺序问题,我给你两个实用的解决思路:
方案1:调整自己脚本的导入顺序(推荐)
打开你运行的object_detection_tutorial.py,把Matplotlib后端设置的代码放在所有其他Matplotlib相关导入的最前面。比如:
# 先设置Matplotlib后端 import matplotlib matplotlib.use('Agg') # 如果你需要显示图像窗口,可以改成'TkAgg',根据你的运行环境选择 # 再导入其他依赖 import matplotlib.pyplot as plt import tensorflow as tf # 其他TensorFlow目标检测相关导入...
这样就能保证在Matplotlib初始化后端之前完成设置,警告自然就消失了。
方案2:修改官方工具脚本(不推荐)
如果你不想改动自己的主脚本,可以直接修改报错的visualization_utils.py文件:找到第25行的matplotlib.use()调用,把它移到文件的最顶部,放在所有其他导入语句之后、其他业务代码执行之前。不过这种修改官方库文件的方式会影响后续的库更新,所以还是优先用方案1。
为什么会触发这个警告?
Matplotlib的后端(负责图像渲染的底层组件)一旦被初始化——比如你导入了matplotlib.pyplot或者pylab之后——再调用matplotlib.use()就完全没用了。这个警告就是在告诉你,visualization_utils.py里的设置调用太晚,已经错过了设置后端的时机。
内容的提问来源于stack exchange,提问作者Vural Erdogan

