天津市网站建设_网站建设公司_GitHub_seo优化
2026/1/19 2:16:14 网站建设 项目流程

可视化识别结果:matplotlib绘图代码示例

1. 引言:让图像识别结果“看得见”

在计算机视觉任务中,模型输出的Top-K类别和置信度是基础信息,但仅以文本形式展示难以直观理解识别效果。尤其在调试、演示或产品集成阶段,将识别结果与原始图像结合可视化,能显著提升可读性和用户体验。

本文基于阿里开源的「万物识别-中文-通用领域」模型,重点介绍如何使用matplotlib将图像识别结果进行图形化呈现。我们将从推理脚本出发,扩展其功能,实现带标签标注的图像显示与保存,并提供完整可运行代码,帮助开发者快速构建具备可视化能力的图像识别系统。

文章内容适用于已完成基础部署并成功运行推理.py的用户,目标是进一步提升结果表达的专业性与实用性。

2. matplotlib可视化核心逻辑设计

2.1 可视化目标定义

我们期望达成以下可视化效果:

  • 显示原始输入图像
  • 在图像上方或侧边标注Top-N识别结果(含中文标签与置信度)
  • 支持保存为高质量图片文件
  • 保持代码简洁、易于集成到现有流程

2.2 技术选型说明

工具作用
matplotlib.pyplot主要绘图引擎,支持图像显示与文字标注
PIL.Image图像加载与格式统一处理
torchvision.transforms确保图像张量与numpy数组正确转换

关键提示:matplotlib 默认不支持中文显示,需显式配置字体以避免标签乱码。

3. 完整可视化代码实现

3.1 扩展后的推理+可视化脚本

以下是整合了模型推理与结果可视化的完整Python代码,可在/root/workspace/目录下新建可视化推理.py文件使用:

# -*- coding: utf-8 -*- import torch from PIL import Image import matplotlib.pyplot as plt import matplotlib.font_manager as fm from torchvision import transforms import numpy as np import os # --- 1. 模型加载 --- print("正在加载模型...") device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model = torch.hub.load('alibaba-damo-academy/vision', 'universal_image_recognition', source='github') model.to(device).eval() # --- 2. 图像路径配置 --- image_path = "/root/workspace/bailing.png" # 检查文件是否存在 if not os.path.exists(image_path): raise FileNotFoundError(f"图像未找到: {image_path}") print(f"正在处理图像: {image_path}") image = Image.open(image_path).convert("RGB") # --- 3. 图像预处理 --- preprocess = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), ]) input_tensor = preprocess(image) input_batch = input_tensor.unsqueeze(0).to(device) # --- 4. 执行推理 --- with torch.no_grad(): output = model(input_batch) # --- 5. 后处理:获取Top-5结果 --- probabilities = torch.nn.functional.softmax(output[0], dim=0) top5_prob, top5_catid = torch.topk(probabilities, 5) # --- 6. 标签映射(实际项目应从 label_map_zh.json 加载)--- labels = [ "白领女性", "办公室工作场景", "笔记本电脑", "商务休闲装", "日光照明", "会议室", "文档工作" ] # 示例标签,需与模型输出ID对齐 # 构建结果列表 results = [] for i in range(top5_prob.size(0)): label = labels[top5_catid[i]] confidence = top5_prob[i].item() * 100 results.append(f"{i+1}. {label} ({confidence:.1f}%)") # --- 7. Matplotlib 可视化设置 --- # 设置中文字体(防止乱码) plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans'] # 常见中文字体 plt.rcParams['axes.unicode_minus'] = False # 正常显示负号 # 创建子图布局:1行2列,左侧原图,右侧文字 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6)) # --- 8. 左侧:显示原始图像 --- ax1.imshow(image) ax1.set_title("输入图像", fontsize=16, fontweight='bold') ax1.axis("off") # 隐藏坐标轴 # --- 9. 右侧:显示识别结果 --- ax2.axis("off") # 隐藏坐标轴 text_str = "\n".join(results) ax2.text(0.1, 0.9, "Top-5 识别结果:", fontsize=18, fontweight='bold', transform=ax2.transAxes) ax2.text(0.1, 0.7, text_str, fontsize=14, verticalalignment='top', transform=ax2.transAxes, bbox=dict(boxstyle="round,pad=0.5", facecolor="lightblue", alpha=0.3)) # --- 10. 调整布局并显示 --- plt.tight_layout() plt.savefig("/root/workspace/识别结果_可视化.png", dpi=150, bbox_inches='tight') plt.show() print("可视化完成!结果已保存至 /root/workspace/识别结果_可视化.png")

3.2 关键代码解析

代码段功能说明
plt.rcParams['font.sans-serif'] = ['SimHei']强制启用黑体等常见中文字体,解决中文乱码问题
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6))创建双面板布局,兼顾图像与文本展示
ax1.imshow(image)在左侧面板绘制原始图像
ax2.text(...)在右侧面板逐行打印Top-5结果,使用\n换行
bbox=dict(...)为文本添加背景框,增强可读性
plt.savefig(..., dpi=150, bbox_inches='tight')高质量保存图像,去除多余空白边缘

3.3 运行方式

确保已激活环境后执行:

cd /root/workspace python 可视化推理.py

预期输出:

  • 弹出一个包含两栏的图形窗口
  • 左侧显示原图
  • 右侧列出Top-5识别结果
  • 同时生成识别结果_可视化.png文件用于后续分享或报告

4. 可视化样式优化建议

4.1 单图叠加标签模式(紧凑型)

若希望直接在图像上方叠加识别结果,可采用如下布局:

# 替换原双面板代码为单图模式 fig, ax = plt.subplots(1, 1, figsize=(10, 8)) ax.imshow(image) ax.set_title("图像识别结果", fontsize=16, fontweight='bold') # 在图像顶部添加半透明背景文本框 result_text = "\n".join([f"{r}" for r in results]) props = dict(boxstyle="round,pad=0.5", facecolor="black", alpha=0.7, edgecolor="white") ax.text(0.02, 0.98, result_text, transform=ax.transAxes, fontsize=12, verticalalignment='top', bbox=props, color="white") ax.axis("off") plt.tight_layout() plt.savefig("/root/workspace/识别结果_紧凑版.png", dpi=150, bbox_inches='tight') plt.show()

此风格更适合嵌入移动端预览或轻量级界面。

4.2 多图批量可视化(进阶用法)

对于测试集评估场景,可遍历目录中的多张图片并生成拼接图:

import glob image_paths = glob.glob("/root/workspace/test_images/*.png")[:4] # 最多取4张 fig, axes = plt.subplots(2, 2, figsize=(12, 12)) axes = axes.flatten() for idx, path in enumerate(image_paths): img = Image.open(path).convert("RGB") input_tensor = preprocess(img).unsqueeze(0).to(device) with torch.no_grad(): output = model(input_tensor) prob = torch.nn.functional.softmax(output[0], dim=0) _, catid = torch.topk(prob, 1) label = labels[catid[0]] axes[idx].imshow(img) axes[idx].set_title(f"预测: {label}", fontsize=12, color="red") axes[idx].axis("off") # 隐藏空余子图 for j in range(len(image_paths), 4): axes[j].axis("off") plt.suptitle("批量图像识别结果", fontsize=16) plt.tight_layout() plt.savefig("/root/workspace/批量识别结果.png", dpi=120) plt.show()

5. 常见问题与解决方案

5.1 中文乱码问题

现象:标签显示为方框或问号
原因:matplotlib 缺少可用中文字体
解决方案

  1. 查看当前可用字体:

    import matplotlib print([f.name for f in matplotlib.font_manager.fontManager.ttflist if 'Sim' in f.name])
  2. 若无合适字体,安装思源黑体:

    wget https://github.com/adobe-fonts/source-han-sans/raw/release/OTF/SimplifiedChinese/SourceHanSansSC-Regular.otf mv SourceHanSansSC-Regular.otf /usr/local/lib/python*/site-packages/matplotlib/mpl-data/fonts/ttf/
  3. 清除缓存并重新加载:

    import matplotlib.font_manager as fm fm._rebuild()

5.2 图像尺寸过大导致显示异常

建议处理方式

  • 使用transforms.Resize(480)控制最大边长
  • 或在plt.figure(figsize=...)中动态调整画布大小

5.3 保存图像模糊

解决方法

  • 提高dpi参数(如设为dpi=200
  • 使用矢量格式保存(推荐用于论文或PPT):
    plt.savefig("result.pdf", format='pdf', bbox_inches='tight')

6. 总结

本文围绕「万物识别-中文-通用领域」模型的实际应用需求,详细介绍了如何利用matplotlib实现图像识别结果的可视化展示。通过完整的代码示例,我们实现了:

  • 原始图像与识别结果的并排展示
  • 支持中文标签的清晰渲染
  • 高质量图像导出功能
  • 多种布局风格适配不同使用场景

这些可视化能力不仅有助于模型调试与效果验证,也为后续集成至Web服务、移动App或数据分析平台提供了坚实基础。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询