同时使用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)