GLM-OCR功能详解文本识别懂排版、表格还原逻辑、公式转LaTeX1. 引言当OCR开始“理解”文档想象一下这个场景你拿到一份扫描的学术论文里面有密密麻麻的文字、复杂的多列表格还有一堆让人头疼的数学公式。传统的OCR工具可能会给你这样的结果文字识别出来了但段落全乱了表格变成了纯文本行列关系全丢公式更是变成了一堆乱码符号。这就是为什么你需要了解GLM-OCR——一个真正能“理解”文档结构的智能识别工具。GLM-OCR在权威的文档解析基准测试OmniDocBench V1.5中拿到了94.6分这个成绩是目前最好的水平。更重要的是它在四个关键维度上都表现出色普通文字识别、数学公式解析、表格结构还原还有信息抽取。它的精度已经接近一些顶尖的商业模型。但分数只是数字真正重要的是它能为你做什么。简单来说GLM-OCR不是简单地“看图识字”而是能看懂文档的“排版逻辑”——知道哪里是标题、哪里是正文、表格怎么对齐、公式怎么书写。接下来我会带你深入了解GLM-OCR的三大核心功能看看它是如何让文档识别从“识别字符”升级到“理解内容”的。2. 文本识别不只是认字更是懂排版2.1 传统OCR的局限我们先来看看传统OCR工具是怎么工作的。它们基本上是把图片当成一堆像素点然后逐个识别里面的字符。这种方法有个很大的问题它只关心“这是什么字”不关心“这些字在文档里是什么角色”。举个例子一个文档可能有一级标题字号大、加粗二级标题字号稍小正文段落正常字号引用块缩进、可能用不同字体项目符号列表传统OCR识别后你可能得到的就是一堆文字所有的格式信息都丢失了。你需要手动重新排版这个过程既耗时又容易出错。2.2 GLM-OCR的智能排版理解GLM-OCR的做法完全不同。它不只是识别字符还会分析文档的视觉布局和语义结构。具体来说它会理解视觉层次通过分析字体大小、粗细、颜色对比度GLM-OCR能判断哪些文字可能是标题哪些是正文。它还会看文字的对齐方式——是左对齐、居中还是右对齐。识别段落结构它能看出哪些文字属于同一个段落哪里是段落之间的分隔。对于缩进的文字它能判断这是引用、代码块还是特殊说明。保留列表格式如果你的文档里有项目符号列表比如用圆点、数字、破折号开头的GLM-OCR能识别出这是列表并在输出时保留相应的标记符号。实际效果对比我们做个简单的测试。下面是一张包含多种格式的文档截图文档内容 # 项目报告 ## 1. 项目概述 本项目旨在开发新一代文档识别系统。 注所有数据均经过脱敏处理。 主要功能包括 - 文本识别 - 表格提取 - 公式转换传统OCR可能输出项目报告 1. 项目概述 本项目旨在开发新一代文档识别系统。 注所有数据均经过脱敏处理。 主要功能包括 文本识别 表格提取 公式转换GLM-OCR的输出# 项目报告 ## 1. 项目概述 本项目旨在开发新一代文档识别系统。 注所有数据均经过脱敏处理。 主要功能包括 - 文本识别 - 表格提取 - 公式转换看到区别了吗GLM-OCR不仅识别了文字还保留了文档的结构信息。标题有#标记引用块用表示列表项用-开头。这样的输出可以直接粘贴到Markdown编辑器里保持原有的格式。2.3 使用技巧让识别效果更好虽然GLM-OCR已经很智能了但如果你想让识别效果达到最佳可以注意以下几点图片质量是关键确保图片清晰文字边缘锐利避免阴影、反光、水印遮挡文字如果是扫描件扫描分辨率建议在300DPI以上选择合适的识别模式在Web界面里GLM-OCR提供了不同的识别模式纯文本模式适合只有文字的文档混合模式适合文字、表格、公式混合的文档高精度模式对精度要求极高的场景预处理很重要如果原始图片质量不太好可以先用简单的图像处理工具调整一下调整对比度让文字更清晰旋转图片确保文字水平裁剪掉无关的边缘区域3. 表格识别还原真实的业务逻辑3.1 表格识别的难点表格识别可能是文档处理中最棘手的部分。难点不在于识别单元格里的文字而在于理解表格的结构逻辑合并单元格怎么处理一个单元格可能跨越多行或多列表头怎么识别第一行可能是标题第二行可能是列名嵌套表格怎么办表格里面套表格空白单元格有意义吗有些空白表示“无数据”有些只是排版需要传统工具处理表格时经常出现这些问题合并单元格被拆分成多个独立单元格表头被当成普通数据行表格结构完全丢失输出变成纯文本3.2 GLM-OCR的表格理解能力GLM-OCR在表格识别上做了很多专门优化。它不只是识别表格“长什么样”更重要的是理解表格“什么意思”。智能识别表格结构GLM-OCR会分析单元格之间的对齐关系左对齐、居中、右对齐边框线的位置和类型实线、虚线、双线单元格的合并情况跨行、跨列表头和表体的区分输出结构化Markdown表格识别完成后GLM-OCR不会输出难以处理的HTML或复杂的JSON而是生成清晰易读的Markdown表格。比如这样一个简单的成绩单姓名语文数学英语张三859288李四908593王五889087GLM-OCR会输出| 姓名 | 语文 | 数学 | 英语 | |------|------|------|------| | 张三 | 85 | 92 | 88 | | 李四 | 90 | 85 | 93 | | 王五 | 88 | 90 | 87 |处理复杂表格对于更复杂的表格比如有合并单元格的销售报表2024年 季度 产品A 产品B 产品C Q1 100 150 200 Q2 120 160 210 Q3-Q4 250 300 350合并两个季度GLM-OCR能识别出“Q3-Q4”是合并单元格并在输出时做相应标记| 季度 | 产品A | 产品B | 产品C | |--------|-------|-------|-------| | Q1 | 100 | 150 | 200 | | Q2 | 120 | 160 | 210 | | Q3-Q4 | 250 | 300 | 350 |3.3 实际应用案例财务报表处理一家会计师事务所每月要处理上百份财务报表。传统方法是人工录入数据既慢又容易出错。使用GLM-OCR后扫描的PDF报表直接转为结构化表格数字自动对齐公式自动计算处理时间从每份30分钟缩短到3分钟准确率从95%提升到99.5%科研数据整理研究人员经常需要从论文中提取实验数据表格。以前要手动抄录现在截图表格区域GLM-OCR识别直接得到可分析的数据格式支持导出为CSV方便用Excel或Python进一步分析电商商品规格表电商平台有大量商品规格表格格式五花八门。GLM-OCR能识别不同格式的表格统一输出为标准化结构自动提取关键参数尺寸、重量、材质等4. 公式识别从图片到LaTeX的一键转换4.1 公式识别的特殊挑战数学公式可能是文档识别中最难的部分原因有几个符号复杂除了普通字母数字还有希腊字母、特殊符号、运算符结构嵌套上下标、分式、根号、积分号层层嵌套空间关系字符的位置关系很重要比如上标要比主体文字高语义理解同样的符号在不同上下文中有不同含义传统OCR处理公式时经常出现把∑求和符号识别成E把上下标当成普通文字丢失公式的结构信息4.2 GLM-OCR的公式解析能力GLM-OCR专门针对数学公式做了优化训练。它不仅能识别公式中的每个符号还能理解符号之间的数学关系。支持完整的LaTeX语法GLM-OCR的输出是标准的LaTeX代码这意味着可以直接在Overleaf、Typora等编辑器中渲染可以复制到学术论文中直接使用支持所有常见的数学环境和命令识别各类数学表达式从简单的到复杂的GLM-OCR都能处理基础算术输入a² b² c²输出a^{2} b^{2} c^{2}分式和根号输入分数和根号的混合表达式 输出\frac{\sqrt{x^2 y^2}}{2\pi}积分和微分输入微积分表达式 输出\int_{0}^{\infty} e^{-x^2} dx或\frac{\partial f}{\partial x}矩阵和方程组输入线性代数表达式 输出\begin{bmatrix} a b \\ c d \end{bmatrix}或\begin{cases} x y 5 \\ 2x - y 1 \end{cases}化学式和物理公式输入科学公式 输出H_2O、E mc^2、F ma4.3 使用场景和技巧学术论文写作研究人员经常需要引用其他论文中的公式。以前的做法是找到公式手动输入LaTeX反复检查是否正确现在只需要截图公式GLM-OCR识别复制LaTeX代码粘贴到论文中整个过程从几分钟缩短到几秒钟而且几乎不会出错。数学题目整理老师整理习题集时可以用GLM-OCR快速将纸质题目转为电子版。学生做笔记时也可以拍照记录黑板上的公式。技术文档编写工程师编写技术文档时经常需要插入数学公式。GLM-OCR让这个过程变得简单手写公式拍照识别书籍中的公式截图识别直接得到可用的LaTeX代码提高识别准确率的小技巧确保公式清晰拍照时对焦准确避免模糊单独截取公式尽量不要包含周围的文字检查复杂符号特别检查积分号、求和号等特殊符号手动微调对于极其复杂的公式识别后可以快速检查并微调5. 实战操作从安装到高级使用5.1 快速安装和启动GLM-OCR的安装非常简单特别是如果你使用预制的镜像。基本步骤是获取镜像从镜像仓库获取GLM-OCR镜像启动服务运行启动命令访问界面在浏览器中打开Web界面具体命令如下# 进入项目目录 cd /root/glm-ocr # 启动服务如果使用预制镜像通常有启动脚本 ./start.sh # 或者分别启动Web界面和API服务 ./scripts/start_webui.sh ./scripts/start.sh服务启动后你会在终端看到类似这样的信息Running on local URL: http://0.0.0.0:7860在浏览器中访问http://你的服务器IP:7860就能看到Web界面了。5.2 Web界面基本使用GLM-OCR的Web界面设计得很简洁主要分为三个区域左侧上传区点击上传按钮选择图片或者直接把图片拖拽到区域里支持PNG、JPG、JPEG、WEBP格式中间设置区选择识别模式文本、表格或公式调整识别参数如果需要开始识别按钮右侧结果区显示识别结果支持复制到剪贴板支持下载为文本文件完整操作流程上传一张包含文字的图片选择识别模式比如“文本识别”点击“开始识别”按钮等待几秒钟右侧显示结果复制结果或下载文件5.3 通过API批量处理对于需要处理大量文档的场景Web界面就不太方便了。这时可以使用GLM-OCR提供的API接口。基本API调用GLM-OCR提供了基于HTTP的API接口默认端口是8080。你可以用任何支持HTTP请求的工具来调用。最简单的例子用curl命令curl -X POST http://localhost:8080/v1/chat/completions \ -H Content-Type: application/json \ -d { messages: [ { role: user, content: [ {type: image, url: file:///path/to/your/image.png}, {type: text, text: Text Recognition:} ] } ] }Python代码示例如果你习惯用Python可以这样写import requests import base64 import json def recognize_image(image_path, modetext): 识别图片中的内容 Args: image_path: 图片文件路径 mode: 识别模式可选 text、table、formula # 读取图片并编码 with open(image_path, rb) as image_file: image_data base64.b64encode(image_file.read()).decode(utf-8) # 根据模式选择提示词 if mode text: prompt Text Recognition: elif mode table: prompt Table Recognition: elif mode formula: prompt Formula Recognition: else: prompt Text Recognition: # 准备请求数据 url http://localhost:8080/v1/chat/completions payload { messages: [ { role: user, content: [ { type: image_url, image_url: { url: fdata:image/png;base64,{image_data} } }, { type: text, text: prompt } ] } ] } # 发送请求 response requests.post(url, jsonpayload) if response.status_code 200: result response.json() # 提取识别结果 content result[choices][0][message][content] return content else: print(f识别失败: {response.status_code}) return None # 使用示例 if __name__ __main__: # 识别单张图片 result recognize_image(document.png, modetable) print(识别结果:) print(result) # 批量处理多张图片 image_files [doc1.png, doc2.jpg, doc3.png] for img_file in image_files: print(f\n处理文件: {img_file}) result recognize_image(img_file, modetext) if result: # 保存结果到文件 output_file img_file.replace(.png, .txt).replace(.jpg, .txt) with open(output_file, w, encodingutf-8) as f: f.write(result) print(f结果已保存到: {output_file})批量处理脚本如果你有很多图片需要处理可以写一个简单的批量处理脚本import os from concurrent.futures import ThreadPoolExecutor import time def batch_process_images(input_folder, output_folder, modetext, max_workers4): 批量处理文件夹中的所有图片 Args: input_folder: 输入图片文件夹 output_folder: 输出结果文件夹 mode: 识别模式 max_workers: 最大并发数 # 创建输出文件夹 os.makedirs(output_folder, exist_okTrue) # 获取所有图片文件 image_extensions [.png, .jpg, .jpeg, .webp] image_files [] for file in os.listdir(input_folder): if any(file.lower().endswith(ext) for ext in image_extensions): image_files.append(os.path.join(input_folder, file)) print(f找到 {len(image_files)} 张图片需要处理) def process_single_image(image_path): 处理单张图片 try: start_time time.time() result recognize_image(image_path, modemode) if result: # 生成输出文件名 base_name os.path.basename(image_path) output_name os.path.splitext(base_name)[0] .txt output_path os.path.join(output_folder, output_name) # 保存结果 with open(output_path, w, encodingutf-8) as f: f.write(result) process_time time.time() - start_time return True, base_name, process_time else: return False, os.path.basename(image_path), 0 except Exception as e: return False, os.path.basename(image_path), str(e) # 使用线程池并发处理 with ThreadPoolExecutor(max_workersmax_workers) as executor: results list(executor.map(process_single_image, image_files)) # 统计结果 successful sum(1 for r in results if r[0]) failed len(results) - successful print(f\n处理完成:) print(f成功: {successful} 张) print(f失败: {failed} 张) if failed 0: print(\n失败的文件:) for success, filename, error in results: if not success: print(f {filename}: {error}) # 使用示例 if __name__ __main__: # 批量处理某个文件夹中的所有图片 batch_process_images( input_folder/path/to/input/images, output_folder/path/to/output/results, modetext, # 可以改为 table 或 formula max_workers4 # 根据你的机器配置调整 )5.4 服务管理和监控GLM-OCR使用Supervisor来管理服务这让你可以方便地监控和控制服务状态。查看服务状态# 查看所有服务状态 supervisorctl status # 输出示例 glm-ocr:glm-ocr-webui RUNNING pid 12345, uptime 1:23:45 glm-ocr:glm-ocr RUNNING pid 12346, uptime 1:23:45重启服务如果服务出现问题可以重启# 重启Web界面 supervisorctl restart glm-ocr:glm-ocr-webui # 重启OCR API服务 supervisorctl restart glm-ocr:glm-ocr # 重启所有相关服务 supervisorctl restart glm-ocr:*查看日志日志是排查问题的重要依据# 查看Web界面日志 tail -f /root/glm-ocr/logs/webui.stdout.log # 查看OCR服务日志 tail -f /root/glm-ocr/logs/glm-ocr.stdout.log # 查看错误日志 tail -f /root/glm-ocr/logs/webui.stderr.log tail -f /root/glm-ocr/logs/glm-ocr.stderr.log服务目录结构了解目录结构有助于管理和维护/root/glm-ocr/ ├── config/ # 配置文件目录 │ └── supervisord.conf # Supervisor配置文件 ├── scripts/ # 脚本目录 │ ├── server.py # OCR API服务主程序 │ ├── webui.py # Web界面主程序 │ ├── start.sh # API启动脚本 │ └── start_webui.sh # WebUI启动脚本 ├── templates/ # Web界面模板 │ └── index.html # 主页面模板 ├── logs/ # 日志文件目录 │ ├── webui.stdout.log # Web界面标准输出日志 │ ├── webui.stderr.log # Web界面错误日志 │ ├── glm-ocr.stdout.log # OCR服务标准输出日志 │ └── glm-ocr.stderr.log # OCR服务错误日志 └── uploads/ # 上传文件临时目录6. 常见问题与解决方案6.1 服务启动问题问题服务启动失败端口被占用Error: Could not bind to 0.0.0.0:7860解决方案检查7860端口是否被其他程序占用lsof -i :7860如果被占用可以停止占用端口的程序或者修改GLM-OCR的端口号修改配置文件中端口设置问题GPU内存不足CUDA out of memory解决方案检查当前GPU使用情况nvidia-smi释放被占用的GPU内存# 查找占用GPU的程序 fuser -v /dev/nvidia* # 或者重启服务释放内存 supervisorctl restart glm-ocr:*如果显存确实太小可以尝试使用CPU模式但速度会慢很多6.2 识别准确率问题问题文字识别错误率高可能原因图片质量太差字体太特殊文字太小或太模糊解决方案预处理图片# 使用Python的PIL库简单预处理 from PIL import Image, ImageEnhance, ImageFilter def preprocess_image(image_path): img Image.open(image_path) # 调整对比度 enhancer ImageEnhance.Contrast(img) img enhancer.enhance(2.0) # 增加对比度 # 调整锐度 enhancer ImageEnhance.Sharpness(img) img enhancer.enhance(2.0) # 增加锐度 # 转为灰度图有时有助于识别 img img.convert(L) # 二值化处理 img img.point(lambda x: 0 if x 128 else 255, 1) return img调整识别参数尝试不同的识别模式如果图片中有多种语言确保语言设置正确分段识别 对于特别复杂的文档可以先识别整个文档对识别不准的部分单独截图再次识别截图部分问题表格识别结构混乱可能原因表格边框不清晰单元格合并复杂表格倾斜或扭曲解决方案调整图片角度# 自动矫正图片角度 from PIL import Image import numpy as np def auto_rotate_image(image_path): img Image.open(image_path) # 这里可以添加自动旋转逻辑 # 实际中可能需要使用OpenCV进行边缘检测 return img手动调整使用图片编辑工具增强表格边框裁剪掉表格周围的多余内容确保表格在图片中水平对齐分步识别先识别整个表格如果结果不理想尝试识别表格的每一行手动合并识别结果6.3 性能优化建议处理速度慢GLM-OCR在首次加载模型时会比较慢后续请求会快很多。如果仍然觉得慢可以使用GPU加速确保正确配置了CUDA环境批量处理时合理控制并发不要同时处理太多图片优化图片大小过大的图片可以先压缩def compress_image(image_path, max_size2000): 压缩图片到指定大小 img Image.open(image_path) # 计算缩放比例 width, height img.size if max(width, height) max_size: ratio max_size / max(width, height) new_width int(width * ratio) new_height int(height * ratio) img img.resize((new_width, new_height), Image.Resampling.LANCZOS) # 保存压缩后的图片 compressed_path image_path.replace(.png, _compressed.png) img.save(compressed_path, optimizeTrue, quality85) return compressed_path内存占用高如果处理大量图片时内存占用过高及时清理缓存import gc def process_with_memory_control(image_paths): results [] for i, img_path in enumerate(image_paths): # 处理图片 result recognize_image(img_path) results.append(result) # 每处理10张图片清理一次内存 if i % 10 0: gc.collect() return results使用流式处理不要一次性加载所有图片到内存6.4 其他常见问题问题API调用返回超时解决方案增加超时时间import requests # 设置更长的超时时间 response requests.post(url, jsonpayload, timeout180) # 180秒超时检查网络连接确保服务正常运行问题识别结果包含乱码解决方案检查图片编码格式确保图片没有损坏尝试重新上传图片问题不支持某些特殊符号解决方案检查GLM-OCR的文档了解支持的特殊符号范围对于不支持的符号可以考虑使用替代符号手动修正识别结果提交反馈给开发团队7. 总结让文档处理变得更智能GLM-OCR代表了文档识别技术的一个新方向——从简单的字符识别升级到真正的文档理解。它不再把文档看作一堆孤立的文字而是看作有结构、有逻辑、有语义的整体。回顾一下GLM-OCR的核心优势真正的排版理解能识别标题、段落、列表等文档结构保留原始的格式信息输出可以直接使用的Markdown格式智能表格还原理解表格的行列关系正确处理合并单元格输出结构化的表格数据准确的公式转换支持复杂的数学表达式输出标准的LaTeX代码识别各种特殊符号和上下标易于集成和使用提供友好的Web界面支持API批量处理安装部署简单在实际应用中GLM-OCR可以帮我们快速数字化纸质文档自动化数据提取流程提高文档处理效率减少人工录入错误无论是处理学术论文、商业报表、技术文档还是日常的扫描文件GLM-OCR都能提供准确、高效的识别服务。它的出现让文档处理从繁琐的手工劳动变成了简单的自动化流程。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。