0

0

【校园AI Day-AI workshop】基于OCR的自定义区域文件重命名程序

P粉084495128

P粉084495128

发布时间:2025-07-25 11:04:35

|

977人浏览过

|

来源于php中文网

原创

该项目基于飞桨校园AI Day活动,实现自定义区域识别文件重命名程序。利用PaddleOCR技术,识别30张交付验收单中的铁塔名称并完成图片重命名,精度达90%合格。通过分析图片确定信息位置,提取后修改文件名,可替代手工录入,节省成本,目前准确率达标,未来将优化模型以提升跨行识别能力。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

【校园ai day-ai workshop】基于ocr的自定义区域文件重命名程序 - php中文网

基于OCR的自定义区域识别文件重命名程序

一.项目介绍

1.1 引言:

本次项目分享来源于最近参加的【飞桨校园AI Day】AI Workshop活动,团队名:重生之我在百度学AI,选择项目命题为《自定义区域识别文件重命名程序》。 其课题主要要求为:

提供30张交付验收单,需要通过OCR技术识别图片中的铁塔名称,并根据该字段完成对图片的重命名。

  • 精度指标:提供30张图片,识别正确90%为合格
  • 环境要求:使用PaddleHUB或PaddleOCR实现均可

目前主要实现了根据图片中的指定区域进行重命名,通过OCR技术实现可自主选择识别区,实现识别内容的精确提取

1.2 项目意义:

在企业与日常的生活与工作过程中,必不可免会产生大量单据,譬如表单、档案等,录入表单数据需要大量人力完成手工录入,过程繁琐枯燥,耗费大量人力物力。而通过拍摄/扫描的方式快速获取表单数据,使用OCR技术实现自动录单,实现海量表单自动化录入,解决表单录入速度慢、易出错、成本高等难题。用人工智能OCR代替手动录入,为企业运营节省了大量人力、时间、物力成本

1.3 项目过程:

  • 基于Paddle的轻量级中文ocr模型对任务目标进行可视化分析,确定所需提取的信息位置

  • 选择预处理模型,完成对目标信息的提取

  • 根据抽取得到的信息,按任务要求对文件名进行修改

【校园AI Day-AI workshop】基于OCR的自定义区域文件重命名程序 - php中文网

二、环境准备

In [5]

# 克隆 PaddleOCR # 此代码只需要执行一次,本项目已完成克隆 #%cd ~  #!git clone -b release/2.1 https://github.com/PaddlePaddle/PaddleOCR.git
/home/aistudio 正克隆到 'PaddleOCR'... remote: Enumerating objects: 35969, done. remote: Counting objects: 100% (285/285), done. remote: Compressing objects: 100% (157/157), done. remote: Total 35969 (delta 165), reused 230 (delta 128), pack-reused 35684 接收对象中: 100% (35969/35969), 319.24 MiB | 137.00 KiB/s, 完成. 处理 delta 中: 100% (24889/24889), 完成. 检查连接... 完成。

三、安装依赖

In [ ]

# 安装依赖库 %cd ~/PaddleOCR !pip install -r requirements.txt -i https://mirror.baidu.com/pypi/simple

四、数据解压

In [ ]

!unzip /home/aistudio/data/data142101/Scan_0012_0004.zip -d /home/aistudio/images

五、模型选择

PaddleOCR是百度开源的超轻量级OCR模型库,提供了数十种文本检测、识别模型,旨在打造一套丰富、领先、实用的文字检测、识别模型/工具库,助力使用者训练出更好的模型,并应用落地。

在 PaddleOCR 识别中,会依次完成三种任务:检测、方向分类及文本识别;

关于预训练权重,PaddleOCR 官网根据提供权重文件大小分为两类:

  • 一类为轻量级,(检测+分类+识别)三类权重加起来大小一共才 9.4 M,适用于手机端和服务器部署;
  • 另一类(检测+分类+识别)三类权重内存加起来一共 143.4 MB ,适用于服务器部署;

无论模型是否轻量级,识别效果都能与商业效果相比,在本文中将选用轻量级权重用于测试;

In [115]

! mkdir inference # 下载超轻量级中文OCR模型的检测模型并解压 ! cd inference && wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_infer.tar && tar xf ch_ppocr_mobile_v2.0_det_infer.tar && rm ch_ppocr_mobile_v2.0_det_infer.tar # 下载超轻量级中文OCR模型的识别模型并解压 ! cd inference && wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_infer.tar && tar xf ch_ppocr_mobile_v2.0_rec_infer.tar && rm ch_ppocr_mobile_v2.0_rec_infer.tar # 下载超轻量级中文OCR模型的文本方向分类器模型并解压 ! cd inference && wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar && tar xf ch_ppocr_mobile_v2.0_cls_infer.tar && rm ch_ppocr_mobile_v2.0_cls_infer.tar ! cd ..
mkdir: 无法创建目录"inference": 文件已存在 --2022-05-25 23:25:29--  https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_infer.tar 正在解析主机 paddleocr.bj.bcebos.com (paddleocr.bj.bcebos.com)... 182.61.200.229, 182.61.200.195, 2409:8c04:1001:1002:0:ff:b001:368a 正在连接 paddleocr.bj.bcebos.com (paddleocr.bj.bcebos.com)|182.61.200.229|:443... 已连接。 已发出 HTTP 请求,正在等待回应... 200 OK 长度: 3164160 (3.0M) [application/x-tar] 正在保存至: “ch_ppocr_mobile_v2.0_det_infer.tar” ch_ppocr_mobile_v2. 100%[===================>]   3.02M  7.34MB/s    in 0.4s     2022-05-25 23:25:30 (7.34 MB/s) - 已保存 “ch_ppocr_mobile_v2.0_det_infer.tar” [3164160/3164160]) --2022-05-25 23:25:30--  https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_infer.tar 正在解析主机 paddleocr.bj.bcebos.com (paddleocr.bj.bcebos.com)... 182.61.200.229, 182.61.200.195, 2409:8c04:1001:1002:0:ff:b001:368a 正在连接 paddleocr.bj.bcebos.com (paddleocr.bj.bcebos.com)|182.61.200.229|:443... 已连接。 已发出 HTTP 请求,正在等待回应... 200 OK 长度: 3897317 (3.7M) [application/x-tar] 正在保存至: “ch_ppocr_mobile_v2.0_rec_infer.tar” ch_ppocr_mobile_v2. 100%[===================>]   3.72M  7.95MB/s    in 0.5s     2022-05-25 23:25:31 (7.95 MB/s) - 已保存 “ch_ppocr_mobile_v2.0_rec_infer.tar” [3897317/3897317]) --2022-05-25 23:25:32--  https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar 正在解析主机 paddleocr.bj.bcebos.com (paddleocr.bj.bcebos.com)... 182.61.200.195, 182.61.200.229, 2409:8c04:1001:1002:0:ff:b001:368a 正在连接 paddleocr.bj.bcebos.com (paddleocr.bj.bcebos.com)|182.61.200.195|:443... 已连接。 已发出 HTTP 请求,正在等待回应... 200 OK 长度: 1454080 (1.4M) [application/x-tar] 正在保存至: “ch_ppocr_mobile_v2.0_cls_infer.tar” ch_ppocr_mobile_v2. 100%[===================>]   1.39M  6.12MB/s    in 0.2s     2022-05-25 23:25:32 (6.12 MB/s) - 已保存 “ch_ppocr_mobile_v2.0_cls_infer.tar” [1454080/1454080])

5.1可视化测试图像

In [184]

import matplotlib.pyplot as plt from PIL import Image %pylab inline def show_img(img_path,figsize=(10,10)):     ## 显示原图,读取名称为11.jpg的测试图像     img = Image.open(img_path)     plt.figure("test_img", figsize=figsize)     plt.imshow(img)     plt.show()#为了显示效果,将图片放到了下个单元块中 #show_img("/home/aistudio/images/Scan_0012_0001.jpg") #为了显示效果,将图片放到了下个单元块中
Populating the interactive namespace from numpy and matplotlib

我们对测试图可视化后可以发现,表单整体基本是印刷体,文字公整清晰,且图片质量较高,可以判断图片是扫描得到的。但目标信息区域文字密集度较高,给信息抽取增加了一定的难度。

测试图像可视化结果如下:【校园AI Day-AI workshop】基于OCR的自定义区域文件重命名程序 - php中文网

5.2 对测试图像进行文字识别

需要详细学习paddleocr使用过程请参考官方baseline:https://aistudio.baidu.com/aistudio/projectdetail/467229

Mapify
Mapify

Mapify是由Xmind推出的AI思维导图生成工具,原名ChatMind

下载

paddleocr已发布v3版本详情参考官方baseline: https://aistudio.baidu.com/aistudio/projectdetail/3916530

In [ ]

# 快速运行 !python3 tools/infer/predict_system.py --image_dir="/home/aistudio/images/Scan_0012_0001.jpg" \ --det_model_dir="./inference/ch_ppocr_mobile_v2.0_det_infer"  \ --rec_model_dir="./inference/ch_ppocr_mobile_v2.0_rec_infer" \ --cls_model_dir="./inference/ch_ppocr_mobile_v2.0_cls_infer"#效果图片存放在"/PaddleOCR/inference_results"中

从测试图像的识别效果可以看出PaddleOCR的轻量级模型对本次任务的识别效果非常好,所以任务聚焦于如何抽取目标信息

测试图像文字识别效果如下:【校园AI Day-AI workshop】基于OCR的自定义区域文件重命名程序 - php中文网

5.3 目标信息抽取

在项目初期,我们小组的想法是通过使用PaddleOCR提供的SER模型(语义实体识别), 完成对图像中的文本识别与分类。然后基于RE任务,完成对图象中的文本内容的关系提取。

但在多次尝试后,因为训练数据的缺少与找不到合适的RE任务标注工具等原因,使用预训练模型直接进行信息抽取的效果较差,无法满足任务需求。

考虑到对测试图像进行分析时,图片质量较高,并且判断是扫描提取的图片,图片质量较为稳定。所以我们尝试使用文字本身的位置关系来抽取目标信息

若读者需要了解SER与RE模型可以参考大神项目: https://aistudio.baidu.com/aistudio/projectdetail/3884375

5.3.1 方案一:基于输出顺序抽取目标信息

In [4]

from paddleocr import PaddleOCR ocr=PaddleOCR(use_angle_cls = True,use_gpu= True) #这里为了方便直接使用接口调用模型,易于输出结果,不用修改配置文件 result=ocr.ocr("/home/aistudio/images/Scan_0012_0001.jpg",cls=True) for i in result[0:10]: #信息较多,这里只输出了前10个,但已经包含目标信息     print(i)
100%|██████████| 3.16M/3.16M [00:00<00:00, 45.5MiB/s]
Namespace(cls_batch_num=6, cls_image_shape='3, 48, 192', cls_model_dir='/home/aistudio/.paddleocr/cls', cls_thresh=0.9, det=True, det_algorithm='DB', det_db_box_thresh=0.5, det_db_score_mode='fast', det_db_thresh=0.3, det_db_unclip_ratio=1.6, det_east_cover_thresh=0.1, det_east_nms_thresh=0.2, det_east_score_thresh=0.8, det_limit_side_len=960, det_limit_type='max', det_model_dir='/home/aistudio/.paddleocr/2.1/det/ch', drop_score=0.5, enable_mkldnn=False, gpu_mem=8000, image_dir='', ir_optim=True, label_list=['0', '180'],, max_text_length=25, rec=True, rec_algorithm='CRNN', rec_batch_num=6, rec_char_dict_path='./ppocr/utils/ppocr_keys_v1.txt', rec_char_type='ch', rec_image_shape='3, 32, 320', rec_model_dir='/home/aistudio/.paddleocr/2.1/rec/ch', use_angle_cls=True, use_dilation=False, use_gpu=True, use_pdserving=False, use_space_char=True, use_tensorrt=False, use_zero_copy_run=False) download https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_infer.tar to /home/aistudio/.paddleocr/2.1/det/ch/ch_ppocr_mobile_v2.0_det_infer.tar download https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_infer.tar to /home/aistudio/.paddleocr/2.1/rec/ch/ch_ppocr_mobile_v2.0_rec_infer.tar
100%|██████████| 3.90M/3.90M [00:00<00:00, 47.6MiB/s] 100%|██████████| 1.45M/1.45M [00:00<00:00, 34.6MiB/s]
download https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar to /home/aistudio/.paddleocr/cls/ch_ppocr_mobile_v2.0_cls_infer.tar
INFO 2022-05-26 08:05:31,915 predict_system.py:92] dt_boxes num : 65, elapse : 1.9299414157867432
[2022/05/26 08:05:31] root INFO: dt_boxes num : 65, elapse : 1.9299414157867432
INFO 2022-05-26 08:05:32,009 predict_system.py:107] cls num  : 65, elapse : 0.06732296943664551
[2022/05/26 08:05:32] root INFO: cls num  : 65, elapse : 0.06732296943664551
INFO 2022-05-26 08:05:32,183 predict_system.py:111] rec_res num  : 65, elapse : 0.16558265686035156
[2022/05/26 08:05:32] root INFO: rec_res num  : 65, elapse : 0.16558265686035156 [[[617.0, 56.0], [944.0, 56.0], [944.0, 87.0], [617.0, 87.0]], ('《塔类业务交付验收单', 0.9945518)] [[[10.0, 131.0], [127.0, 131.0], [127.0, 172.0], [10.0, 172.0]], ('客户:', 0.9867139)] [[[542.0, 128.0], [1142.0, 123.0], [1142.0, 162.0], [542.0, 167.0]], ('中国联合网络通信有限公司泰安市分公司', 0.99098516)] [[[858.0, 209.0], [994.0, 203.0], [996.0, 244.0], [860.0, 250.0]], ('铁塔名称', 0.996998)] [[[1059.0, 206.0], [1525.0, 203.0], [1525.0, 245.0], [1059.0, 247.0]], ('名嘉广场置业有限公司前绿化带', 0.9981682)] [[[73.0, 216.0], [205.0, 216.0], [205.0, 257.0], [73.0, 257.0]], ('需求名称', 0.998343)] [[[317.0, 216.0], [781.0, 211.0], [781.0, 249.0], [318.0, 254.0]], ('名嘉广场置业有限公司前绿化带', 0.9984528)] [[[861.0, 288.0], [991.0, 288.0], [991.0, 322.0], [861.0, 322.0]], ('铁塔区县', 0.99679285)] [[[46.0, 293.0], [224.0, 288.0], [225.0, 329.0], [47.0, 335.0]], ('运营商区县', 0.9963339)] [[[503.0, 293.0], [603.0, 293.0], [603.0, 327.0], [503.0, 327.0]], ('泰山区', 0.9958537)]

In [187]

print(result[4]) #resul[4]即为我们所需要的目标信息 print(result[6]) #信息一样,但是通过坐标我们可以发现result[4]才是我们需要的目标信息
[[[1059.0, 206.0], [1525.0, 203.0], [1525.0, 245.0], [1059.0, 247.0]], ('名嘉广场置业有限公司前绿化带', 0.9981682)] [[[317.0, 216.0], [781.0, 211.0], [781.0, 249.0], [318.0, 254.0]], ('名嘉广场置业有限公司前绿化带', 0.9984528)]

在使用方案一进行信息抽取的过程中,我们发现目标信息的输出位置并不固定,导致结果出错,在对比模型的输出与目标图片的特点后我们发现,PaddleOCR的默认输出顺序是先从上到下,后从左到右。

而在任务目标图片中,常有图片有略微倾斜,导致目标信息的输出位置移动。这里仍旧以图一为例:图一正常的目标信息位置应该为第七位即result[6],但由于图像倾斜,导致目标输出位置迁移到了result[4]。

倾斜情况如图:【校园AI Day-AI workshop】基于OCR的自定义区域文件重命名程序 - php中文网

5.3.2 方案二:基于识别框位置抽取目标信息

在方案一的实行过程中,发现输出结果中包含信息的识别区域信息,于是优化了方案一,首先计算并根据图片的文字分布情况调整得到目标信息位置的中心点,通过各个识别框与中心点的距离,定位目标识别框,从而抽取目标信息

In [18]

data = result[4][0] #data为图一的目标区域 center = [sum(e)/len(e) for e in zip(*data)] #计算目标框中心点 print(center)  center = [1292.0, 220.0] #由于目标框下方密集上方稀疏,所以将中心点y值略微上移,提高准确度
[1292.0, 225.25]

六、模型应用

In [ ]

import os path="/home/aistudio/images/"  #待读取的文件夹 path_list=os.listdir(path) path_list.sort() #对读取的路径进行排序 name_list = [] for filename in path_list: #会出现checkpoints文件,跳过     file = os.path.join(path, filename)     text=ocr.ocr(file,cls=True)     min=9999999     for t in text:             location = [sum(e)/len(e) for e in zip(*t[0])] #计算识别框中心点         if(((location[0]-center[0])**2+(location[1]-center[1])**2)

In [20]

name_list #带有same后缀的是用于区分相同名称
['名嘉广场置业有限公司前绿化带',  '泰山区凤凰小区南侧',  '泰山区华城丽景湾北',  '中国山东泰安主城区国棉北机房无',  '老王府村北十字路口绿化带',  '时代大厦西区',  '高新区龙腾路青年特车西',  '泰山区上峪环山路卧龙大观北',  '泰山区上峪环山路卧龙大观北same',  '泰山区白马石东一体化基站',  '泰山区徐家楼栗家庄南快装',  '泰山区建行干部学校',  '宁阳磁窑力博集团办公楼-3G',  '宁阳县东庄王家庄',  '宁阳华丰机电高庄山坡',  '杨家集-2',  '新泰市放城游坡村',  '新泰市宫里镇桃园村中间',  '无线',  '新泰市龙廷胡家庄新建',  '中国山东泰安新泰赵家峪机房无线',  '泉沟庙子牌村',  '新泰龙庭刘家石山子机房无线',  '新泰西韩',  '新泰星泰晶光电',  '新泰泉沟高崖头',  '新泰楼德镇封家庄',  '新泰谷里镇卧马村',  '新泰市西张庄湖西社区',  '岱岳区惠普西区西新建']

七、模型评价与改进方向

通过对比发现图四,图十七,图十九重命名存在错误,准确率达到90%,达到任务要求。

其中图四与图十七错误为选用的文字识别模型无法跨行识别,图十七为文字识别错误,所以后续改进方向以调整文字识别模型为主,使其可以跨行识别,或者选用PaddleOCR新提供的V3版本,增加文字识别的准确度。

相关专题

更多
人工智能在生活中的应用
人工智能在生活中的应用

人工智能在生活中的应用有语音助手、无人驾驶、金融服务、医疗诊断、智能家居、智能推荐、自然语言处理和游戏设计等。本专题为大家提供人工智能相关的文章、下载、课程内容,供大家免费下载体验。

405

2023.08.17

人工智能的基本概念是什么
人工智能的基本概念是什么

人工智能的英文缩写为AI,是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学;该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

291

2024.01.09

人工智能不能取代人类的原因是什么
人工智能不能取代人类的原因是什么

人工智能不能取代人类的原因包括情感与意识、创造力与想象力、伦理与道德、社会交往与沟通能力、灵活性与适应性、持续学习和自我提升等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

622

2024.09.10

Python 人工智能
Python 人工智能

本专题聚焦 Python 在人工智能与机器学习领域的核心应用,系统讲解数据预处理、特征工程、监督与无监督学习、模型训练与评估、超参数调优等关键知识。通过实战案例(如房价预测、图像分类、文本情感分析),帮助学习者全面掌握 Python 机器学习模型的构建与实战能力。

32

2025.10.21

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1758

2024.08.16

PHP 命令行脚本与自动化任务开发
PHP 命令行脚本与自动化任务开发

本专题系统讲解 PHP 在命令行环境(CLI)下的开发与应用,内容涵盖 PHP CLI 基础、参数解析、文件与目录操作、日志输出、异常处理,以及与 Linux 定时任务(Cron)的结合使用。通过实战示例,帮助开发者掌握使用 PHP 构建 自动化脚本、批处理工具与后台任务程序 的能力。

22

2025.12.13

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

150

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

88

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

90

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 2.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号