深度学习篇---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模型准备
- 训练京东/顺丰图标检测模型(使用PP-YOLO等算法)
- 将训练好的模型保存到jd_sf_model目录
- 目录应包含:model.pdmodel, model.pdiparams, infer_cfg.yml
3.3数据库初始化
代码首次运行时会自动创建SQLite数据库和表结构
3.4串口配置
- 根据实际硬件修改SERIAL_PORT和BAUDRATE参数
- Linux系统查看端口:ls /dev/tty*
- Windows系统端口通常为COMx格式
3.5信息提取优化
- 可根据实际快递单样式调整正则表达式匹配规则
- 添加更多关键字匹配规则提高准确性
3.6注意事项
- 检测模型需要自行训练并放置到指定目录
- 实际快递单的OCR识别效果取决于图像质量
- 信息提取规则可能需要根据具体快递单样式调整
- 串口通信需要正确配置端口和波特率
- 数据库文件会自动生成在当前目录下
相关文章:
深度学习篇---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相结合的示例…...
Ant Design Vue Select 选择器 全选 功能
Vue.js的组件库Ant Design Vue Select 选择器没有全选功能,如下图所示: 在项目中,我们自己实现了全选和清空功能,如下所示: 代码如下所示: <!--* 参数配置 - 风力发电 - 曲线图 * 猴王软件学院 - 大强 …...
系统与网络安全------网络应用基础(1)
资料整理于网络资料、书本资料、AI,仅供个人学习参考。 TCP/IP协议及配置 概述 TCP/IP协议族 计算机之间进行通信时必须共同遵循的一种通信规定 最广泛使用的通信协议的集合 包括大量Internet应用中的标准协议 支持跨网络架构、跨操作系统平台的数据通信 主机…...
ZIP_STORED和ZIP_LZMA没有compresslevel参数!
在使用py的zipfile库进行压缩的时候,有这么一个函数: def write(self, filename, arcnameNone,compress_typeNone, compresslevelNone): 一般我们在压缩文件进去的时候都是用这个函数的; 对于compresslevel这个函数,它是用来指…...
坦克大战(c++)
今天我给大家分享一个c游戏。 废话不多说,作品展示: #include <stdio.h> #include <windows.h> #include <time.h> //里规格:长39*278 (真坐标)(假坐标宽为39) 高39 //外规格:长…...
论文阅读:2023 EMNLP SeqXGPT: Sentence-level AI-generated text detection
总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 SeqXGPT: Sentence-level AI-generated text detection https://aclanthology.org/2023.emnlp-main.73/ https://github.com/Jihuai-wpy/SeqXGPT https://www.doubao.com/chat/21003…...
JDK 24 发布,新特性解读!
一、版本演进与技术格局新动向 北京时间3月20日,Oracle正式发布Java SE 24。作为继Java 21之后的第三个非LTS版本,其技术革新力度远超预期——共集成24项JEP提案,相当于Java 22(12项)与Java 23(12项&#…...
k8s中service概述(二)NodePort
NodePort 是 Kubernetes 中一种用于对外暴露服务的 Service 类型。它通过在集群的每个节点上开放一个静态端口(NodePort),使得外部用户可以通过节点的 IP 地址和该端口访问集群内部的服务。以下是关于 NodePort Service 的详细说明࿱…...
Oracle归档配置及检查
配置归档位置到 USE_DB_RECOVERY_FILE_DEST,并设置存储大小 startup mount; !mkdir /db/archivelog ALTER SYSTEM SET db_recovery_file_dest_size100G SCOPEBOTH; ALTER SYSTEM SET db_recovery_file_dest/db/archivelog SCOPEBOTH; ALTER SYSTEM SET log_archive…...
计算机二级:函数基础题
函数基础题 第一题 rinput("请输入半径:") c3.1415926*r*2 print("{:.0f}".format(c))输出: Type Error第二题 a7 b2 print(a%2)输出 1第三题 ab4 def my_ab(ab,xy):abpow(ab,xy)print(ab,end"\n") my_ab(ab,2)prin…...
Python爬虫-爬取AliExpress商品搜索词排名数据
前言 本文是该专栏的第49篇,后面会持续分享python爬虫干货知识,记得关注。 本文,笔者以AliExpress平台为例。基于Python爬虫,通过某个指定的“搜索关键词”,批量获取该“搜索关键词”的商品排名数据。 具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。废…...
AI 时代,我们需要什么样的数据库?
AI 时代,我们需要什么样的数据库? 人工智能正在悄然改变软件开发的方式。过去一年间,诸如 GitHub Spark、Replit 和 Bolt 等新兴 AI 工具层出不穷,能够快速生成简单的前端应用,甚至无需传统意义上的后端服务就能部署上…...
刷机维修进阶教程-----adb禁用错了系统app导致无法开机 如何保数据无损恢复机型
在刷机维修过程中 。我们会遇到一些由于客户使用adb指令来禁用手机app而导致手机无法开机进入系统的故障机型。通常此类问题机型有好几种解决方法。但如果客户需要保数据来恢复机型。其实操作也是很简单的.还有类似误删除应用导致不开机等等如何保数据。 通过博文了解💝💝�…...
Vue3 实战:基于 mxGraph 与 WebSocket 的动态流程图构建
本文将详细介绍如何在 Vue3 项目中集成 mxGraph 可视化库,并通过 WebSocket 实现画布元素的实时更新。适合有 Vue 基础的前端开发者学习参考。 一、技术栈准备 Vue3:采用 Composition API 开发mxGraph:JavaScript 流程图库(版本 …...
Ubuntu AX200 iwlwifi-cc-46.3cfab8da.0.tgz无法下载的解决办法
文章目录 前言一、检查网卡是否被识别二、确认内核模块是否可用1.AX200 wifi 要求内核5.12.检查 iwlwifi.ko 是否存在:3.如果未找到,可能是内核模块未正确生成。尝试安装 linux-modules-extra:4.再次检查 iwlwifi.ko 是否存在:5.确…...
蓝桥杯,利用 Vue.js 构建简易任务管理器
在日常开发中,我们经常需要处理各种任务和计划。一个简单且高效的任务管理器可以帮助我们更好地组织和安排时间。今天,我将向大家展示如何使用 Vue.js 构建一个简易的任务管理器。这个项目不仅能够帮助我们更好地理解 Vue.js 的基本语法和功能࿰…...
国际机构Gartner发布2025年网络安全趋势
转自:中国新闻网 中新网北京3月14日电 国际机构高德纳(Gartner)14日发布的消息称,网络安全和风险管理在2025年“面临挑战与机遇并存的局面”,“实现转型和提高弹性”对确保企业在快速变化的数字世界中,实现安全且可持续的创新至关…...
【设计模式】单件模式
七、单件模式 单件(Singleton) 模式也称单例模式/单态模式,是一种创建型模式,用于创建只能产生 一个对象实例 的类。该模式比较特殊,其实现代码中没有用到设计模式中经常提起的抽象概念,而是使用了一种比较特殊的语法结构&#x…...
Elasticsearch + Docker:实现容器化部署指南
Elasticsearch是一款强大的分布式搜索和分析引擎,广泛应用于日志分析、全文检索、实时数据分析等场景。而Docker作为一种轻量级的容器化技术,能够帮助开发者快速部署和管理应用。将Elasticsearch与Docker结合,不仅可以简化部署流程࿰…...
win32汇编环境,网络编程入门之十一
;win32汇编环境,网络编程入门之十一 ;在上一教程里,我们学习了如何读取大容量的网页内容,在这一教程里,我们学习一下如何在wininet或winhttp机制中提取网页中的超链接 ;>>>>>>>>>>>>>>>>>…...
穿越之程序员周树人的狂人日记Part3__人机共生纪元
穿越之程序员周树人的狂人日记Part3__人机共生纪元 代码知识点:协程、内存管理、版本控制 故事一【协程陷阱】择偶标准的多核运算 故事二【内存泄漏】中产幻觉的垃圾回收 故事三【版本控制】人设仓库的强制推送 故事四【容器化生存】:员工生存之现状 静夜…...
后端——AOP异步日志
需求分析 在SpringBoot系统中,一般会对访问系统的请求做日志记录的需求,确保系统的安全维护以及查看接口的调用情况,可以使用AOP对controller层的接口进行增强,作日志记录。日志保存在数据库当中,为了避免影响接口的响…...
【C#语言】深入理解C#多线程编程:从基础到高性能实践
文章目录 ⭐前言⭐一、多线程的本质价值🌟1、现代计算需求🌟2、C#线程演进史 ⭐二、线程实现方案对比🌟1、传统线程模型🌟2、现代任务模型(推荐)🌟3、异步编程范式 ⭐三、线程安全深度解析&…...
第十四章:模板实例化_《C++ Templates》notes
模板实例化 核心知识点解析多选题设计题关键点总结 核心知识点解析 两阶段查找(Two-Phase Lookup) 原理: 模板在编译时分两个阶段处理: 第一阶段(定义时):检查模板语法和非依赖名称࿰…...
循环查询指定服务器开放端口(Python)
循环查询指定服务器开放端口列表 # Time : 2025/3/22 # Author : cookie # Desc :import socket import concurrent.futures from datetime import datetime# 设置目标IP和端口范围 target_ip input("请输入目标IP地址: ") start_port int(input("请输入…...
算法 | 蜣螂优化算法原理,引言,公式,算法改进综述,应用场景及matlab完整代码
蜣螂优化算法(Dung Beetle Optimizer, DBO)详解 1. 算法原理 蜣螂优化算法(DBO)是一种基于自然界蜣螂行为的元启发式优化算法,灵感来源于蜣螂的滚球、繁殖、觅食和偷窃行为。其核心思想是通过模拟蜣螂在复杂环境中的协作与竞争机制,解决全局优化问题。关键行为模拟: 滚球…...
排序复习_代码纯享
头文件 #pragma once #include<iostream> #include<vector> #include<utility> using std::vector; using std::cout; using std::cin; using std::endl; using std::swap;//插入排序 //1、直接插入排序(稳定) void InsertSort(vecto…...
【STM32】第一个工程的创建
目录 1、获取 KEIL5 安装包2、开始安装 KEIL52.1、 激活2.2、安装DFP库 3、工程创建4、搭建框架5、开始编写代码 1、获取 KEIL5 安装包 要想获得 KEIL5 的安装包,在百度里面搜索“KEIL5 下载”即可找到很多网友提供的下载文件,或者到 KEIL 的官网下载&a…...
SpringBoot+策略模式+枚举类,优雅消除if-else
需求分析 公司做物联网系统的,使用nettry进行设备连接,对设备进行数据采集,根据设备的协议对数据进行解析,解析完成之后存放数据库,但是不同厂家的设备协议不同。公司系统使用了使用了函数式编程的去写了一个解析类&am…...
前端框架学习路径与注意事项
学习前端框架是一个系统化的过程,需要结合理论、实践和工具链的综合掌握。以下是学习路径的关键方面和注意事项: 一、学习路径的核心方面 1. 基础概念与核心思想 组件化开发:理解组件的作用(复用性、隔离性)、组件通信…...
