基于CANN的AI推理最佳实践丨多路极致性能目标检测应用设计解密

news2024/11/19 17:22:06

当前人工智能领域,最热门的无疑是以ChatGPT为代表的各种“新贵”大模型,它们高高在上,让你无法触及。但在人们的日常生活中,实际应用需求最大的还是以Yolo模型为代表的目标检测“豪强”,它们每天都在以各种方式落地、应用于我们日常生活的方方面面。

目标检测是计算机视觉领域的一项关键技术,它的任务是找出图像中所有感兴趣的目标,确定它们的类别和位置。随着人工智能潜移默化地渗入人们的生活中,各行各业竞相通过引入目标检测等技术打开市场空间,关于目标检测的各类人工智能需求也奔涌而来,比如:

  • 在交通领域,目标检测可以用来检测道路上的行人、车辆、交通标志等物体,提升行驶安全和通行便利性。
  • 在安全领域,目标检测可以用来检测关键特征、特定行为或者可疑物体,以便快速发现和识别安全威胁。
  • 在医疗领域,目标检测可以用来识别身体部位、病灶、心电图、CT影像等,以便快速辅助诊断。
  • 在生活领域,目标检测可以用于智能购物、智能家居等场景,提升人们生活的便利性。

但AI应用开发门槛高,周期长。各类AI软件栈理解成本高、AI算法模型与业务结合难度高、对开发人员的技能要求也较高。如何提升AI推理应用的开发效率,降低开发门槛,是亟需改善的现状。为此,昇腾CANN技术专家设计和开发了针对目标检测应用的最佳实践,让开发者可以在昇腾平台上快速部署目标检测应用,轻松获得几十甚至上百路的检测效果。下面我们就来详细拆解一下这个实践的设计思路。

基础应用分解

我们首先从一个基础的目标检测推理应用场景开始,推理流程通常包含如下几个部分:

GPU AI推理业务流程

  1. 数据输入是摄像头获取的视频数据流,一般以H.264格式为主。
  2. 然后通过FFmpeg软件,将连续的视频流进行拆帧和解码。
  3. 下一阶段是对解码后的图像进行预处理,通常使用OpenCV对图像进行缩放,得到模型需要的图像规格。
  4. 模型推理环节,用户可以选择的方式比较多,比较典型的是使用TensorRT进行推理应用开发。
  5. 目标检测后处理需要进行NMS计算,进行图片画框等操作。
  6. 数据输出阶段,用户根据需要实现一个结果呈现形式。

推理功能适配

将上面介绍的目标检测应用迁移到昇腾平台,开发者仅需关注“推理”环节的适配,包括如下两个步骤:

  1. 将推理模型文件(onnx模型或pb模型)通过ATC工具转化为昇腾平台专属的离线om文件。
  2. 使用昇腾AscendCL语言开发模型加载和模型执行的逻辑。

基于CANN的AI推理业务流程

完成如上两个环节后,推理应用的功能就已经迁移到昇腾平台了。这时若整体的推理性能未达到理想预期,就需要进入性能优化提升阶段。

性能提升方式一:使能DVPP硬件的高效编解码能力

DVPP(Digital Vision Pre-Processing,数字视觉预处理)是昇腾AI处理器内置的图像处理单元,通过AscendCL媒体数据处理接口提供强大的媒体处理硬加速能力,主要包括以下功能:

  • VPC(Vision Preprocessing Core):处理YUV、RGB等格式的图片,包括缩放、抠图、色域转换等。
  • JPEGD(JPEG Decoder):JPEG压缩格式→YUV格式的图片解码。
  • JPEGE(JPEG Encoder):YUV格式→JPEG压缩格式的图片编码。
  • VDEC(Video Decoder):H264/H265格式→YUV/RGB格式的视频码流解码。
  • VENC(Video Encoder):YUV420SP格式→H264/H265格式的视频码流编码。
  • PNGD(PNG Decoder):PNG格式→RGB格式的图片解码。

Ascend 310 AI处理器逻辑架构中DVPP位置

开发者可以通过DVPP对图像进行硬件解码和处理,提升图像处理效率。另外,DVPP和执行推理的计算单元AI Core是完全独立的硬件单元,无需担心使用DVPP后会对推理执行的性能产生影响。

基于CANN的AI推理业务流程——使用DVPP进行数据预处理

性能提升方式二:增加推理前后数据并行,让推理步骤一刻不停

昇腾平台采用异构计算架构,所以要充分利用计算核心AI Core的超强能力,就需要保证AI Core计算需要的数据能够持续不间断供给,同时能够无等待输出。为了实现此能力,可以在数据预处理→模型推理,模型推理→数据后处理模块间通过队列的机制,增加推理模块的并行流水。

基于CANN的AI推理业务流程——通过队列增加推理并行流水

同理,在FFmpeg视频拆帧和DVPP处理之间,也可以使用队列,进一步增加并行情况。但需要注意推理侧的队列数据会消耗硬件内存,所以需要要合理设置。

性能提升方式三:多线程并发,持续释放AI Core性能

多线程是提升硬件资源利用率的重要手段,通过多线程的支持,可以实现多路不同源的视频输入;针对服务器多卡的场景,同样支持多个卡并行执行,充分释放昇腾软硬件的性能。

基于CANN的AI推理业务流程——多线程并发

基于目标检测最佳实践,开发者可轻松实现已有AI推理应用到昇腾平台的迁移,并轻松达成高性能。开发者也可以参考此实践快速上手AI开发,玩转昇腾平台推理应用。未来,CANN将持续致力于应用开发的易用性提升,不断满足开发者的诉求。

点击Link,获取多路高性能目标检测最佳实践源码。

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

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

相关文章

javascript匿名函数之立即调用函数

今天在看youtube的前端代码时发现了一个很奇怪的写法,从来没见过,代码如下: (function(e, c, l, f, g, h, k) {var d window;d.getInitialData function() {var b window;b.ytcsi && b.ytcsi.tick("pr", null, "&…

TensorFlow基础和入门案例

TensorFlow简介 TensorFlow是目前主流深度学习框架之一,其库中几乎包含了所有机器学习和深度学习相关的辅助函数和封装类,官方文档如下图所示。在其框架下做各种神经网络算法的开发可以极大减轻工作量,在入门阶段可以不需要深入理解相关优化…

spring拦截器参数及多拦截器执行顺序讲解

1.拦截器中的参数 2.多拦截器执行顺序 如果全部返回true,则按照流程全部执行 如果3返回false,123的preHandler会执行,123的postHandler都不会执行,但是return为true的2和1的after会执行 如果2返回false 12的preHandler会执行 pos…

sql 模糊查询与查询时间范围 起止时间

上代码 <select id"page" resultType"com.sky.entity.Orders">select * from orders<where><if test"number!null and number!">and number like concat(%,#{number},%)</if><if test"phone!null and phone!&q…

选择排序、归并排序、快速排序

1.选择排序 选择排序算法的实现思路有点类似插入排序&#xff0c;也分已排序区间和未排序区间。但是选择排序每次会从未排序区间中找到最小的元素&#xff0c;将其放到已排序区间的末尾。 Java代码实现如下。 ps&#xff1a;选择排序的最好情况时间复杂度、最坏情况和平均情况…

vue子组件监听不到父组件数据变化;子组件获取不到父组件的异步数据

当父子组件嵌套使用时created 和mounted 生命周期的执行顺序是父created -> 子created -> 子mounted -> 父mounted&#xff0c;但是这只是针对同步代码&#xff0c;当生命周期中有异步接口时&#xff0c;那么就会变成父created未执行完 -> 子created -> 子mount…

web安全php基础_魔术常量__FUNCTION__与__METHOD__的区别

PHP 魔术常量 PHP 向它运行的任何脚本提供了大量的预定义常量。 不过很多常量都是由不同的扩展库定义的&#xff0c;只有在加载了这些扩展库时才会出现&#xff0c;或者动态加载后&#xff0c;或者在编译时已经包括进去了。 有八个魔术常量它们的值随着它们在代码中的位置改…

安装Pytorch及配置Pycharm

PyTorch是一个基于Torch的Python开源机器学习库&#xff0c;用于自然语言处理等应用程序。它主要由Facebookd的人工智能小组开发&#xff0c;不仅能够 实现强大的GPU加速&#xff0c;同时还支持动态神经网络&#xff0c;这一点是现在很多主流框架如TensorFlow都不支持的。 本文…

Service Computing Frontier Technology Experiment

任务说明 实验算法 空间数据索引RTree&#xff08;R树&#xff09;完全解析及Java实现 - 佳佳牛 - 博客园 (cnblogs.com) SFS 打开堆文件 t相当于一个指针 当指针指到不为空的时候 如果窗口未被占用那么 如果窗口是满的话那么代表完成 如果窗口没有满的话 把他加到窗口上&a…

k8s 第一篇 基础知识

一 k8s 1.1 概念 k8s 是一个能让应用部署到容器中&#xff0c;实现自动部署和管理更加高效 自能化的平台。 也就是说通过k8s&#xff0c;能够进行应用的自动化部署和扩容。 1.2 集群的架构流程 1.3 k8s的核心概念 1.4 k8s 集群规划 从第6集开始看

【分立元件】理解电阻

如果强行将某电压加在电子器件上&#xff0c;那么器件上被迫流过的电流是不可控的&#xff0c;电流具体是多少&#xff0c;是由器件本身的性质决定的。 比如同样的电压加载在导体和绝缘体两端&#xff0c;那么一般流过导体的电流会是大于流过绝缘体的。但要是超高电压下绝缘体…

单点登录SSO==MAXKEY

1-下载安装包安装启动 2-打开教程&#xff0c;里面说的很详细了 3- 测试 不想从这点进去也可以直接匿名打开个窗口直接访问 http://oauth.demo.maxkey.top:9521/demo-oauth/oauth20index.jsp 也会跳转到登录页面&#xff0c;输入账号密码后登录成功 乱输密码的话登录不成功还…

【算法设计与分析】素数测试问题——设计一个拉斯维加斯算法,对于给定的正整数,判断其是否为素数。

目录 一、问题描述二、分析三、运行结果四、代码 一、问题描述 试设计一个素数测试的偏真蒙特卡罗算法&#xff0c;对于测试的整数n&#xff0c;所述算法是一个关于logn的多项式时间算法。结合教材中素数测试的偏假蒙特卡罗算法&#xff0c;设计一个素数测试的拉斯维加斯算法。…

盛最多水的容器(力扣)双指针 JAVA

给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。 输入&…

Tomcat安装配置及其出错的解决方法

文章目录 一、安装二、进行配置三、解决问题四、验证 一、安装 官网链接: https://tomcat.apache.org/ 1.选择 A r c h i v e s \color{red}{Archives} Archives 2.选择 T o m c a t \color{red}{Tomcat} Tomcat版本 3.在对应的版本中选择相对应的小版本 点击 b i n \color…

海盗船DDR5版本号VER命名规则

从华硕、技嘉、微星的内存QVL中可总结出如下规律 海盗船DDR5版本号命名规则 第一位数字 颗粒厂商 第二位数字 对应产品类型 第三位数字 DIE数 3 美光 01 A 4 三星 43 传统内存 02 B 5 海力士 53 非传统内存 03 C 04 D 05 E 8 …

JAVA线程池分析实现

1、定义线程池 /*** 使用给定的初始参数创建新的 ThreadPoolExecutor对象&#xff0c;就创建了一个线程池* param corePoolSize - 要保留在池中的线程数&#xff0c;即使它们处于空闲状态&#xff0c;若果allowCoreThreadTimeOut设置为ture&#xff0c;那么核心线程在keepAliv…

整理——xilinx FPGA 在线升级

一&#xff1a;xilinx FPGA 在线升级方案&#xff1a;&#xff08;系统搭建&#xff1a;MicroBlaze软核处理器&#xff0c;uart控制器&#xff0c;Axi-lite-user用户通信接口&#xff0c;MIG DDR3控制器&#xff0c;中断控制器等&#xff0c;以太网控制器&#xff09; 1.跑一个…

C#开发的OpenRA游戏之建造物品的窗口10

C#开发的OpenRA游戏之建造物品的窗口10 前面已经分析完成建造物品的过程,从物品进入队列,直到物品按时间进行生产完成。那么生产完成之后,又是怎么样放置到游戏的地图里面的呢?本文就来分析这个问题。 前面可以看到,当物品建造完成时,会在右边的面板上显示建造完成: 在…

类 模板 已经声明为非类 模板

类 模板 已经声明为非类 模板 解决方案 原因是在当前包下&#xff0c;已经定义了AA类 解决方案 更改模板类AA的类名