首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >DeepSeek-OCR:基于光学压缩的上下文处理

DeepSeek-OCR:基于光学压缩的上下文处理

原创
作者头像
AI小怪兽
发布2026-01-05 09:57:22
发布2026-01-05 09:57:22
2311
举报
文章被收录于专栏:毕业设计毕业设计YOLO大作战

📄 论文核心摘要

  1. 提出上下文光学压缩新范式 - 首次验证通过视觉模态压缩文本的可行性,在10倍压缩比下实现97%的解码精度
  2. 设计DeepEncoder创新架构 - 通过串联SAM-CLIP和16倍卷积压缩,在高分辨率输入下保持低激活内存和最少视觉标记
  3. 实现卓越性能表现 - 仅用100视觉token超越GOT-OCR2.0,少于800token超越MinerU2.0,展现高效压缩能力
  4. 开辟LLM研究新方向 - 光学压缩的渐进模糊特性为模拟人类遗忘机制、解决长上下文挑战提供了创新思路

这些贡献为VLM和LLM的长上下文处理提供了全新的技术路径。

博主简介

AI小怪兽 | 计算机视觉布道者 | 视觉检测领域创新者

深耕计算机视觉与深度学习领域,专注于视觉检测前沿技术的探索与突破。长期致力于YOLO系列算法的结构性创新、性能极限优化与工业级落地实践,旨在打通从学术研究到产业应用的最后一公里。

🚀 核心专长与技术创新

  • YOLO算法结构性创新:于CSDN平台原创发布《YOLOv13魔术师》、《YOLOv12魔术师》等全系列深度专栏。系统性提出并开源了多项原创自研模块,在模型轻量化设计、多维度注意力机制融合、特征金字塔重构等关键方向完成了一系列突破性实践,为行业提供了具备高参考价值的技术路径与完整解决方案。
  • 技术生态建设与知识传播:独立运营 “计算机视觉大作战” 公众号(粉丝1.6万),成功构建高质量的技术交流社群。致力于将复杂算法转化为通俗易懂的解读与可复现的工程代码,显著降低了计算机视觉的技术入门门槛。

🏆 行业影响力与商业实践

  • 荣获腾讯云年度影响力作者创作之星奖项,内容质量与专业性获行业权威平台认证。
  • 全网累计拥有 7万+ 垂直领域技术受众,专栏文章总阅读量突破百万,在目标检测领域形成了广泛的学术与工业影响力。
  • 具备丰富的企业级项目交付经验,曾为工业视觉检测、智慧城市安防等多个关键领域提供定制化的算法模型与解决方案,驱动业务智能化升级。

💡 未来方向与使命

秉持 “让每一行代码都有温度” 的技术理念,未来将持续聚焦于实时检测、语义分割及工业缺陷检测的商业化闭环等核心方向。愿与业界同仁协同创新,共同推动技术边界,以坚实的技术能力赋能实体经济与行业变革。

DeepSeek-OCR介绍

官方地址:GitHub - deepseek-ai/DeepSeek-OCR: Contexts Optical Compression

摘要:我们提出DeepSeek-OCR作为通过光学二维映射压缩长上下文的可行性初步研究。该模型包含两个组件:作为核心引擎的DeepEncoder和作为解码器的DeepSeek3B-MoE-A570M。具体而言,DeepEncoder作为核心引擎,设计目标是在高分辨率输入下保持低激活量,同时实现高压缩比,以确保视觉标记数量处于最优且可控范围。实验表明,当文本标记数量不超过视觉标记10倍时(即压缩比<10倍),模型解码(OCR)精度可达97%。即使在20倍压缩比下,OCR准确率仍能维持在60%左右。这为历史长上下文压缩、大语言模型记忆遗忘机制等研究方向展现了可观潜力。此外,DeepSeek-OCR还展现出较高的实用价值:在OmniDocBench基准测试中,仅用100个视觉标记就超越了GOT-OCR2.0(每页256标记),并以少于800个视觉标记的表现优于平均每页消耗6000+标记的MinerU2.0。在实际应用中,单张A100-40G显卡即可支持DeepSeek-OCR每日生成超过20万页的LLM/VLM训练数据。

伪代码如下:

代码语言:python
复制
# ==============================
# 1. 主流程
# ==============================
def main():
    # 输入:原始图像
    original_image = load_image("input.png")
    
    # 步骤1: 文本检测与识别(OCR模块)
    text_bboxes, recognized_texts = deepseek_ocr(original_image)
    
    # 步骤2: 上下文建模
    context_map = build_context_map(original_image, text_bboxes, recognized_texts)
    
    # 步骤3: 自适应压缩(基于上下文)
    compressed_data = adaptive_compress(original_image, context_map)
    
    # 步骤4: 存储或传输压缩数据
    save_compressed(compressed_data, "output.compressed")
    
    # 步骤5: 解码与重建
    reconstructed_image = adaptive_decompress(compressed_data, context_map)
    
    # 步骤6: 评估(压缩率与OCR精度)
    evaluate(original_image, reconstructed_image, recognized_texts)

# ==============================
# 2. OCR模块(DeepSeek-OCR)
# ==============================
def deepseek_ocr(image):
    # 使用预训练的OCR模型(如基于Transformer的检测+识别)
    # 假设使用两阶段:文本检测 + 文本识别
    
    # 文本检测
    text_bboxes = text_detection_model(image)  # 返回边界框列表 [x1, y1, x2, y2]
    
    # 文本识别
    recognized_texts = []
    for bbox in text_bboxes:
        cropped_text_region = crop_image(image, bbox)
        text = text_recognition_model(cropped_text_region)
        recognized_texts.append(text)
    
    return text_bboxes, recognized_texts

# ==============================
# 3. 上下文建模
# ==============================
def build_context_map(image, text_bboxes, recognized_texts):
    # 创建与图像同大小的上下文映射图
    h, w = image.shape[:2]
    context_map = np.zeros((h, w), dtype=int)
    
    # 标记文本区域(根据OCR结果)
    for bbox in text_bboxes:
        x1, y1, x2, y2 = bbox
        context_map[y1:y2, x1:x2] = 1  # 文本区域标记为1
    
    # 可扩展:根据文本内容(recognized_texts)分配不同重要性等级
    # 例如:关键词汇(如标题、数字)赋予更高权重
    for i, text in enumerate(recognized_texts):
        if is_important(text):
            bbox = text_bboxes[i]
            x1, y1, x2, y2 = bbox
            context_map[y1:y2, x1:x2] = 2  # 重要文本区域标记为2
    
    return context_map

# ==============================
# 4. 自适应压缩
# ==============================
def adaptive_compress(image, context_map):
    # 将图像转换为YUV颜色空间(通常用于压缩)
    yuv_image = rgb_to_yuv(image)
    
    # 对Y、U、V通道分别处理
    compressed_channels = []
    for channel in range(3):
        channel_data = yuv_image[:, :, channel]
        
        # 根据上下文映射调整压缩参数
        # 文本区域使用更低压缩率(更高质量),非文本区域使用更高压缩率
        compressed_channel = compress_channel_adaptive(channel_data, context_map)
        compressed_channels.append(compressed_channel)
    
    # 打包压缩数据(包括元数据:文本区域坐标、识别文本等)
    metadata = {
        "text_bboxes": text_bboxes,
        "recognized_texts": recognized_texts
    }
    
    compressed_data = {
        "channels": compressed_channels,
        "metadata": metadata,
        "image_shape": image.shape
    }
    
    return compressed_data

def compress_channel_adaptive(channel_data, context_map):
    # 使用基于上下文的量化表
    # 示例:对文本区域使用细量化,非文本区域使用粗量化
    
    # 离散余弦变换(DCT)分块处理(如8x8块)
    h, w = channel_data.shape
    compressed_blocks = []
    
    for i in range(0, h, 8):
        for j in range(0, w, 8):
            block = channel_data[i:i+8, j:j+8]
            
            # 计算该块中文本区域的比例
            context_block = context_map[i:i+8, j:j+8]
            text_ratio = np.sum(context_block > 0) / 64.0
            
            # 根据文本比例选择量化矩阵(自定义规则)
            if text_ratio > 0.5:
                q_matrix = quality_high  # 高质量(低压缩)
            else:
                q_matrix = quality_low   # 低质量(高压缩)
            
            # DCT变换
            dct_block = dct2d(block)
            
            # 量化
            quantized_block = np.round(dct_block / q_matrix)
            
            # 熵编码(如Huffman编码)
            encoded_block = entropy_encode(quantized_block.flatten())
            compressed_blocks.append(encoded_block)
    
    return compressed_blocks

# ==============================
# 5. 自适应解码
# ==============================
def adaptive_decompress(compressed_data, context_map):
    # 解压每个通道
    decompressed_channels = []
    for channel_idx, compressed_channel in enumerate(compressed_data["channels"]):
        channel_data = decompress_channel_adaptive(compressed_channel, context_map)
        decompressed_channels.append(channel_data)
    
    # 组合通道并转换回RGB
    yuv_image = np.stack(decompressed_channels, axis=-1)
    reconstructed_image = yuv_to_rgb(yuv_image)
    
    return reconstructed_image

def decompress_channel_adaptive(compressed_channel, context_map):
    # 逆处理:熵解码 → 反量化 → 逆DCT
    h, w = context_map.shape
    channel_data = np.zeros((h, w))
    
    block_idx = 0
    for i in range(0, h, 8):
        for j in range(0, w, 8):
            # 熵解码
            quantized_values = entropy_decode(compressed_channel[block_idx])
            quantized_block = quantized_values.reshape((8, 8))
            
            # 根据上下文选择相同的量化矩阵
            context_block = context_map[i:i+8, j:j+8]
            text_ratio = np.sum(context_block > 0) / 64.0
            q_matrix = quality_high if text_ratio > 0.5 else quality_low
            
            # 反量化
            dct_block = quantized_block * q_matrix
            
            # 逆DCT
            block = idct2d(dct_block)
            
            channel_data[i:i+8, j:j+8] = block
            block_idx += 1
    
    return channel_data

# ==============================
# 6. 评估模块
# ==============================
def evaluate(original_image, reconstructed_image, original_texts):
    # 计算压缩率
    original_size = original_image.nbytes
    compressed_size = calculate_compressed_size(compressed_data)
    compression_ratio = original_size / compressed_size
    
    # 计算图像质量指标(PSNR, SSIM)
    psnr_value = psnr(original_image, reconstructed_image)
    ssim_value = ssim(original_image, reconstructed_image)
    
    # OCR精度评估:在重建图像上重新运行OCR
    _, new_texts = deepseek_ocr(reconstructed_image)
    ocr_accuracy = calculate_text_accuracy(original_texts, new_texts)
    
    print(f"压缩率: {compression_ratio:.2f}")
    print(f"PSNR: {psnr_value:.2f} dB")
    print(f"SSIM: {ssim_value:.4f}")
    print(f"OCR准确率: {ocr_accuracy:.2%}")

# ==============================
# 辅助函数
# ==============================
def dct2d(block):
    # 2D离散余弦变换
    return scipy.fft.dct(scipy.fft.dct(block.T, norm='ortho').T, norm='ortho')

def idct2d(block):
    # 2D逆离散余弦变换
    return scipy.fft.idct(scipy.fft.idct(block.T, norm='ortho').T, norm='ortho')

def entropy_encode(data):
    # 简化的熵编码(实际可用Huffman/算术编码)
    # 这里假设使用游程编码 + Huffman
    return run_length_encode(data)

def is_important(text):
    # 启发式规则判断文本重要性
    # 示例:包含数字、大写字母、短文本(可能是标题)等视为重要
    if len(text) < 5:
        return True
    if any(char.isdigit() for char in text):
        return True
    return False

# ==============================
# 执行主程序
# ==============================
if __name__ == "__main__":
    main()

1. 引言

当前的大语言模型在处理长文本内容时,由于计算复杂度随序列长度呈二次方增长,面临着显著的挑战。我们探索了一种潜在的解决方案:利用视觉模态作为文本信息的高效压缩媒介。一张包含文档文本的图像,能够使用比等效数字文本少得多的标记来表示丰富的信息,这表明通过视觉标记进行光学压缩可以实现高得多的压缩比。

这一见解促使我们从以大语言模型为核心的视角重新审视视觉-语言模型,重点关注视觉编码器如何提升LLMs处理文本信息的效率,而非仅仅局限于人类擅长的基本视觉问答任务[12, 16, 24, 32, 41]。OCR任务作为连接视觉与语言的中间模态,为这种视觉-文本压缩范式提供了一个理想的测试平台,因为它在视觉和文本表示之间建立了自然的压缩-解压缩映射关系,同时提供了可量化的评估指标。

据此,我们提出了DeepSeek-OCR,这是一个旨在为高效的视觉-文本压缩提供初步概念验证的VLM。我们的工作主要有以下三个贡献:

首先,我们对视觉-文本标记的压缩比进行了全面的定量分析。如图1(a)所示,在包含多样化文档布局的Fox基准测试[21]上,我们的方法在9-10倍文本压缩时实现了96%以上的OCR解码精度,在10-12倍压缩时达到约90%,在20倍压缩时仍能保持约60%的准确率(若考虑输出与真实值之间的格式差异,实际准确率甚至更高)。这些结果表明,紧凑的语言模型能够有效学习解码压缩后的视觉表示,这预示着更大的LLMs通过适当的预训练设计也能轻松获得类似能力。

其次,我们引入了DeepEncoder,这是一种新颖的架构,即使在高分辨率输入下也能保持较低的激活内存和最少的视觉标记数量。它通过一个16倍卷积压缩器,将窗口注意力编码器组件和全局注意力编码器组件串联起来。该设计确保了窗口注意力组件处理大量视觉标记,而压缩器在标记进入密集的全局注意力组件之前将其减少,从而实现了有效的内存和标记压缩。

第三,我们基于DeepEncoder和DeepSeek3B-MoE [19, 20]开发了DeepSeek-OCR。如图1(b)所示,它在OmniDocBench上实现了端到端模型中最先进的性能,同时使用的视觉标记数量最少。此外,我们还为模型配备了解析图表、化学公式、简单几何图形和自然图像的能力,以进一步增强其实用性。在生产环境中,DeepSeek-OCR使用20个节点(每个节点配备8张A100-40G GPU)每天可为LLMs或VLMs生成3300万页数据。

总而言之,这项工作对使用视觉模态作为LLMs中文本信息处理的高效压缩媒介进行了初步探索。通过DeepSeek-OCR,我们证明了视觉-文本压缩能够为不同的历史上下文阶段实现显著的标记减少(7-20倍),为解决大语言模型中的长上下文挑战提供了一个有前景的方向。我们的定量分析为VLM标记分配优化提供了经验性指导,而提出的DeepEncoder架构则展示了实际可行性及现实部署能力。尽管本研究以OCR作为概念验证重点,但这种范式为重新思考如何协同结合视觉与语言模态以提升大规模文本处理和智能体系统中的计算效率,开启了新的可能性。

2. 相关工作

2.1. 视觉语言模型中的典型视觉编码器

如图2所示,当前开源的VLMs主要采用三种类型的视觉编码器。

第一种是以Vary [36]为代表的双塔架构。该架构利用并行的SAM [17]编码器来增加视觉词汇参数,以处理高分辨率图像。虽然这种方法提供了可控的参数和激活内存,但其存在显著缺点:它需要双图像预处理,这使部署复杂化,并在训练时使得编码器流水线并行极具挑战性。

第二种是以InternVL2.0 [8]为代表的基于图像块的方法。该方法通过将图像分割成小块进行并行计算来处理,从而在高分辨率设置下减少激活内存。尽管这种方法能够处理极高的分辨率,但由于其通常较低的原生编码器分辨率(低于512×512),导致大图像被过度分割,从而产生大量的视觉标记,因此存在明显的局限性。

第三种是以Qwen2-VL [35]为代表的自适应分辨率编码。该方法采用NaViT [10]范式,通过基于图像块的分割直接处理完整图像,而无需进行图像块并行化。虽然这种编码器能够灵活处理不同分辨率,但在处理大图像时面临巨大挑战,因为巨量的激活内存消耗可能导致GPU内存溢出,并且训练过程中的序列打包需要极长的序列长度。过长的视觉标记会同时减慢推理的预填充和生成阶段。

2.2. 端到端OCR模型

OCR,特别是文档解析任务,一直是图像到文本领域非常活跃的话题。随着VLMs的发展,大量端到端的OCR模型涌现,通过简化OCR系统,彻底改变了传统(需要独立检测和识别专家模型的)流水线架构。Nougat [6]首次采用端到端框架处理arXiv上的学术论文OCR,展示了模型在处理密集感知任务方面的潜力。GOT-OCR2.0 [38]将OCR2.0的范围扩展到包含更多合成图像解析任务,并设计了一种在性能和效率之间取得平衡的OCR模型,进一步凸显了端到端OCR研究的潜力。此外,通用视觉模型如Qwen-VL系列[35]、InternVL系列[8]及其众多衍生模型,也在持续增强其文档OCR能力,以探索密集视觉感知的边界。

然而,当前模型尚未解决一个关键的研究问题是:对于一个包含1000个单词的文档,解码它至少需要多少个视觉标记?这个问题的答案对于研究"一图胜千言"的原理具有重要意义。

3. 方法论

3.1. 架构

如图3所示,DeepSeek-OCR采用统一的端到端VLM架构,由一个编码器和一个解码器组成。编码器(即DeepEncoder)负责提取图像特征并对视觉表示进行标记化和压缩。解码器用于根据图像标记和提示生成所需的结果。DeepEncoder参数量约为3.8亿,主要由一个8000万参数的SAM-base [17]和一个3亿参数的CLIP-large [29]串联构成。解码器采用30亿参数的MoE架构 [19, 20],激活参数量约为5.7亿。在接下来的段落中,我们将深入探讨模型组件、数据工程和训练技巧。

图3 | DeepSeek-OCR的架构。DeepSeek-OCR由一个DeepEncoder和一个DeepSeek-3B-MoE解码器组成。DeepEncoder是DeepSeek-OCR的核心,包含三个组件:一个以窗口注意力为主的感知模块SAM [17]、一个具有密集全局注意力的知识模块CLIP [29],以及一个在两者之间进行16倍标记压缩的桥接压缩器。

3.2. DeepEncoder

为了探索上下文光学压缩的可行性,我们需要一个具备以下特征的视觉编码器:1. 能够处理高分辨率;2. 在高分辨率下激活量低;3. 视觉标记数量少;4. 支持多分辨率输入;5. 参数量适中。然而,如第2.1节所述,当前的开源编码器无法完全满足所有这些条件。因此,我们自行设计了一种新颖的视觉编码器,命名为DeepEncoder。

3.2.1. DeepEncoder的架构

DeepEncoder主要由两个组件构成:一个以窗口注意力为主的视觉感知特征提取组件,和一个具有密集全局注意力的视觉知识特征提取组件。为了受益于前人工作的预训练成果,我们分别使用SAM-base(图像块大小16)和CLIP-large作为这两个组件的主要架构。对于CLIP,我们移除了第一个图像块嵌入层,因为其输入不再是图像,而是来自前一个流程的输出标记。在两个组件之间,我们借鉴Vary [36]的方法,使用一个2层卷积模块对视觉标记进行16倍下采样。每个卷积层的核大小为3,步长为2,填充为1,通道数从256增加到1024。假设我们输入一张1024×1024的图像,DeepEncoder会将其分割成1024/16×1024/16=4096个图像块标记。由于编码器前半部分以窗口注意力为主且仅有8000万参数,其激活量是可接受的。在进入全局注意力之前,这4096个标记会经过压缩模块,标记数量变为4096/16=256,从而使整体激活内存可控。

3.2.2. 多分辨率支持

假设我们有一张包含1000个光学字符的图像,我们想测试解码需要多少个视觉标记。这就要求模型支持可变数量的视觉标记。也就是说,DeepEncoder需要支持多分辨率。

我们通过位置编码的动态插值来满足上述要求,并设计了几种分辨率模式用于同步模型训练,以实现单个DeepSeek-OCR模型支持多分辨率的能力。如图4所示,DeepEncoder主要支持两大输入模式:原生分辨率和动态分辨率。每种模式都包含多个子模式。

原生分辨率支持四个子模式:Tiny、Small、Base和Large,对应的分辨率和标记数量分别为512×512(64)、640×640(100)、1024×1024(256)和1280×1280(400)。由于Tiny和Small模式的分辨率相对较小,为避免浪费视觉标记,图像通过直接调整原始形状来处理。对于Base和Large模式,为了保留原始图像的宽高比,图像会被填充到相应尺寸。填充后,有效视觉标记的数量少于实际视觉标记数,计算公式为:

动态分辨率可由两种原生分辨率组合而成。例如,Gundam模式由n个640×640的图像块(局部视图)和一个1024×1024的全局视图组成。图像块划分方法遵循InternVL2.0 [8]。支持动态分辨率主要是出于应用考虑,特别是针对超高分辨率输入(如报纸图像)。图像块划分是次级窗口注意力的一种形式,能进一步有效减少激活内存。值得注意的是,由于我们的原生分辨率相对较大,在动态分辨率下图像不会被过度分割(图像块数量控制在2到9个范围内)。Gundam模式下DeepEncoder输出的视觉标记数量为:𝑛 × 100 + 256,其中 𝑛 是图像块数量。对于宽和高均小于640的图像,𝑛 设为0,即Gundam模式将退化为Base模式。

Gundam模式与四种原生分辨率模式一同训练,以达到一个模型支持多种分辨率的目标。请注意,Gundam-master模式(1024×1024局部视图+1280×1280全局视图)是通过在训练好的DeepSeek-OCR模型上继续训练得到的。这主要是为了负载均衡,因为Gundam-master的分辨率过大,一同训练会降低整体训练速度。

3.3. MoE解码器

我们的解码器使用DeepSeekMoE [19, 20],具体是DeepSeek-3B-MoE。在推理时,模型从64个路由专家中激活6个,并使用2个共享专家,激活参数量约为5.7亿。30亿参数的DeepSeekMoE非常适合于以特定领域(对我们而言是OCR)为中心的VLM研究,因为它获得了30亿模型的表达能力,同时享有5亿小模型的推理效率。

解码器从DeepEncoder压缩的潜在视觉标记中重建原始文本表示,如下所示:

3.4. 数据引擎

我们为DeepSeek-OCR构建了复杂多样的训练数据,包括:

  • OCR 1.0数据:主要包括传统OCR任务,如场景图像OCR和文档OCR。
  • OCR 2.0数据:主要包括复杂人造图像的解析任务,如常见图表、化学公式和平面几何解析数据。
  • 通用视觉数据:主要用于向DeepSeek-OCR注入一定的通用图像理解能力,并保留通用视觉接口。

3.4.1. OCR 1.0数据

文档数据是DeepSeek-OCR的重中之重。我们从互联网收集了3000万页涵盖约100种语言的多样化PDF数据,其中中文和英文约占2500万页,其他语言约占500万页。对于这些数据,我们创建了两种类型的真实标签:粗标注和细标注。粗标注是使用fitz直接从全量数据集中提取的,旨在教导模型识别光学文本,特别是小语种文本。细标注包括中英文各200万页,使用先进的版面模型(如PP-DocLayout [33])和OCR模型(如MinuerU [34]和GOT-OCR2.0 [38])进行标注,以构建检测和识别交错的数据。对于小语种,在检测部分,我们发现版面模型具有一定的泛化能力。在识别部分,我们使用fitz创建小图块数据来训练一个GOT-OCR2.0模型,然后使用训练好的模型对版面处理后的小图块进行标注,采用模型飞轮机制创建了60万个数据样本。在DeepSeek-OCR训练期间,通过不同的提示词区分粗标签和细标签。细标注图像-文本对的真实标签示例如图5所示。我们还收集了300万Word数据,通过直接提取内容构建了无需版面分析的高质量图像-文本对。这些数据主要对公式和HTML格式的表格处理有益。此外,我们还选择了一些开源数据[28, 37]作为补充。

对于自然场景OCR,我们的模型主要支持中文和英文。图像数据来源为LAION [31]和Wukong [13],使用PaddleOCR [9]进行标注,中英文各有1000万个数据样本。与文档OCR类似,自然场景OCR也可以通过提示词控制是否输出检测框。

3.4.2. OCR 2.0数据

遵循GOT-OCR2.0 [38],我们将图表、化学公式和平面几何解析数据称为OCR 2.0数据。

  • 对于图表数据,遵循OneChart [7],我们使用pyecharts和matplotlib渲染了1000万张图像,主要包括常用的折线图、柱状图、饼图和复合图表。我们将图表解析定义为图像到HTML表格的转换任务,如图6(a)所示。
  • 对于化学公式,我们利用PubChem中的SMILES格式作为数据源,并使用RDKit将其渲染成图像,构建了500万个图像-文本对。
  • 对于平面几何图像,我们遵循Slow Perception [39]的方法生成。具体来说,我们使用感知标尺大小为4来建模每个线段。为了增加渲染数据的多样性,我们引入了几何平移不变的数据增强方法,即相同的几何图像在原始图像中进行平移,对应于在坐标系中心位置绘制的相同真实标签。基于此,我们总共构建了100万个平面几何解析数据,如图6(b)所示。

图6 | 对于图表数据,我们未采用OneChart[7]的字典格式,而是使用HTML表格格式作为标注,这可以节省一定数量的标记。对于平面几何数据,我们将真实标签转换为字典格式,该字典包含线段、端点坐标、线段类型等键值,以提升可读性。每个线段均采用Slow Perception[39]的方式进行编码。

3.4.3. 通用视觉数据

DeepEncoder可以从CLIP的预训练成果中受益,并且有足够的参数来融合通用视觉知识。因此,我们也为DeepSeek-OCR准备了一些相应的数据。遵循DeepSeek-VL2 [40],我们为描述、检测和定位等任务生成相关数据。请注意,DeepSeek-OCR并非通用VLM模型,这部分数据仅占总数据的20%。我们引入此类数据主要是为了保留通用视觉接口,以便对我们模型和通用视觉任务感兴趣的研究人员未来能够方便地推进其工作。

3.4.4. 纯文本数据

为了确保模型的语言能力,我们引入了10%的内部纯文本预训练数据,所有数据处理成长度为8192个标记,这也是DeepSeek-OCR的序列长度。总而言之,在训练DeepSeek-OCR时,OCR数据占70%,通用视觉数据占20%,纯文本数据占10%。

3.5. 训练流程

我们的训练流程非常简单,主要包括两个阶段:a). 独立训练DeepEncoder;b). 训练完整的DeepSeek-OCR。请注意,Gundam-master模式是通过在预训练的DeepSeek-OCR模型上,使用600万采样数据继续训练得到的。由于训练协议与其他模式相同,下文将省略详细描述。

3.5.1. 训练DeepEncoder

遵循Vary [36]的方法,我们利用一个紧凑语言模型[15]并使用下一标记预测框架来训练DeepEncoder。在此阶段,我们使用前面提到的所有OCR 1.0和2.0数据,以及从LAION [31]数据集中采样的1亿通用数据。所有数据训练2个周期,批大小为1280,使用AdamW [23]优化器配合余弦退火调度器[22],学习率为5e-5。训练序列长度为4096。

3.5.2. 训练DeepSeek-OCR

在DeepEncoder准备就绪后,我们使用第3.4节中提到的数据训练DeepSeek-OCR,整个训练过程在HAI-LLM [14]平台上进行。整个模型使用流水线并行(PP),分为4部分,DeepEncoder占两部分,解码器占两部分。对于DeepEncoder,我们将SAM和压缩器视为视觉标记器,置于PP0并冻结其参数,而将CLIP部分作为输入嵌入层,置于PP1并进行训练(权重不冻结)。对于语言模型部分,由于DeepSeek3B-MoE有12层,我们在PP2和PP3上各放置6层。我们使用20个节点(每个节点配备8张A100-40G GPU)进行训练,数据并行(DP)度为40,全局批大小为640。我们使用AdamW优化器,配合基于步数的调度器,初始学习率为3e-5。对于纯文本数据,训练速度为每天900亿标记;对于多模态数据,训练速度为每天700亿标记。

表2 | 我们使用Fox基准测试[21]中所有包含600-1300个标记的英文文档测试DeepSeek-OCR的视觉-文本压缩比。"文本标记"表示使用DeepSeek-OCR的分词器对真实文本进行分词后的标记数量。"视觉标记=64或100"分别表示输入图像调整为512×512和640×640后,DeepEncoder输出的视觉标记数量。

4. 评估

4.1. 视觉-文本压缩研究

我们选择Fox基准测试[21]来验证DeepSeek-OCR对文本丰富文档的压缩-解压缩能力,以初步探索上下文光学压缩的可行性与边界。我们使用Fox的英文文档部分,通过DeepSeek-OCR的分词器(词汇量约12.9万)对真实文本进行分词,并筛选出包含600-1300个标记的文档进行测试,恰好为100页。由于文本标记数量不大,我们仅需测试Tiny和Small模式下的性能,其中Tiny模式对应64个标记,Small模式对应100个标记。我们使用不包含版面信息的提示词:"<image>\nFree OCR." 来控制模型的输出格式。尽管如此,输出格式仍无法完全匹配Fox基准测试的格式,因此实际性能会略高于测试结果。

如表2所示,在10倍压缩比内,模型的解码精度可达约97%,这是一个非常令人鼓舞的结果。未来,通过文本到图像的方法,或许有可能实现近10倍的无损上下文压缩。当压缩比超过10倍时,性能开始下降,这可能有两个原因:一是长文档的版面布局变得更加复杂,另一个原因可能是长文本在512×512或640×640分辨率下变得模糊。第一个问题可以通过将文本渲染到单一版面页面来解决,而我们相信第二个问题将成为遗忘机制的一个特征。当标记压缩接近20倍时,我们发现精度仍能接近60%。这些结果表明,光学上下文压缩是一个非常具有前景且值得研究的方向,并且这种方法不会带来任何额外开销,因为它可以利用VLM的基础设施,毕竟多模态系统本身就需要额外的视觉编码器。

表4 | OmniDocBench中不同类别文档的编辑距离。结果表明,某些类型的文档仅需64或100个视觉标记即可获得良好性能,而其他类型则需要Gundam模式。

4.2. OCR实际性能

DeepSeek-OCR不仅是一个实验模型,更具有强大的实际能力,能够为LLM/VLM预训练构建数据。为了量化OCR性能,我们在OmniDocBench [27]上测试了DeepSeek-OCR,结果如表3所示。仅需100个视觉标记(640×640分辨率),DeepSeek-OCR便超越了使用256个标记的GOT-OCR2.0 [38];使用400个标记(有效标记285个,1280×1280分辨率),它在该基准测试上达到了与最先进模型相当的性能。使用少于800个标记(Gundam模式),DeepSeek-OCR的性能超过了需要近7000个视觉标记的MinerU2.0 [34]。这些结果表明,我们的DeepSeek-OCR模型在实际应用中非常强大,并且由于更高的标记压缩率,使其具有更高的研究上限。

如表4所示,某些类别的文档只需极少的标记就能获得令人满意的性能,例如幻灯片仅需64个视觉标记。对于书籍和报告文档,DeepSeek-OCR仅需100个视觉标记即可实现良好性能。结合第4.1节的分析,这可能是因为这些文档类别中的大多数文本标记都在1000个以内,意味着视觉标记压缩比未超过10倍。对于报纸类文档,则需要Gundam甚至Gundam-master模式才能获得可接受的编辑距离,因为报纸中的文本标记数达到4000-5000个,远远超过了其他模式的10倍压缩能力。这些实验结果进一步揭示了上下文光学压缩的边界,这可能为VLM中视觉标记优化、LLM中上下文压缩及遗忘机制的研究提供有效的参考。

4.3. 定性研究

4.3.1. 深度解析

DeepSeek-OCR同时具备版面分析和OCR 2.0能力,使其能够通过二次模型调用来进一步解析文档中的图像,这一特性我们称之为"深度解析"。如图7、8、9、10所示,我们的模型能够对图表、几何图形、化学公式甚至自然图像进行深度解析,且仅需统一的提示词。

4.3.2. 多语言识别

互联网上的PDF数据不仅包含中文和英文,还包含大量多语言数据,这在训练LLMs时也至关重要。对于PDF文档,DeepSeek-OCR可以处理近100种语言。与中英文文档一样,多语言数据也同时支持带版面和不带版面的OCR格式。可视化结果如图11所示,我们选取了阿拉伯语和僧伽罗语来展示效果。

4.3.3. 通用视觉理解

我们还为DeepSeek-OCR提供了一定程度的通用图像理解能力。相关的可视化结果如图12所示。

图12 | 我们保留了DeepSeek-OCR在通用视觉理解方面的能力,主要包括图像描述、目标检测、定位等。同时,由于包含了纯文本数据,DeepSeek-OCR的语言能力也得以保留。请注意,由于我们不包含SFT阶段,该模型不是聊天机器人,某些能力需要通过补全提示来激活。

5. 讨论

我们的工作代表了对视觉-文本压缩边界的初步探索,旨在研究解码𝑁个文本标记需要多少视觉标记。初步结果令人鼓舞:DeepSeek-OCR在大约10倍压缩比下实现了近乎无损的OCR压缩,而在20倍压缩下仍能保持60%的准确率。这些发现为未来的应用指明了有前景的方向,例如在多轮对话中对𝑘轮以上的对话历史实施光学处理,以实现10倍的压缩效率。

图13 | 遗忘机制是人类记忆最基本的特征之一。上下文光学压缩方法可以通过将前几轮的历史文本渲染到图像上进行初步压缩,然后逐步调整旧图像的大小以实现多级压缩,从而模拟这种机制。在此过程中,标记数量逐渐减少,文本变得越来越模糊,从而完成文本遗忘。

对于更早的上下文,我们可以逐步缩小渲染图像的大小以进一步减少标记消耗。这一假设的灵感来源于人类记忆随时间衰退与视觉感知随空间距离降解之间的自然类比——两者都表现出类似的渐进性信息丢失模式,如图13所示。通过结合这些机制,上下文光学压缩方法实现了一种模拟生物遗忘曲线的记忆衰退形式,即近期信息保持高保真度,而久远记忆则通过更高的压缩比自然淡忘。

尽管我们的初步探索显示了可扩展的超长上下文处理潜力(近期上下文保持高分辨率,而较早上下文消耗更少资源),但我们承认这仍是早期工作,需要进一步研究。该方法为平衡信息保留与计算约束、理论上实现无限上下文的架构指明了一条路径,尽管这种视觉-文本压缩系统的实际意义和局限性仍有待在未来的研究中深入探讨。

6. 结论

在本技术报告中,我们提出了DeepSeek-OCR,并通过该模型初步验证了上下文光学压缩的可行性,证明模型能够从少量视觉标记有效解码超出其数量10倍以上的文本标记。我们相信这一发现将有助于未来VLM和LLM的发展。此外,DeepSeek-OCR是一个实用性很强的模型,能够进行大规模的预训练数据生产,成为LLM不可或缺的助手。当然,仅凭OCR不足以完全验证真正的上下文光学压缩,我们未来将进行数字-光学文本交错预训练、大海捞针测试等其他评估。从另一个角度看,光学上下文压缩仍然拥有巨大的研究和改进空间,是一个充满前景的新方向。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 博主简介
  • DeepSeek-OCR介绍
  • 1. 引言
  • 2. 相关工作
    • 2.1. 视觉语言模型中的典型视觉编码器
    • 2.2. 端到端OCR模型
  • 3. 方法论
    • 3.1. 架构
    • 3.2. DeepEncoder
      • 3.2.1. DeepEncoder的架构
      • 3.2.2. 多分辨率支持
    • 3.3. MoE解码器
    • 3.4. 数据引擎
      • 3.4.1. OCR 1.0数据
      • 3.4.2. OCR 2.0数据
      • 3.4.3. 通用视觉数据
      • 3.4.4. 纯文本数据
    • 3.5. 训练流程
      • 3.5.1. 训练DeepEncoder
      • 3.5.2. 训练DeepSeek-OCR
  • 4. 评估
    • 4.1. 视觉-文本压缩研究
    • 4.2. OCR实际性能
    • 4.3. 定性研究
      • 4.3.1. 深度解析
      • 4.3.2. 多语言识别
      • 4.3.3. 通用视觉理解
  • 5. 讨论
  • 6. 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档