共计 4913 个字符,预计需要花费 13 分钟才能阅读完成。
本文作者是本届 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 等利用开发。
当然做起来这一套零碎还须要大量的人力物力投入,也须要更多的零碎设计和开发,道阻且长。