LightOnOCR-2-1B实战:批量处理图片文字提取

📅 发布时间:2026/7/9 11:53:49 👁️ 浏览次数:
LightOnOCR-2-1B实战:批量处理图片文字提取
LightOnOCR-2-1B实战批量处理图片文字提取你是不是也遇到过这样的烦恼手头有一堆扫描的合同、发票、或者截图需要把里面的文字一个个敲出来费时费力还容易出错。或者作为一个开发者想给自己的应用加个图片转文字的功能却发现市面上的OCR服务要么贵要么慢要么识别不准。今天我们就来聊聊一个能帮你解决这些问题的利器——LightOnOCR-2-1B。这是一个只有10亿参数的轻量级OCR模型别看它“小”本事可不小。它支持包括中文、英文在内的11种语言而且部署简单处理速度快。更重要的是它原生支持API调用这意味着我们可以轻松地编写脚本实现大批量图片的自动化文字提取。这篇文章我就手把手带你从零开始部署这个模型并写一个实用的Python脚本让你能一键处理整个文件夹的图片把文字都提取出来存成文本文件。整个过程清晰明了就算你之前没怎么接触过AI模型部署也能跟着做下来。1. 环境准备与模型部署首先我们需要一个能运行模型的服务器环境。LightOnOCR-2-1B对硬件的要求相对友好但为了获得最佳速度建议使用带有GPU的服务器。1.1 服务器与镜像选择你可以选择任何支持Docker的云服务器或本地机器。这里以在CSDN星图平台部署为例过程非常简单访问CSDN星图镜像广场。在搜索框中输入“LightOnOCR-2-1B”。找到对应的镜像点击“一键部署”。镜像启动后系统会自动完成所有依赖环境的配置和模型的下载。你只需要稍等几分钟服务就准备就绪了。根据文档模型部署后会启动两个服务前端界面运行在7860端口提供了一个可视化的网页可以手动上传图片体验效果。后端API运行在8000端口这是我们实现批量处理的关键所有程序调用都通过这个API进行。你可以通过命令ss -tlnp | grep -E “7860|8000”来确认两个服务是否都已正常启动。1.2 验证服务可用性部署完成后我们先快速验证一下。在浏览器中打开http://你的服务器IP:7860。你会看到一个简洁的上传界面。找一张带有文字的图片比如一份文档的截图上传上去然后点击“Extract Text”按钮。稍等片刻模型识别出的文字就会显示在下方。这个步骤能最直观地让你感受模型的识别能力比如对中文、英文混排或者一些简单表格的识别效果。2. 核心编写批量处理Python脚本手动上传虽然直观但效率太低。我们的目标是自动化。下面这个Python脚本就是今天的主角它能遍历指定文件夹中的所有图片调用OCR API识别并将结果保存起来。创建一个新的Python文件比如叫做batch_ocr.py然后将下面的代码复制进去。我会在代码中加上详细的注释帮你理解每一步在做什么。import os import base64 import requests import glob from pathlib import Path import json import time class BatchOCRProcessor: def __init__(self, api_base_urlhttp://localhost:8000/v1/chat/completions): 初始化批量OCR处理器 :param api_base_url: LightOnOCR-2-1B API 的地址 self.api_url api_base_url self.headers {Content-Type: application/json} # 支持的图片格式 self.supported_extensions (.png, .jpg, .jpeg, .bmp, .tiff) def image_to_base64(self, image_path): 将图片文件转换为Base64编码字符串 try: with open(image_path, rb) as image_file: # 读取图片二进制数据并编码 encoded_string base64.b64encode(image_file.read()).decode(utf-8) # 根据文件类型构造 data URL file_ext Path(image_path).suffix.lower() mime_type fimage/{file_ext[1:]} if file_ext ! .jpg else image/jpeg return fdata:{mime_type};base64,{encoded_string} except Exception as e: print(f错误读取图片 {image_path} 失败 - {e}) return None def ocr_single_image(self, image_base64): 调用OCR API识别单张图片 payload { model: /root/ai-models/lightonai/LightOnOCR-2-1B, messages: [{ role: user, content: [{ type: image_url, image_url: {url: image_base64} }] }], max_tokens: 4096 # 最大输出token数可根据文本长度调整 } try: response requests.post(self.api_url, headersself.headers, jsonpayload, timeout30) response.raise_for_status() # 检查HTTP请求是否成功 result response.json() # 提取模型返回的文本内容 extracted_text result[choices][0][message][content] return extracted_text.strip() except requests.exceptions.RequestException as e: print(fAPI请求失败: {e}) return None except (KeyError, json.JSONDecodeError) as e: print(f解析API响应失败: {e}) return None def process_folder(self, input_folder, output_folderNone): 批量处理文件夹中的所有图片 :param input_folder: 包含图片的输入文件夹路径 :param output_folder: 保存文本结果的输出文件夹路径默认为 input_folder/results input_path Path(input_folder) if not input_path.exists(): print(f错误输入文件夹 {input_folder} 不存在。) return # 设置输出文件夹 if output_folder is None: output_folder input_path / ocr_results output_path Path(output_folder) output_path.mkdir(parentsTrue, exist_okTrue) # 查找所有支持的图片文件 image_files [] for ext in self.supported_extensions: image_files.extend(glob.glob(str(input_path / f*{ext}))) image_files.extend(glob.glob(str(input_path / f*{ext.upper()}))) if not image_files: print(f在 {input_folder} 中未找到支持的图片文件。支持格式: {self.supported_extensions}) return print(f找到 {len(image_files)} 张待处理图片。开始OCR识别...) print(- * 50) success_count 0 for idx, img_path in enumerate(image_files, 1): img_name Path(img_path).name print(f处理中 ({idx}/{len(image_files)}): {img_name}) # 1. 图片转Base64 base64_img self.image_to_base64(img_path) if not base64_img: print(f - 跳过图片编码失败。) continue # 2. 调用OCR API start_time time.time() extracted_text self.ocr_single_image(base64_img) elapsed_time time.time() - start_time if extracted_text is None: print(f - 跳过OCR识别失败。) continue if not extracted_text: print(f - 警告未识别出任何文字。) # 仍然保存一个空文件或记录日志 # 3. 保存结果到文本文件 output_filename output_path / f{Path(img_path).stem}.txt try: with open(output_filename, w, encodingutf-8) as f: f.write(extracted_text) success_count 1 print(f - 成功识别耗时 {elapsed_time:.2f} 秒。结果已保存至: {output_filename}) except IOError as e: print(f - 失败保存文件时出错 - {e}) # 可选处理间隙短暂停顿避免对服务器造成压力 # time.sleep(0.1) print(- * 30) print( * 50) print(f批量处理完成成功处理 {success_count}/{len(image_files)} 张图片。) print(f所有文本结果保存在: {output_path}) # 使用示例 if __name__ __main__: # 初始化处理器请将 localhost 替换为你的实际服务器IP processor BatchOCRProcessor(api_base_urlhttp://你的服务器IP:8000/v1/chat/completions) # 指定你的图片文件夹路径 my_image_folder ./my_documents # 例如存放了合同、发票扫描图的文件夹 # 开始批量处理 processor.process_folder(my_image_folder)3. 脚本使用与实战演示现在我们来让这个脚本跑起来。3.1 配置与运行修改服务器地址打开batch_ocr.py找到最下面__main__部分将“http://你的服务器IP:8000/v1/chat/completions”中的你的服务器IP替换成你实际部署模型的服务器IP地址。准备图片文件夹在脚本所在的目录创建一个文件夹比如叫my_documents然后把你想提取文字的所有图片PNG、JPG等格式放进去。安装依赖确保你的Python环境安装了requests库。如果没有在终端运行pip install requests。运行脚本在终端中切换到脚本所在目录运行命令python batch_ocr.py3.2 查看运行结果脚本运行后你会在终端看到实时的处理日志包括正在处理哪张图片、是否成功、耗时多少。所有识别出来的文本会被自动保存到一个新创建的ocr_results文件夹位于你的图片文件夹内中。每个文本文件以原图片的名字命名方便你对号入座。实战小技巧处理大量图片如果你有上百张图片脚本可能会运行一段时间。你可以放心它会自动处理完所有文件。网络问题如果遇到超时错误可以尝试在ocr_single_image方法中增加requests.post的timeout参数值。结果后处理OCR识别出的文本是“纯净”的你可以根据需要在保存结果前用Python字符串处理函数如splitlines,replace进行简单的格式化比如去除多余空行、按段落整理等。4. 进阶优化与场景扩展基础的批量处理已经实现了但我们还可以让它更强大、更贴合具体业务。4.1 性能与稳定性优化并发处理如果服务器性能强劲可以引入concurrent.futures模块使用线程池并发调用API能大幅缩短大批量图片的总处理时间。错误重试机制网络偶尔会波动。可以在ocr_single_image方法中加入重试逻辑比如失败后自动重试2-3次提高整体鲁棒性。进度保存处理成千上万张图片时脚本万一中断重新开始会很麻烦。可以设计一个检查点机制将已成功处理的图片记录在一个日志文件里下次运行时跳过它们。4.2 融入实际工作流这个批量OCR脚本可以成为你自动化流程中的一个环节。自动监控文件夹使用watchdog库可以监控某个文件夹一旦有新图片放入就自动触发OCR处理实现真正的“无人值守”。与文档管理系统集成将识别后的文本连同元数据如文件名、处理时间一起自动存入数据库如MySQL、Elasticsearch方便后续检索和分析。结构化信息提取对于发票、简历等格式相对固定的文档OCR提取出全文后可以再接一个文本分析模型如通过正则表达式或微调的小模型从中抽取出“金额”、“日期”、“姓名”等关键字段生成结构化的JSON数据。5. 总结通过今天的实战我们完成了一件很有价值的事情将一个先进的OCR模型变成了一个能为我们自动化工作的工具。我们不仅学会了如何部署LightOnOCR-2-1B更重要的是掌握了如何通过编写脚本将它的API能力与我们的具体需求批量处理连接起来。回顾一下关键点部署简单利用现成的镜像可以快速获得一个高性能OCR服务。核心脚本我们编写的BatchOCRProcessor类封装了图片编码、API调用、结果保存的全流程清晰且易于复用。开箱即用你只需要修改一个IP地址指定你的图片文件夹就能立刻开始批量提取文字。扩展性强这个脚本是一个起点你可以基于它根据自己业务的复杂度添加并发、重试、结构化提取等各种功能。无论是处理个人积累的电子书截图还是帮助企业数字化堆积如山的纸质档案这种“模型自动化脚本”的思路都能极大地提升效率。希望这篇文章和附带的脚本能成为你解决文字提取难题的一把得力钥匙。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。