车牌识别之三:检测+识别的onnx部署(免费下载高精度onnx模型)

news2024/12/19 11:20:27

依赖

paddle2onnx==1.3.1
onnxruntime-gpu==1.14.0
ultralytics==8.3.38

背景

在车牌识别之一:车牌检测(包含全部免费的数据集、源码和模型下载)我们得到了车牌检测模型;
在车牌识别之二:车牌OCR识别(包含全部免费的数据集、源码和模型下载)我们得到了车牌识别模型;
本节中,我们将检测和识别整合起来,并主要使用onnx格式进行推理, windows或没有GPU同样适用

项目地址(含模型)

戳这里获取

PlateRecognition
├── 22_16_5_0_25_24_25.jpg
├── license_models
│   ├── dict.txt
│   ├── license_ocr.onnx
│   ├── y11n-pose_plate_best.onnx
│   └── y11n-pose_plate_best.pt
├── ocr_rec.py
├── plate.jpg
├── plate_rec.py
├── README.md
├── requirements.txt
├── result.jpg
└── test_plate
    ├── 402d522edcc44c51bd29d4c21588cf9d.jpeg
    ├── ec4a268fc_r.jpg
    ├── hcqccip6335913.jpg
    ├── nimg.ws.126.jpeg
    ├── u=1570203173,1434495175&fm=253&fmt=auto&app=138&f=JPEG.webp
    ├── u=2912148279,95351854&fm=253&fmt=auto&app=138&f=JPEG.webp
    ├── u=3989120446,3136378086&fm=253&fmt=auto&app=138&f=JPEG.webp
    └── u=4235953944,2077995208&fm=253&fmt=auto&app=138&f=JPEG.webp

导出检测onnx

yolo export model=runs/pose/train/weights/y11n-pose_plate_best.pt format=onnx

如果支持tensorrt,也可以导出TensorRT格式

yolo export model=runs/pose/train/weights/y11n-pose_plate_best.pt format=TensorRT

导出后,生成y11n-pose_plate_best.onnxy11n-pose_plate_best.engine

导出OCR识别onnx

python tools/export_model.py -c configs/rec/PP-OCRv3/ch_PP-OCRv3_rec_liecece.yml -o Global.pretrained_model=output/rec_ppocr_licence_v3/best_model/model Global.save_inference_dir=output/rec_ppocr_licence_v3/best_model/
paddle2onnx --model_dir output/rec_ppocr_licence_v3/best_model/ --model_filename inference.pdmodel --params_filename inference.pdiparams --save_file ./license_ocr.onnx --opset_version 11 --enable_onnx_checker True

识别测试

测试图片:

python ./plate_rec.py --image_path ./test_plate/hcqccip6335913.jpg

在这里插入图片描述
测试速度:

python ./plate_rec.py --speed_test True
avgtime cost: 8.244389284320489ms [{'text': '粤A63N9S', 'score_text': 0.9457973837852478, 'bbox': [248, 509, 440, 598], 'score_bbox': 0.8173038959503174}]
avgtime cost: 8.244389296076081ms [{'text': '苏A6PQ33', 'score_text': 0.999988853931427, 'bbox': [786, 1026, 1213, 1197], 'score_bbox': 0.8369629383087158}]
avgtime cost: 8.244372001034755ms [{'text': '苏D2B222', 'score_text': 0.9999993443489075, 'bbox': [245, 235, 437, 345], 'score_bbox': 0.8726518154144287}]

单张推理时间仅8ms, 本人的测试环境是ubuntu, RTX 4090 如果使用tensorrt和tritonserver, 应该还有提速空间。

测试源码

import numpy as np
import cv2
from ocr_rec import TextRecognizer, init_args
from PIL import Image, ImageDraw, ImageFont
from ultralytics import YOLO
import warnings
warnings.filterwarnings("ignore")
class PlateRecognizer:
    def __init__(self, det_model_path="license_models/y11n-pose_plate_best.onnx"):
        self.model_det = YOLO(det_model_path)
        parser = init_args().parse_args()
        self.model_ocr = TextRecognizer(parser)
    def recognize(self, img):
        plate_objs=[]
        # detect plates
        plates = self.model_det(img, verbose=False)
        for plate, conf in zip(plates[0].boxes.xyxy, plates[0].boxes.conf):
            x1, y1, x2, y2 = plate.cpu()
            x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2)
            plate_img = img[y1:y2, x1:x2]
            # recognize text
            try:
                rec_res, _ = self.model_ocr([plate_img])
            except Exception as E:
                print(E)
                exit()
            if len(rec_res[0])>0:
                obj = {}
                obj['text'] = rec_res[0][0]
                obj['score_text'] = rec_res[0][1]
                obj['bbox'] = [x1, y1, x2, y2]
                obj['score_bbox'] = conf.cpu().numpy().item()
                plate_objs.append(obj)
        return plate_objs
      

def DrawPlateNum(img, palte_num, x1, y1):
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    img_pil = Image.fromarray(img_rgb)
    draw = ImageDraw.Draw(img_pil)
    font = ImageFont.truetype("simsun.ttc", 40)
    draw.text((x1, y1), palte_num, font=font, fill=(255, 255, 0))
    img_bgr = cv2.cvtColor(np.array(img_pil), cv2.COLOR_RGB2BGR)
    return img_bgr

def demo():
    parser = init_args().parse_args()
    img = cv2.imread(parser.image_path)
    if img is None:
        print("Error: no image found")
        return
    plate_rec = PlateRecognizer()
    plate_objs = plate_rec.recognize(img)
    print(plate_objs)
    for bbox in plate_objs:
        x1, y1, x2, y2 = bbox['bbox']
        cv2.rectangle(img, (x1, y1), (x2, y2), (255, 0, 0), 2)
        img = DrawPlateNum(img, bbox['text'], x1, y1)
    # cv2.imshow("result", img)
    # cv2.waitKey(0)
    cv2.imwrite("result.jpg", img)

# 计算平均识别时间
def test_ocr_speed():
    plate_rec = PlateRecognizer()
    imgs = [cv2.imread("test_plate/ec4a268fc_r.jpg"),
     cv2.imread("test_plate/hcqccip6335913.jpg"),
     cv2.imread("test_plate/u=1570203173,1434495175&fm=253&fmt=auto&app=138&f=JPEG.webp"),
     ]
    #warm up
    plate_objs = plate_rec.recognize(imgs[0])
    time_start = cv2.getTickCount()
    cal_count = 0
    while True:
        plate_objs = plate_rec.recognize(imgs[cal_count%len(imgs)])
        cal_count += 1
        time_pause = cv2.getTickCount()
        time_cost = (time_pause - time_start)*1000 / cv2.getTickFrequency()
        print(f"avgtime cost: {time_cost/(cal_count)}ms {plate_objs}")
        

if __name__ == "__main__":
    parser = init_args().parse_args()
    if parser.speed_test:
        test_ocr_speed()
    else:        
        demo()    

关联

车牌识别之一:车牌检测(包含全部免费的数据集、源码和模型下载)
车牌识别之二:车牌OCR识别(包含全部免费的数据集、源码和模型下载)

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

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

相关文章

WPF ControlTemplate 控件模板

区别于 DataTemplate 数据模板,ControlTemplate 是控件模板,是为自定义控件的 Template 属性服务的,Template 属性类型就是 ControlTemplate。 演示, 自定义一个控件 MyControl,包含一个字符串类型的依赖属性。 pub…

在IDE中使用Git

我们在开发的时候肯定是经常使用IDE进行开发的,所以在IDE中使用Git也是非常常用的,接下来以IDEA为例,其他的VS code ,Pycharm等IDE都是一样的。 在IDEA中配置Git 1.打开IDEA 2.点击setting 3.直接搜索git 如果已经安装了会自…

Excel中如何消除“长短款”

函数微调可以可以实施,简单且易于操作的气球🎈涨缩更妙。 (笔记模板由python脚本于2024年12月17日 06:19:13创建,本篇笔记适合用Excel操作数据的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Fre…

微命令 微指令 微程序 微操作

微命令是计算机控制部件通过控制线向执行部件发出的各种控制命令,它是构成控制序列的最小单位 微命令与微操作是一一对应的关系,微命令是微操作的控制信号,而微操作是微命令的执行过程。在机器的一个CPU周期中,一组实现一定操作功…

Spring 不推荐使用@Autowired

Spring 不推荐使用Autowired 原因:为什么 Spring和IDEA 都不推荐使用 Autowired 注解_autowired为什么不推荐-CSDN博客 解决方法: 使用Resource注解。 使用构造函数注入。缺点显而易见,当成员变量很多时,构造函数代码冗长&#…

6、AI测试辅助-测试报告编写(生成Bug分析柱状图)

AI测试辅助-测试报告编写(生成Bug分析柱状图) 一、测试报告1. 创建测试报告2. 报告补充优化2.1 Bug图表分析 3. 风险评估 总结 一、测试报告 测试报告内容应该包含: 1、测试结论 2、测试执行情况 3、测试bug结果分析 4、风险评估 5、改进措施…

使用re模块

一、常量 常量说明 re.M re.MULTLINE 多行模式 re.S re.DOTALL 单行模式 re.I re.IGNORECASE 忽略大小写 re.X re.VERBOSE 忽略表达式的空白字符 可以使用|开启多个选项 二、方法 2.1 编译 compile re.compile(pattern,[,falgs]) pattern是正则表达式的字符串 设定falgs&…

自动驾驶控制与规划——Project 2: 车辆横向控制

目录 零、任务介绍一、环境配置二、算法三、代码实现四、效果展示 零、任务介绍 补全src/ros-bridge/carla_shenlan_projects/carla_shenlan_stanley_pid_controller/src/stanley_controller.cpp中的TODO部分。 一、环境配置 上一次作业中没有配置docker使用gpu,…

FFmpeg库之ffmpeg

文章目录 ffmpeg命令行使用基本命令选择流 -map选项 主要命令视频选项音频选项多媒体格式转换滤镜裁剪加水印画中画 录制查看可用的录制设备查看录制设备选项参数录制桌面录制窗口录制摄像头录制麦克风录制系统声音同时录制桌面和麦克风 直播推流拉流 ffmpeg命令行使用 ffmpeg…

模型 信任公式(麦肯锡)

系列文章 分享 模型,了解更多👉 模型_思维模型目录。信任的量化:可信度、可靠性、亲密度、自私度。 1 信任公式(麦肯锡)的应用 1.1 私域用户信任建立(麦肯锡信任公式的应用) 在私域营销领域,与用户建立牢固的信任关系对于提升用…

低延迟!实时处理!中软高科AI边缘服务器,解决边缘计算多样化需求!

根据相关统计,随着物联网的发展和5G技术的普及,到2025年,全球物联网设备连接数将达到1000亿,海量的计算数据使得传输到云端再处理的云计算方式显得更捉襟见肘。拥有低延迟、实时处理、可扩展性和更高安全性的边缘计算应运而生&…

【计算机网络2】计算机网络的性能能指标

目录 一 、计算机网络的性能指标 二、具体介绍 1、速 率 2、带 宽 3、吞 吐 量 4、时 延 5、时延带宽积 6、往 返 时 延 7、信道利用率 一 、计算机网络的性能指标 计算机网络的性能指标就是从不同方面度量计算机网络的性能,有如下7个指标: 速…

密码学——密码学概述、分类、加密技术(山东省大数据职称考试)

大数据分析应用-初级 第一部分 基础知识 一、大数据法律法规、政策文件、相关标准 二、计算机基础知识 三、信息化基础知识 四、密码学 五、大数据安全 六、数据库系统 七、数据仓库. 第二部分 专业知识 一、大数据技术与应用 二、大数据分析模型 三、数据科学 密码学 大数据…

网络攻击与防范

目录 选填 第一章 1、三种网络模式 2、几种创建网络拓扑结构 NAT模式 VPN模式 软路由模式1 软路由模式2 3、Linux网络配置常用指令 4、常见网络服务配置 DHCP DNS Web服务与FTP服务 FTP用户隔离 第二章 DNS信息收集(dnsenum、dnsmap) 路…

网络攻与防

1、两个专网连接 (1)、两个网卡VMNET2/3---配置IP子网、仅主机模式--除去DHCP设置 路由和两台主机分别ping通 (2)、路由配置:两个专网之间连接--否拨号连接 两台主机可相互ping通---成功 如果ping不通,…

react Ant Design

一、通过项目模版创建一个react项目 set NPM_CONFIG_REGISTRYhttps://registry.npmmirror.com pnpm create vite antd-demo cd antd-demo pnpm install pnpm install antd --save 打开项目: 修改:welcome.tsx import React from react; import { Butto…

【排序算法】——选择排序

前言 排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列。所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小&#x…

【排序算法】——交换排序

前言 排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列。所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小&#x…

硬件工程师面试题 11-20

把常见的硬件面试题进行总结,方便及时巩固复习。其中包括网络上的资源、大佬们的大厂面试题,其中可能会题目类似,加强印象即可。 11、示波器需要关注哪些参数? 1,示波器带宽 带宽是示波器最重要的指标之一。 模拟示波器…

【Yolov8足球追踪】YOLO格式足球检测数据集制作及目标追踪

可以只是已经制作好的数据集,也可以进行制作: 数据集制作:1,2,3步 数据集下载: https://pan.baidu.com/s/1upT_aD06lzjuz-Xjze0dcw 提取码: 6eax windows下分卷解压文件:https://blog.csdn.net/…