使用imgaug库遇AttributeError:'FigureCanvasAgg'无set_window_title属性
问题
在MacOS笔记本上运行一段展示带边界框图片的代码时触发错误,错误源于imgaug库内部逻辑,该库通过conda-forge渠道安装。
运行代码
import imageio import imgaug as ia from imgaug.augmentables.bbs import BoundingBox, BoundingBoxesOnImage %matplotlib inline ia.seed(1) image = imageio.imread("https://upload.wikimedia.org/wikipedia/commons/8/8e/Yellow-headed_caracara_%28Milvago_chimachima%29_on_capybara_%28Hydrochoeris_hydrochaeris%29.JPG") image = ia.imresize_single_image(image, (298, 447)) bbs = BoundingBoxesOnImage([ BoundingBox(x1=0.2*447, x2=0.85*447, y1=0.3*298, y2=0.95*298), BoundingBox(x1=0.4*447, x2=0.65*447, y1=0.1*298, y2=0.4*298) ], shape=image.shape) ia.imshow(bbs.draw_on_image(image, size=2))
错误信息
AttributeError Traceback (most recent call last) Cell In[1], line 15 8 image = ia.imresize_single_image(image, (298, 447)) 10 bbs = BoundingBoxesOnImage([ 11 BoundingBox(x1=0.2*447, x2=0.85*447, y1=0.3*298, y2=0.95*298), 12 BoundingBox(x1=0.4*447, x2=0.65*447, y1=0.1*298, y2=0.4*298) 13 ], shape=image.shape) ---> 15 ia.imshow(bbs.draw_on_image(image, size=2)) File ~/miniconda3/envs/imgaug/lib/python3.11/site-packages/imgaug/imgaug.py:2120, in imshow(image, backend) 2117 w = max(w, 6) 2119 fig, ax = plt.subplots(figsize=(w, h), dpi=dpi) -> 2120 fig.canvas.set_window_title("imgaug.imshow(%s)" % (image.shape,)) 2121 # cmap=gray is automatically only activate for grayscale images 2122 ax.imshow(image, cmap="gray") AttributeError: 'FigureCanvasAgg' object has no attribute 'set_window_title'
解决方案
错误根源是matplotlib的Agg后端不支持set_window_title方法,但imgaug的ia.imshow强制调用了该方法,以下是三种可行解决方式:
替换为matplotlib原生显示方法:
直接弃用ia.imshow,改用matplotlib的原生API展示图片,代码替换为:import matplotlib.pyplot as plt plt.imshow(bbs.draw_on_image(image, size=2)) plt.show()这种方式绕开了imgaug的问题代码,适配所有matplotlib后端,尤其适合你使用的jupyter notebook环境(
%matplotlib inline)。修改imgaug源码修复bug:
找到imgaug.py文件(路径为错误信息中的~/miniconda3/envs/imgaug/lib/python3.11/site-packages/imgaug/imgaug.py),定位到第2120行,将该行代码替换为:fig.suptitle("imgaug.imshow(%s)" % (image.shape,))或者直接注释掉该行——因为在jupyter的inline模式下,窗口标题本就不会显示,不影响图片展示效果。
切换matplotlib后端:
在代码开头添加以下两行,切换到支持窗口标题的交互式后端(如TkAgg):import matplotlib matplotlib.use('TkAgg')注意:此方法需要你的MacOS已安装对应后端依赖(比如tkinter),若未安装需先通过conda或pip补充安装。
内容的提问来源于stack exchange,提问作者tomxor
相关产品推荐
相关产品推荐

