深度学习篇---PaddleDetectionPaddleOCR


文章目录

  • 前言
  • 1.代码
  • 2.代码介绍
    • 2.1 **导入模块**
    • 2.2 **配置区域**
    • 2.3 ExpressInfoProcessor类
    • 2.4 **主程序**:
  • 3.使用说明
    • 3.1环境准备
    • 3.2模型准备
    • 3.3数据库初始化
    • 3.4串口配置
    • 3.5信息提取优化
    • 3.6注意事项


前言

本文简单介绍了PaddleDetection和PaddleOCR相结合的示例代码,通过两个PaddlePaddle框架下的工具包结合使用同时达到图像识别和文本识别的功能。


1.代码

import cv2
import re
import serial
import sqlite3
from datetime import datetime
from paddledetection.deploy.python.infer import Detector
from paddleocr import PaddleOCR# ========== 配置区域 ==========
SERIAL_PORT = '/dev/ttyUSB0'  # 串口设备
BAUDRATE = 9600               # 波特率
DB_NAME = 'express.db'        # 数据库名称
DET_MODEL_DIR = './jd_sf_model/'  # 检测模型路径
# =============================class ExpressInfoProcessor:def __init__(self):# 初始化检测模型self.detector = Detector(model_dir=DET_MODEL_DIR,device='GPU',threshold=0.6)# 初始化OCR模型self.ocr = PaddleOCR(use_angle_cls=True, lang='ch')# 初始化串口self.ser = serial.Serial(SERIAL_PORT, BAUDRATE)# 初始化数据库self.conn = sqlite3.connect(DB_NAME)self._init_db()def _init_db(self):"""初始化数据库表结构"""cursor = self.conn.cursor()cursor.execute('''CREATE TABLE IF NOT EXISTS express_info(id INTEGER PRIMARY KEY AUTOINCREMENT,company TEXT,track_no TEXT,name TEXT,phone TEXT,create_time TIMESTAMP)''')self.conn.commit()def process_image(self, img_path):"""处理图像的主流程"""# 读取图像img = cv2.imread(img_path)if img is None:raise FileNotFoundError(f"Image {img_path} not found")# 检测快递公司company = self._detect_company(img)if not company:print("未识别到有效快递公司")return# OCR文字识别ocr_result = self.ocr.ocr(img, cls=True)text_list = [line[1][0] for line in ocr_result]# 信息提取info = self._extract_info(text_list)# 发送串口指令self._send_serial(company)# 存储到数据库self._save_to_db(company, info)def _detect_company(self, img):"""检测快递公司"""results = self.detector.predict([img], visual=False)# 解析检测结果(假设0:京东,1:顺丰)for result in results:if len(result['boxes']) > 0:class_id = int(result['boxes'][0][0])score = result['boxes'][0][1]if score > 0.6:return '京东' if class_id == 0 else '顺丰'return Nonedef _extract_info(self, text_list):"""从OCR结果提取结构化信息"""return {'track_no': self._find_track_no(text_list),'name': self._find_name(text_list),'phone': self._find_phone(text_list)}def _find_track_no(self, texts):"""查找快递单号"""# 优先查找包含关键字的条目for text in texts:if any(kw in text for kw in ['单号', '快递单号', '运单号']):match = re.search(r'\d{10,20}', text)if match:return match.group()# 全局搜索长数字for text in texts:match = re.search(r'\d{12,20}', text)if match:return match.group()return ''def _find_phone(self, texts):"""查找电话号码"""for text in texts:match = re.search(r'(1[3-9]\d{9})', text)if match:return match.group()return ''def _find_name(self, texts):"""查找收件人姓名"""# 查找包含关键字的条目for text in texts:if any(kw in text for kw in ['收件人', '姓名', '收货人']):parts = re.split(r'[::]', text)if len(parts) > 1:name = parts[-1].strip()if re.match(r'^[\u4e00-\u9fa5]{2,4}$', name):return name# 匹配纯中文姓名for text in texts:if re.match(r'^[\u4e00-\u9fa5]{2,4}$', text):return textreturn ''def _send_serial(self, company):"""发送串口指令"""cmd = '1' if company == '京东' else '2'self.ser.write(cmd.encode())print(f"已发送指令:{cmd}")def _save_to_db(self, company, info):"""保存到数据库"""cursor = self.conn.cursor()cursor.execute('''INSERT INTO express_info (company, track_no, name, phone, create_time)VALUES (?, ?, ?, ?, ?)''',(company,info['track_no'],info['name'],info['phone'],datetime.now().strftime("%Y-%m-%d %H:%M:%S")))self.conn.commit()print("数据已存储")def __del__(self):"""资源清理"""self.ser.close()self.conn.close()if __name__ == "__main__":processor = ExpressInfoProcessor()processor.process_image("test.jpg")

2.代码介绍

这段代码是一个用于处理快递信息的Python程序,具体功能包括读取图像中的快递信息,识别快递公司、提取快递单号、收件人姓名和联系电话,然后通过串口发送指令,并将这些信息存储到SQLite数据库中。下面是对代码中各部分的详细介绍:

2.1 导入模块

代码一开始导入了需要使用的模块,包括OpenCV(cv2)用于图像处理、正则表达式模块(re)用于文本匹配串口通信模块(serial)SQLite数据库模块(sqlite3)****、datetime模块用于处理时间PaddlePaddle的物体检测模型(Detector)和OCR模型(PaddleOCR)

2.2 配置区域

定义了一些配置常量,如串口设备、波特率、数据库名称、检测模型路径等。

2.3 ExpressInfoProcessor类

这是主要的处理类,包含以下方法和功能:

__init__方法:初始化函数,初始化物体检测模型、OCR模型、串口和数据库连接

_init_db方法:初始化数据库表结构,如果表不存在则创建。

process_image方法:处理图像的主要流程,包括读取图像、检测快递公司、OCR文字识别、提取信息、发送串口指令和存储到数据库。

_detect_company方法:检测快递公司,使用物体检测模型判断是京东还是顺丰。

_extract_info方法:从OCR结果中提取结构化信息,包括快递单号、姓名和电话号码。

_find_track_no、_find_phone、_find_name方法:分别用于查找快递单号、电话号码和姓名。

_send_serial方法:发送串口指令,根据公司类型发送不同的指令。

_save_to_db方法:将信息保存到数据库中。

__del__方法:资源清理方法,在对象销毁时关闭串口和数据库连接。

2.4 主程序

在if __name__ == "__main__"下初始化ExpressInfoProcessor对象,并调用process_image方法处理名为"test.jpg"的图像。

3.使用说明

3.1环境准备

pip install paddlepaddle paddleocr paddledetection serial pyserial opencv-python

3.2模型准备

  1. 训练京东/顺丰图标检测模型(使用PP-YOLO等算法)
  2. 将训练好的模型保存到jd_sf_model目录
  3. 目录应包含:model.pdmodel, model.pdiparams, infer_cfg.yml

3.3数据库初始化

代码首次运行时会自动创建SQLite数据库和表结构

3.4串口配置

  1. 根据实际硬件修改SERIAL_PORTBAUDRATE参数
  2. Linux系统查看端口:ls /dev/tty*
  3. Windows系统端口通常为COMx格式

3.5信息提取优化

  1. 可根据实际快递单样式调整正则表达式匹配规则
  2. 添加更多关键字匹配规则提高准确性

3.6注意事项

  1. 检测模型需要自行训练并放置到指定目录
  2. 实际快递单的OCR识别效果取决于图像质量
  3. 信息提取规则可能需要根据具体快递单样式调整
  4. 串口通信需要正确配置端口和波特率
  5. 数据库文件会自动生成在当前目录下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/42143.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis6为什么引入了多线程?

大家好,我是锋哥。今天分享关于【Redis6为什么引入了多线程?】面试题。希望对大家有帮助; Redis6为什么引入了多线程? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Redis 6 引入了多线程的主要目的是为了提升 Redis…

电力物联网数据采集装置 高精度电能计量表

摘要 随着现代电力系统的复杂化和负荷多样化,电能质量问题日益突出。高精度电能质量监测装置在配电系统中的应用,可以有效监测和分析谐波、不平衡、电压暂升暂降等电能质量问题,为电网优化运行和故障诊断提供重要数据支持。本文以APM电能质量…

element-plus中,Tour 漫游式引导组件的使用

目录 一.Tour 漫游式引导组件的简单介绍 1.作用 2.基本使用 3.展示效果 二.实战1:介绍患者病历表单 1.要求 2.实现步骤 3.展示效果 结语 一.Tour 漫游式引导组件的简单介绍 1.作用 快速了解一个功能/产品。 2.基本使用 从官网复制如下代码: &…

【Unity网络编程知识】使用Socket实现简单TCP通讯

1、Socket的常用属性和方法 创建Socket TCP流套接字 Socket socketTcp new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 1.1 常用属性 1)套接字的连接状态 socketTcp.Connected 2)获取套接字的类型 socketTcp.So…

【C++游戏引擎开发】《线性代数》(1):环境配置与基础矩阵类设计

一、开发环境配置 1.1 启用C 20 在VS2022中新建项目后右键项目 1.2 启用增强指令集 1.3 安装Google Test vcpkg安装使用指南 vcpkg install gtest:x64-windows# 集成到系统目录,只需要执行一次,后续安装包之后不需要再次执行 vcpkg integrate inst…

Flutter完整开发实战详解(一、Dart语言和Flutter基础)

前言 在如今的 Flutter 大潮下,本系列是让你看完会安心的文章。本系列将完整讲述:如何快速从0开发一个完整的 Flutter APP,配套高完成度 Flutter 开源项目 GSYGithubAppFlutter。同时也会提供一些 Flutter 的开发细节技巧,并针对…

Spring 事件监听机制介绍以及源码分析

在复杂的业务系统中,模块间的过度耦合往往会导致代码维护困难、扩展性受限。Spring 事件监听机制基于观察者模式,提供了一种优雅的解耦方案,使得组件间通过事件驱动实现松耦合通信。这种机制不仅被 Spring 框架内部使用(如容器生命…

【VSCode的安装与配置】

目录: 一:下载 VSCode二:安装 VSCode三:配置 VSCode 一:下载 VSCode 下载地址:https://code.visualstudio.com/download 下载完成之后,在对应的下载目录中可以看到安装程序。 二:安装…

2024年认证杯SPSSPRO杯数学建模C题(第二阶段)云中的海盐全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 C题 云中的海盐 原题再现: 巴黎气候协定提出的目标是:在2100年前,把全球平均气温相对于工业革命以前的气温升幅控制在不超过2摄氏度的水平,并为1.5摄氏度而努力。但事实上,许多之前的…

Scala基础语法与简介

对象 -对象有属性和行为。例如:一只狗的状属性有:颜色,名字,行为有:叫、跑、吃等。对象是一个类的实例。 类 -类是对象的抽象,而对象是类的具体实例。 方法 -方法描述的基本的行为,一个类可以…

鸿蒙UI开发

鸿蒙UI开发 本文旨在分享一些鸿蒙UI布局开发上的一些建议,特别是对屏幕宽高比发生变化时的应对思路和好的实践。 折叠屏适配 一般情况(自适应布局/响应式布局) 1.自适应布局 1.1自适应拉伸 左右组件定宽 TypeScript //左右定宽 Row() { …

BeeWorks:为企业打造专网部署即时通讯解决方案

在数字化快速发展的今天,企业的沟通与协作越来越依赖于高效的即时通讯工具。然而,保障信息安全和数据隐私也变得愈发重要。这种情况下,专网部署即时通讯软件成为许多企业的首要选择。BeeWorks作为一款优质的专网部署即时通讯软件,…

uniapp笔记-swiper组件实现轮播图

思路 主要就是参考 swiper | uni-app官网 实现轮播图。 实例 新建一个banner.vue通用组件。 代码如下&#xff1a; <template><view>轮播图</view> </template><script> </script><style> </style> 随后在index.vue中导…

企业在人工智能创新与安全之间走钢丝

2025 年全球 AI/ML 工具使用量将激增&#xff0c;企业将 AI 融入运营之中&#xff0c;员工也将 AI 嵌入日常工作流程中。报告显示&#xff0c;企业对 AI/ML 工具的使用同比增长 3,000% 以上&#xff0c;凸显了各行各业迅速采用 AI 技术&#xff0c;以提升生产力、效率和创新水平…

vue - [Vue warn]: Duplicate keys detected: ‘0‘. This may cause an update error.

问题描述&#xff1a; vue项目中&#xff0c;对表单数组赋值时&#xff0c;控制台抛出警告&#xff1a; 问题代码&#xff1a; 问题分析&#xff1a; 1、Vue 要求每个虚拟 DOM 节点必须有唯一的 key。该警告信息通常出现在使用v-for循环的场景中&#xff0c;多个同级节点使用…

Containerd+Kubernetes搭建k8s集群

虚拟机环境设置&#xff0c;如果不是虚拟机可以忽略不看 1、安装配置containerd 1.1 添加 Kubernetes 官方仓库 安装cri-tools的时候需要用到 cat > /etc/yum.repos.d/kubernetes.repo << EOF [kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kub…

ubuntu服务器server版安装,ssh远程连接xmanager管理,改ip网络连接。图文教程

ventoy启动服务器版iso镜像&#xff0c;注意看server名称&#xff0c;跟之前desktop版ubuntu不一样。没有gui界面。好&#xff0c;进入命令行界面。语言彻底没汉化了&#xff0c;选英文吧&#xff0c;别的更看不懂。 跟桌面版ubuntu类似&#xff0c;选择是否精简系统&#xff0…

QOpenGLWidget视频画面上绘制矩形框

一、QPainter绘制 在QOpenGLWidget中可以绘制&#xff0c;并且和OpenGL的内容叠在一起。paintGL里面绘制完视频后&#xff0c;解锁资源&#xff0c;再用QPainter绘制矩形框。这种方式灵活性最好。 void VideoGLWidget::paintGL() {glClear(GL_COLOR_BUFFER_BIT);m_program.bi…

蓝桥杯备考:真题之飞机降落(暴搜+小贪心)

我们最多有十架飞机&#xff0c;可以选择dfs暴力搜索&#xff0c;枚举每种情况 那么&#xff0c;我们降落的时候怎么确定新的起点也就是newend呢&#xff1f; 如果飞机飞到机场的时刻是大于原来的end的&#xff0c;我们就让tili作为newend 否则&#xff0c;我们就让end作为ne…

解决 Element UI 嵌套弹窗的状态管理问题!!!

解决 Element UI 嵌套弹窗的状态管理问题 &#x1f527; 问题描述 ❓ 在使用 Element UI 开发一个多层嵌套弹窗功能时&#xff0c;遇到了以下问题&#xff1a; 弹窗只能打开一次&#xff0c;第二次点击无法打开 &#x1f6ab;收到 Vue 警告&#xff1a;避免直接修改 prop 值…