本文作者是本屆 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 等應用開發。
當然做起來這一套系統還需要大量的人力物力投入,也需要更多的系統設計和開發,道阻且長。