提升OCR准确率的新途径
在之前的视频中,我们对多个开源OCR大模型进行了广泛测试,涵盖了从1B到3B再到9B参数的模型。测试结果表明,参数量更大的模型通常拥有更高的识别精度,但也对显卡提出了更高的要求。相反,参数量较小的模型虽然对显卡的要求较低,但其识别准确率往往不尽人意。例如,我们之前测试的 DeepSeek-OCR 模型,在实际使用中,它将中文字符“1”错误地识别成了“2”。在处理更细致的场景,如特定文本或手写体时,小参数模型的表现尤为不理想。那么,有没有一种方法,能够在不依赖高端显卡的情况下,显著提升这些OCR模型的准确率呢?答案是肯定的,我们可以通过**微调(Fine-tuning)**的方式来实现。
本期视频将重点演示如何使用中文OCR数据集来微调DeepSeek-OCR这款小参数OCR模型,以大幅提升其识别中文的能力。对于不熟悉微调概念的用户,我们可以用一个更通俗的比喻来解释:微调就好比是利用我们自己的数据或特定领域的知识,对模型进行“小灶”教学。通用的大语言模型(Large Language Model: 基于海量文本训练的AI系统)如同一个什么都会但又不精通的通才,通过注入特定领域的知识,我们可以将其打造成某个领域的专家。我们的核心目标就是让原本能识别多种语言但都不够精准的DeepSeek-OCR模型,转变为能够精准识别中文的专家。
为了实现这一目标,我们将使用制作好的中文OCR数据集,并借助Google Colab提供的免费GPU资源。整个微调过程预计耗时不到10分钟,便可完成对DeepSeek-OCR模型的微调,从而显著提高其在中文识别方面的准确率。微调后的模型,中文识别错误率预计将降低70%以上。接下来,我们将为大家展示如何微调DeepSeek-OCR模型,以及如何制作中文OCR数据集。
精准化模型:从通用到专业的飞跃
我们可以直接使用Anthlux提供的微调脚本。这些脚本最初是为波斯文数据设计的,因此我们需要将其中包含的波斯文数据集替换为中文数据集。如果您希望通过微调来提升模型在通用中文领域的准确性,HuggingFace上开源的高质量中文数据集是一个绝佳的选择。这个数据集包含了多种样式的中文内容,其中image字段对应图像,text字段则包含了图像上的完整文字。由于它涵盖了不同样式和场景的中文扫描内容,使用此数据集进行微调,能够大幅提升DeepSeek-OCR模型在通用中文场景下的OCR准确率。
如果您希望针对特定领域的数据进行微调,可以参考类似的数据集来制作您自己的数据集。例如,我们这里准备了一些用于OCR场景的图像,这些图像来源于扫描版的PDF,文字内容较为模糊。我们还创建了一个文件,其中记录了每张图像的路径以及其对应的完整文字和标点符号。为了节省时间,我们准备了10张图像。放大后可以看到,这些扫描件上的文字确实非常不清晰。
接下来,我们将利用一个现成的脚本来生成可用于微调大模型的数据集。这个脚本非常简单,并且加入了详细的中文注释,说明了使用方式。我们可以通过命令python <脚本名称>.py <文件名称>来运行它,其中<文件名称>包含完整的图像路径和对应的文字内容。运行脚本后,它会生成后缀为.pucky的数据集文件,其格式与我们之前看到的中文数据集一致,包含image和text字段。这样,您就可以用自己特定领域的数据来制作数据集,用于微调大模型。
实操:Google Colab上的深度微调
下面,我们将演示如何使用通用的中文OCR数据集来微调DeepSeek-OCR模型。我们将在Google Colab中打开Anthlux提供的微调脚本。首先,点击“Runtime”,然后选择“Change runtime type”,并将GPU设置为免费的T4 GPU,因为使用它来微调3B参数的DeepSeek-OCR模型速度非常快。保存设置后,步骤就变得非常简单了。
首先,我们需要执行安装命令,在Colab上安装微调所需的Python环境和依赖。
# (此处省略了安装命令的实际代码,因为它是安装步骤)
接下来,执行代码下载DeepSeek-OCR模型相关文件。模型将被存储在指定路径下。
# (此处省略了下载模型的代码)
下载完成后,将模型添加到内存中。
# (此处省略了加载模型的代码)
现在,我们来加载数据集。在这里,我们将Anthlux脚本的默认数据集更改为我们之前查看的中文数据集。由于源数据集格式与我们准备的中文数据集格式略有不同,我们需要调整脚本中的图像路径设置。在参数部分,脚本会加载数据集中的前2000个样本。我们直接执行加载数据集的代码。
# (此处省略了加载数据集的代码)
然后,我们执行这段代码,从数据集中随机选取一张图像进行测试,以评估未微调的DeepSeek-OCR模型的效果。
# (此处省略了随机选图并保存的代码)
执行保存图像的代码后,我们可以显示这张图像。图像中有一个汉字“1”。由于DeepSeek-OCR模型容易将“1”识别成“2”,我们可以借此测试它能否正确识别这个数据集中的图像。
下面,运行代码使用未微调的模型进行推理,以识别这张图像。
# (此处省略了推理代码)
可以看到,输出结果不出所料地将“1”识别成了“2”。接着,我们运行代码查看数据集中对应的真实文字。
# (此处省略了显示真实文本的代码)
您可以发现,数据集中对应的真实文字是“1”,但未微调的DeepSeek-OCR模型将其识别成了“2”。这再次证明了未配置的DeepSeek-OCR模型在中文识别方面的准确率仍然非常低。
好的,接下来我们开始配置这个模型。我们可以使用LoRA Adapters(一种高效的参数配置方法)来进行微调。
# (此处省略了LoRA Adapters的配置代码)
这里是详细的超参数设置,我已经加入了中文注释,在此不再赘述。直接执行这段代码。
# (此处省略了超参数设置和执行代码)
下面,我们需要准备数据集,对数据进行一些处理。执行这段代码将数据集样本转换为对话格式。
# (此处省略了数据集转对话格式的代码)
在这里,我们加载了之前查看的中文数据集,并且只加载前1000个样本用于微调模型。直接执行这段代码即可。
# (此处省略了加载前1000个样本的代码)
然后,执行这段代码将数据集转换为正确的微调格式。
# (此处省略了数据集格式转换的代码)
接下来,我们可以完整地运行这段代码,它用于创建Data Collector(数据整理器)。这段代码包含了完整的中文注释,为了节省时间,我们不再详细查看,直接执行。
# (此处省略了Data Collector创建代码)
好,下面我们就可以微调这个模型了。执行下面的代码创建训练器并设置超参数。这些具体的参数在以前的微调视频中已详细解释过,因此我们直接执行。
# (此处省略了创建训练器和设置超参数的代码)
我们还可以执行这段代码查看当前的硬件配置。这里显示的是T4 GPU,最大内存为14GB。现在,我们可以运行这段代码开始微调了,直接执行即可。
# (此处省略了开始微调的代码)
现在正在执行微调,需要稍等几分钟。
微调成效与未来展望
大约等待了六七分钟后,微调过程已经完成。可以看到,它执行了60个步(steps)。
# (此处省略了微调完成的日志输出)
下面,我们可以运行下面的代码,将微调后的LoRA Adapter权重和Tokenizer保存到本地目录。直接执行即可。
# (此处省略了保存模型权重的代码)
接下来,运行这段代码加载之前未正确识别图像的模型。我们直接运行,看看它是否能成功识别之前的图像。
# (此处省略了加载模型并推理的代码)
这里它成功识别出了图像上的文字内容,将之前识别错误的“2”成功识别成了“1”。下面的代码是将模型保存为支持VRM推理的文件。这里我们只需要将FALSE改为"处"(注:此处原文口误或笔误,实际应为True或特定配置值,此处根据原文转写)。为了节省时间,这里不再详细演示。大家可以参考我之前发布的关于微调的详细视频。
通过微调DeepSeek-OCR模型,我们可以发现它之前识别错误的文字,在微调之后能够正确识别。像这样,我们就可以针对特定领域或特定任务场景,来微调DeepSeek-OCR大模型或其他OCR模型。
本期视频所使用的代码和指令,我都会放在视频下方的描述栏或评论区。如果视频下方找不到,也可以通过我的博客查找本期视频对应的笔记本。本期视频就到这里,欢迎大家点赞、关注和转发。谢谢大家观看!
📌 文中提及的人物和组织
公司/组织: Google, HuggingFace, Anthlux
产品/模型: DeepSeek-OCR, LoRA Adapters