当前位置: 首页 > news >正文

TPU-NNTC 编译部署LPRNet 车牌识别算法

TPU-NNTC 编译部署LPRNet 车牌识别算法

注意: 由于SOPHGO SE5微服务器的CPU是基于ARM架构,以下步骤将在基于x86架构CPU的开发环境中完成

  • 初始化开发环境(基于x86架构CPU的开发环境中完成)
  • 模型转换 (基于x86架构CPU的开发环境中完成)

处理后的LPRNet 项目文件将被拷贝至 SE5微服务器 上进行推理测试

1. 开发环境配置

  • Linux 开发环境(x86架构CPU的开发环境)

    1. 一台安装了Ubuntu16.04/18.04/20.04的x86主机,运行内存建议12GB以上

    2. 下载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")
    ....
    

注意: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例程以供参考使用,具体情况如下:

#例程主文件说明
1lprnet_cv_cv_sail.py使用OpenCV解码、OpenCV前处理、SAIL推理
2lprnet_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 车牌识别算法 注意&#xff1a; 由于SOPHGO SE5微服务器的CPU是基于ARM架构&#xff0c;以下步骤将在基于x86架构CPU的开发环境中完成 初始化开发环境(基于x86架构CPU的开发环境中完成)模型转换 (基于x86架构CPU的开发环境中完成) 处理后的LPRNet 项…...

在线/开源GNSS处理软件/平台介绍

当前&#xff0c;存在较多的GNSS开源/免费软件&#xff0c;可用于质量检核、RTK解算和PPP解算等&#xff0c;本文总结了部分常用的处理软件&#xff0c;其详细信息如表1和表2所示。 表1 常用GNSS预处理&#xff08;格式转换、质量检核&#xff09;软件&#xff1a; 软件名称 …...

SpringBoot集成企业微信群聊机器人消息

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

​五、驱动 - ​音频系统硬件电路

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

【图像分割和识别】活动形状模型 (ASM) 和活动外观模型 (AAM)(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

HTML基础介绍2

表单格式化 ctrld&#xff1a;复制选中行数的所有代码 ctrlx&#xff1a;删除代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>表单综合案例</title> </head> <body> <!--…...

rar压缩包怎么改成zip格式

不知道大家有没有遇到需要转换压缩包格式的问题&#xff0c;今天想和大家分享rar压缩包改成zip格式的方法。 方法一&#xff1a; 直接修改rar压缩包的后缀名变为zip&#xff0c;就可以修改压缩包文件格式了 方法二&#xff1a; 先将rar压缩包解压出来&#xff0c;然后再将解…...

Mac 补丁管理

Mac 补丁管理涉及通过扫描收集所有缺失补丁的完整列表、下载缺失的补丁、在非生产计算机上测试它们&#xff0c;最后将它们推广到生产环境中进行部署来管理 macOS 端点&#xff0c;修补 Mac 设备&#xff08;又称 Mac 修补&#xff09;可增强 macOS 环境的安全级别。 什么是 m…...

【物理】带电粒子在磁场和电场中移动的 3D 轨迹研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&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 简介&#xff1a;Springboot来简化Spring应用开发的一个框架&#xff0c;约定大于配置 1.2 优点&#xff1a; 可以快速的构建独立运行的Spring项目&#xff1b; 框架内有Servlet容器&#xff0c;无需依赖外部&#xff0c;所以不需要达成w…...

Day 9 字符串

慢慢补。 Prefixes and Suffixes 水个代码先。 代码...

Promise用法

学习了promise之后&#xff0c;有点懂但让我说又说不出来&#xff0c;参考别人的记录一下。 1.什么是promise&#xff1f; 2.promise解决了什么问题 3.es6 promise语法 &#xff08;1&#xff09;then链式操作语法 &#xff08;2&#xff09;catch的语法 &#xff08;3&#xf…...

JSP教程_编程入门自学教程_菜鸟教程-免费教程分享

教程简介 JSP&#xff08;全称Java Server Pages&#xff09;是由Sun Microsystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上&#xff0c;可以响应客户端发送的请求&#xff0c;并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页&#xff0c;然后返…...

极简在线商城系统,支持docker一键部署

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

如何微调医疗大模型llm:llama2学习笔记

三个微调方向&#xff1a;简单医疗问答 临床问答 影像学 一般流程&#xff1a; 1 数据集准备 2 模型基座选择 3 微调 4 案例拆解 1 数据集准备&#xff1a;两种类型&#xff0c;一种文本一种影像 扩展&#xff0c;多模态 2 模型基座选择 多模态处理所有视频&#xff0c;文本…...

生成对抗网络DCGAN学习

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

error: #5: cannot open source input file “core_cmInstr.h“

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

FastAPI 教程、结合vue实现前后端分离

英文版文档&#xff1a;https://fastapi.tiangolo.com/ 中文版文档&#xff1a;https://fastapi.tiangolo.com/zh/ 1、FastAPI 教程 简 介 FastAPI 和 Sanic 类似&#xff0c;都是 Python 中的异步 web 框架。相比 Sanic&#xff0c;FastAPI 更加的成熟、社区也更加的活跃。 …...

算法通关村第四关——如何基于数组(链表)实现栈

栈的基础知识 栈的特征 特征1 栈和队列是比较特殊的线性表&#xff0c;又被称为 访问受限的线性表。栈是很多表达式、符号等运算的基础&#xff0c;也是递归的底层实现&#xff08;递归就是方法自己调用自己&#xff0c;在JVM的虚拟机栈中&#xff0c;一个线程中的栈帧就是…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...