在自然语言处理与计算机视觉交叉领域,光学字符识别(OCR)技术正不断进化。GLM-OCR 作为新一代多模态模型,其图片文字提取能力备受关注。本文基于一个简洁的测试脚本,详细讲解如何在 CPU 环境下搭建 GLM-OCR 评估流程,记录识别耗时,并输出结构化报告。无论你是 Python 开发者还是 AI 应用研究者,都能从中获得可复用的实践经验。

脚本概述与核心功能

本文使用的测试脚本 test_simple.py 是一个轻量级的 OCR 性能评估工具。它专为 GLM-OCR 模型设计,旨在通过标准化流程衡量模型对静态图片的文字识别能力。脚本的核心设计原则是 简化部署、强制稳定性——它默认禁用 GPU 加速,全面依赖 CPU 运行,从而规避了因驱动版本或 CUDA 库不匹配导致的兼容性问题。

脚本的主要功能点包括:

  • 强制 CPU 模式:避免 GPU 环境差异带来的启动失败
  • 三图并行测试:分别处理 a.png、b.png、c.png 三张样本
  • 精确计时:记录每张图片从输入到输出识别结果的耗时
  • 自动报告生成:结果汇总至 test1.txt 文件

这种设计思路与 Go 语言中强调的“显式错误处理”异曲同工——通过强制约束来减少运行时的不确定性。对于需要批量验证模型精度的场景,脚本提供了即插即用的解决方案。

环境搭建与依赖配置

在开始测试前,必须确保 Python 环境满足要求。当前脚本基于 Python 3.13.2 开发,推荐使用虚拟环境隔离项目依赖:

  • 创建虚拟环境:venv_ocr
  • 操作系统兼容性:Windows 10/11、Linux、macOS

核心依赖包为

# 激活虚拟环境
venv_ocr\Scripts\activate
# 安装 PyTorch (CPU 版本)
pip install torch torchvision torchaudio
# 安装 Transformers (需要最新版本以支持 GLM-OCR)
pip install git+https://github.com/huggingface/transformers.git
# 安装 Pillow (图像处理)
pip install Pillow
,这是驱动 GLM-OCR 模型推理的基础。建议使用完整安装命令一次性部署:

# 激活虚拟环境
venv_ocr\Scripts\activate
# 一次性安装所有依赖
pip install torch torchvision torchaudio Pillow
pip install git+https://github.com/huggingface/transformers.git

如果你未来计划启用 GPU 加速(例如使用 NVIDIA 显卡),可额外安装

# CUDA 版本的 PyTorch(需要根据 CUDA 版本选择)
# 例如 CUDA 11.8:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
# 或 CUDA 12.1:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
。但请注意,当前脚本强制 CPU 模式,因为 GPU 模式下可能存在 kernel 版本不匹配的已知问题。这一点与 C++ 开发中需要严格匹配运行时库版本的理念类似——版本一致性是稳定性的基石

项目目录结构如下:

ocr (1)/
├── venv_ocr/              # Python 3.13.2 虚拟环境
├── model/                 # GLM-OCR 模型文件
│   ├── config.json
│   ├── model.safetensors
│   ├── tokenizer.json
│   └── ...
└── gputest/               # 测试目录
    ├── a.png             # 测试图片 1
    ├── b.png             # 测试图片 2
    ├── c.png             # 测试图片 3
    ├── test_simple.py    # 测试脚本
    ├── test1.txt         # 测试结果输出文件(运行后生成)
    └── 运行简单测试.bat   # Windows 批处理文件

运行测试与结果解读

测试执行有两种方式,均能获得一致的输出。

方法一:批处理文件(推荐)
双击运行 运行简单测试.bat,脚本自动开始测试。等待执行完成后,打开 test1.txt 即可查看完整报告。

方法二:命令行直接运行
在终端中执行以下命令:

# 进入项目目录
cd "D:\ocr (1)"
# 激活虚拟环境
venv_ocr\Scripts\activate
# 进入测试目录
cd gputest
# 运行测试脚本
python test_simple.py

输出结果会写入 gputest/test1.txt 文件,其中包含:

  • ⏱️ 测试时间戳
  • ️ 使用设备(CPU)
  • 每张图片的识别用时
  • 识别结果字符串长度
  • 总计用时与平均用时

示例输出格式如下:

OCR 识别测试结果
============================================================
测试时间: 2026-02-12 10:30:45
使用设备: CPU
============================================================
图片             用时(秒)         结果长度
------------------------------------------------------------
a.png            12.34            1234
b.png            15.67            2345
c.png            18.90            3456
------------------------------------------------------------
总计             46.91
平均             15.64

这种结构化输出与 TypeScript 中类型定义的清晰性一脉相承——让数据一目了然。通过对比不同图片的耗时,你可以评估模型对复杂版面或手写体的处理效率。

⚠️ 常见问题与故障排查

在实际运行中,开发者可能会遇到几类典型问题。以下是针对性的解决方案:

问题 1:找不到模型文件

脚本会自动检测模型路径,优先使用 model/ 目录。如果该目录不存在,则回退到项目根目录。请确认:

  • model/ 目录是否存在
  • model/config.json 文件是否完整

问题 2:导入错误

通常由依赖缺失或虚拟环境未激活引起。建议:

  • ✅ 重新运行完整安装命令
  • ✅ 检查虚拟环境是否激活
  • ✅ 尝试重装 transformers:pip install --upgrade git+https://github.com/huggingface/transformers.git

问题 3:内存不足

CPU 模式下模型加载后占用约 2-4GB 内存,建议至少 8GB RAM。可以:

  • ✅ 关闭其他高内存占用的程序(如浏览器、IDE)
  • ✅ 考虑使用量化版本模型减少内存消耗

问题 4:测试图片不存在

确保 gputest/ 目录下包含 a.png, b.png, c.png 三个文件。文件名大小写敏感,建议统一使用小写。

值得注意的是,GPU 兼容性错误(

FATAL: kernel `fmha_cutlassF_f16_aligned_64x64_rf_sm80` is for sm80-sm100,
but was built for sm37
)是当前脚本强制 CPU 模式的根本原因。这与 JavaScript 生态中“polyfill”解决浏览器兼容性的思路类似——通过降级方案保证功能可用性。

实践建议与延伸思考

经过多轮测试,我总结出以下最佳实践:

  • 首次运行耐心等待:模型加载需要数分钟,后续调用会显著加快
  • 图片预处理:确保测试图片清晰、无过多噪点,可提高识别准确率
  • 日志分析:结合用时数据评估模型瓶颈,若单张图片耗时超过 30 秒,建议检查图片分辨率

如果你熟悉 Python 性能调优,可以尝试将脚本与多线程结合,实现并发测试。此外,GLM-OCR 模型也支持与其他编程语言集成,例如通过 REST API 暴露服务,供 Go、TypeScript 或 C++ 后端调用。
[AFFILIATE_SLOT_1]

对于希望进一步探索 OCR 技术的读者,推荐研究 GLM-OCR 的官方文档(

"""
OCR识别测试脚本 - 简化版
分别测试3张图片,记录用时到 test1.txt
环境要求:
- Python 3.13.2
- 虚拟环境: venv_ocr
需要安装的包:
- torch (PyTorch CPU版本)
- transformers (最新版本,支持GLM-OCR)
- Pillow (图像处理)
安装命令:
venv_ocr\Scripts\activate
pip install torch torchvision torchaudio Pillow
pip install git+https://github.com/huggingface/transformers.git
使用方法:
方法1: 双击运行 运行简单测试.bat
方法2: python test_simple.py
输出:
测试结果保存在 test1.txt 文件中
注意:
- 当前强制使用CPU模式(避免GPU兼容性问题)
- 首次运行需要加载模型,可能需要几分钟
"""
import os
import sys
import time
import torch
from datetime import datetime
from transformers import AutoProcessor, AutoModelForImageTextToText
from PIL import Image
# 获取项目根目录
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 模型路径 - 优先使用 model 目录,如果不存在则使用项目根目录
MODEL_PATH = os.path.join(PROJECT_ROOT, "model")
if not os.path.exists(os.path.join(MODEL_PATH, "config.json")):
MODEL_PATH = PROJECT_ROOT
# 测试图片目录
TEST_IMAGES_DIR = os.path.dirname(os.path.abspath(__file__))
# 输出文件
OUTPUT_FILE = os.path.join(TEST_IMAGES_DIR, "test1.txt")
def test_image(image_path, processor, model, device):
"""测试单张图像的识别"""
try:
# 加载图像
image = Image.open(image_path).convert("RGB")
# 设置提示词
prompt_text = "Text Recognition:"
# 构建消息
messages = [{
"role": "user",
"content": [
{"type": "image", "image": image},
{"type": "text", "text": prompt_text}
]
}]
# 处理输入
inputs = processor.apply_chat_template(
messages,
tokenize=True,
add_generation_prompt=True,
return_dict=True,
return_tensors="pt"
)
inputs = {k: v.to(device) if isinstance(v, torch.Tensor) else v
for k, v in inputs.items()}
inputs.pop("token_type_ids", None)
# 开始识别并计时
start_time = time.time()
with torch.no_grad():
generated_ids = model.generate(
**inputs,
max_new_tokens=8192,
do_sample=False,
num_beams=1
)
elapsed_time = time.time() - start_time
# 解码输出
output_text = processor.decode(
generated_ids[0][inputs["input_ids"].shape[1]:],
skip_special_tokens=False
)
return output_text, elapsed_time
except Exception as e:
print(f"错误: {str(e)}")
import traceback
traceback.print_exc()
return None, None
def main():
"""主测试函数"""
print("="*60)
print("OCR 识别测试")
print("="*60)
# 测试图片列表
test_images = ["a.png", "b.png", "c.png"]
# 强制使用CPU模式(避免GPU兼容性问题)
use_gpu = False
device = "cpu"
torch_dtype = torch.float32
print("\n强制使用CPU模式(避免GPU兼容性问题)")
# 加载模型
print(f"\n加载模型... (路径: {MODEL_PATH})")
try:
processor = AutoProcessor.from_pretrained(MODEL_PATH, trust_remote_code=True)
model = AutoModelForImageTextToText.from_pretrained(
MODEL_PATH,
torch_dtype=torch_dtype,
trust_remote_code=True
)
model = model.to(device)
model.eval()
print("模型加载完成!")
except Exception as e:
print(f"模型加载失败: {str(e)}")
return
# 测试结果
results = []
# 测试每张图片
print("\n" + "="*60)
print("开始测试图片")
print("="*60)
for img_name in test_images:
img_path = os.path.join(TEST_IMAGES_DIR, img_name)
if not os.path.exists(img_path):
print(f"\n警告: 图片不存在: {img_path}")
continue
print(f"\n测试图片: {img_name}")
result, elapsed = test_image(img_path, processor, model, device)
if result is not None and elapsed is not None:
results.append({
"image": img_name,
"time": elapsed,
"result_length": len(result)
})
print(f"  用时: {elapsed:.2f} 秒")
print(f"  结果长度: {len(result)} 字符")
else:
print(f"  测试失败")
# 写入结果到文件
print("\n" + "="*60)
print("保存结果到 test1.txt")
print("="*60)
with open(OUTPUT_FILE, "w", encoding="utf-8") as f:
f.write("OCR 识别测试结果\n")
f.write("="*60 + "\n")
f.write(f"测试时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
f.write(f"使用设备: {'GPU' if use_gpu else 'CPU'}\n")
if use_gpu:
f.write(f"GPU名称: {torch.cuda.get_device_name(0)}\n")
f.write("="*60 + "\n\n")
f.write(f"{'图片':<15} {'用时(秒)':<15} {'结果长度':<15}\n")
f.write("-" * 60 + "\n")
total_time = 0
for r in results:
f.write(f"{r['image']:<15} {r['time']:<15.2f} {r['result_length']:<15}\n")
total_time += r['time']
f.write("-" * 60 + "\n")
f.write(f"{'总计':<15} {total_time:<15.2f} {'':<15}\n")
f.write(f"{'平均':<15} {total_time/len(results):<15.2f} {'':<15}\n")
print(f"\n结果已保存到: {OUTPUT_FILE}")
print("\n测试完成!")
if __name__ == "__main__":
main()
)以及 Transformers 和 PyTorch 的社区资源。下图展示了测试过程中的典型输出界面:

在这里插入图片描述

最后,附上更新日志以供参考:

  • v1.0 (2026-02-12):初始版本,支持 CPU 模式测试,输出结构化报告

在实际工程中,类似脚本也可用于持续集成(CI)流程,确保每次模型更新后 OCR 性能不退化。这与软件工程中的回归测试理念一致——自动化、可重复、可量化

[AFFILIATE_SLOT_2]

总结

本文详细介绍了基于 Python 的 GLM-OCR 测试脚本,涵盖环境搭建、运行流程、常见故障及优化建议。通过强制 CPU 模式与结构化报告,脚本为模型性能评估提供了可靠起点。无论你是 AI 初学者还是资深开发者,都可以直接复用此方案,快速验证 GLM-OCR 在图片识别任务上的表现。未来,随着 GPU 兼容性问题的修复,脚本可轻松扩展以支持加速推理,进一步提升测试效率。