写点什么

基于华为云 ECS 的目标检测与识别的昇腾 AI 开发体验【华为云至简致远】

作者:sofiya
  • 2022 年 8 月 07 日
  • 本文字数:13278 字

    阅读完需:约 44 分钟

【摘要】 基于华为云弹性云服务器 ECS,搭配共享镜像,快速搭建环境,进行目标检测与识别的昇腾 AI 开发体验,开箱即用,打破时间和空间限制,随时随地进行开发,适合个人开发和团队协作,体验流畅丝滑。前言强大的社会粘性不断催温数字化发展,目标检测与识别作为计算机视觉领域的一项关键技术,应用场景广泛,前景十分广阔,从城市治理、楼宇园区、互联网等领域,延伸至智能家居、金融、医疗影像等更多创新领域。随着这些技术潜移默化地渗透入人们的生活中,各行各业竞相通过引入目标检测和识别等人工智能新技术打开市场空间,关于目标检测和识别等各类人工智能需求奔涌而来。


image.png


但人工智能应用开发门槛高,周期长,各类 AI 软件栈理解成本高、各类 AI 算法模型与业务结合难度高、AI 领域开发人员技能要求高,这是 AI 开发者们的切肤之痛,也是 AI 基础服务提供商们必须医好的症结。


对此,华为给出了自己的解决方案——昇腾 AI。


昇腾 AI 是以昇腾 AI 基础软硬件平台为基础构建的人工智能计算产业,昇腾 AI 基础软硬件平台包括 Atlas 系列硬件及伙伴硬件、异构计算架构 CANN(Compute Architecture for Neural Networks)、全场景 AI 框架昇思 MindSpore、昇腾应用使能 MindX 等。作为昇腾 AI 的核心,异构计算架构 CANN 兼容多种底层硬件设备形态提供强大的异构计算能力,并且通过多层次编程接口,支持用户快速构建 AI 应用和业务,对上承接多种 AI 框架,对下服务 AI 芯片与编程,是提升昇腾处理器效率的关键。同时,还开源了各种 AI 应用源码供个人和企业开发者们免费使用。


通用目标检测与识别样例介绍在计算机视觉领域,CANN 最新开源的通用目标检测与识别样例,通过其强大的可定制、可扩展性,为 AI 开发者们提供了良好编程选择。大量模块化编程逻辑、可扩展配置,让开发者们像乐高搭积木一样,仅需进行简单的替换和定制,就能实现符合业务场景需求的高性能、企业级 AI 应用。


该样例使用了 YOLOv3 图片检测模型与 CNN 颜色分类模型,基于 CANN AI 应用编程接口,对数据预处理、模型推理、模型后处理等 AI 核心计算逻辑进行模块化组装,实现了车辆检测和车身颜色识别基础功能:


image.png


同时,该样例开放出多个编程定制点,并公开了系统的定制文档,详细介绍了样例代码结构、编译运行方法,以及如何基于现有样例代码进行功能定制和扩展,让不同程度的 AI 开发者们轻松上手。


image.png


  1. 支持多格式输入和输出 CANN 通用目标检测和识别样例支持图片、离线视频、RTSP 视频流等多输入格式,开发者可基于此样例实现对图片和视频等不同格式的目标进行识别。另外在结果展示方面,该样例支持图片、离线视频、Web 前端等多形式展现,可根据业务场景灵活呈现识别结果。

  2. 支持轻松替换和串接模型样例目前选用的是 YOLOv3 图片检测模型与 CNN 颜色分类模型的串接,可实现基本的车辆检测和车辆颜色识别,开发者可轻松修改程序代码,自行替换/增加/删除 AI 模型,实现更多 AI 功能。

  3. 支持高效数据预处理图片、视频等各类数据是进行目标检测和识别的原料,在把数据投入 AI 算法或模型前,我们需要对数据进行预加工,才能达到更加高效和准确的计算。该样例采用独立数据预处理模块,支持开发者按需定制,高效实现解码、抠图、缩放、色域转换等各种常见数据处理功能。

  4. 支持图片数、分辨率可变场景定制在目标检测和识别领域,开发者们除了需要应对输入数据格式等方面差异,还会经常遇到图片数量、分辨率不确定的场景,这也是格外头疼的问题之一。比如,在目标检测和识别过程中,由于检测出的目标个数不固定,导致程序要等到图片攒到固定数量再进行 AI 计算,浪费了大量宝贵的 AI 计算资源。该样例开放了便捷的定制入口,支持设置多种数据量 Batch 档位、多种分辨率档位,在推理时根据实际输入情况灵活匹配,不仅扩宽了业务场景,更有效节省计算资源,大大提升 AI 计算效率。

  5. 支持多路多线程高性能编程同时,为了进一步提高编程的灵活性,满足开发者实现高性能 AI 应用,该样例支持通过极为友好和便捷的方式调整线程数和设备路数,极大降低学习成本,提升设备资源利用率。

  6. 高效后处理计算除此之外,本样例还将原本需要在 CPU 上进行处理的功能推送到昇腾 AI 处理器上执行,利用昇腾 AI 处理器强大的算力实现后处理的加速,进一步提升整个 AI 应用的计算效率。


CANN 为 AI 开发者用户提供了越来越灵活的编程技术支持,让越来越多的开发者们寻求到了更加友好且高效的编程体验。让大学生创新人才更轻松地上手 AI 开发、开展创意实践,让企业开发者们更高效落地商业应用。


通用目标检测与识别样例实战基础知识


  1. 昇腾形态介绍以昇腾 AI 处理器的 PCIe 的工作模式进行区分:(1)如果 PCIe 工作在主模式,可以扩展外设,则称为 RC 模式;(2)如果 PCIe 工作在从模式,则称为 EP 模式。EP 模式通常由 Host 侧作为主端,Device 侧作为从端。客户的 AI 业务程序运行在 Host 系统中,产品作为 Device 系统以 PCIe 从设备接入 Host 系统,Host 系统通过 PCIe 通道与 Device 系统交互,将 AI 任务加载到 Device 侧的昇腾 AI 处理器中运行。


两种模式的产品及架构如下图所示:


image.png


关于 Host 和 Device 的概念说明如下:


Host:是指与昇腾 AI 处理器所在硬件设备相连接的 X86 服务器、ARM 服务器,利用昇腾 AI 处理器提供的 NN(Neural-Network)计算能力完成业务。Device:是指安装了昇腾 AI 处理器的硬件设备,利用 PCIe 接口与服务器连接,为服务器提供 NN 计算能力。


以下是对于目前的昇腾处理器和产品的工作模式总结:


昇腾 AI 处理器的工作模式如下:− 昇腾 310 AI 处理器有 EP 和 RC 两种模式。− 昇腾 310P AI 处理器(昇腾 710 AI 处理器)只有 EP 模式。− 昇腾 910 AI 处理器只有 EP 模式。


支持 RC 模式的产品有:Atlas 200 AI 加速模块、Atlas 200 DK 开发者套件。产品的 CPU 直接运行用户指定的 AI 业务软件,接入网络摄像头、I2C 传感器、SPI 显示器等其他外挂设备作为从设备接入产品。


支持 EP 模式的产品昇腾 310 AI 处理器:Atlas 200 AI 加速模块、Atlas 300I 推理卡、Atlas 500 智能小站、Atlas 500 Pro 智能边缘服务器、Atlas 800 推理服务器。昇腾 310P AI 处理器:Atlas 300I Pro 推理卡、Atlas 300V Pro 视频解析卡。昇腾 910 AI 处理器:Atlas 800 训练服务器、Atlas 300T 训练卡。


  1. CANN 介绍 image.png


(1)昇腾计算语言接口:昇腾计算语言(Ascend Computing Language,AscendCL)接口是昇腾计算开放编程框架,是对低层昇腾计算服务接口的封装。它提供 Device(设备)管理、Context(上下文)管理、Stream(流)管理、内存管理、模型加载与执行、算子加载与执行、媒体数据处理、Graph(图)管理等 API 库,供用户开发人工智能应用调用。(2)昇腾计算服务层:本层主要提供昇腾计算库,例如神经网络(Neural Network,NN)库、线性代数计算库(Basic Linear Algebra Subprograms,BLAS)等;昇腾计算调优引擎库,例如算子调优、子图调优、梯度调优、模型压缩以及 AI 框架适配器。(3)昇腾计算编译引擎:本层主要提供图编译器(Graph Compiler)和 TBE 算子开发支持。前者将用户输入中间表达(Intermediate Representation,IR)的计算图编译成 NPU 运行的模型。后者提供用户开发自定义算子所需的工具。(4)昇腾计算执行引擎:本层负责模型和算子的执行,提供如运行时(Runtime)库(执行内存分配、模型管理、数据收发等)、图执行器(Graph Executor)、数字视觉预处理(Digital Vision Pre-Processing,DVPP)、人工智能预处理(Artificial Intelligence Pre-Processing,AIPP)、华为集合通信库(Huawei Collective Communication Library,HCCL)等功能单元。(5)昇腾计算基础层:本层主要为其上各层提供基础服务,如共享虚拟内存(Shared Virtual Memory,SVM)、设备虚拟化(Virtual Machine,VM)、主机-设备通信(Host Device Communication,HDC)等。


环境要求按照官方的文档说明,如下条件的硬件环境中进行测试,若环境不符合如下要求,样例可能运行失败:


产品型号 支持的操作系统 Atlas 200 DK 开发者套件(型号 3000) Ubuntu 18.04Atlas 300I Pro 推理卡 Ubuntu 18.04 / CentOS 7.6 但遗憾的是,目前我暂无上述两种设备,不过幸好我手头有一些代金券,又恰好有上次 CANN 训练营的镜像,那我就在华为云 ECS 购买一台云服务器来试试吧。


如图是我选择的镜像:


image.png


根据此镜像,我创建了一台云服务器,规格为: AI 加速型 | ai1s.large.4 | 2vCPUs | 8GiB,系统版本为 Ubuntu 18.04 server 64bit,是 x86 + Ascend 310 的硬件组合。不得不说华为云这个弹性云服务器 ECS 还真是不错,很方便,当然也感谢上次的 CANN 训练营,是的我可以根据镜像快速创建服务器,不用一个个安装各种驱动和固件了,赞!


这里记录一下我这台云服务器的一些信息:


image.png


image.png


注意,CANN 版本为:5.0.4.alpha001 及以上版本,同时解析以下概念:开发环境指编译开发代码的环境。运行环境指运行推理程序的环境,运行环境必须带昇腾 AI 处理器。开发环境与运行环境合设场景指带昇腾 AI 处理器的机器既作为开发环境又作为运行环境,此种场景下,代码开发与代码运行在同一台机器上。开发环境与运行环境分设场景指开发者使用其他独立机器进行代码开发与编译,而不使用带有昇腾 AI 处理器的机器。


而通过上图,可以看到我这里的 CANN 版本为:5.0.5.alpha001,对了,咱这是开发环境与运行环境合设场景,安装用户是 HwHiAiUser。


应用流程介绍本样例基于 CANN,实现了在昇腾 AI 处理器上对输入图片或者视频进行目标识别,通用业务流程如下所示:


image.png


AscendCL 初始化 调用 aclInit 接口实现初始化 AscendCL。运行管理资源申请 依次申请运行管理资源 Device、Context 与 Stream,确保可以使用这些资源执行运算、管理任务。在申请管理资源时,样例进行了当前昇腾 AI 处理器运行模式的判断,做到不同形态的昇腾 AI 处理器的代码实现归一。加载模型文件 加载模型文件,并构建模型的输入与输出。数据预处理。 针对不同类型的输入,分别进行不同的处理,使其满足模型对输入数据的要求。模型推理 执行模型推理,并获取输出结果。推理结果后处理 根据用户选择的后处理方式,对输出结果进行不同的处理,例如对推理结果进行标注,输出为离线视频文件,或通过网页在线展示等。目录结构├── model //模型文件夹,存放样例运行需要的模型文件│ └── xxxx.pb├── data //数据文件夹│ └── xxxx //测试数据,输入图片/视频├── inc //头文件文件夹│ └── CarParams.h //声明样例使用的数据结构的头文件├── out //编译输出文件夹,存放编译生成的可执行文件│ ├── xxxx //可执行文件│ └── output //结果输出文件夹(如果不存在需要自行创建)│ └── xxxx //样例运行的输出结果├── display //网页展示功能实现代码文件夹│ ├── presenterserver //presenterserver 文件夹│ └── run_presenter_server.sh//presenterserver 启动脚本├── scripts //配置文件+脚本文件夹│ ├── params.conf //样例运行配置文件│ ├── present_start.conf //presentserver 启动配置文件│ ├── sample_build.sh //快速编译脚本│ └── sample_run.sh //快速运行脚本├── src│ ├── acl.json //系统初始化的配置文件│ ├── CMakeLists.txt //Cmake 编译文件│ ├── classifyPostprocess //分类模型后处理线程文件夹,存放该业务线程的头文件及源码│ ├── classifyPreprocess //分类模型预处理线程文件夹,存放该业务线程的头文件及源码│ ├── detectPostprocess //检测模型后处理线程文件夹,存放该业务线程的头文件及源码│ ├── detectPreprocess //检测模型预处理线程文件夹,存放该业务线程的头文件及源码│ ├── inference //预处理线程文件夹,存放该业务线程的头文件及源码│ ├── presentagentDisplay //网页展示线程文件夹,存放该业务线程的头文件及源码│ └── main.cpp //主函数,图片分类功能的实现文件


└── CMakeLists.txt //编译脚本入口,调用 src 目录下的 CMakeLists 文件环境配置因为咱这次用的是开发环境与运行环境合设场景,下面操作皆针对此场景设置,如果是分设环境,请参考 README。


  1. 配置环境变量以安装用户在任意目录下执行以下命令,打开.bashrc 文件。注意,咱这里安装用户就是 HwHiAiUser,但 ECS 默认登录是 root 用户,因此需要切换用户,执行如下命令:


su - HwHiAiUser 运行截图:


image.png


接下来就执行:


vi ~/.bashrc 在文件最后一行后面添加如下内容。提示:按“i”可以进入编辑状态。


export CPU_ARCH=arch # 使用 arch 命令自动获取当前操作系统架构 export THIRDPART_PATH={CPU_ARCH} # 存储第三方库文件的路径,例如依赖安装中的 OpenCV、FFmpeg 等 export LD_LIBRARY_PATH={CPU_ARCH}/lib:LD_LIBRARY_PATH # 运行时链接库文件export INSTALL_DIR={HOME}/Ascend/ascend-toolkit/latest # CANN 软件安装后文件存储路径,若是 root 用户安装,$HOME 请替换为/usr/local 运行截图:


image.png


执行命令保存文件并退出。提示:按“Ecs”是退出编辑状态。


:wq!执行命令使其立即生效。source ~/.bashrc2. 创建第三方依赖文件夹。注意,因为已经使用镜像创建的环境已经创建过了,所以这里就跳过,如果之前未创建过,这里要执行:


mkdir -p ${THIRDPART_PATH}3. 下载 samples 仓源码。先来介绍一些命令,注意先别执行哈:


cd ${HOME} # 此处以将 samples 源码仓下载到用户家目录为例,开发者可自定义下载路径 sudo apt-get install git # 可选,如果没安装 git,则需要执行本命令,本环境可省略,因为已经安装了。git clone https://gitee.com/ascend/samples.git那这里,我执行的是如下命令:


mkdir downloadscd downloadsgit clone https://gitee.com/ascend/samples.git运行截图:


image.png


  1. 将 samples 源码仓中的公共库拷贝到前面创建的第三方依赖文件夹中。cp -r samples/common ${THIRDPART_PATH}运行截图:


image.png


依赖安装注意,因为咱使用的镜像很棒,所以以下依赖基本都安装过了或者根据业务需求,并不需要安装,所以这里的依赖可省略,但如果确有需求,可参考以下方式安装。


  1. OpenCV 样例使用 OpenCV 接口的作用是进行输入视频文件的读取,以及所有类型输出数据的后处理,数据后处理包括目标标注、不同类型数据的输出,为此必选依赖。但咱这里预装过了,所以可以省略。


咱们这是开发环境与运行环境合设场景,所以在环境上执行如下命令安装 OpenCV:


sudo apt-get install libopencv-dev 运行截图:


image.png


提示:这里可能要让你输入 HwHiAiUser 密码,如果你之前没有设置过的话,可以按照如下步骤进行设置:


su - rootpasswd HwHiAiUser 这个过程,按照提示操作即可,运行截图:


image.png


  1. FFmpeg 样例中,FFmpeg 的作用是在输入数据类型为 RTSP 视频流或者离线视频的情况下,进行数据切帧的操作,如果业务不包含输入时 RTSP 视频流或者离线视频的场景,该第三方库实际上并不会被调用,可以不安装此依赖。


但还是介绍下,在咱这开发环境与运行环境合设场景的安装方法,在环境上参考如下命令使用源码编译的方式安装 FFmpeg:

下载并解压缩 FFmpeg 安装包,此处以将 FFmpeg 安装包存储在用户家目录下为例,开发者也可以自定义 FFmpeg 安装包存储路径。

cd ${HOME}wget http://www.ffmpeg.org/releases/ffmpeg-4.1.3.tar.gz --no-check-certificatetar -zxvf ffmpeg-4.1.3.tar.gzcd ffmpeg-4.1.3

安装 ffmpeg

./configure --enable-shared --enable-pic --enable-static --disable-x86asm --prefix=${THIRDPART_PATH}运行截图:


image.png


image.png


下面开始 make 了:


make -j2 # 因为我买的 ECS 是双核,所以这里写 2,具体数值可根据自己的处理器设置 make install 运行截图:


image.png


image.png


  1. PresentAgentPresentAgent 是为了将带有推理结果的图片数据发送到网页进行显示,如果业务场景不存在需要在网页观察推理结果的情况,可以不安装 PresentAgent。由于 PresentAgent 依赖 Protobuf,所以若需要使用 PresentAgent,也要要同步安装 Protobuf。


在咱们的开发环境与运行环境合设场景,参考如下命令使用源码方式安装 Protobuf 以及 PresentAgent:

安装 Protobuf 相关依赖,可省略,咱们的镜像环境已经装过了

sudo apt-get install autoconf automake libtool 运行截图:


image.png

下载 Protobuf 源码,此处以将 Protobuf 存储在用户家目录下为例,开发者也可以自定义 Protobuf 源码的存储路径。

cd ${HOME}git clone -b 3.13.x https://gitee.com/mirrors/protobufsource.git protobuf

编译安装 Protobuf

cd protobuf./autogen.sh./configure --prefix=${THIRDPART_PATH}make cleanmake -j2 # 因为我买的 ECS 是双核,所以这里写 2,具体数值可根据自己的处理器设置 sudo make install

进入 PresentAgent 源码目录并编译,PresentAgent 源码存储在 samples 仓的“cplusplus/common/presenteragent”目录下,此处以 samples 源码存储在用户家目录的 downloads 文件夹下为例

cd {THIRDPART_PATH}/bin/protoc presenter_message.proto --cpp_out=./

编译安装 Presentagnet

cd ..make -j2make install 运行截图:


image.png


  1. AclLiteAclLite 库是对 AscendCL DVPP 图像和视频处理相关接口,AscendCL 设备管理、资源管理、模型推理等接口进行了封装,旨在为用户提供一组更简易的公共接口。本样例是基于 AclLite 接口进行的开发,所以需要下载并编译安装 AclLite 库。但咱这里预装过了,所以可以省略。


如需安装,请参考文档。


模型及数据准备样例运行前,请参见本章节准备样例依赖的模型文件及测试数据文件。


  1. 准备模型模型名称 模型说明 模型下载路径 yolov3 图片检测推理模型。是基于 onnx 的 Yolov5 模型。 请参考 https://gitee.com/ascend/ModelZoo-PyTorch/tree/master/ACL_PyTorch/built-in/cv/Yolov5_for_Pytorch 中的“原始模型”章节下载原始模型网络文件、权重文件以及配置文件。color 车辆颜色分类推理模型。是基于 tensorflow 的 CNN 模型。 请参考 https://gitee.com/ascend/ModelZoo-TensorFlow/tree/master/TensorFlow/contrib/cv/ATC_CarColor_tensorflow_AE 中的“原始模型”章节下载原始模型网络文件。

  2. 模型转换需要将下载的原始模型转换为适配昇腾 AI 处理器的离线 om 模型,并放置到样例代码中的“model”目录下。


为方便操作,此处直接给出了原始模型的下载命令以及模型转换命令,可直接拷贝执行。当然,您也可以参见模型列表中的下载地址中对应的 README 进行手工操作,并了解更多细节。

进入目标识别样例工程根目录,根据实际情况,比如我这里就是根据实际路径

cd $HOME/samples/cplusplus/level3_application/1_cv/detect_and_classify

创建并进入 model 目录

mkdir modelcd model

下载 yolov3 的原始模型文件及 AIPP 配置文件

wget https://modelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/YOLOV3_carColor_sample/data/yolov3_t.onnxwget https://modelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/YOLOV3_carColor_sample/data/aipp_onnx.cfg运行截图如下,可以看到网络速度是真的快啊,OBS 和 ECS 的搭配真是不错。


image.png


下面开始转换模型了:

执行模型转换命令,生成 yolov3 的适配昇腾 AI 处理器的离线模型文件

atc --model=./yolov3_t.onnx --framework=5 --output=yolov3 --input_shape="images:1,3,416,416;img_info:1,4" --soc_version=Ascend310 --input_fp16_nodes="img_info" --insert_op_conf=aipp_onnx.cfg 运行截图:


image.png


接着按照上面的方法,再来一次转换模型:

下载 color 模型的原始模型文件及 AIPP 配置文件

wget https://modelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/YOLOV3_carColor_sample/data/color.pbwget https://modelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/YOLOV3_carColor_sample/data/aipp.cfg

执行模型转换命令,生成 color 的适配昇腾 AI 处理器的离线模型文件

atc --input_shape="input_1:10,224,224,3" --output=./color_dvpp_10batch --soc_version=Ascend310 --framework=3 --model=./color.pb --insert_op_conf=./aipp.cfg 运行截图:


image.png


感觉转个模型转换,对 CPU 要求较高,咱这双核有点慢。


  1. 准备数据样例编译时会自动下载测试数据,无需手工下载。


若您想自行下载测试数据,可参见如下命令:


wget https://modelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/YOLOV3_carColor_sample/data/car1.mp4 --no-check-certificatewget https://modelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/YOLOV3_carColor_sample/data/car2.mp4 --no-check-certificatewget https://modelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/YOLOV3_carColor_sample/data/car1.jpg --no-check-certificate 样例数据下载完后请存储在样例工程的 data 目录下。


样例编译运行请确认之前的环境及模型、数据准备完成。


  1. 在通用目标识别样例工程的根目录下执行以下命令,进行样例编译。cd scriptsbash sample_build.sh 很遗憾,报错了,报错信息如下图所示:


image.png


看这报错,应该是没有找到相应的函数或属性,应该是我们的 AclLite 没安装编译,因为当时镜像已经预装了,便直接用了,看来不行啊,那么下面安装一下吧。


以下操作均在安装用户 HwHiAiUser 下进行,在咱们的开发环境与运行环境合设场景下,先进入 acllite 目录,这里要根据实际目录操作哦:


cd ${HOME}/downloads/samples/cplusplus/common/acllitemakemake install 运行完成截图:


image.png


好了,这次返回通用目标识别样例工程的根目录下,再来试试:


bash sample_build.sh 果然,编译成功了!如下图所示:


image.png


编译完成后,会在 out 文件夹下生成可执行文件 main。


  1. 修改 scripts 目录下的 params.conf 文件,配置样例的输入数据类型及结果展示类型。[base_options]device_num=1 // Device 数量


[device_0_options] //Device0 的配置参数 inputType_0=pic // Device0 的输入数据类型 outputType_0=pic // Device0 的输出数据类型 inputDataPath_0=../data/pic // Device0 的输入数据路径


#outputFrameWidth_0=1280 //outputType_0 为 video 时,需要配置此参数,代表输出视频的宽 #outputFrameHeight_0=720 //outputType_0 为 video 时,需要配置此参数,代表输出视频的高


#[device_1_options] //Device1 的配置参数 #inputType_1=video#outputType_1=presentagent#inputDataPath_1=../data/car2.mp4#outputFrameWidth_1=2368#outputFrameHeight_1=1080


.......参数说明:


device_num,表示运行此样例的 Device 数量,device_X_options 表示每一个 Device 上的配置,其中 X 为 Device ID。需要注意,device_num 的优先级高于 device_X_options 的个数,例如,若 device_num 配置为 1,但配置了两个 Device 的详细信息,即 device_0_options 与 device_1_options,那么实际生效的只有 device_0_options,若 device_num 配置为 2,则 device_0_options 与 device_1_options 都会生效。


inputType_X,表示 DeviceX 的输入数据类型,其中 X 为 Device ID,此参数当前支持的配置项有:


pic:表示输入数据为图片,当前此样例支持的图片格式为 JPEG 压缩图片 video:表示输入数据为 MP4 视频文件 rtsp:表示输入数据为 rtsp 流 outputType_X,表示 DeviceX 的输出数据类型,其中 X 为 Device ID,此参数当前支持的配置项有:


pic:表示输出结果为图片 video:表示输出结果为 MP4 视频文件 presentagent:表示用 PresentAgent 展示推理结果 inputDataPath_X:表示 DeviceX 的输入数据路径,其中 X 为 Device ID,此参数的配置规则如下:


若输入数据类型是图片,则填写图片所在文件夹的相对路径,只支持填入一个路径若输入数据类型是 mp4 视频文件,则填写视频文件的相对路径,只支持填入一个路径若输入数据类型是 rtsp 流,则填写 rtsp 流地址,只支持填入一个地址咱们这里就暂时不做任何修改了。


  1. 注意事项若输出类型配置的为“presentagent”,运行可执行文件前您需要参考此步骤启动 PresentServer,若配置的其他输出类型,则此步骤可跳过。


配置 PresentServer 配置文件“present_start.conf”,配置文件参数如下:


在通用目标识别样例根目录下执行如下命令打开配置文件:


cd scriptsvim present_start.conf 配置文件如下所示:


[present_serer_options]

A socket server address to communicate with presenter agent

presenter_server_ip=192.168.1.2

The port of presenter agent and server communicate with

presenter_server_port=7006


#the ip in presenter server view web urlpresenter_view_ip=192.168.1.2


#view entry label in presenter server view webchannel_name=multi_videos


#the data type that send to presenter server from agent, 0:image, 1:videocontent_type=1


[display]display_channel=0 其中 presenter_server_ip 为数据发送 IP,presenter_view_ip 为网页展示 IP,两者的 IP 需要保持一致,配置参考如下:对于 Atlas 200 DK 开发者板,请填写 Atlas 200 DK 的与 windows 主机通信的 IP 地址即可,例如“192.168.1.2”对于 Atlas 300 加速卡(例如,ai1s 云端推理环境),请填写 ai1s 的内网 IP 地址。presenter_server_port:PresenterServer 的访问端口,请配置为 PresentAgent 的默认端口号 7006 即可。启动 PresentServer 服务。


在通用目标识别样例根目录下执行如下命令启动 PresentServer:


cd displaybash run_presenter_server.sh ../scripts/present_start.conf 其中 run_presenter_server.sh 为 PresentServer 的启动脚本,present_start.conf 为上一步骤中修改的 PresentServer 的配置文件。其中 PresentServer 后,界面会提示 PresentServer 服务所使用的 IP 地址及端口号。


访问 PresentServer 展示界面。


在 windows 系统中通过浏览器访问 PresentServer 网页界面。


对于 Atlas 200 DK 开发者板,请使用启动 PresenterServer 服务时提示的 URL 访问即可。对于 Atlas 300 加速卡(例如,ai1s 云端推理环境):以内网的 IP 地址为“192.168.0.194”,公网的 IP 地址为“124.70.8.192”进行举例说明。启动 PresentServer 服务时提示“Please visit http://192.168.0.194:7009 for display server”,用户需要将提示 URL 中的内网 IP 地址“192.168.0.194”替换为公网 IP 地址“124.70.8.192”进行访问,即需要访问的 URL 为“http://124.70.8.192:7009”。等待 PresentAgent 传输数据给服务端,单击“Refresh“刷新,当有数据时相应 Channel 的 Status 会变成绿色。


然后单击右侧对应的 View Name 链接,查看结果。


说明 :PresentServer 当前仅支持显示前四路,如果业务有修改展示路数的需要,除代码开发适配外,还需要对网页 UI 代码进行修改:


修改文件:


display/presenterserver/display/ui/templates/view.html


核心代码:image.png


  1. 运行样例。cd ../out./main 运行报错了,如图所示:


image.png


看看这个报错:


[ERROR] The ../data/car1.mp4 is inaccessible 应该是输入的视频../data/car1.mp4 没找到,我去看了一下,还真没有,甚至都没有 data 文件夹,看来代码并没有自己下载啊,那咱们还是先回到前面,修改下 scripts/params.conf 吧,先来看看该文件的内容:


image.png


哦,应该就是没有自动下载,那就先建个 data 文件夹,下载几张图片,在通用目标识别样例工程的根目录下执行:


mkdir datacd datawget https://modelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/YOLOV3_carColor_sample/data/car1.mp4 --no-check-certificatewget https://modelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/YOLOV3_carColor_sample/data/car2.mp4 --no-check-certificatewget https://modelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/YOLOV3_carColor_sample/data/car1.jpg --no-check-certificate 运行完成截图:


image.png


咱们顺便看看下载的这三个文件吧!不过很抱歉的是,视频展示有点 Bug,请大家海涵。


car1.mp4


car2.mp4


car1.jpg 如下图所示:


car1.jpg


下面我们来试试 PresentServer 展示,这时候要配置一下,请参考之前的 3 注意事项部分:


咱们这利用的是 ECS,需要在配置里填写 ai1s 的内网 IP 地址。可在 ECS 的服务台找到,如图所示:


image.png


之后要启动 PresentServer 服务:


cd displaybash run_presenter_server.sh ../scripts/present_start.conf 启动后,界面会提示 PresentServer 服务所使用的 IP 地址及端口号。


image.png


接下来就访问看看,不过咱们用的是 ECS,假设内网的 IP 地址为“192.168.0.194”,公网的 IP 地址为“124.70.8.192”。若启动 PresentServer 服务时提示“Please visit http://192.168.0.194:7009 for display server”。


则需要将提示 URL 中的内网 IP 地址“192.168.0.194”替换为公网 IP 地址进行访问,即需要访问的 URL 为“http://124.70.8.192:7009”。


image.png


如果你遇到无法访问的情况,请修改下安全组入方向的安全规则,我全部放行了(不建议这样做,这样对服务器来说不安全),就能显示了,当然,也可能是网络的延迟,等一会可能就行。


下面还是照例修改 scripts 目录下的 params.conf 文件,这里先测试下图片哈:


[base_options]device_num=1


[device0_options]inputType_0=pic #pic ; video ; rtspoutputType_0=presentagent #pic ; video ; presentagentinputDataPath_0=../data/car1.jpgoutputFrameWidth_0=1280outputFrameHeight_0=720


#[device1_options]#inputType_1 = video#outputType_1 = presentagent#inputDataPath_1=../data/car2.mp4#outputFrameWidth_1=2368#outputFrameHeight_1=1080 之后运行:


cd ../out./main 可以看到运行成功,但是还是没有显示,可能是一张图片不行?下面试试视频。


image.png


换成视频,照例修改 scripts 目录下的 params.conf 文件,这里先测试下图片哈:


[base_options]device_num=1


[device0_options]inputType_0=video #pic ; video ; rtspoutputType_0=presentagent #pic ; video ; presentagentinputDataPath_0=../data/car1.mp4outputFrameWidth_0=1280outputFrameHeight_0=720


#[device1_options]#inputType_1 = video#outputType_1 = presentagent#inputDataPath_1=../data/car2.mp4#outputFrameWidth_1=2368#outputFrameHeight_1=1080 之后再运行:


cd ../out./main 好消息,这次没问题了,而且速度很快,FPS 在 30 左右,这时候我们输入的是 car1.mp4(1920 * 1080, 30FPS),设置的输出应该是(1280 * 720),这个性能很强啊:


image.png


对了,如果最开始没有,别担心,刷新一下,当下图中绿圈“√”出现时候,点击右侧的 multi_videos 就会跳转了,就能看了:


image.png


下面试试 car1.mp4(2368 * 1080, 30FPS),输出大小不变,此时 scripts 目录下的 params.conf 文件配置如下:


[base_options]device_num=1


[device0_options]inputType_0=video #pic ; video ; rtspoutputType_0=presentagent #pic ; video ; presentagentinputDataPath_0=../data/car2.mp4outputFrameWidth_0=1280outputFrameHeight_0=720


#[device1_options]#inputType_1 = video#outputType_1 = presentagent#inputDataPath_1=../data/car2.mp4#outputFrameWidth_1=2368#outputFrameHeight_1=1080 运行结果:


image.png


不得不说,真是太强了,速度几乎没变化,FPS 仍在 30 左右,说明输入阶段的视频解码和处理很强,应该是 DVPP + AIPP(应该是用于色与转换)的功劳,牛啊!


最后奉上 Ascend 310 的硬件情况,AI Core 的利用率很高,稳定在 68%左右,此时功耗大概 12.8W,不过这个功耗很稳定,这个运行期间没什么变化,大约占了 1GB 的 Memory 吧,硬件资源占用不大,且利用率高,昇腾果然很强。


image.png


结语整体体验还是很流畅的,华为云弹性云服务器 ECS 还真挺好用的,大大减轻了我本地的硬件资源要求,让我可以轻松方便体验到昇腾的强大算力,随时随地都能开发,只要有网络即可,搭配镜像使用就更完美了,这次基于共享镜像创建环境非常快,不用重复配置,直接进入开发,可以想象,如果是团队协作开发,效率一定很高,不过最后无法展示有点遗憾,期待更新代码,完善功能。


如果需要开发新的应用,可以很轻松的在此基础上进行改进和优化,官方给了非常详尽的保姆级的教程,手把手教你进行模型替换和开发自己的应用,特别详细,可以想象官方工程师做了很多努力和工作,详细的文档让人赏心悦目,真是把简单留给开发者,把困难留给自己了。


道阻且长,未来可期,期待昇腾 AI 以向上之力,持续推动人工智能产业生态的建设和发展,构建万物 AI 的美好世界。

用户头像

sofiya

关注

还未添加个人签名 2022.08.01 加入

还未添加个人简介

评论

发布
暂无评论
基于华为云ECS的目标检测与识别的昇腾AI开发体验【华为云至简致远】_sofiya_InfoQ写作社区