深度学习篇---PaddleDetectionPaddleOCR

news2025/3/27 10:41:16

文章目录

  • 前言
  • 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 None

    def _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 text
        return ''

    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.coloradmin.cn/o/2321486.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ant Design Vue Select 选择器 全选 功能

Vue.js的组件库Ant Design Vue Select 选择器没有全选功能&#xff0c;如下图所示&#xff1a; 在项目中&#xff0c;我们自己实现了全选和清空功能&#xff0c;如下所示&#xff1a; 代码如下所示&#xff1a; <!--* 参数配置 - 风力发电 - 曲线图 * 猴王软件学院 - 大强 …

系统与网络安全------网络应用基础(1)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 TCP/IP协议及配置 概述 TCP/IP协议族 计算机之间进行通信时必须共同遵循的一种通信规定 最广泛使用的通信协议的集合 包括大量Internet应用中的标准协议 支持跨网络架构、跨操作系统平台的数据通信 主机…

JDK 24 发布,新特性解读!

一、版本演进与技术格局新动向 北京时间3月20日&#xff0c;Oracle正式发布Java SE 24。作为继Java 21之后的第三个非LTS版本&#xff0c;其技术革新力度远超预期——共集成24项JEP提案&#xff0c;相当于Java 22&#xff08;12项&#xff09;与Java 23&#xff08;12项&#…

k8s中service概述(二)NodePort

NodePort 是 Kubernetes 中一种用于对外暴露服务的 Service 类型。它通过在集群的每个节点上开放一个静态端口&#xff08;NodePort&#xff09;&#xff0c;使得外部用户可以通过节点的 IP 地址和该端口访问集群内部的服务。以下是关于 NodePort Service 的详细说明&#xff1…

Oracle归档配置及检查

配置归档位置到 USE_DB_RECOVERY_FILE_DEST&#xff0c;并设置存储大小 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…

刷机维修进阶教程-----adb禁用错了系统app导致无法开机 如何保数据无损恢复机型

在刷机维修过程中 。我们会遇到一些由于客户使用adb指令来禁用手机app而导致手机无法开机进入系统的故障机型。通常此类问题机型有好几种解决方法。但如果客户需要保数据来恢复机型。其实操作也是很简单的.还有类似误删除应用导致不开机等等如何保数据。 通过博文了解💝💝�…

Vue3 实战:基于 mxGraph 与 WebSocket 的动态流程图构建

本文将详细介绍如何在 Vue3 项目中集成 mxGraph 可视化库&#xff0c;并通过 WebSocket 实现画布元素的实时更新。适合有 Vue 基础的前端开发者学习参考。 一、技术栈准备 Vue3&#xff1a;采用 Composition API 开发mxGraph&#xff1a;JavaScript 流程图库&#xff08;版本 …

Ubuntu AX200 iwlwifi-cc-46.3cfab8da.0.tgz无法下载的解决办法

文章目录 前言一、检查网卡是否被识别二、确认内核模块是否可用1.AX200 wifi 要求内核5.12.检查 iwlwifi.ko 是否存在&#xff1a;3.如果未找到&#xff0c;可能是内核模块未正确生成。尝试安装 linux-modules-extra&#xff1a;4.再次检查 iwlwifi.ko 是否存在&#xff1a;5.确…

蓝桥杯,利用 Vue.js 构建简易任务管理器

在日常开发中&#xff0c;我们经常需要处理各种任务和计划。一个简单且高效的任务管理器可以帮助我们更好地组织和安排时间。今天&#xff0c;我将向大家展示如何使用 Vue.js 构建一个简易的任务管理器。这个项目不仅能够帮助我们更好地理解 Vue.js 的基本语法和功能&#xff0…

Elasticsearch + Docker:实现容器化部署指南

Elasticsearch是一款强大的分布式搜索和分析引擎&#xff0c;广泛应用于日志分析、全文检索、实时数据分析等场景。而Docker作为一种轻量级的容器化技术&#xff0c;能够帮助开发者快速部署和管理应用。将Elasticsearch与Docker结合&#xff0c;不仅可以简化部署流程&#xff0…

win32汇编环境,网络编程入门之十一

;win32汇编环境,网络编程入门之十一 ;在上一教程里&#xff0c;我们学习了如何读取大容量的网页内容&#xff0c;在这一教程里&#xff0c;我们学习一下如何在wininet或winhttp机制中提取网页中的超链接 ;>>>>>>>>>>>>>>>>>…

穿越之程序员周树人的狂人日记Part3__人机共生纪元

穿越之程序员周树人的狂人日记Part3__人机共生纪元 代码知识点&#xff1a;协程、内存管理、版本控制 故事一【协程陷阱】择偶标准的多核运算 故事二【内存泄漏】中产幻觉的垃圾回收 故事三【版本控制】人设仓库的强制推送 故事四【容器化生存】&#xff1a;员工生存之现状 静夜…

后端——AOP异步日志

需求分析 在SpringBoot系统中&#xff0c;一般会对访问系统的请求做日志记录的需求&#xff0c;确保系统的安全维护以及查看接口的调用情况&#xff0c;可以使用AOP对controller层的接口进行增强&#xff0c;作日志记录。日志保存在数据库当中&#xff0c;为了避免影响接口的响…

循环查询指定服务器开放端口(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("请输入…

【STM32】第一个工程的创建

目录 1、获取 KEIL5 安装包2、开始安装 KEIL52.1、 激活2.2、安装DFP库 3、工程创建4、搭建框架5、开始编写代码 1、获取 KEIL5 安装包 要想获得 KEIL5 的安装包&#xff0c;在百度里面搜索“KEIL5 下载”即可找到很多网友提供的下载文件&#xff0c;或者到 KEIL 的官网下载&a…

SpringBoot+策略模式+枚举类,优雅消除if-else

需求分析 公司做物联网系统的&#xff0c;使用nettry进行设备连接&#xff0c;对设备进行数据采集&#xff0c;根据设备的协议对数据进行解析&#xff0c;解析完成之后存放数据库&#xff0c;但是不同厂家的设备协议不同。公司系统使用了使用了函数式编程的去写了一个解析类&am…

前端框架学习路径与注意事项

学习前端框架是一个系统化的过程&#xff0c;需要结合理论、实践和工具链的综合掌握。以下是学习路径的关键方面和注意事项&#xff1a; 一、学习路径的核心方面 1. 基础概念与核心思想 组件化开发&#xff1a;理解组件的作用&#xff08;复用性、隔离性&#xff09;、组件通信…

Linux驱动开发-①platform平台②MISC字符驱动框架③input框架

Linux驱动开发-①platform平台②MISC字符驱动框架③input框架 一&#xff0c;platform1.1 platform框架&#xff08;设备树下&#xff09;1.2 platform框架&#xff08;配置设备函数&#xff09; 二&#xff0c;MISC字符驱动框架三&#xff0c;input框架 一&#xff0c;platfor…

【mysql】唯一性约束unique

文章目录 唯一性约束 1. 作用2. 关键字3. 特点4. 添加唯一约束5. 关于复合唯一约束 唯一性约束 1. 作用 用来限制某个字段/某列的值不能重复。 2. 关键字 UNIQUE3. 特点 同一个表可以有多个唯一约束。唯一约束可以是某一个列的值唯一&#xff0c;也可以多个列组合的值唯…

常见中间件漏洞:Jboss篇

CVE-2015-7501 环境搭建 cd vulhub-master/jboss/JMXInvokerServlet-deserialization docker-compose up -d 过程 访问网址&#xff0c;存在页面说明接口存在且存在反序列化漏洞 http://8.130.17.222:8080/invoker/JMXInvokerServlet 2.下载 ysoserial ⼯具进⾏漏洞利⽤…