LightOnOCR-2-1B OCR教程:批量处理目录下所有图片并生成JSON结构化结果
LightOnOCR-2-1B OCR教程批量处理目录下所有图片并生成JSON结构化结果你是不是也遇到过这样的烦恼手头有一堆扫描的文档、发票或者截图需要把里面的文字一个个敲出来费时费力还容易出错。或者你正在做一个项目需要自动化处理大量图片中的文字信息手动操作简直是一场噩梦。今天我要给你介绍一个超级实用的解决方案LightOnOCR-2-1B。这不仅仅是一个OCR工具更是一个能帮你批量处理整个文件夹图片并自动生成结构化JSON结果的智能助手。想象一下你只需要运行一个脚本泡杯咖啡的功夫所有图片里的文字就整整齐齐地躺在JSON文件里了是不是很酷这篇文章我就手把手教你如何从零开始搭建并使用LightOnOCR-2-1B实现图片文字的批量识别与结构化输出。无论你是开发者、数据分析师还是经常需要处理文档的办公人员这套方法都能让你的效率提升好几个档次。1. 初识LightOnOCR-2-1B你的多语言文字识别助手在开始动手之前我们先简单了解一下我们将要使用的“武器”。1.1 它是什么能做什么LightOnOCR-2-1B是一个参数规模为10亿1B的光学字符识别模型。你可以把它理解成一个非常聪明的“眼睛”专门负责“看”图片然后把看到的文字“读”出来。它的核心能力包括多语言支持一口气支持11种语言包括中文、英文、日文、法文、德文、西班牙文、意大利文、荷兰文、葡萄牙文、瑞典文和丹麦文。这意味着无论是中文合同、英文报告还是日文说明书它都能应对。复杂文档处理不仅能识别普通的印刷体文字对表格、收据、表单甚至数学公式的识别也有不错的效果。结构化输出这是它的一大亮点。它不只是简单地输出一串文字而是能理解文字的版面布局比如哪个是标题哪个是正文表格的单元格是怎么划分的并以结构化的JSON格式返回方便程序进一步处理。1.2 为什么选择它技术栈一览你可能会问OCR工具那么多为什么选这个这里有几个理由精度与效率的平衡1B的参数量在保证较高识别精度的同时对硬件的要求相对友好推理速度也较快。部署简单它提供了基于Gradio的Web界面和标准的OpenAI兼容API无论是想点点鼠标就用还是想集成到自己的代码里都非常方便。批量处理潜力其API设计使得编写脚本进行批量处理变得异常简单这正是我们本篇教程的核心。它的服务主要由两部分组成前端界面 (端口: 7860)一个直观的网页可以上传单张图片进行识别和测试。后端API (端口: 8000)一个遵循OpenAI Chat Completion格式的API这是我们实现批量处理的“编程接口”。了解完这些是不是已经跃跃欲试了接下来我们就进入实战环节。2. 环境准备与快速部署为了让教程清晰易懂我假设你已经拥有一台安装了Linux系统如Ubuntu并配有NVIDIA GPU的服务器。如果没有一些云服务商提供的GPU实例也是完美的选择。2.1 基础环境检查首先我们通过SSH连接到服务器检查一下基础环境。# 1. 检查Python版本建议使用Python 3.8-3.10 python3 --version # 2. 检查CUDA和GPU驱动确保GPU可用 nvidia-smi # 3. 检查pip是否已安装 pip3 --version如果nvidia-smi命令能正常显示GPU信息那么你的GPU环境基本就是可用的。如果缺少某些组件需要先安装CUDA工具包和cuDNN。2.2 一键部署LightOnOCR-2-1B最让人省心的是这个模型通常已经制作成了可一键部署的镜像或安装包。我们假设模型和相关服务脚本已经存放在服务器的/root/LightOnOCR-2-1B/目录下。部署过程非常简单只需要运行启动脚本# 进入项目目录 cd /root/LightOnOCR-2-1B # 运行启动脚本 bash start.sh这个start.sh脚本通常会做以下几件事激活一个Python虚拟环境。使用vLLM这类高性能推理引擎加载模型模型权重可能在/root/ai-models/lightonai/LightOnOCR-2-1B/。启动后端API服务在8000端口。启动前端Gradio界面在7860端口。启动完成后你可以用下面的命令检查服务是否正常运行ss -tlnp | grep -E 7860|8000你应该能看到7860和8000端口都处于监听LISTEN状态。2.3 快速验证访问Web界面在浏览器中输入http://你的服务器IP地址:7860如果能看到一个上传图片的界面恭喜你服务部署成功你可以在这里上传一张测试图片比如包含中文和英文的截图点击“Extract Text”按钮体验一下单张图片的识别效果。这个界面非常适合进行初步测试和模型能力验证。Web界面虽好但我们的目标是批量处理。所以让我们把目光转向更强大的API。3. 核心技能通过API与OCR模型对话批量处理的魔法都藏在API里。LightOnOCR-2-1B的API设计成了OpenAI的格式这对于熟悉ChatGPT API的开发者来说几乎零学习成本。3.1 理解API调用格式我们先来看一下单次API调用的“模板”curl -X POST http://服务器IP:8000/v1/chat/completions \ -H Content-Type: application/json \ -d { model: /root/ai-models/lightonai/LightOnOCR-2-1B, messages: [{ role: user, content: [{ type: image_url, image_url: {url: data:image/png;base64,这里是图片的Base64编码} }] }], max_tokens: 4096 }我来解释一下关键部分地址http://你的服务器IP:8000/v1/chat/completions模型路径model字段需要指定为模型在服务器上的具体路径。消息内容messages里我们以user的身份发送一条消息。这条消息的content是一个列表里面只有一个元素其type是image_url。最关键的是image_url.url它需要是图片的Base64编码并且前面要加上data:image/png;base64,或data:image/jpeg;base64,这样的前缀。最大令牌数max_tokens设置为4096通常足够返回OCR结果。3.2 编写你的第一个Python调用脚本用命令行curl测试没问题但用Python写脚本会更灵活。下面是一个最简单的Python示例import requests import base64 import json # 配置 API_URL http://localhost:8000/v1/chat/completions # 如果脚本就在服务器上运行可以用localhost MODEL_PATH /root/ai-models/lightonai/LightOnOCR-2-1B # 1. 读取图片并转换为Base64 def image_to_base64(image_path): with open(image_path, rb) as image_file: # 根据图片类型判断前缀这里假设是png encoded_string base64.b64encode(image_file.read()).decode(utf-8) return fdata:image/png;base64,{encoded_string} # 2. 准备请求数据 image_path ./test.png # 你的测试图片路径 image_base64 image_to_base64(image_path) payload { model: MODEL_PATH, messages: [{ role: user, content: [{ type: image_url, image_url: {url: image_base64} }] }], max_tokens: 4096 } # 3. 发送请求 headers {Content-Type: application/json} response requests.post(API_URL, headersheaders, datajson.dumps(payload)) # 4. 处理响应 if response.status_code 200: result response.json() # OCR识别出的文本在返回内容的第一个choice的message的content里 extracted_text result[choices][0][message][content] print(识别结果) print(extracted_text) # 你也可以保存完整的JSON响应 with open(ocr_result.json, w, encodingutf-8) as f: json.dump(result, f, ensure_asciiFalse, indent2) print(完整结果已保存至 ocr_result.json) else: print(f请求失败状态码{response.status_code}) print(response.text)运行这个脚本如果一切顺利你会在终端看到图片中的文字同时得到一个包含完整结构化信息的ocr_result.json文件。打开这个JSON文件你会发现模型返回的信息非常丰富可能包含了文本块、位置坐标、置信度等。单张图片的API调用已经掌握批量处理的大门已经敞开。4. 实战批量处理图片目录并生成JSON现在我们来解决最核心的问题如何自动化处理一个文件夹里的所有图片思路非常清晰遍历指定目录下的所有图片文件如.png,.jpg,.jpeg。对每张图片调用我们上面写好的OCR API函数。将每张图片的识别结果包括原始JSON和提取的文本保存下来最好能和图片文件名关联。4.1 编写批量处理脚本下面是一个功能更完善的批量处理脚本batch_ocr.pyimport os import glob import base64 import json import requests from pathlib import Path import time # 配置 API_URL http://localhost:8000/v1/chat/completions MODEL_PATH /root/ai-models/lightonai/LightOnOCR-2-1B INPUT_DIR ./images # 存放待处理图片的目录 OUTPUT_DIR ./ocr_results # 存放输出结果的目录 # 支持的图片格式 SUPPORTED_EXTENSIONS (.png, .jpg, .jpeg, .bmp, .tiff) # 创建输出目录 Path(OUTPUT_DIR).mkdir(parentsTrue, exist_okTrue) def get_image_files(directory): 获取目录下所有支持的图片文件 image_files [] for ext in SUPPORTED_EXTENSIONS: image_files.extend(glob.glob(os.path.join(directory, f*{ext}))) image_files.extend(glob.glob(os.path.join(directory, f*{ext.upper()}))) return sorted(image_files) # 排序以便顺序处理 def image_to_base64(image_path): 将图片转换为Base64 Data URL格式 with open(image_path, rb) as f: img_data f.read() # 根据文件后缀判断MIME类型 ext os.path.splitext(image_path)[1].lower() mime_type fimage/{ext[1:]} if ext[1:] in [jpg, jpeg] else fimage/{ext[1:]} if ext .jpg or ext .jpeg: mime_type image/jpeg elif ext .png: mime_type image/png elif ext .bmp: mime_type image/bmp elif ext .tiff: mime_type image/tiff else: mime_type image/png # 默认 base64_str base64.b64encode(img_data).decode(utf-8) return fdata:{mime_type};base64,{base64_str} def ocr_single_image(image_path, max_retries3): 调用API识别单张图片 image_base64 image_to_base64(image_path) payload { model: MODEL_PATH, messages: [{ role: user, content: [{ type: image_url, image_url: {url: image_base64} }] }], max_tokens: 4096 } headers {Content-Type: application/json} for attempt in range(max_retries): try: response requests.post(API_URL, headersheaders, datajson.dumps(payload), timeout60) response.raise_for_status() # 如果状态码不是200抛出异常 return response.json() except requests.exceptions.RequestException as e: print(f 尝试 {attempt 1}/{max_retries} 失败: {e}) if attempt max_retries - 1: time.sleep(2) # 等待2秒后重试 else: print(f 图片 {os.path.basename(image_path)} 识别失败跳过。) return None return None def process_batch(): 批量处理主函数 image_files get_image_files(INPUT_DIR) total len(image_files) if total 0: print(f在目录 {INPUT_DIR} 中未找到图片文件。) return print(f找到 {total} 张待处理图片。开始批量OCR识别...) summary [] # 用于记录处理摘要 for idx, img_path in enumerate(image_files, 1): img_name os.path.basename(img_path) print(f[{idx}/{total}] 正在处理: {img_name}) start_time time.time() result ocr_single_image(img_path) elapsed_time time.time() - start_time if result is not None: # 提取纯文本内容 extracted_text result.get(choices, [{}])[0].get(message, {}).get(content, ) # 生成基础文件名不含扩展名 base_name os.path.splitext(img_name)[0] # 1. 保存完整的JSON响应 json_filename os.path.join(OUTPUT_DIR, f{base_name}_full.json) with open(json_filename, w, encodingutf-8) as f: json.dump(result, f, ensure_asciiFalse, indent2) # 2. 保存提取出的纯文本 txt_filename os.path.join(OUTPUT_DIR, f{base_name}.txt) with open(txt_filename, w, encodingutf-8) as f: f.write(extracted_text) # 记录处理摘要 summary.append({ image: img_name, text_file: f{base_name}.txt, json_file: f{base_name}_full.json, time_seconds: round(elapsed_time, 2), status: 成功 }) print(f 完成结果已保存。耗时: {elapsed_time:.2f}秒) print(f 文本长度: {len(extracted_text)} 字符) else: summary.append({ image: img_name, status: 失败 }) # 可选处理完一张图片后稍微停顿避免对服务器造成过大压力 time.sleep(0.5) # 保存处理摘要 summary_filename os.path.join(OUTPUT_DIR, processing_summary.json) with open(summary_filename, w, encodingutf-8) as f: json.dump({ total_images: total, processed: len([s for s in summary if s[status] 成功]), failed: len([s for s in summary if s[status] 失败]), details: summary }, f, ensure_asciiFalse, indent2) print(f\n批量处理完成) print(f结果保存在目录: {OUTPUT_DIR}) print(f处理摘要: {summary_filename}) if __name__ __main__: process_batch()4.2 如何使用这个脚本准备图片在一个文件夹例如./images里放入所有你需要识别的图片。配置脚本修改脚本开头的INPUT_DIR变量指向你的图片文件夹路径。运行脚本在终端执行python3 batch_ocr.py。脚本会开始工作并在控制台打印处理进度。所有结果包括每张图片的完整JSON和纯文本文件都会保存在./ocr_results目录下。最后还会生成一个processing_summary.json告诉你总共处理了多少张成功了多少张每张耗时多久一目了然。5. 进阶技巧与最佳实践掌握了基本操作后我们再来看看如何用得更好、更稳。5.1 优化图片预处理提升识别率模型对输入图片有一定要求。遵循以下建议可以让识别效果更好from PIL import Image def preprocess_image_for_ocr(image_path, target_max_size1540): 优化图片以供OCR识别。 官方建议最长边1540像素效果最佳。 img Image.open(image_path) # 转换为RGB模式处理可能存在的RGBA或P模式 if img.mode ! RGB: img img.convert(RGB) # 等比例缩放使最长边不超过target_max_size width, height img.size if max(width, height) target_max_size: ratio target_max_size / max(width, height) new_width int(width * ratio) new_height int(height * ratio) img img.resize((new_width, new_height), Image.Resampling.LANCZOS) # 可选轻度锐化或增加对比度根据图片情况 # ... 这里可以添加更多图像增强代码 ... # 保存预处理后的临时文件或直接转换为base64 temp_path f{image_path}_preprocessed.jpg img.save(temp_path, JPEG, quality95) return temp_path你可以在ocr_single_image函数中先调用这个预处理函数然后再将处理后的图片转换为Base64。5.2 处理大容量图片与错误重试批量处理时网络波动或服务短暂不可用可能导致个别图片失败。我们的脚本已经加入了重试机制。你还可以考虑以下增强策略设置超时在requests.post中设置timeout参数如timeout30避免某个请求卡住整个流程。限制并发如果图片非常多不要同时发起大量请求。可以使用concurrent.futures模块的ThreadPoolExecutor来控制并发线程数比如一次只处理5张图。结果校验检查API返回的JSON结构中是否包含有效内容避免保存空结果。5.3 解析与利用结构化JSON结果模型返回的完整JSON可能包含丰富的结构化信息。你需要根据实际返回的数据结构来解析。例如如果结果里包含了文本块和其边界框bounding box你可以这样提取和可视化def parse_detailed_ocr_result(ocr_json): 解析可能包含版面信息的OCR结果 # 这是一个示例函数实际结构需要根据LightOnOCR-2-1B的具体输出调整 full_content ocr_json.get(choices, [{}])[0].get(message, {}).get(content, ) # 情况1如果返回的是纯文本字符串 if isinstance(full_content, str): return {text: full_content} # 情况2如果返回的是包含块信息的复杂结构假设是列表 elif isinstance(full_content, list): parsed_blocks [] for block in full_content: # 这里需要根据实际的JSON结构来解析 # 例如block.get(text), block.get(bbox), block.get(type) parsed_blocks.append(block) return {blocks: parsed_blocks} return {raw: full_content} # 在批量处理脚本中保存JSON后可以额外解析并保存结构化信息 structured_result parse_detailed_ocr_result(result) if blocks in structured_result: # 可以生成一个更易读的、带坐标的文本文件 pass重要提示你需要查阅模型的官方文档或通过几次API调用亲自查看其返回的content字段的具体格式才能编写出准确的解析代码。6. 总结走到这里你已经掌握了使用LightOnOCR-2-1B进行批量图片OCR识别并生成结构化JSON结果的完整技能。让我们简单回顾一下部署与验证我们学会了如何一键部署服务并通过Web界面验证其基本功能。理解核心API掌握了通过OpenAI兼容格式的API与模型交互的关键特别是如何将图片转换为Base64 Data URL。实现批量处理我们编写了一个健壮的Python脚本能够自动遍历文件夹、调用API、处理异常、保存结构化和纯文本两种结果并生成处理报告。追求更优效果探讨了通过图片预处理、错误重试、并发控制等手段来提升批量处理的效率和稳定性。这套方法的价值在于它的自动化和结构化输出。无论是处理上百张产品说明书扫描件还是分析数千张社交媒体截图你都可以让脚本在后台默默运行解放你的双手和双眼。生成的JSON文件可以直接导入数据库或交给下游的自然语言处理程序进行进一步分析如关键词提取、情感分析等。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

相关新闻

Qwen3-ASR-1.7B商业应用:律所庭审录音结构化摘要生成系统

Qwen3-ASR-1.7B商业应用:律所庭审录音结构化摘要生成系统

Qwen3-ASR-1.7B商业应用:律所庭审录音结构化摘要生成系统 1. 项目背景与需求分析 在法律服务行业,庭审录音转写是一项耗时耗力的基础性工作。传统的人工转写方式存在几个痛点:效率低下,一个小时的录音需要3-4小时才能完成转写&a…

2026/7/5 23:52:34 阅读更多 →
圣女司幼幽-造相Z-Turbo保姆级部署教程:从零开始10分钟搞定AI画板

圣女司幼幽-造相Z-Turbo保姆级部署教程:从零开始10分钟搞定AI画板

圣女司幼幽-造相Z-Turbo保姆级部署教程:从零开始10分钟搞定AI画板 你是不是也刷到过那些用AI生成的绝美画作,心里痒痒的,想自己动手试试?但一看那些复杂的代码和配置,头都大了,感觉离自己太遥远。 别担心…

2026/5/17 8:13:32 阅读更多 →
Matter设备蓝牙配网全链路解析:从广播发现到安全入网

Matter设备蓝牙配网全链路解析:从广播发现到安全入网

1. 配网前夜:理解Matter的“安全基因” 如果你家里有超过三个不同品牌的智能设备,大概率经历过这样的抓狂时刻:想用A品牌的灯配合B品牌的传感器做个自动化,结果发现它们根本“不认识”彼此,各自困在自家的App孤岛里。M…

2026/7/5 23:51:02 阅读更多 →

最新新闻

基于深度学习的工程图纸形位公差自动识别技术解析

基于深度学习的工程图纸形位公差自动识别技术解析

1. 项目背景与核心价值在机械制造和工程图纸设计领域,形位公差的标注与识别一直是影响生产效率的关键环节。传统的人工识别方式不仅耗时费力,而且容易因视觉疲劳导致误判。我们团队开发的"简会图纸识别系统"正是为了解决这一行业痛点而生。这套…

2026/7/5 23:53:15 阅读更多 →
淘宝拍立淘技术解析:基于ResNet50的图像搜索实战

淘宝拍立淘技术解析:基于ResNet50的图像搜索实战

1. 淘宝按图搜索技术背景解析在电商平台购物时,我们经常会遇到这样的情况:看到朋友穿的一件衣服很好看,或者在网上看到某款心仪的商品,却不知道具体名称和关键词。传统的关键词搜索方式在这种情况下完全失效,而淘宝的&…

2026/7/5 23:51:15 阅读更多 →
Claude Code与Codex深度对比:AI编程副驾选型指南

Claude Code与Codex深度对比:AI编程副驾选型指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 在 AI 编程助手领域,Claude Code 和 Codex 无疑是当前最受瞩目的两个顶级选手。许多开发者在选择日常主力工具时&#xff…

2026/7/5 23:49:15 阅读更多 →
Web即时通讯加密实战:从TLS到端到端加密的三种高效方案

Web即时通讯加密实战:从TLS到端到端加密的三种高效方案

1. 项目概述:为什么Web即时通讯必须谈加密?聊到Web即时通讯,很多人第一反应是功能实现:怎么建立WebSocket连接、怎么处理消息队列、怎么设计UI界面。但从业十年,我见过太多项目在初期对安全“偷懒”,结果在…

2026/7/5 23:47:14 阅读更多 →
基于YOLO26的文档表格识别技术解析与实践

基于YOLO26的文档表格识别技术解析与实践

1. 项目背景与核心价值文档表格识别一直是办公自动化和企业数字化转型中的关键痛点。传统OCR技术虽然能识别文字内容,但对于表格这种结构化数据的识别准确率往往不尽如人意。特别是在处理扫描件、倾斜拍摄或复杂排版的文档时,常规方法经常出现单元格错位…

2026/7/5 23:45:12 阅读更多 →
Java突变测试实战:Pitest与JUnit整合提升测试有效性

Java突变测试实战:Pitest与JUnit整合提升测试有效性

1. 项目概述:为什么我们需要Pitest? 在软件开发的日常里,我们写单元测试,运行JUnit,看到绿色的进度条,心里就踏实了。但这份“踏实”真的可靠吗?我经历过不止一次,一个看似覆盖全面的…

2026/7/5 23:43:10 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻