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

news2024/9/23 1:33:16

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
      

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

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

相关文章

sql入门4--函数

字符串函数 # -----字符串函数----- # concat(s1,s2,....)拼接 select concat(Hello ,Mysql); #str转换为小写 select lower(HELLO); # str转换为大写 select upper(mysql); # 向左侧添加 str 位数 要添加的元素 select lpad(1, 3 ,-); # 向右侧添加 str 位数 要添加的元…

【单调栈part01】| 739.每日温度、496.下一个更大元素

&#x1f388;LeetCode739. 每日温度 链接&#xff1a;739.每日温度 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不…

rv1109/1126 rknn 模型部署过程

rv1109/1126是瑞芯微出的嵌入式AI芯片&#xff0c;带有npu, 可以用于嵌入式人工智能应用。算法工程师训练出的算法要部署到芯片上&#xff0c;需要经过模型转换和量化&#xff0c;下面记录一下整个过程。 量化环境 模型量化需要安装rk的工具包&#xff1a; rockchip-linux/rk…

weblogic XML反序列化分析——CVE-2017-10271

环境 https://vulhub.org/#/environments/weblogic/CVE-2017-10271/ 启动环境 docker-compose up -d代码审计 传入参数 中间跟进函数 最后的出口 没有限制&#xff0c;直接包参数传入xmlDecoder public String readLine() throws IOException {return (String)this.xml…

Class Central-全球在线课程搜索引擎和学习平台

Class Central&#xff08;课程中央网站&#xff09;是一个全球在线课程搜索引擎和学习平台&#xff0c;全球知名的慕课资源导航社区&#xff0c;汇集了来自Coursera&#xff08;斯坦佛大学&#xff09;、edX&#xff08;麻省理工学院&#xff09;、Futurelearn&#xff08;英国…

如何使用vue ui创建一个项目?

首先打开cmd 输入vue ui 等待浏览器打开一个窗口&#xff0c;按照下图操作 在"功能页面"中&#xff0c;各个插件代表以下意思&#xff1a; Babel&#xff1a;Babel是一个JavaScript编译器&#xff0c;用于将ES6代码转换为向后兼容的JavaScript版本&#xff0c;以确保…

ORB-SLAM2学习笔记6之D435i双目IR相机运行ROS版ORB-SLAM2并发布位姿pose的rostopic

文章目录 0 引言1 D435i相机配置2 新增发布双目位姿功能2.1 新增d435i_stereo.cc代码2.2 修改CMakeLists.txt2.3 新增配置文件D435i.yaml 3 编译运行和结果3.1 编译运行3.2 结果3.3 可能出现的问题 0 引言 ORB-SLAM2学习笔记1已成功编译安装ROS版本ORB-SLAM2到本地&#xff0c…

C++入门篇6 C++的内存管理

在学习C的内存管理之前&#xff0c;我们先来回顾一下C语言中动态内存 int main() {int* p1 (int*)malloc(sizeof(int));free(p1);// 1.malloc/calloc/realloc的区别是什么&#xff1f;int* p2 (int*)calloc(4, sizeof(int));//calloc 可以初始化空间为0int* p3 (int*)reall…

渗透-01:DNS原理和HTML字符编码-HTML实体编码

一、DNS概念 DNS (Domain Name System 的缩写)就是根据域名查出IP地址(常用) DNS分类&#xff1a; 正向解析&#xff1a;已知域名解析IP反向解析&#xff1a;已知IP解析对应的域名 二、查询过程 工具软件dig可以显示整个查询过程 [rootnode01 ~]# dig baidu.com; <<>&…

pytorch学习——卷积神经网络——以LeNet为例

目录 一.什么是卷积&#xff1f; 二.卷积神经网络的组成 三.卷积网络基本元素介绍 3.1卷积 3.2填充和步幅 3.2.1填充&#xff08;Padding&#xff09; 填充是指在输入数据周围添加额外的边界值&#xff08;通常是零&#xff09;&#xff0c;以扩展输入的尺寸。填充可以在卷…

重磅特性 - SpreadJS推出新插件甘特图,预览版下载体验中

摘要&#xff1a;本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 甘特图对于业务场景中的工程项目管理、预算执行、生产计划等都能将原有的表格数据&…

【数据分析】numpy (二)

numpy作为数据分析&#xff0c;深度学习常用的库&#xff0c;本篇博客我们来介绍numpy的一些进阶用法&#xff1a; 一&#xff0c;numpy的常用简单内置函数&#xff1a; 1.1求和&#xff1a; a np.array([[1, 2],[3, 4]]) np.sum(a)10 1.2求平均值&#xff1a; np.mean(a…

《向量数据库》——怎么安装向量检索库Faiss?

装 Faiss 以下教程将展示如何在 Linux 系统上安装 Faiss: 1. 安装 Conda。 在安装 Faiss 之前,先在系统上安装 Conda。Conda 是一个开源软件包和环境管理系统,可在 Windows、macOS 和 Linux 操作系统上运行。根据以下步骤在 Linux 系统上安装 Conda。 2. 从官网…

[模拟电路]集成运算放大器

目录 一.前言二.集成运放的介绍及特性分析1.集成运算放大器2.集成运放由四个部分组成3.集成运放的特性 三.集成运放的线性应用&#xff08;引入负反馈&#xff09;1.两个基本运算电路——反相/同相比例运算电路2.同相比例运算电路的特例——电压跟随器3.反相加法运算电路4.同相…

Android组件化入门:一步步搭建组件化架构

1、前言 最近因为业务需求变更&#xff0c;有考虑采用组件化架构进行开发&#xff0c;这方面我之前没有接触过。关于组件化的文章很多&#xff0c;各方大神更是提出了各种的组件化方案&#xff0c;我也看了很多相关文章。但是学习新东西看的再多&#xff0c;不如动手做一次&am…

CAD产品设计逆向软件 FARO RevEng Crack

CAD产品设计逆向软件 FARO RevEng 软件平台能为用户带来全面的数字设计体验。该反向工程软件有助于利用三维点云创建和编辑高质量的网格和 CAD 表面&#xff0c;以实现反向工程工作流程。然后&#xff0c;工业设计师可以利用这些网格模型进行进一步设计或三维打印。 RevEng 的商…

element-ui分页编辑器的使用

代码&#xff1a; 准备好初始数据; total: ,page: {pageSize: 1,pageNumber: 10,}, 当前显示在第一页,每页10条数据。 一,页码改变的事件 handleCurrentChange(val) { this.page.pageSizeval 通过传入(this.page) 获取当前页的数据 } 二.页容量改变 handleSizeChange(val) …

剑指offer49.丑数

看完题想了一下&#xff0c;就想到了一点&#xff0c;它就是先用1分别乘2&#xff0c;乘3&#xff0c;乘5然后往后加&#xff0c;然后用2分别乘2&#xff0c;乘3&#xff0c;乘5往后加&#xff0c;但是如果这样就是1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;4&…

更快的训练和推理: 对比 Habana Gaudi®2 和英伟达 A100 80GB

&#x1f917; 宝子们可以戳 阅读原文 查看文中所有的外部链接哟&#xff01; 通过本文&#xff0c;你将学习如何使用 Habana Gaudi2 加速模型训练和推理&#xff0c;以及如何使用 &#x1f917; Optimum Habana 训练更大的模型。然后&#xff0c;我们展示了几个基准测例&#…

春秋云镜 CVE-2020-5515

春秋云镜 CVE-2020-5515 Gila CMS 1.11.8 sql注入 靶标介绍 Gila CMS是一套基于PHP和MySQL的开源内容管理系统&#xff08;CMS&#xff09;。 Gila CMS 1.11.8版本中的/admin/sql?query存在SQL注入漏洞。该漏洞源于基于数据库的应用缺少对外部输入SQL语句的验证。攻击者可利…