【智慧交通项目实战】 《 OCR车牌检测与识别》(五):模型部署与优化

news2024/11/23 15:39:54

在这里插入图片描述

👨‍💻作者简介: CSDN、阿里云人工智能领域博客专家,新星计划计算机视觉导师,百度飞桨PPDE,专注大数据与AI知识分享。✨公众号:GoAI的学习小屋 ,免费分享书籍、简历、导图等,更有交流群分享宝藏资料,关注公众号回复“加群”或➡️点击链接 加群。
🎉专栏推荐: 点击访问➡️ 《计算机视觉》 总结目标检测、图像分类、分割OCR、等方向资料。 点击访问➡️ 《深入浅出OCR》: 对标全网最全OCR教程,含理论与实战总结。以上专栏内容丰富、价格便宜且长期更新,欢迎订阅,可加入上述交流群长期学习。
🎉学习者福利: 强烈推荐优秀AI学习网站,包括机器学习、深度学习等理论与实战教程,非常适合AI学习者。➡️网站链接

在这里插入图片描述

💚 专栏地址:深入浅出OCR
🍀 专栏导读:恭喜你发现宝藏!本专栏系列主要介绍计算机视觉OCR文字识别领域,每章将分别从OCR技术发展、方向、概念、算法、论文、数据集、对现有平台及未来发展方向等各种角度展开详细介绍,综合基础与实战知识。以下是本系列目录,分为前置篇、基础篇与进阶篇,进阶篇在基础篇基础上进行全面总结,会针对最经典论文及最新算法展开讲解,内容目前包括不限于文字检测、识别、表格分析等方向。 未来看情况更新NLP方向知识,本专栏目前主要面向深度学习及CV同学学习,希望大家能够多多交流,欢迎订阅本专栏,如有错误请大家评论区指正,如有侵权联系删除。


【智慧交通项目实战】 OCR车牌检测与识别项目实战(五):模型部署与加速

💚导读:本项目为新系列 【智慧交通项目实战】《OCR车牌检测和识别》(五)–模型部署与优化》为该系列最后一篇,着重介绍车牌识别系统的模型部署与优化,后续其他系列文章将继续更新相关实战项目。

在这里插入图片描述

智慧交通预测系统(PaddleOCR版本)

参考:https://blog.csdn.net/qq_36816848/article/details/128686227

OCR车牌检测+识别

本系列项目目录如下, 代码暂未公开,需要代码和指导可加群联系。

【智慧交通项目实战】《 OCR车牌检测与识别》(一)项目介绍
【智慧交通项目实战】 《 OCR车牌检测与识别》(二):基于YOLO的车牌检测
【智慧交通项目实战】 《 OCR车牌检测与识别》(三):基于CRNN改进版的车牌识别
【智慧交通项目实战】 《 OCR车牌检测与识别》(四):车牌检测与识别可视化
【智慧交通项目实战】《 OCR车牌检测与识别》 (五):模型部署与优化(本篇)

在这里插入图片描述

车辆检测

后续更新,且将持续更新其他实战项目系列!
img


一、项目背景:

车牌识别技术是智能交通的重要环节,目前已广泛应用于例如停车场、收费站等等交通设施中,提供高效便捷的车辆认证的服务,其中较为典型的应用场景为卡口系统。车牌识别即识别车牌上的文字信息,属于光学字符识别(OCR)的一项子任务。
请添加图片描述

二、车牌识别模型量化与加速

(1)模型部署

1.ONNX

ONNX(Open Neural Network Exchange),开放神经网络交换,是一种模型IR,用于在各种深度学习训练和推理框架转换的一个中间表示格式。在实际业务中,可以使用Pytorch或者TensorFlow训练模型,导出成ONNX格式,然后在转换成目标设备上支撑的模型格式,比如TensorRT Engine、NCNN、MNN等格式。ONNX定义了一组和环境,平台均无关的标准格式,来增强各种AI模型的可交互性,开放性较强。

在这里插入图片描述
导图参考:https://zhuanlan.zhihu.com/p/425232454

ONNX介绍

2.OpenVINO

OpenVINO是英特尔推出的一款全面的工具套件(2023.0版本已经发布),用于快速部署应用和解决方案,支持计算机视觉的CNN网络结构超过200余种。OpenVINO是一个Pipeline工具集,同时可以兼容各种开源框架训练好的模型,拥有算法模型上线部署的各种能力,掌握该工具可以轻松的将预训练模型在Intel的CPU上快速部署起来。

https://img-bss.csdnimg.cn/202103311747047950.pdf

本项目支持 检测模型导出onnx,需要安装onnx-sim onnx-simplifier

  1. python export.py --weights ./weights/plate_detect.pt --img 640 --batch 1
  2. onnxsim weights/plate_detect.onnx weights/plate_detect.onnx

训练好的模型进行检测

python detect_demo.py  --detect_model weights/plate_detect.pt

本项目使用ONNX推理如下:

onnx demo

python onnx_infer.py --detect_model weights/plate_detect.onnx  --rec_model weights/plate_rec.onnx  --image_path imgs --output result_onnx

本项目使用openvino推理如下:

openvino demo

 python openvino_infer.py --detect_model weights/plate_detect.onnx --rec_model weights/plate_rec.onnx --image_path imgs --output result_openvino

推荐学习:使用 OpenVINO™ 运行 YOLOv5 推理

(2)模型加速

1. 模型优化加速方法

模型优化加速能够提升网络的计算效率,具体包括:

(1)Op-level的快速算法:FFT Conv2d (7x7, 9x9), Winograd Conv2d (3x3, 5x5) 等;
(2)Layer-level的快速算法:Sparse-block net [1] 等;
(3)优化工具与库:TensorRT (Nvidia), Tensor Comprehension (Facebook) 和 Distiller (Intel) 等;

2. TensorRT加速原理

​ 在计算资源并不丰富的嵌入式设备上,TensorRT之所以能加速神经网络的的推断主要得益于两点:

  • 首先是TensorRT支持int8和fp16的计算,通过在减少计算量和保持精度之间达到一个理想的trade-off,达到加速推断的目的。

  • 更为重要的是TensorRT对于网络结构进行了重构和优化,主要体现在一下几个方面。

    (1) TensorRT通过解析网络模型将网络中无用的输出层消除以减小计算。

    (2) 对于网络结构的垂直整合,即将目前主流神经网络的Conv、BN、Relu三个层融合为了一个层,例如将图1所示的常见的Inception结构重构为图2所示的网络结构。

    (3) 对于网络结构的水平组合,水平组合是指将输入为相同张量和执行相同操作的层融合一起,例如图2向图3的转化。

3.本项目加速整体流程

(1)Pytorch->TensorRT

python export.py --weights "torch权重路径" --onnx2trt  --fp16_trt 

(2).TensorRT推理

python torch2trt/main.py --trt_path "trt权重路径"

图像预处理 -> TensorRT推理 -> 可视化结果

def ONNX_to_TRT(onnx_model_path=None,trt_engine_path=None,fp16_mode=False):
    """
    仅适用TensorRT V8版本
    生成cudaEngine,并保存引擎文件(仅支持固定输入尺度)  
    
    fp16_mode: True则fp16预测
    onnx_model_path: 将加载的onnx权重路径
    trt_engine_path: trt引擎文件保存路径
    """
    builder = trt.Builder(TRT_LOGGER)
    network = builder.create_network(EXPLICIT_BATCH)
    parser = trt.OnnxParser(network, TRT_LOGGER)
    
    config = builder.create_builder_config()
    config.max_workspace_size=GiB(1) 
    if fp16_mode:
        config.set_flag(trt.BuilderFlag.FP16) 
    with open(onnx_model_path, 'rb') as model:
        assert parser.parse(model.read())
        serialized_engine=builder.build_serialized_network(network, config)

   
    with open(trt_engine_path, 'wb') as f:
        f.write(serialized_engine)  # 序列化

    print('TensorRT file in ' + trt_engine_path)
    print('============ONNX->TensorRT SUCCESS============')

耗时对比

Pytorch(ms)TensorRT_FP16(ms)
yolov5n-0.57.72.1
yolov5n-face7.72.4
yolov5s-face5.62.2
yolov5m-face9.93.3
yolov5l-face15.94.5
python torch2trt/speed.py --torch_path "torch权重路径" --trt_path "trt权重路径"

车牌识别模型最终识别效果:
在这里插入图片描述

三、可视化界面识别效果:

在这里插入图片描述

四、项目总结:

《智慧交通项目实战《OCR车牌检测和识别》(五)–模型部署与优化》为该系列最后一篇,着重介绍车牌识别系统的模型部署与优化,后续其他系列文章将继续更新相关实战项目。

文章参考 :

1.基于Paddle的智慧交通预测系统
2.Pyqt介绍

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

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

相关文章

用python合并execl做统计分析

背景: 我们有项目问题记录的表格,每一个项目都会反馈来一个execl表格,表格的格式都是统一的,我需要定期把这些项目上反馈来的表格进行统计,但是表格非常多,我要每个都统计出来在来相加,这样操作…

Mysql 数据库开发及企业级应用

文章目录 1、Mysql 数据库开发及企业级应用1.1、为什么要使用数据库1.1.1、数据库概念(Database)1.1.2、为什么需要数据库 1.2、程序员为什么要学习数据库1.3、数据库的选择1.3.1、主流数据库简介1.3.2、使用 MySQL 的优势1.3.3、版本选择 1.4、Windows …

C语言,通过多文件编辑定义字符指针,指向堆区空间,计算字符串长度

通过多文件编辑,定义字符指针,分别指向堆区空间,计算字符串长度 要求: 1、定义函数实现堆区空间申请 2、在主函数中实现输入字符串 3、定义函数实现字符串长度 函数原型:size_t my_strlen(const char *s) 4、定义函数释…

vue 下拉框显示从后端请求的数据

下拉框<!-- 给产品添加推广人员弹出框 --><el-dialog :title"titlePerson" :visible.sync"openAddPerson" width"1000px" append-to-body><el-select v-model"this.bindingProductPerson.recommendId" filterable plac…

分层解耦-IOCDI-IOC详解

目录 Bean的声明 注意 声明bean的时候&#xff0c;可以通过value属性指定bean的名字&#xff0c;如果没有指定&#xff0c;默认为类名首字母小写 使用以上四个注解都可以声明bean&#xff0c;但在SpringBoot集成Web开发中&#xff0c;声明控制器bean只能使用Controller或者R…

springboot时间管理系统

通过前面的功能分析可以将时间管理系统的功能分为管理员&#xff0c;用户两个部门&#xff0c;系统的主要功能包括首页&#xff0c;个人中心&#xff0c;系统公告管理&#xff0c;用户管理&#xff0c;时间分类管理&#xff0c;事件数据管理&#xff0c;目标数据管理&#xff0…

MySQL数据库第七课————数据的增删改查----------简单操作

作者前言 欢迎小可爱们前来借鉴我的gtiee秦老大大 (qin-laoda) - Gitee.com —————————————————————————————— 目录 SQL增删改查 新增数据 删除数据 修改&#xff08;更新&#xff09;数据 查询数据 条件 ————————————————…

java ajax

1.ajax定义:异步刷新技术 2.ajax语法 3.ajax实战 在不需要点击刷新按钮时达到局部刷新显示&#xff0c;如下图所示 步骤一&#xff1a;创建工程/包/js 步骤二&#xff1a;数据库/表创建 步骤三&#xff1a;实体类 步骤四&#xff1a;UserDao package cn.kgc.dao;import cn…

linux_driver_day10

作业1 题目&#xff1a; 使用驱动代码实现如下要求 应用程序通过阻塞的io模型来读取number变量的值 number是内核驱动中的一个变量 number的值随着按键按下而改变&#xff08;按键中断&#xff09; 例如 numbero 按下按键 number1&#xff0c;再次按下按键 number0 在按下按…

pdf文件怎么删除密码?4个方法实用简单!

PDF文件作为一种常见的电子文档格式&#xff0c;广泛应用于各行各业。有时候&#xff0c;我们可能会遇到需要删除PDF文件密码的情况&#xff0c;无论是因为忘记密码、接收到加密的文件或是需要与他人共享文件等。为了帮助你轻松解决这一问题&#xff0c;本文将介绍四种简单实用…

【GitHub】腾讯这一款设计神器,开源了!PAG 动效组件

作为一个资深的互联网用户&#xff0c;我们经常会在各种产品上看到十分酷炫的动画效果。比如&#xff0c;短视频中有趣的虚拟场景、直播间粉丝打榜的 “火箭”、“轮船” 等等。 如今&#xff0c;优质的动效不仅可以使用户更容易地理解产品功能和操作方式&#xff0c;减少用户…

简单分享怎么做卖货小程序

微信卖货小程序是一种基于微信平台开发的小程序应用&#xff0c;它可以帮助用户在小程序中完成商品展示、下单购买、在线支付等操作。下面我们来介绍微信卖货小程序的好处和优点。 一、便捷快速 微信卖货小程序可以直接在微信App中使用&#xff0c;无需下载和安装&#xff0c;…

docker-compose安装gitlab

docker安装gitlab 1、创建docker-compose.yml文件 version: 3 services:gitlab:image: twang2218/gitlab-ce-zh:11.1.4restart: unless-stoppedhostname: gitlab.example.comenvironment:TZ: Asia/ShanghaiGITLAB_OMNIBUS_CONFIG: |external_url http://gitlab.example.comgi…

基于STM32LVGL8.2保姆级教程①软件资料准备

下载LVGL源码 LVGL资料包下载点击直达 点击master -》选择8.2分支,也就是倒数第二个 准备开发环境 这个软件玩STM32的有好吧 准备代码模板 需要准备一份能够成功点亮屏幕的keil工程 既然是保姆级教程 So我免费分享出来 私信或评论区获取 此屏幕驱动 就是图片里面的那块屏幕 具…

【安装】windows环境下的 JDK官网下载 安装配置 环境变量

目录 官网下载JDK8windows安装JDKJava环境配置JDK、JRE、JVMJava环境配置1.JAVA_HOME2.PATH3.CLASSPATH 测试环境变量运行命令行cmd查看jdk是否安装 官网下载JDK8 Oracle 甲骨文中国 | 云应用和云平台 选择产品/Java 下载JDK8 点击下载Java 选择Java archive 选择x64位安装包 …

读笛卡尔《方法论》有感

1.新书到手 今天又到手一本新书《谈谈方法》&#xff08;又称《方法论》&#xff09;&#xff0c;此书的作者是笛卡尔&#xff0c;本书介绍了笛卡尔是如何运用自己的理性在各门学科里寻求真理的方法。 勒内笛卡尔&#xff08;1596年3月31日-1650年2月11日&#xff09;&#xf…

MySQL每日一练:单表查询、连接查询

目录 1、创建两张表 student表&#xff1a; score表 &#xff1a; 2.为student表和score表增加记录 student表&#xff1a; score表&#xff1a; 3、按条件查找 1、创建两张表 student表&#xff1a; CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY…

dubbo核心知识

1、简介 Apache Dubbo (incubating) |ˈdʌbəʊ|是一款高性能、轻量级的开源Java RPC框架&#xff0c;它提供了三大核心能力&#xff1a;面向接口的远程方法调用&#xff0c;智能容错和负载均衡&#xff0c;以及服务自动注册和发现。 官网&#xff1a;http://dubbo.apache.or…

【导航驾驶引导(DG)模块功能】

什么是DG&#xff1f; 相信每个人都有迷路的经历&#xff0c;当你徘徊在十字路口时&#xff0c;你需要的可能是一张地图&#xff0c;当你在地图上找不到参照物的时候&#xff0c;你需要的是一个能告诉你正确道路的好心人&#xff0c;但对于一个Driver来说&#xff0c;在驾驶期间…

什么是超网,和子网有什么区别

将 IP 地址分组到子网和超网中是 IP 地址管理的一个基本方面。使网络管理员能够将其海量网络地址空间的不同 IP 组分解并聚合为可管理的实体&#xff0c;IP 子网划分和超网已成为有效网络地址空间管理的核心组件。 了解超网的细微差别以及超网和子网之间的主要区别对于设计和管…