TPU-NNTC 编译部署LPRNet 车牌识别算法
TPU-NNTC 编译部署LPRNet 车牌识别算法
注意: 由于SOPHGO SE5微服务器的CPU是基于ARM架构,以下步骤将在基于x86架构CPU的开发环境中完成
- 初始化开发环境(基于x86架构CPU的开发环境中完成)
- 模型转换 (基于x86架构CPU的开发环境中完成)
处理后的LPRNet 项目文件将被拷贝至 SE5微服务器 上进行推理测试
1. 开发环境配置
-
Linux 开发环境(x86架构CPU的开发环境)
-
一台安装了Ubuntu16.04/18.04/20.04的x86主机,运行内存建议12GB以上
-
下载SophonSDK开发包(v3.0.0)
-
1.1 配置步骤
- 解压SDK压缩包
sudo apt update
sudo apt install unzip
unzip sophonsdk_v3.0.0_<***>.zip
- docker 安装
# 安装docker
sudo apt-get install docker.io
# docker命令免root权限执行
# 创建docker用户组,若已有docker组会报错,没关系可忽略
sudo groupadd docker
# 将当前用户加入docker组
sudo gpasswd -a ${USER} docker
# 重启docker服务
sudo service docker restart
# 切换当前会话到新group或重新登录重启X会话
newgrp docker
提示:需要logout系统然后重新登录,再使用docker就不需要sudo了。
-
下载docker 镜像
- technical center (sophgo.com)
-
解压压缩包,挂载docker 镜像
unzip x86_sophonsdk3_ubuntu18.04_py37_dev_22.06_docker cd x86_sophonsdk3_ubuntu18.04_py37_dev_22.06_docker docker load -i x86_sophonsdk3_ubuntu18.04_py37_dev_22.06.docker
-
创建docker容器并进入Docker
cd sophonsdk_v3.0.0_<***> ./docker_run_sophonsdk.sh
注意:此时已经进入到docker 中,后续的操作都在docker 中完成
-
在docker 容器内安装依赖库和设置环境变量
cd $REL_TOP/scripts # 安装库 ./install_lib.sh nntc # 设置环境变量,注意此命令只对当前终端有效,重新进入需要重新执行 source envsetup_cmodel.sh # for CMODEL MODE # source envsetup_pcie.sh # for PCIE MODE
2. 模型准备
2.1 模型简介
LPRNet(License Plate Recognition via Deep Neural Networks),是一种轻量级卷积神经网络,可实现无需进行字符分割的端到端车牌识别。
LPRNet的优点可以总结为如下三点:
- LPRNet不需要字符预先分割,车牌识别的准确率高、算法实时性强、支持可变长字符车牌识别。对于字符差异比较大的各国不同车牌均能够端到端进行训练。
- LPRNet是第一个没有使用RNN的实时轻量级OCR算法,能够在各种设备上运行,包括嵌入式设备。
- LPRNet具有足够好的鲁棒性,在视角和摄像畸变、光照条件恶劣、视角变化等复杂的情况下,仍表现出较好的识别效果。
2.2 数据集准备
- CCPD数据集
- 该数据集是由中科大团队构建的一个用于车牌识别的大型国内停车场车牌数据集。该数据集在合肥市的停车场采集得来,采集时间早上7:30到晚上10:00。停车场采集人员手持Android POS机对停车场的车辆拍照并手工标注车牌位置。拍摄的车牌照片涉及多种复杂环境,包括模糊、倾斜、阴雨天、雪天等等。CCPD数据集一共包含将近30万张图片,每种图片大小720x1160x3。
2.3 准备移植例程
-
从github上下载移植好的例程,LPRNet的例程位于examples/simple/lprnet/。
git clone https://github.com/sophon-ai-algo/examples.git cd examples/simple/lprnet
2.4 准备模型与数据
-
进入本例程的工作目录后,可通过运行
scripts/download.sh
将相关模型下载至data/models
,将数据集下载并解压至data/images/
。./scripts/download.sh
- data/image 目录
-
data/model 目录
下载的模型包括:
Final_LPRNet_model.pth: 原始模型
LPRNet_model.torchscript: trace后的JIT模型
lprnet_fp32_1b4b.bmodel: 编译后的FP32模型,包含batch_size=1和batch_size=4
lprnet_int8_1b4b.bmodel: 量化后的INT8模型,包含batch_size=1和batch_size=4
下载的数据包括:
test: 原始测试集
test_md5_lmdb: 用于量化的lmdb数据集
2.5 模型转换
2.5.1 准备模型
原始模型 | Final_LPRNet_model.pth |
---|---|
概述 | 基于ctc的车牌识别模型,支持蓝牌、新能源车牌等中国车牌,可识别字符共67个。 |
骨干网络 | LPRNet |
训练集 | 未说明 |
运算量 | 148.75 MFlops |
输入数据 | [batch_size, 3, 24, 94], FP32,NCHW |
输出数据 | [batch_size, 68, 18], FP32 |
前处理 | resize,减均值,除方差,HWC->CHW |
后处理 | ctc_decode |
-
导出JIT模型
- SophonSDK中的PyTorch模型编译工具BMNETP只接受PyTorch的JIT模型(TorchScript模型)。本工程可以直接使用下载好的
LPRNet_model.torchscript
进行编译,也可以自己在源码上通过以下方法导出JIT模型。
.... # 在CPU上加载网络模型 lprnet.load_state_dict(torch.load("{PATH_TO_PT_MODEL}/Final_LPRNet_model.pth", map_location=torch.device('cpu'))) # jit.trace model = torch.jit.trace(lprnet, torch.rand(1, 3, 24, 94)) # 保存JIT模型 torch.jit.save(model, "{PATH_TO_JIT_MODEL}/LPRNet_model.torchscript") ....
- SophonSDK中的PyTorch模型编译工具BMNETP只接受PyTorch的JIT模型(TorchScript模型)。本工程可以直接使用下载好的
注意:LPRNet_model.torchscript 已下载到data/model 目录下,也可直接调用
2.5.2 模型转换
模型转换的过程需要在x86下的docker开发环境中完成。以下操作均在x86下的docker开发环境中完成。
2.5.2.1 生成FP32 BModel
-
在本工程目录下执行以下命令,使用bmnetp编译生成FP32 BModel,请注意修改
gen_fp32bmodel.sh
中的JIT模型路径、生成模型目录和输入大小shapes等参数:./scripts/gen_fp32bmodel.sh
上述脚本会在
data/models/fp32bmodel/
下生成lprnet_fp32_1b4b.bmodel、lprnet_fp32_1b.bmodel、lprnet_fp32_4b.bmodel、
文件,即转换好的FP32 BModel,使用bm_model.bin --info {path_of_bmodel}
查看lprnet_fp32_1b4b.bmodel
具体信息如下:
注意:lprnet_fp32_1b4b.bmodel 已下载到data/model 目录下,也可直接调用
2.5.2.1 生成iint8 BModel
-
不量化模型可跳过本节。
-
INT8 BModel的生成需要先制作lmdb量化数据集,然后经历中间格式UModel,即:原模型→FP32 UModel→INT8 UModel→INT8 BModel。在工程目录下执行以下命令,将生成INT8 BModel:
./scripts/gen_int8bmodel.sh
上述脚本会在
data/models/int8bmodel/
下生成lprnet_int8_1b4b.bmodel、lprnet_int8_4b.bmodel、lprnet_int8_1b.bmodel
文件,即转换好的INT8 BModel,使用bm_model.bin --info {path_of_bmodel}
查看lprnet_int8_1b4b.bmodel
具体信息如下:
注意:lprnet_int8_1b4b.bmodel 已下载到data/model 目录下,也可直接调用
3. 部署测试
3.1 环境配置
-
SE5 微服务器 是输入 arm SoC 平台, 对于arm SoC平台,内部已经集成了相应的SDK运行库包,位于/system目录下,只需设置环境变量即可。
# 设置环境变量 export PATH=$PATH:/system/bin export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/system/lib/:/system/usr/lib/aarch64-linux-gnu export PYTHONPATH=$PYTHONPATH:/system/lib
-
如果您使用的设备是Debian系统,您可能需要安装numpy包,以在Python中使用OpenCV和SAIL:
# 对于Debian9,请指定numpy版本为1.17.2 sudo apt update sudo apt-get install python3-pip sudo pip3 install numpy==1.17.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
如果您使用的设备是Ubuntu20.04系统,系统内已经集成了numpy环境,不需要进行额外的安装。
3.2 python例程推理
Python代码无需编译,无论是x86 PCIe平台还是arm SoC平台配置好环境之后就可直接运行。
工程目录下的python目录提供了一系列python例程以供参考使用,具体情况如下:
# | 例程主文件 | 说明 |
---|---|---|
1 | lprnet_cv_cv_sail.py | 使用OpenCV解码、OpenCV前处理、SAIL推理 |
2 | lprnet_sail_bmcv_sail.py | 使用SAIL解码、BMCV前处理、SAIL推理 |
使用bm_opencv解码的注意事项: x86 PCIe平台默认使用原生opencv,arm SoC平台默认使用bm_opencv。使用bm_opencv解码可能会导致推理结果的差异。若要在x86 PCIe平台使用bm_opencv可添加环境变量如下:
export PYTHONPATH=$PYTHONPATH:$REL_TOP/lib/opencv/pcie/opencv-python/
-
lprnet_cv_cv_sail.py 推理示例
-
具体参数说明
usage:lprnet_cv_cv_sail.py [--mode MODE] [--img_path IMG_PATH] [--bmodel BMODEL] [--batch_size] [--tpu_id TPU] --mode:运行模型,可选择test或val,选择test时可将图片的推理结果打印出来,选择val时可将图片的推理结果打印出来并与标签进行对比,计算准确率,val只用于整个文件夹的推理且图片名以车牌标签命令; --img_path:推理图片路径,可输入单张图片的路径,也可输入整个图片文件夹的路径; --bmodel:用于推理的bmodel路径; --batch_size: 模型输入的batch_size,本例程可支持1或4; --tpu_id:用于推理的tpu设备id。
-
测试数据集并保存预测结果的实例如下:
# 测试单张图片 python3 python/lprnet_cv_cv_sail.py --mode test --img_path data/images/test.jpg --bmodel data/models/fp32bmodel/lprnet_fp32_1b4b.bmodel --batch_size 1 --tpu_id 0 # 测试整个文件夹 python3 python/lprnet_cv_cv_sail.py --mode test --img_path data/images/test --bmodel data/models/fp32bmodel/lprnet_fp32_1b4b.bmodel --batch_size 4 --tpu_id 0 # 测试整个文件夹,并计算准确率 python3 python/lprnet_cv_cv_sail.py --mode val --img_path data/images/test --bmodel data/models/fp32bmodel/lprnet_fp32_1b4b.bmodel --batch_size 4 --tpu_id 0
-
执行完成后,会打印预测结果、推理时间、准确率等信息。
...... INFO:root:img:豫RM6396.jpg, res:皖RM6396 INFO:root:img:皖S08407.jpg, res:皖S08407 INFO:root:img:皖SYZ927.jpg, res:皖SYZ927 INFO:root:img:皖SZ788K.jpg, res:皖SZ788K INFO:root:img:皖SZH382.jpg, res:皖SZH382 INFO:root:img:川X90621.jpg, res:川X90621 INFO:root:ACC = 0.9010 INFO:root:------------------ Inference Time Info ---------------------- INFO:root:inference_time(ms): 1.03 INFO:root:total_time(ms): 1371.67, img_num: 1000 INFO:root:average latency time(ms): 1.37, QPS: 729.037181
-
相关文章:

TPU-NNTC 编译部署LPRNet 车牌识别算法
TPU-NNTC 编译部署LPRNet 车牌识别算法 注意: 由于SOPHGO SE5微服务器的CPU是基于ARM架构,以下步骤将在基于x86架构CPU的开发环境中完成 初始化开发环境(基于x86架构CPU的开发环境中完成)模型转换 (基于x86架构CPU的开发环境中完成) 处理后的LPRNet 项…...

在线/开源GNSS处理软件/平台介绍
当前,存在较多的GNSS开源/免费软件,可用于质量检核、RTK解算和PPP解算等,本文总结了部分常用的处理软件,其详细信息如表1和表2所示。 表1 常用GNSS预处理(格式转换、质量检核)软件: 软件名称 …...

SpringBoot集成企业微信群聊机器人消息
目录 参考文档概述一、功能作用二、应用场景三、 群机器人发送限制四、创建机器人1、添加2、群机器人Webhook地址 五、发送消息1、文本 text请求体 图文连接 news 参考文档 官方文档 企业微信群机器人应用 概述 现在很多企业都在使用企业微信进行工作交流,自从企…...

五、驱动 - 音频系统硬件电路
文章目录 1. 音频系统硬件电路结构2. 蓝牙音频2.1 音乐播放2.2 VoIP通话2.3 4G通话3. 其他3.1 什么是S/PDIF1. 音频系统硬件电路结构 录音放音设备:mic、speaker、耳机、听筒这些带有录音放音功能的设备(因为录放设备可能是模拟设备也可能是数字设备,所以接口可能是模拟接口…...

【图像分割和识别】活动形状模型 (ASM) 和活动外观模型 (AAM)(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

HTML基础介绍2
表单格式化 ctrld:复制选中行数的所有代码 ctrlx:删除代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>表单综合案例</title> </head> <body> <!--…...

rar压缩包怎么改成zip格式
不知道大家有没有遇到需要转换压缩包格式的问题,今天想和大家分享rar压缩包改成zip格式的方法。 方法一: 直接修改rar压缩包的后缀名变为zip,就可以修改压缩包文件格式了 方法二: 先将rar压缩包解压出来,然后再将解…...
Mac 补丁管理
Mac 补丁管理涉及通过扫描收集所有缺失补丁的完整列表、下载缺失的补丁、在非生产计算机上测试它们,最后将它们推广到生产环境中进行部署来管理 macOS 端点,修补 Mac 设备(又称 Mac 修补)可增强 macOS 环境的安全级别。 什么是 m…...

【物理】带电粒子在磁场和电场中移动的 3D 轨迹研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

【云原生】K8S二进制搭建上篇
目录 一、环境部署1.1操作系统初始化 二、部署etcd集群2.1 准备签发证书环境在 master01 节点上操作在 node01与02 节点上操作 三、部署docker引擎四、部署 Master 组件4.1在 master01 节点上操 五、部署Worker Node组件 一、环境部署 集群IP组件k8s集群master01192.168.243.1…...

day49-Springboot
Springboot 1. Springboot简介 1.1 简介:Springboot来简化Spring应用开发的一个框架,约定大于配置 1.2 优点: 可以快速的构建独立运行的Spring项目; 框架内有Servlet容器,无需依赖外部,所以不需要达成w…...
Day 9 字符串
慢慢补。 Prefixes and Suffixes 水个代码先。 代码...

Promise用法
学习了promise之后,有点懂但让我说又说不出来,参考别人的记录一下。 1.什么是promise? 2.promise解决了什么问题 3.es6 promise语法 (1)then链式操作语法 (2)catch的语法 (3…...
JSP教程_编程入门自学教程_菜鸟教程-免费教程分享
教程简介 JSP(全称Java Server Pages)是由Sun Microsystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返…...

极简在线商城系统,支持docker一键部署
Hmart 给大家推荐一个简约自适应电子商城系统,针对虚拟商品在线发货,支持企业微信通知,支持docker一键部署,个人资质也可搭建。 前端 后端 H2 console 运行命令 docker run -d --name mall --restartalways -p 8080:8080 -e co…...

如何微调医疗大模型llm:llama2学习笔记
三个微调方向:简单医疗问答 临床问答 影像学 一般流程: 1 数据集准备 2 模型基座选择 3 微调 4 案例拆解 1 数据集准备:两种类型,一种文本一种影像 扩展,多模态 2 模型基座选择 多模态处理所有视频,文本…...

生成对抗网络DCGAN学习
在AI内容生成领域,有三种常见的AI模型技术:GAN、VAE、Diffusion。其中,Diffusion是较新的技术,相关资料较为稀缺。VAE通常更多用于压缩任务,而GAN由于其问世较早,相关的开源项目和科普文章也更加全面&#…...

error: #5: cannot open source input file “core_cmInstr.h“
GD32F103VET6和STM32F103VET6引脚兼容。 GD32F103VET6工程模板需要包含头文件:core_cmInstr.h和core_cmFunc.h,这个和STM32F103还是有区别的,否则会报错,如下: error: #5: cannot open source input file "core…...

FastAPI 教程、结合vue实现前后端分离
英文版文档:https://fastapi.tiangolo.com/ 中文版文档:https://fastapi.tiangolo.com/zh/ 1、FastAPI 教程 简 介 FastAPI 和 Sanic 类似,都是 Python 中的异步 web 框架。相比 Sanic,FastAPI 更加的成熟、社区也更加的活跃。 …...

算法通关村第四关——如何基于数组(链表)实现栈
栈的基础知识 栈的特征 特征1 栈和队列是比较特殊的线性表,又被称为 访问受限的线性表。栈是很多表达式、符号等运算的基础,也是递归的底层实现(递归就是方法自己调用自己,在JVM的虚拟机栈中,一个线程中的栈帧就是…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
Spring事务传播机制有哪些?
导语: Spring事务传播机制是后端面试中的必考知识点,特别容易出现在“项目细节挖掘”阶段。面试官通过它来判断你是否真正理解事务控制的本质与异常传播机制。本文将从实战与源码角度出发,全面剖析Spring事务传播机制,帮助你答得有…...
在ubuntu等linux系统上申请https证书
使用 Certbot 自动申请 安装 Certbot Certbot 是 Let’s Encrypt 官方推荐的自动化工具,支持多种操作系统和服务器环境。 在 Ubuntu/Debian 上: sudo apt update sudo apt install certbot申请证书 纯手动方式(不自动配置)&…...