校园AI Day的AI工作坊任务为:用OCR技术识别30张交付验收单的铁塔名称,实现图片重命名。方案采用PaddleHUB+后处理,低代码实现,准确率100%。实施含数据准备(上传至指定路径)、环境准备(安装相关库)、执行输出(定义函数提取名称并遍历重命名至输出目录)。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

【校园AI Day-AI workshop】自定义区域OCR识别文件重命名
1背景介绍
任务描述:在实际的工作中,有时候需要根据图片中的指定区域进行重命名,通过OCR技术实现可自主框选识别区,实现识别内容的精确提取。本任务提供30张交付验收单,需要通过OCR技术识别图片中的铁塔名称,并根据该字段完成对图片的重命名
2解决方案
2.1数据分析
- 数据情况:制式标准表单
- 数据量:30张扫描数据
2.2表单识别介绍
参考《多模态技术在金融场景创新实践:表单识别》
- 表单识主流方案:单模态和多模态
2.3本项目拟采取思路
- 基于PaddleHUB+后处理(低代码快速实现文本提前)
- 准确率100%
#创建文件夹,上传数据#!mkdir work/data!tree work/data
3.2环境准备
#安装 paddlehub!pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple !pip install paddlehub==2.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
3.3执行输出
#定义获取名称函数import paddlehub as hubimport cv2
ocr = hub.Module(name="ch_pp-ocrv3")
def get_name(fn):
img = cv2.imread(fn)
result = ocr.recognize_text(images=[img])
#1找到铁塔名称
indx = 0
r_data = result[0]['data'] for i in range(len(r_data)): if '塔名称' in r_data[i]['text']: #print(r_data[i]['text_box_position'])
indx = i break
#2找到铁塔名称
#垂直方向加权,铁塔名称答案在一条直线上
weight_y = 4
#找到离铁塔名称最近的识别框
p_x = (r_data[indx]['text_box_position'][1][0] + r_data[indx]['text_box_position'][2][0])/2
p_y = (r_data[indx]['text_box_position'][1][1] + r_data[indx]['text_box_position'][2][1])/2
min_d = p_x + p_y
name_idx = 0
for i in range(len(r_data)): #排除自己
if i == indx: continue
x = (r_data[i]['text_box_position'][0][0] + r_data[i]['text_box_position'][3][0])/2
y = (r_data[i]['text_box_position'][0][1] + r_data[i]['text_box_position'][3][1])/2
dis = abs(p_x-x) + abs(p_y - y)*weight_y #print('{0}:{1}'.format(dis,r_data[i]['text']))
if dis < min_d:
min_d = dis
name_idx = i
name = r_data[name_idx]['text']
#3搜索夸行问题
weight_x =1
#底部两个点中点
p_x = (r_data[name_idx]['text_box_position'][2][0] + r_data[name_idx]['text_box_position'][3][0])/2
p_y = (r_data[name_idx]['text_box_position'][2][1] + r_data[name_idx]['text_box_position'][3][1])/2
min_d = 20 # 距离小于20存在跨行
for i in range(len(r_data)): #排除自己
if i == name_idx: continue
x = (r_data[i]['text_box_position'][0][0] + r_data[i]['text_box_position'][1][0])/2
y = (r_data[i]['text_box_position'][0][1] + r_data[i]['text_box_position'][1][1])/2
dis = abs(p_x-x)*weight_x + abs(p_y - y) #print('{0}:{1}'.format(dis,r_data[i]['text']))
if dis < min_d:
name += r_data[i]['text']
break
return name
#遍历重命名文件!mkdir work/outputimport os
img_dir = 'work/data'output_dir = 'work/output'for pic in os.listdir(img_dir):
fn = os.path.join(img_dir,pic)
name = get_name(fn) print('{0}:{1}'.format(fn,name)) import shutil
shutil.copy(fn,os.path.join(output_dir,name + fn[-9:]))









