Hunyuan-OCR-WEBUI实战教程快递面单信息批量提取1. 引言从手动录入到智能提取的转变每天处理几百上千张快递面单手动敲键盘录入信息眼睛看花了手指敲麻了还总担心输错一个数字导致后续的麻烦。这是很多仓库管理员、电商客服和物流文员的日常。一张面单上运单号、收寄人信息、电话号码、物品详情每个字段都至关重要但人工录入不仅慢错误率也居高不下。有没有一种方法能让电脑自动“看懂”这些面单把文字信息精准地抓取出来直接整理成表格这就是我们今天要解决的问题。腾讯混元OCRHunyuanOCR提供了一个非常轻便但能力强大的解决方案。它就像一个视力超群、识字能力极强的助手专门帮你处理各种图片里的文字。本教程将手把手教你如何利用Hunyuan-OCR-WEBUI搭建一个属于自己的快递面单信息批量提取工具。你不需要是AI专家甚至不需要懂复杂的编程跟着步骤走就能让繁琐的录入工作自动化。2. 环境准备与快速部署2.1 部署前准备在开始之前你需要准备好运行环境。好消息是HunyuanOCR模型非常轻量参数只有1B对硬件要求很友好。硬件要求一张NVIDIA显卡就能流畅运行例如RTX 4090D或性能相近的型号。如果没有独立显卡在CPU上运行速度会慢一些但功能完全可用。获取镜像我们需要使用一个已经打包好所有依赖的“Hunyuan-OCR-WEBUI”镜像。这能省去你手动安装Python环境、深度学习框架等一大堆复杂配置的时间。2.2 一键启动OCR服务部署过程比安装一个普通软件还要简单。部署镜像在你使用的云平台或本地服务器上找到名为Tencent-HunyuanOCR-APP-WEB的镜像并完成部署。这个过程通常是点击几下按钮等待初始化完成。进入控制台部署成功后平台会提供一个访问入口通常是一个类似Jupyter Lab的网页控制台。点击进入。启动服务在控制台的文件列表里你会看到几个脚本文件。根据你的需求选择如果你想通过网页界面手动上传图片、查看结果运行1-界面推理-pt.sh或1-界面推理-vllm.sh。如果你想通过程序代码API来批量调用运行2-API接口-pt.sh或2-API接口-vllm.sh。对于本教程我们先从网页界面开始直观感受它的能力。运行1-界面推理-pt.sh。脚本运行后控制台会打印日志最后会显示一行类似Running on local URL: http://0.0.0.0:7860的信息这表示服务启动成功了。打开操作界面在控制台找到“网页推理”或“打开WebUI”之类的按钮点击它。你的浏览器会自动弹出一个新页面这就是Hunyuan-OCR-WEBUI的操作界面了。至此你的私人OCR识别引擎已经就绪随时可以“上岗”读取图片中的文字了。3. 单张面单识别初体验让我们先通过网页界面看看这个OCR助手到底有多能干。3.1 上传与基础识别打开WEBUI界面你会看到一个非常简洁的页面主要就是一个大大的上传区域。准备测试图片找一张清晰的快递面单照片或扫描件保存到电脑上。最好是打印体这样初次体验效果最好。上传图片点击上传区域选择你的面单图片。选择任务类型在下拉菜单中选择“通用文字识别检测识别”。这是最常用的模式它会先找出图片中所有文字所在的位置检测然后再识别这些文字是什么识别。提交推理点击“提交”或“运行”按钮。稍等几秒结果就会出现在页面右侧。你会看到两种形式的输出可视化结果你的面单图片上所有被识别出的文字行都被绿色的方框框了起来一目了然。文本结果所有识别出的文字按照阅读顺序通常是从左到右、从上到下排列在下方文本框中。现在你可以尝试从这一大段文本里手动找出运单号、收件人等信息。你会发现对于打印清晰的面单识别的准确率非常高几乎不需要修改。3.2 处理复杂情况实际工作中面单不可能都那么完美。可能会遇到拍摄模糊光线不足或对焦不准。可以尝试在上传前用手机自带的图片编辑功能稍微调高一下对比度和锐度。角度倾斜拍歪了。HunyuanOCR本身有一定的纠偏能力但如果倾斜太严重识别框可能会错乱。尽量保证拍摄端正。部分手写比如手写的备注。你可以观察一下对于工整的手写体模型也能识别个大概如果是特别潦草的可能就需要人工核对关键信息了。通过这个简单的交互测试你已经验证了OCR核心能力的可靠性。接下来我们要解决批量处理的问题。4. 核心实战编写批量提取脚本网页界面适合单张测试但我们的目标是批量处理。这就需要用到后台的API服务。还记得我们启动脚本时的另一个选择吗API服务通常在8000端口运行。下面我将带你编写一个Python脚本实现文件夹内所有面单图片的自动识别和信息提取。4.1 搭建Python环境首先确保你的电脑上安装了Python建议3.8及以上版本。然后打开命令行终端安装必要的库pip install requests pandas openpyxl Pillowrequests用于调用OCR的API接口。pandas和openpyxl用于将提取的结果整理并保存为Excel表格。Pillow一个常用的图像处理库这里可能用于图像的简单预处理。4.2 编写批量处理脚本创建一个新的Python文件比如叫做batch_process_waybills.py然后将下面的代码复制进去。你需要修改代码中的API_URL为你自己的服务器地址和端口。import requests import json import os import pandas as pd import base64 import re import time # 重要修改为你的OCR服务地址 # 如果使用网页界面服务7860端口API通常不在同一端口请确认API服务如8000端口已启动 API_URL http://你的服务器IP:8000/v1/ocr # 示例地址请根据实际情况修改 # 图片文件夹路径存放所有需要识别的面单图片 IMAGE_FOLDER ./快递面单图片 # 输出Excel文件路径 OUTPUT_EXCEL ./提取结果.xlsx def encode_image_to_base64(image_path): 将图片文件转换为Base64编码字符串 with open(image_path, rb) as image_file: return base64.b64encode(image_file.read()).decode(utf-8) def call_hunyuan_ocr_api(image_base64): 调用Hunyuan OCR API进行识别 headers {Content-Type: application/json} # 构建请求数据任务类型为通用识别 payload { image: image_base64, task: general_ocr # 通用文字识别任务 # 根据实际API文档可能还有其他参数如“det”、“rec”等 } try: response requests.post(API_URL, headersheaders, jsonpayload, timeout30) response.raise_for_status() # 如果请求失败如4xx5xx状态码抛出异常 return response.json() # 返回API的JSON响应 except requests.exceptions.RequestException as e: print(fAPI请求失败: {e}) return None except json.JSONDecodeError as e: print(f解析API响应失败: {e}) return None def extract_info_from_text(ocr_result): 从OCR识别结果中提取结构化信息。 这是一个示例函数你需要根据你面单的实际格式来定制规则 # 初始化一个字典来存放提取的信息 info { 运单号: , 寄件人: , 寄件电话: , 收件人: , 收件电话: , 收件地址: , 物品名称: , 备注: } # 假设API返回的结果中识别出的完整文本在‘text’字段文字块列表在‘text_blocks’ full_text ocr_result.get(text, ) text_blocks ocr_result.get(text_blocks, []) # 每个块可能包含文本和位置 # 示例1使用正则表达式匹配运单号常见格式数字长度10-15位 waybill_pattern r\b\d{10,15}\b waybill_matches re.findall(waybill_pattern, full_text) if waybill_matches: # 取第一个匹配的作为运单号可根据位置信息更精确判断 info[运单号] waybill_matches[0] # 示例2简单关键字匹配这是最基础的方法实际应用需要更精细的规则 lines full_text.split(\n) for i, line in enumerate(lines): line_lower line.lower() # 转为小写匹配更灵活 # 匹配收件人 if 收件人 in line or 收货人 in line_lower: # 提取“收件人张三”中的“张三” # 简单处理移除关键词和常见分隔符 name_part line.replace(收件人, ).replace(收货人, ).replace(:, ).split()[-1].strip() if name_part and len(name_part) 20: # 简单过滤掉过长的错误匹配 info[收件人] name_part # 匹配电话简单的手机号/固话匹配 elif 电话 in line_lower or 手机 in line_lower or mob in line_lower: # 查找这一行或下一行的数字串 phone_candidates re.findall(r1[3-9]\d{9}, line) # 手机号 if not phone_candidates: phone_candidates re.findall(r\d{3,4}-\d{7,8}, line) # 固话 if phone_candidates: # 判断是寄件还是收件电话这里逻辑需要根据版面优化 # 简单策略如果还没找到收件电话就赋值给它 if not info[收件电话]: info[收件电话] phone_candidates[0] elif not info[寄件电话]: info[寄件电话] phone_candidates[0] # 匹配地址关键词 elif 地址 in line_lower or addr in line_lower: # 地址可能跨越多行这里只取本行关键词后的部分 address_part line.split(地址)[-1].split(址)[-1].replace(:, ).split()[-1].strip() if address_part and len(address_part) 5: # 地址通常较长 info[收件地址] address_part # 更高级的做法结合text_blocks的位置信息坐标 # 如果文字块信息包含坐标你可以根据面单的固定模板区域来定位字段。 # 例如你知道运单号通常出现在图片的右上角区域就可以筛选出那个区域的文字块。 return info, full_text def main(): 主函数遍历图片文件夹批量处理 # 检查图片文件夹是否存在 if not os.path.exists(IMAGE_FOLDER): print(f错误图片文件夹 {IMAGE_FOLDER} 不存在。) return # 支持的文件格式 supported_extensions (.png, .jpg, .jpeg, .bmp, .tiff) image_files [f for f in os.listdir(IMAGE_FOLDER) if f.lower().endswith(supported_extensions)] if not image_files: print(f文件夹 {IMAGE_FOLDER} 中没有找到支持的图片文件。) return print(f找到 {len(image_files)} 张待处理图片。开始批量识别...) all_extracted_data [] for idx, filename in enumerate(image_files, 1): image_path os.path.join(IMAGE_FOLDER, filename) print(f[{idx}/{len(image_files)}] 正在处理: {filename}) # 1. 将图片编码为Base64 try: img_base64 encode_image_to_base64(image_path) except Exception as e: print(f 读取图片失败: {e}) continue # 2. 调用OCR API ocr_result call_hunyuan_ocr_api(img_base64) if ocr_result is None: print(f OCR识别失败跳过此文件。) continue # 3. 从识别结果中提取结构化信息 extracted_info, raw_text extract_info_from_text(ocr_result) extracted_info[文件名] filename extracted_info[原始文本] raw_text[:500] ... if len(raw_text) 500 else raw_text # 保存部分原始文本供核对 all_extracted_data.append(extracted_info) # 避免请求过快可添加短暂延迟 # time.sleep(0.1) # 4. 将所有结果保存到Excel if all_extracted_data: df pd.DataFrame(all_extracted_data) # 调整列顺序让文件名和运单号在前 columns_order [文件名, 运单号, 收件人, 收件电话, 收件地址, 寄件人, 寄件电话, 物品名称, 备注, 原始文本] # 只保留DataFrame中实际存在的列 existing_columns [col for col in columns_order if col in df.columns] df df[existing_columns [col for col in df.columns if col not in existing_columns]] df.to_excel(OUTPUT_EXCEL, indexFalse) print(f\n处理完成共成功处理 {len(all_extracted_data)} 张面单。) print(f提取结果已保存至: {os.path.abspath(OUTPUT_EXCEL)}) else: print(\n未能成功处理任何图片。) if __name__ __main__: main()4.3 脚本使用与定制准备工作将所有需要识别的快递面单图片PNG, JPG格式放入一个文件夹例如命名为“快递面单图片”并与脚本放在同一目录或者修改脚本中的IMAGE_FOLDER变量为你的文件夹路径。修改API地址将代码第10行的API_URL中的“你的服务器IP”替换成你实际部署Hunyuan-OCR服务的服务器IP地址。确保你运行的是API服务脚本2-API接口-xxx.sh并且端口默认8000可访问。定制提取规则extract_info_from_text函数是核心。我提供的示例规则非常简单关键字匹配和正则表达式。你需要根据你们公司常用的面单模板来优化这个函数。观察规律先手动用WEBUI识别几张典型面单看看识别出的原始文本是什么结构。强化规则如果运单号有固定前缀如SF、YT修改正则表达式。如果收件人总是在“收件人”后面就加强这个关键词的提取逻辑。利用位置信息如果API返回的text_blocks包含每个文字块的坐标左上角x,y右下角x,y你可以实现更精准的“模板匹配”。例如只提取图片特定矩形区域内的文字作为“运单号”。运行脚本在命令行中进入脚本所在目录运行python batch_process_waybills.py。脚本会依次处理每张图片并将最终结果输出到一个Excel文件中。5. 进阶技巧与优化建议当你成功运行了批量脚本后可以考虑以下优化让系统更加智能和稳定。5.1 提升识别准确率图像预处理在调用API前可以先对图片进行简单的自动处理。使用Pillow或OpenCV库可以轻松实现from PIL import Image, ImageEnhance def preprocess_image(image_path): img Image.open(image_path) # 1. 转换为灰度图减少颜色干扰 img img.convert(L) # 2. 增加对比度 enhancer ImageEnhance.Contrast(img) img enhancer.enhance(1.5) # 增强1.5倍 # 3. 锐化使边缘更清晰 enhancer ImageEnhance.Sharpness(img) img enhancer.enhance(2.0) # 保存或直接转换为base64 # ... return img后处理纠错建立常见词汇词典如全国城市名、区县名、街道常用字。当识别出的文字与词典中的某个词编辑距离相似度很近时自动替换。例如“北京巾”自动纠正为“北京市”。5.2 设计健壮的自动化流程一个完整的生产系统可以这样设计监控文件夹使用Python的watchdog库监控一个指定文件夹。一旦有新的面单图片放入立即触发处理流程。异步处理如果图片量很大可以使用消息队列如Redis或者多线程/多进程避免一张图卡住整个流程。结果校验与人工复核对提取的“运单号”检查位数。对“电话号码”检查格式。计算OCR返回的文本置信度对低置信度的识别结果比如低于0.8将其图片路径和原始识别结果记录到另一个“待复核”列表或数据库供人工后续检查。数据入库将最终提取的结构化数据DataFrame直接写入公司的数据库MySQL, PostgreSQL等或通过接口推送到业务系统实现真正的无缝自动化。6. 总结通过本教程我们完成了一次从零到一的快递面单信息自动化提取实践。我们不仅学会了如何部署和操作Hunyuan-OCR-WEBUI这个强大的工具更重要的是掌握了将其与简单的Python脚本结合打造自动化工作流的核心思路。回顾关键步骤部署服务 → 单张测试 → 编写批量API调用脚本 → 定制信息提取规则 → 优化流程与准确率。这个模式具有很强的通用性。今天你用它来处理快递面单明天稍加修改就可以用来批量识别发票上的金额和税号、提取合同中的甲乙双方和签署日期、或者读取身份证上的信息。技术工具的价值在于解决实际问题。从每天手动录入几百条信息到运行一个脚本让电脑自动完成这中间节省的时间、减少的错误就是效率最直接的提升。希望这个教程能成为你开启办公自动化之旅的第一块积木。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。