import os, time, torch, gradio as gr
from PIL import Image
from transformers import AutoModel, AutoTokenizer
from datetime import datetime
import random
import string技术支持
我们导入用于文件 I/O、模型推理(torch)、UI 构建(gradio)、图像处理(PIL)以及管理文件路径与随机运行 ID 的实用函数等必要模块。
步骤 3:加载模型
安装完所有必需库后,您就可以从 Hugging Face 加载 DeepSeek-OCR 模型了。不过,访问某些模型需要使用 Hugging Face 访问令牌进行身份验证。
以下是在 Google Colab 中设置 Hugging Face 访问令牌的方法:
在 Colab 中添加机密信息:在 Google Colab 笔记本左侧边栏点击钥匙图标(“Secrets”),选择“Add a Secret”。
在 Hugging Face 上创建令牌:登录 Hugging Face 账户,进入账户设置,找到“Access Tokens”部分。点击“Create new token”,选择合适的角色(通常为“Read”),并生成令牌。
复制并粘贴令牌:复制新建的访问令牌,并粘贴到 Colab 的 “Add a Secret” 字段中。这样您的笔记本就能安全访问 DeepSeek-OCR 模型。
最后一步,我们为 DeepSeek-OCR 定义一个交互式 Gradio 界面,使用户能够轻松上传图像、选择不同的 OCR 提取模式、调整高级设置,并在单一 Web UI 中查看输出。
DEMO_MODES ={"Document ➔ Markdown":{"prompt":"<image>\n<|grounding|>Convert the document to markdown.","desc":"Extracts full document text as Markdown, preserving structure (headings, tables, lists, etc.).","base_size":1024,"image_size":640,"crop_mode":False},"Chart Deep Parsing":{"prompt":"<image>\nParse all charts and tables. Extract data as HTML tables.","desc":"Extracts tabular/chart data into HTML tables.","base_size":1024,"image_size":640,"crop_mode":False},"Chemical Formula Recognition":{"prompt":"<image>\nExtract all chemical formulas and SMILES.","desc":"Extracts chemical structures and formulae.","base_size":1024,"image_size":768,"crop_mode":False},"Geometry Parsing":{"prompt":"<image>\nExtract all geometric figures and their measurements.","desc":"Parses diagrams and extracts geometric data.","base_size":1024,"image_size":768,"crop_mode":False},"Plain Text Extraction":{"prompt":"<image>\nFree OCR.","desc":"Fast, plain text OCR of the image.","base_size":768,"image_size":512,"crop_mode":False},"Multilingual Document":{"prompt":"<image>\n<|grounding|>Extract text. Preserve all languages and structure.","desc":"Extracts multi-language content, preserves structure.","base_size":1024,"image_size":640,"crop_mode":False},"Custom Prompt":{"prompt":"","desc":"Provide your own custom prompt for flexible OCR or parsing.","base_size":1024,"image_size":640,"crop_mode":False}}with gr.Blocks(theme=gr.themes.Soft())as demo:
gr.Markdown("""
<div style="text-align:center;">
<h1>DeepSeek-OCR Demo</h1>
</div>
""")with gr.Row():with gr.Column():
gr.Markdown("### Input")
image_input = gr.Image(type="pil", label="Upload Document/Image", height=350)
gr.Markdown("#### Demo Modes (From Paper)")
mode = gr.Radio(
choices=list(DEMO_MODES.keys()), value="Document to Markdown", label="Select Capability to Test")
desc = gr.Markdown(DEMO_MODES["Document to Markdown"]["desc"])
custom_prompt = gr.Textbox(label="Custom Prompt", visible=False)with gr.Accordion("Advanced Settings",open=False):
base_size = gr.Slider(512,1280, value=DEMO_MODES["Document to Markdown"]["base_size"], step=64, label="Base Size")
image_size = gr.Slider(512,1280, value=DEMO_MODES["Document to Markdown"]["image_size"], step=64, label="Image Size")
crop_mode = gr.Checkbox(value=DEMO_MODES["Document to Markdown"]["crop_mode"], label="Dynamic Resolution (Crop Mode)")
process_btn = gr.Button("Process Image", variant="primary")with gr.Column():
gr.Markdown("### Results")
ocr_output = gr.Textbox(label="Extracted Content", lines=22, show_copy_button=True)
status_out = gr.Markdown("_Process an image to see stats and output dir_")
boxed_output = gr.Image(label="Result with Bounding Boxes",type="pil")defupdate_mode(selected):
d = DEMO_MODES[selected]return d["desc"], gr.update(visible=selected=="Custom Prompt"), d["base_size"], d["image_size"], d["crop_mode"]
mode.change(update_mode, inputs=mode,
outputs=[desc, custom_prompt, base_size, image_size, crop_mode])
process_btn.click(
gr_ocr,
inputs=[image_input, mode, custom_prompt, base_size, image_size, crop_mode],
outputs=[ocr_output, status_out, boxed_output])
demo.launch(share=True, debug=True)技术支持
我们将分段理解这段代码:
演示模式与提示词:DEMO_MODES 字典封装了 DeepSeek-OCR 支持的主要 OCR 能力,如“Document to Markdown”“Chart Deep Parsing”“Chemical Formula Recognition”等。每种模式都包括默认提示词、描述与推荐图像处理参数,便于用户随时切换提取任务。
DeepSeek-OCR 是一款全新的大型视觉-语言模型,能够理解结构、解析表格、提取图表,甚至可以处理数学、梗图以及多种语言。
在本指南中,我将 DeepSeek-OCR 用于端到端的真实任务测试——从手写笔记到复杂图表、梗图和多语种文档。我们将逐步演示:
读完之后,您将了解 DeepSeek-OCR 的优势与短板。如果您正打算探索开源 OCR,在确定流水线前不妨先看看这些实验。我也推荐查看我们的 DeepSeek V3.2-Speciale 教程。
什么是 DeepSeek-OCR?
DeepSeek-OCR 是一款拥有 30 亿参数、面向文档理解的开放式视觉-语言模型。它利用上下文光学压缩,通过将庞大的二维视觉上下文映射为压缩的视觉 token,从而高效处理体量巨大的文档。
其关键特性包括:
DeepSeek-OCR 的工作原理
DeepSeek-OCR 旨在处理多种类型的文档图像,从图表、表格到手写、数学和多语文本。它并未将图像与文本视为相互独立的域,而是将视觉模态作为长文本的压缩引擎,从而使大型语言模型(LLM)可以用显著更少的 token 处理更多信息。下面来拆解其架构与独特之处:
端到端流水线:从编码器到解码器
从高层来看,DeepSeek-OCR 包含两个主要组件:
来源:DeepSeek-OCR: Contexts Optical Compression
1. 输入图像预处理:流水线从文档图像开始,如扫描合同、手写笔记、财务表格等。图像被切分为 16×16 像素网格块,作为模型理解的最小视觉“词”。
2. DeepEncoder:DeepEncoder 是一个多阶段视觉引擎,旨在平衡分辨率、内存占用与信息压缩。其包含三个主要阶段:
3. 从视觉 token 到文本:MoE 解码器将视觉 token 压缩后输入 DeepSeek-3B MoE(Mixture-of-Experts)解码器,并在推理时仅激活与样本最相关的专家,以降低计算成本而不牺牲准确性。
4. 由提示词驱动的灵活性:只需更改提示词即可引导输出格式(Markdown、HTML 表格、SMILES 化学式、多语种版式等),与使用 LLM 的方式类似。
DeepSeek-OCR 显示出单页文档图像可被“压缩”为纯文本所需 token 的十分之一左右,同时几乎不损失准确性。
DeepSeek OCR 演示:Gradio 应用
本节将搭建一个完整的 Gradio Web 应用,让 DeepSeek-OCR 可直接在您的浏览器或 Google Colab 中运行 OCR。只需几个步骤,您就能上传图表、表格、手写笔记、梗图、数学、多语文本等图片,并获取带有边界框的结构化输出。
步骤 1:先决条件
开始之前,请确保具备以下先决条件:
上述命令会安装 DeepSeek-OCR 和 Gradio 所需的全部 Python 库,包括与之兼容的 transformers、tokenizers、图像处理(pillow)以及 Gradio UI 工具包的最新版本。
注意:此代码在 Google Colab 的 L4 GPU(高内存)上运行。
步骤 2:导入
我们已经安装了所有依赖。接下来设置导入。
我们导入用于文件 I/O、模型推理(
torch)、UI 构建(gradio)、图像处理(PIL)以及管理文件路径与随机运行 ID 的实用函数等必要模块。步骤 3:加载模型
安装完所有必需库后,您就可以从 Hugging Face 加载 DeepSeek-OCR 模型了。不过,访问某些模型需要使用 Hugging Face 访问令牌进行身份验证。
以下是在 Google Colab 中设置 Hugging Face 访问令牌的方法:
现在,您可以进行身份验证并加载模型了!
上述代码从 Hugging Face 直接加载官方 DeepSeek-OCR 模型与分词器。随后通过设置 pad token 保证分词器兼容性,并以
bfloat16精度加载模型。步骤 4:辅助函数
模型已就绪,接下来我们为每次模型输出创建一个新目录,以便有序管理每次 OCR 运行。这样可以确保提取的文本、边界框可视化以及日志文件都被保存,且不会覆盖之前结果。
new_run_dir函数依据当前时间戳与随机后缀为每次图像处理创建唯一的输出目录。这样可避免不同运行的结果相互覆盖,并便于检查或调试。步骤 5:OCR 处理器
此步骤是 DeepSeek-OCR Gradio 应用的核心引擎。它先将上传的图像转换为合适格式,并在文件过大时进行缩放。每次运行模型时,都会将所有输出保存在一个新目录中。
gr_ocr函数封装了 DeepSeek-OCR 在 Gradio 应用中的预处理、推理与后处理逻辑,具体包括:torch.inference_mode()环境下调用模型,避免梯度计算,降低内存占用并提升推理速度。ZeroDivisionError会被妥善处理,不影响用户体验。接下来进入交互式 UI,看看 DeepSeek-OCR 的实际表现。
步骤 6:Gradio UI
最后一步,我们为 DeepSeek-OCR 定义一个交互式 Gradio 界面,使用户能够轻松上传图像、选择不同的 OCR 提取模式、调整高级设置,并在单一 Web UI 中查看输出。
我们将分段理解这段代码:
DEMO_MODES字典封装了 DeepSeek-OCR 支持的主要 OCR 能力,如“Document to Markdown”“Chart Deep Parsing”“Chemical Formula Recognition”等。每种模式都包括默认提示词、描述与推荐图像处理参数,便于用户随时切换提取任务。BlocksAPI 构建。界面分为两个主列:输入面板供用户上传图像、选择 OCR 模式并微调高级参数(如图像尺寸与裁剪模式);输出面板 展示提取的 OCR 内容、推理统计以及带边界框的标注图像。gr_ocr,随后输出面板立刻呈现结果。注意:如仍返回前一次输入的输出,您可能需要在 Google Colab 中重启会话。
现在 Gradio 应用已经搭建完成,接下来用一系列实用示例来检验 DeepSeek-OCR。
DeepSeek OCR 应用示例 1:图表深度解析
在 DeepSeek-OCR 的 Gradio 演示中,我想看看模型从图表中提取表格数据的效果。这对大多数 OCR 与视觉模型仍然是挑战。
我尝试了两个经典用例:
DeepSeek-OCR 为每张图返回了一个 HTML 表格,单元格对应其在图像中识别到的类别、数值和标签。
亮点:模型捕获了图表中的所有可见文本与结构,且输出为可被机器使用的 HTML 表格格式,能保持表格逻辑。它甚至处理了复杂的金融图表,尝试将每个数字和标签表格化。
不足:原始输出非常冗长,包含大量
<td>与<tr>标签,难以一目了然。在复杂图表中,模型有时会重复条目或丢失高层视觉结构,导致“BUY”“SELL”信号与数值的重复表格令人眼花缭乱。在实际工作流中,您可能需要对 HTML 进行后处理以提升可读性,或将其导入 Excel 或 Pandas。
DeepSeek-OCR 的图表解析具备“图表数字化”能力,但偏重 HTML 的输出更适合下游数据流水线或进一步解析,而非快速人工审阅。
示例 2:化学式提取
接下来我想评估 DeepSeek-OCR 从结构化图像中提取化学信息的效果。其化学提取模式旨在将表格化学数据与分子结构图转换为机器可读格式,如 HTML 表格与 SMILES 表示。
我上传了两类图像,结果概括如下:
总体而言,化学式提取功能为化学数据数字化与分子结构识别提供了快捷方式,但要实现可靠的化学解析(尤其是复杂结构)仍需进一步打磨。
示例 3:手写文本 OCR
我还想看看 DeepSeek-OCR 处理手写笔记的效果。手写一直是 OCR 系统的经典难题,尤其是在字迹风格化或大小不一时。
我上传了一张手写化学清单的图片,内容是在有横线的纸上写的化合物名称。处理后,模型的 Document to Markdown 模式在提取文本并保留结构方面表现出乎意料地好。它识别了标题,并将每个化合物单独成行,基本还原了原图的呈现。边界框也直观地验证了模型正确识别每一行并将文本块分离。
这表明模型能够将手写内容转写为数字文本。尽管可能丢失一些细微的格式细节,但本例整体提取的准确性很高。
示例 4:方程式提取
另一个 OCR 的标准测试是读取并正确理解标准教材记法中的数学方程。为评估模型是否不仅能检测,还能准确提取并格式化这些表达式,我上传了一张包含多条复杂方程、采用类似 LaTeX 数学字体的图像。
DeepSeek-OCR 成功检测出图中的四条方程,并将其提取为 LaTeX 字符串。识别输出结构清晰,每个方程都以标准 LaTeX 格式分行转写。
边界框在原图上的叠加也基本准确,表明模型能够较好地定位与分割各个数学表达式。
值得一提的是,提取内容保留了数学结构,比如用
\frac表示分数并进行了规范的变量格式化,使结果可直接用于文档。示例 5:表格提取
最常见且最有价值的 OCR 任务之一,是从文档图像中提取表格数据,尤其是在处理扫描报告、研究论文或数据集时。为评估 DeepSeek-OCR 在此方面的能力,我上传了一张包含多国经济对比的结构化表格图像。
选择“Chart Deep Parsing”模式并处理图像后,DeepSeek-OCR 尝试将可视表格转换为 HTML 表格结构。提取内容(右侧)包含一系列
<table>与<td>标签,将表格的行与列映射为纯文本。边界框输出也进一步确认模型正确识别并分割了图像中的主要表格区域。对于简单表格,模型的提取较为稳定。但由于输出格式为原始 HTML,若用于快速审阅或下游数据分析,可能仍需后处理。
示例 6:梗图上的 OCR
我还测试了模型对流行梗图图像中文字的提取能力。这是一个真实场景:文本常叠加在复杂背景上,字体各异,也未必遵循典型文档结构。
我上传了一张经典梗图:在电影《被解放的姜戈》中莱昂纳多·迪卡普里奥的场景上覆盖了大写白色文字,并运行了 Document to Markdown 提取模式。
来源:Media.io
该梗图的 OCR 结果出乎意料地稳健。即使背景复杂,也能按正确顺序捕获所有相关词语,没有出现拼写错误或漏读。
尽管没有结构化标记,但该提取结果非常适合用于梗图情感分析、内容审核或基于文本的梗图检索等下游任务。
示例 7:多语种 OCR
DeepSeek-OCR 的一大优势是支持多语种文本提取,尤其适用于包含多种语言的文档或图像。
我用多种样本进行了测试,包括一张真实的中文街拍路牌,以及一张包含中、日、韩混合句子的合成样本。
来源:DeepSeek OCR Hugging Face
在处理这些多语样本时,DeepSeek-OCR 的 document-to-Markdown 模式能够准确检测并提取非英文字符脚本。对于街拍图片,模型识别并返回了整段中文文本。
在混合语言示例中,它还能正确分隔并标注中文、日文与韩文部分,保留其格式与文本块。边界框叠加也显示出对各语言文本区域的精准检测。
不过需要注意两点:
尽管存在这些小问题,DeepSeek-OCR 仍提供了强大的多语种 OCR 能力,能够可靠处理混合脚本与真实场景照片。
DeepSeek-OCR 最终看法
DeepSeek-OCR 架起了传统 OCR 与现代多模态 LLM 之间的桥梁。其最大优势是多面手:一个流水线既能读取扫描文档、提取复杂表格与图表、理解方程与化学结构,也能处理梗图、手写以及多种语言。
话虽如此,DeepSeek-OCR 并非完美。图表与表格输出可能过于冗长;化学结构识别有时未达预期;多语处理会明显偏慢。复杂版式可能需要后处理方能直接使用。
但对于科研、学术工作流、快速原型,以及需要超越纯文本的高级 OCR 的用户而言,DeepSeek-OCR 已然是对传统工具的显著升级。
如果您想进一步了解 DeepSeek 生态,推荐查看Working with DeepSeek in Python 课程。