开发者实践丨Agora Home AI 音视频的未来
阅读原文时间:2023年07月10日阅读:2

本文作者是本届 RTE 2021 创新编程挑战赛获奖者,来自上海交通大学的李新春。他分享了本次参赛作品的构思、系统设计和开发的心得。

01 不得忽略的背景

从国家层面上讲,十四五期间我国人工智能发展的方向之一是:基于 AI 硬件的新产品设计及平台将成为主流。当前,人工智能解决方案正由“软件”模式转变为“软件+硬件”模式。随着智能计算芯片与系统、新型多元智能传感器件与集成平台等新一代人工智能基础支撑平台日渐成熟。以 AI 硬件为基础,在“端+云+芯片”协同发展的背景下,产品的感知、理解、推理和决策能力将实现突破。

从企业发展来说,AI 技术正越来越多的应用的社会的各个方面,从基础的人脸识别到无人驾驶,无论是机器学习还是深度学习虽然是弱人工智能时代,但已经足够让人们的生活产生明显的影响。因而,依托企业应用实践,结合人工智能的发展方向,打造出独具特色的人工智能产品是值得探索战略方向。

02 本项目缘起

因本人一直从事技术领域相关工作,从 AR、VR 到现在的 AI。在不断的工作实践中积累经验,也在不断思考未来技术如何改变生活,所谓人工智能,在现阶段的应用主要的几个方面如工厂生产、生活服务、社会治理等等,各个领域互相独立,有自己独特的算法和模型,那是不是可以做一套云平台,接入各种音视频进行实时分析并反馈,形成一套 AI 云服务平台?因此,本次参赛的出发点就是形成一套可行的应用实践,并提出一种云上 AI 平台的系统架构。

03 系统构成

在本次项目中采用了 YOLO V3 作为基础算法识别引擎,采用声网Agora 的音视频传输作为智能终端的数据来源,采用开源硬件 NodeMcu 及其配套作为智能硬件终端代表,最终形成在家庭局域网内的智能家居平台。

YOLO V3:是 YOLO(You Only Look Once)系列目标检测算法中的第三版。在这一版本中提升了对小目标的识别性能,同时速度得到更好的提升。目前该算法已经更新到 V5 版本,在速度和识别结果上有大幅提升。简单的说,该算法能够达到实时得识别数据,识别精度也满足基本要求,同时在配置、使用和学习上成本较低。

Agora SDKs:在本项目中使用到声网提供的两款 SDK,RTC 实时音视频通信主要功能是进行实时视音频的传输,RTM云信令提供高效、高并发的实时消息,这两款 SDK 兼容 iOS、Android、Windows、macOS、Web、小程序等 20 多个开发平台,可以方便的进行拓展和多平台交互开发。同时对于注册用户,每个月均有 10000 分钟的免费时长,这对于普通开发者完全可以满足日常需求,并且实测在 4G 网络的情况下端到端延迟<400ms,开发测试也是十分良好的体验。

智能硬件:项目中实际上应用包括智能小车控制的 Node MCU 和音视频传输的终端(树莓派Android things等)因为手头的终端性能太差,故开发采用旧手机作为智能硬件控制终端,通过局域网对家庭内的所有智能硬件设备进行综合管理。

开发环境:因为项目使用了机器学习算法,所以对设备还是有点要求,目前本人的开发环境如下:

硬件环境:

  • CPU:I7 9700K

  • GPU:GTX1050TI

  • 内存:16G,500SSD

软件环境:

  • VS2015

  • Arduino IDE

  • Unity 3D 2019.2

04 系统设计

平台初步规划以家居的只能 AI 项目应用,通过家庭笔记本、网络监控摄像机、智能硬件设备、物联网终端设备、Agora 音视频平台等构建一套在家庭范围内可用的智能管理平台。接入智能硬件设备、实时音视频通信、实时信令控制等主要功能,完成从设备管理到事件处理的完整逻辑。

平台功能:平台引入 YOLO V3 并进行封装,以满足在 Unity3D 中实时调用进行识别的需求;调整 Agora 音视频传输脚本,将回调的视频图片进行实时识别,并输出识别事件;构建 Agora 信令消息群组,进行智能硬件控制;使用 Unity Charts 进行数据的展示和分析。

设备管理:随着智能设备性能提升和网络的快速发展,以音视频为基础的智能硬件正快速发展,对于各种设备接入,建议通过专门的设备管理中心进行数据对接,而对于AI管理平台只需要对接梳理好的各类硬件设备,从而进行解耦。目前家居管理平台主要以视频管理为主,支持多种视频监控接入:Agora 视频流、Web 摄像头、HTTP 视频流(HLS)、视频文件等。

AI 算法:系统采用开源 YOLO V3 算法进行各种视频数据的处理。除此之外,各种人工智能识别算法均可以进行接入。当然需要解决在 Unity 中的调用和数据反馈问题。当前家居管理平台通过对 YOLO V3 的封装,支持 C#、C++ 调用;当前项目支持基础 80 种物体识别(自带)、安全帽识别(网络下载)、冰球识别(自定义)等均可以在 github 项目中下载得到,替换同名文件即可实现不同种类识别。

模型构建:如上所述,当前平台已经支持 YOLO 基础 80 种物体识别、安全帽识别、冰球识别,依照 YOLO V3 进行自主训练的模型,均可以在本项目中执行,极大减少了程序开发的难度。

硬件控制:当前采用声网提供的云信令进行远程设备控制,通过构建群组房间进行家居环境下的消息实时通信,支持通过自定义协议进行智能硬件的控制,对于一些智能硬件爱好者,可能只需要一个脚本即可接入到本平台的系统中。

事件处理:采用 Agora 云信令,在构建的家居智能管理群组中发送不同的识别消息和控制命令,通过即时消息发送给移动端用户以及智能设备。支持在线消息、离线消息,让用户任何时候都不错过消息。

移动应用:本项目中,采用 Agora 音视频直播和云信令功能,让用户在接收消息的同时进行对智能硬件进行实时控制,如控制开关、摄像头旋转等。同时,因为 Agora 有很好的可扩展性和封装性,可以对应用系统进行解耦,方便用户进行各模块的分离编程,提升系统可用性。

05 系统开发

相对与去年 Agora 更新发布了针对 Unity3D 的 RTM 即时通信 SDK,同时开发者平台在专业的管理运营下也越来越丰富,同时对于 Unity 3D 开发的支持也在不断完善,出现了很多教程和示例以及丰富的开发文档。

在本次开发中,因为要对 Agora 本身的视频进行图像识别,在 VideoSurface.cs 脚本上进行修改:

//调用yolo封装过的sdk,detectedCallback是托管函数,对回调数据进行处理
var container = RTCGameManager.rtcYoloManager.GetYolo().Detect(nativeTexture.EncodeToJPG());
if (detectedCallback != null)
{
detectedCallback.Invoke(new DeviceItem(), container, nativeTexture,width, height);
}

因为使用了 YOLO 机器学习框架,项目还涉及大量的 C++ 开发,除了 YOLO V3 的配置、学习、数据训练还有 C++ 与 C# 的数据通信,为了能使 Unity 3D 顺利调用 YOLO 也是费了很大力气,在工程源码中封装了 YoloWrapper 可以对封装的 DLL 进行调用。

yolo V3 封装
这一阶段使用AlexeyAB在Windows上配置Yolo V3并实现运行和视频识别
目前系统封装了如下主要函数

//定义C#的Debug函数,方便调试
typedef void(*FuncPtr)(const char *);
//传入Debug托管函数
extern "C" YOLODLL_API void set_debug(FuncPtr fp);
//传入是否展示Opencv渲染输出
extern "C" YOLODLL_API void set_show(bool s);
//测试callback
extern "C" YOLODLL_API void test(char* s);
//仅能使用NEt视频流,Web视频流的识别
extern "C" YOLODLL_API bool detect_net( char* filename, char* type, float thresh , bool use_mean);
//配合上一函数使用
extern "C" YOLODLL_API int update_tracking(uchar* data, bbox_t_container &container,int &w,int &h);
//辅助色彩转换函数
extern "C" YOLODLL_API int bgr_to_rgb(const uint8_t* src, const size_t data_length, uchar* des);
//辅助大小转换(图片太大时候使用)
extern "C" YOLODLL_API int resize(const uint8_t* src, const size_t data_length, int w, int h, uchar* des);
//初始化,传入Yolo v3cfg、weights等
extern "C" YOLODLL_API int init(const char *configurationFilename, const char *weightsFilename, const char* names, int gpu);
//识别单张图片文件
extern "C" YOLODLL_API int detect_image(const char *filename, bbox_t_container &container);
//识别单张图片文件bytes
extern "C" YOLODLL_API int detect_mat( uint8_t* data, const size_t data_length, bbox_t_container &container, float thresh, bool use_mean);
//关闭系统
extern "C" YOLODLL_API int dispose();

在智能硬件控制方面本次采用的是开源硬件 NodeMCU,虽说是硬件,但是经过封装之后,采用 C++ 的编程习惯可以顺利的进行端口控制和数据交互,在本次项目中采用舵机控制进行摄像机的转向,通过马达对小车进行运动控制,通过超声波进行避障控制。

//loop函数,循环检测前方是否有障碍物,同时处理服务器
void loop() {
//超声波测距
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = ((duration/2) / 29.1);
if(disLeng<3){
disAvg[disLeng]=distance;
disLeng++;
}else{
disAvg[0]=disAvg[1];
disAvg[1]=disAvg[2];
disAvg[2]=distance;
}
// 距离控制,过近则停止运动
if((disAvg[0]+disAvg[1]+disAvg[2])/3<10){
stop_motors();
}
delay(50);
//处理服务器响应
server.handleClient();
delay(50);
}

最终,项目经过一个多月的开发,形成初步可演示系统。期望借助 Agora 挑战赛的平台,集合小伙伴们的力量,一起丰富扩展这个平台,也期望能为各领域开发者提供一些新的想和和实践。

06 写在最后

关于本次项目:项目目前只是本地 AI 识别 + Agora 音视频平台 + 云信令消息通信 + 智能硬件形成的一个小型综合管理平台,而对于这个平台的最终形态应该是:

  • 云服务 AI 识别中台、可配置模型算法库、完善的事件处理流程。

  • 云服务设备管理平台,对接入的各类硬件传感设备进行综合管理、数据输入输出。

  • 智能生态:以 Agora 音视频、云信令等开发 APP 应用于机顶盒、居家机器人、监护设备,以智能硬件等进行家居设备如烟感、红外、一键 SOS 等应用开发。

当然做起来这一套系统还需要大量的人力物力投入,也需要更多的系统设计和开发,道阻且长。