Python> 正文

同时使用yolov5、matplotlib绘图不显示问题

2024-05-30T12:21:33+08:00

同时使用yolov5、matplotlib绘图不显示,问题出在yolov5代码中会改写matplotlib的backend。

https://github.com/ultralytics/yolov5/blob/916bdb1d61f23de92833bd491df54cda5c3ef0cc/utils/plots.py#L28

有两种处理方式: 1、在调用torch.hub.load之前先保存matplotlib的backend,调用后在恢复过来。

# Save backend
b = plt.get_backend()

torch.hub.load(yolo_path, 'custom', path=onnx_path, source='local')

#Reset backend
matplotlib.use(b)
#或者直接
import matplotlib

model = torch.hub.load('ultralytics/yolov5', 'yolov5s') # Load model first
matplotlib.use('TkAgg') # Change backend after loading model

2、如果单独封装函数使用matplotlib绘图,则:

        if plt.get_backend()=="agg":
            plt.switch_backend("TkAgg")

例如:

import matplotlib.pyplot as plt
def plot_images(images, titles=None, ncols=2):
    """
    绘制多个图像,并自适应布局。

    参数:
        images (list): 包含图像数据的列表。
        titles (list): 图像标题列表(可选)。
        ncols (int): 每行的图像数量。
    """
    try:
        if plt.get_backend()=="agg":
            plt.switch_backend("TkAgg")

        num_images = len(images)
        print(f"本次显示{num_images}张图片")

        nrows = (num_images + ncols - 1) // ncols
        fig, axes = plt.subplots(nrows, ncols, figsize=(12, 8))

        for i, ax in enumerate(axes.flat):
            try:

                if i < num_images:

                    ax.imshow(cv2.cvtColor(images[i], cv2.COLOR_BGR2RGB))

                    ax.axis("off")
                    if titles:
                        ax.set_title(titles[i])
                else:
                    ax.axis("off")
            except Exception as e:
                print(f"{i} -- {e}")
        plt.tight_layout()
        plt.show()
    except Exception as e:
        print(e)
分享到:

Ranvane的日常记录

关于我们 客服中心 广告服务 法律声明