6 行代码把截图变成 Markdown/HTML/LaTeXTeleOCR 极简调用实测【免费下载链接】TeleOCR项目地址: https://ai.gitcode.com/XingChen-AGI/TeleOCR做技术分享和论文笔记时最烦的就是截图里的内容无法直接复用公式要手抄成 LaTeX表格要对着像素一格一格敲代码截图只能靠肉眼转写。传统 OCR 只能吐纯文本而完整的文档解析管线往往要串联版面分析、文字检测、表格结构还原、公式渲染四五个模型部署成本高、中间环节还容易互相放大错误。TeleOCR 把这件事压缩到了一个端到端的视觉语言模型里约 1.2B 参数基于 Qwen2.5-VL 架构输入一张截图直接输出 Markdown 文本、LaTeX 公式或 HTML 表格。在 OmniDocBench v1.6 上以 96.87 的综合得分登顶表格 TEDS 达 97.05同时还能处理手机拍歪的弯折文档。更关键的是官方 README.md 给出的最小调用代码只有寥寥数行。这篇文章就用仓库里的真实代码和样例图片实测它的三种输出格式并踩一遍分辨率与图片比例这些最容易翻车的坑。一张截图直出结构化文本凭什么是它先看架构。仓库根目录的 config.json 显示TeleOCR 是一个标准的 Qwen2.5-VL 生成式视觉语言模型28 层 Decoderhidden_size 1024、16 注意力头、8 组 KV 头做 GQA 加速配一个 32 层的 ViT 视觉编码器window_size 112 的窗口注意力第 7/15/23/31 层做全注意力PatchMerger以 2×2 的空间合并压缩视觉 token词表扩充到 151936除了|box_start|、|quad_start|这类坐标 token还内置了表格专用的 OTSL 标记符。参数小但能力并不单薄。README 的实验结果表里TeleOCR 以 1.2B 参数量在 OmniDocBench v1.6 上拿下 96.87 总分文本编辑距离 0.027、公式 CDM 96.36、表格 TEDS 97.05 全部位居前列甚至压过了 Qwen3-VL-235B、GPT-5.2 这类数百亿参数的大模型模型本身已经开源并随仓库附带权重文件model.safetensors配合pip install transformers torch pillow就能跑起来单张消费级显卡即可部署这也是它能作为截图转写工具日常使用的前提。6 行代码的最小调用核心就两个 API打开 README.md 的 Quick Start核心推理函数infer的逻辑可以压缩成下面 6 行构造消息 → 套用聊天模板 → 走 processor 预处理 →model.generate生成 → 截掉输入 token → 解码成文本。def infer(image: Image.Image, prompt: str) - str: messages [{role: system, content: You are a helpful assistant.}, {role: user, content: [{type: image}, {type: text, text: prompt}]}] chat_prompt processor.apply_chat_template(messages, tokenizeFalse, add_generation_promptTrue) inputs processor(text[chat_prompt], images[image.convert(RGB)], paddingTrue, return_tensorspt).to(devicemodel.device, dtypemodel.dtype) output_ids model.generate(**inputs, use_cacheTrue, max_new_tokens4096, do_sampleFalse) output_ids output_ids.cpu().tolist()[0][len(inputs.input_ids[0]):] return processor.batch_decode([output_ids], skip_special_tokensTrue, clean_up_tokenization_spacesFalse)[0].strip()模型加载同样只有两行processor AutoProcessor.from_pretrained(StarDoc-AI/TeleOCR, trust_remote_codeTrue, use_fastTrue) model AutoModel.from_pretrained(StarDoc-AI/TeleOCR, trust_remote_codeTrue, torch_dtypetorch.bfloat16).cuda().eval()整个调用过程没有任何检测、识别、结构化的中间步骤infer的输入是一张 PIL 图片加一句 prompt输出就是结构化文本。注意model.generate里显式设置了do_sampleFalse而仓库的 generation_config.json 也把temperature压到 0.1、top_k设为 1配合 1.05 的 repetition penalty——说明官方推荐的是近贪婪的确定性解码同一张图每次识别结果一致这对批处理、回归测试和生产流水线是很有价值的特性。同一张论文截图文本、LaTeX、HTML 三格式实测TeleOCR 之所以一条 prompt 通吃是因为它把输出格式做成了提示词里的一个开关。下面用仓库 assets 里的样例图分别实测。文本一句话输出纯文本对于纯文字段落直接给出Please output the text content from the image.输出就是干净的文本也可以直接当 Markdown 用image Image.open(assets/text.png).convert(RGB) raw_text infer(image, Please output the text content from the image.) print(raw_text.strip())公式LaTeX 直出还自动补齐$$包裹对公式截图把 prompt 换成 LaTeX 指令模型直接输出\sum、\int这类标准 LaTeX 表达式raw_formula infer(image, Please write out the expression of the formula in the image using LaTeX format.)仓库在 README.md 的post_process里还内置了一段公式规整逻辑把输出里残留的\[/\]剥离若内容没有$包裹则统一包成$$...$$块方便直接粘贴进 Markdown 渲染content content.removeprefix(\\[).removesuffix(\\]).strip() if not (content.startswith($) and content.endswith($)): content f$${content}$$表格OTSL 中间格式6 个 token 保住合并单元格表格是文档解析里最容易被传统 OCR 做崩的部分尤其是含 rowspan/colspan 的合并单元格。TeleOCR 的做法是让模型先输出一种名为 OTSL 的中间格式——只用 6 个特殊标记符描述单元格相对位置nl换行、fcel单元格起始带文本、ecel单元格结束、lcel向右跨列、ucel向下跨行、xcel双向跨。由于坐标关系是相对位置而非绝对像素合并单元格的层级能被完整保留raw_otsl infer(image, This is the image of a table. Please output the table in OTSL format.) print(convert_otsl_to_html(raw_otsl))随后由仓库自带的convert_otsl_to_html把 token 序列确定性解析成带rowspan/colspan的标准 HTML——解析逻辑_otsl_parse_texts里的_count_right与_count_down在 README.md 中有完整实现整个转换是纯函数、无随机性也就杜绝了模型直接生成 HTML 时的标签错位问题。科学图表绕开画布直接挖表格更实用的是这个能力还能延伸到科学图表给一张折线图、柱状图截图prompt 指定提取这张图隐含的表格模型会直接把图里的数据点结构化输出成表格再走 OTSL→HTML 的同一路径raw_figure infer(image, This is a scientific figure. Please extract the table implied by this figure.) print(convert_otsl_to_html(raw_figure))同一个模型为什么敢直接喂拍歪的截图用手机拍文档、拍屏幕最常见的输入其实是透视变形、弯曲的书页。传统管线必须先跑一个矫正模块否则后续版面分析全崩。TeleOCR 的思路是把矫正能力直接内化进模型README 在layout_distorted.jpg上直接做多点版面分割Multi-point Layout Segmentation Analysis.并引用了 DocUNet、DIR300 两个去畸变数据集上的可视化评估证明它不需要去畸变预处理或专门的矫正模型就能在复杂几何形变下完成版面与内容解析README 还列出了几项为此服务的训练技术几何感知的文档建模Geometry-aware modeling、CGDP 曲率引导采样、多节点共识投票MCV自动生成伪标签以及内容-结构解耦的三阶段训练。简单说训练阶段见过了足够多的歪图推理时就能把歪当作特征而不是噪声来消化。对用户而言这意味着截图怎么拍基本都能喂省掉一整条预处理链路。翻车点实测分辨率与图片比例决定成败能力再强输入处理不当照样翻车。仓库的 preprocessor_config.json 给出了两个关键数字min_pixels: 3136, max_pixels: 12845056,这是 Qwen2.5-VL 动态分辨率机制的两端图片先被等比缩放使总像素数落在 3136约 56×56到 12845056约 3584×3584之间再切分成 14×14 的 patch 送入 ViT。由此可以推出四个高发翻车点1. 超长截图会被暴力压缩。一张网页长截图往往远超 1284 万像素上限预处理阶段会被等比缩小到边界内小字号文字直接糊成一片。对策是分块把长图切成若干 1:1 左右的段落分别喂入再自行拼接结果。2. 比例失衡浪费分辨率预算。视觉 token 数与图像像素数成正比一张 3:1 的超宽截图会把大量 token 花在留白上有效文字区域反而得不到足够的分辨率。README 里版面分析的样例就明确把图resize((1036, 1036), Image.Resampling.BICUBIC)后再推理——1036 是 28 的倍数恰好能被 patch 尺寸整除这说明接近正方形、且长宽为 28 的倍数的输入是官方验证过的稳定形态3. 别做二值化等好心预处理。社区实测中普遍反馈灰度化、二值化、锐化这类传统 OCR 的常规动作反而会抹掉模型赖以判断版面与公式结构的光影信息TeleOCR 吃原图的效果明显更好。预处理只需要保证够亮、够清楚、不要被拉伸变形。4. 输出有 4096 token 上限。infer里固定了max_new_tokens4096解析超大表格或长文档时输出可能被截断。遇到大版面优先分块而不是整页硬塞这也与第一点形成闭环。结语6 行核心代码、一个模型、几段不同的 promptTeleOCR 把截图 → Markdown/HTML/LaTeX这条原本要四五套模型协作的流水线收敛成了图 一句话的端到端调用。OTSL 中间格式保住了表格的结构完整性几何感知训练免掉了拍照文档的矫正预处理而生成侧的确定性解码让它在工程上足够可靠。剩下要做的就是在喂图时尊重它的分辨率边界——不二值化、不硬拉伸、长图分块截图解析这件小事就真的只剩 6 行代码了。【免费下载链接】TeleOCR项目地址: https://ai.gitcode.com/XingChen-AGI/TeleOCR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考