近年來,自動駕駛一直是人工智能領(lǐng)域最熱門的場景之一,可以落地到物流、共享出行、公共交通、環(huán)衛(wèi)、港口碼頭、礦山開采、零售等眾多領(lǐng)域。
在2019年華為云人工智能大賽·無人車挑戰(zhàn)杯賽道中,來自上海交通大學(xué)的“SRC”戰(zhàn)隊,借助華為云一站式AI開發(fā)與管理平臺ModelArts及HiLens端云協(xié)同AI開發(fā)應(yīng)用平臺,進行無人車模型開發(fā)與部署,最終奪冠。
2020年2月11日-12日,華為開發(fā)者大會2020(Cloud)將在深圳舉辦。會上,除了Keynote、技術(shù)論壇、展區(qū)、熱門開源項目、創(chuàng)新大賽、Startup對接會等一系列豐富的活動,開發(fā)者還可以親自參與Codelabs環(huán)節(jié),動手體驗 “零代碼完成自動駕駛AI模型開發(fā)”、“自動駕駛場景海量數(shù)據(jù)的AI模型訓(xùn)練和部署”、“交互式開發(fā)調(diào)試自動駕駛AI模型代碼”等內(nèi)容,輕松get更多自動駕駛場景AI開發(fā)技能。
“SRC”戰(zhàn)隊撰文分享其參賽體驗,包括無人車的圖像識別,多維數(shù)據(jù)處理及行駛控制的能力等。
一、背景介紹
華為云人工智能大賽·無人車挑戰(zhàn)杯總決賽主要賽點包括:實現(xiàn)交通燈識別、環(huán)島行駛、U形彎道行駛、靜態(tài)/動態(tài)障礙物避障,并準確識別停車位標示進行泊車。在總決賽中,小車不僅僅要完成所有的賽點,還要跑得快。在比賽規(guī)則中,還要一個時間加分項,若40s內(nèi)跑完全程,則可以獲得此項得分。
無人車挑戰(zhàn)杯是在智能小車的基礎(chǔ)上,結(jié)合華為云人工智能平臺(華為云ModelArts一站式AI開發(fā)與管理平臺、HiLens端云協(xié)同AI開發(fā)應(yīng)用平臺),全面鍛煉和提高賽隊的AI解決方案能力及無人駕駛編程技巧的賽事,比賽用車由上海交大學(xué)生創(chuàng)新中心智能制造實驗室自主研發(fā)。
二、整體解決方案
在無人車比賽中,有著兩個非常重要的傳感器:相機及激光雷達。相機主要用于交通標志牌和交通信號燈的識別,激光雷達則用于避障及路徑規(guī)劃。在無人駕駛領(lǐng)域,相機和激光雷達的復(fù)合解決方案也逐漸成為了技術(shù)主流。激光雷達的點云數(shù)據(jù)流可以由工控機處理,這一部分的技術(shù)也比較成熟,github、gitlab等開源平臺也有一些非常棒的基于ROS的激光slam項目,此文就不再贅述;對于涉及到深度學(xué)習的圖像數(shù)據(jù)流的處理,傳統(tǒng)工控機顯得有些力不從心。首先模型部署流程比較復(fù)雜,模型推理需要安裝必要的依賴庫,這些庫的配置在傳統(tǒng)工控機上并不容易,尤其是具有arm架構(gòu)的工控機;最重要的是對于無人駕駛這樣的高速實時系統(tǒng),模型推理的速度是最為關(guān)鍵的,HiLens針對神經(jīng)網(wǎng)絡(luò)進行了優(yōu)化,在模型的推理上有著得天獨厚的優(yōu)勢。

三、華為云ModelArts平臺的使用
3.1 識別任務(wù)
交通信號燈的識別主要分為紅燈、左轉(zhuǎn)燈和右轉(zhuǎn)燈的識別;交通標志牌主要分為P1、P2兩個停車位的識別。本文使用華為云平臺ModelArts進行模型訓(xùn)練。
3.2 網(wǎng)絡(luò)框架
在選擇深度學(xué)習框架時,盡管tensorflow和pytorch是目前學(xué)術(shù)界的兩大主流,但caffe在工業(yè)設(shè)備上進行部署要更加方便,因此選擇了caffe。ModelArts是華為云智能計算平臺。目前,ModelArts notebook中提供了官方1.0版本的Caffe引擎,我們基于Caffe使用SSD算法開發(fā)交通信號燈和標志牌檢測模型,并使用了ModelArts notebook自帶的terminal來編譯安裝caffe-ssd。

3.3 模型處理流程
(1)下載OBS Browser,配置OBS桶,將原始采集數(shù)據(jù)上傳至OBS桶內(nèi)。
對象存儲服務(wù)(Object Storage Service)是一款穩(wěn)定、安全、高效、易用的云存儲服務(wù),具備標準Restful API接口,可存儲任意數(shù)量和形式的非結(jié)構(gòu)化數(shù)據(jù)
對象存儲服務(wù)OBS配置說明文檔:https://support.huaweicloud.com/obs/index.html
OBS控制臺說明文檔:https://support.huaweicloud.com/usermanual-obs/obs-usermanual-zh.pdf、
(2)在ModelArts中打開已經(jīng)編譯好caffe-ssd的notebook,使用支持OBS文件系統(tǒng)的華為自研的分布式訓(xùn)練加速架構(gòu)MoXing文件操作來訪問上傳至OBS桶內(nèi)的原始數(shù)據(jù),并在notebook中做數(shù)據(jù)清洗及數(shù)據(jù)增強,并將處理好的數(shù)據(jù)返回至OBS桶。
如移動一個文件:mox.file.copy('s3://bucket_name/obs_file.txt','s3://bucket_name/obs_file_2.txt')
MoXing文件操作:
https://github.com/huaweicloud/ModelArts-Lab/blob/master/docs/moxing_api_doc/MoXing_API_File.md
(3)進入ModelArts平臺的數(shù)據(jù)標注模塊,創(chuàng)建數(shù)據(jù)集,選擇物體檢測,添加標簽集。既可以選擇手動標注,也可以在手動標注一部分后選擇智能標注,最終再修改確認智能標注。當數(shù)據(jù)集較大的時候,智能標注可以有效降低數(shù)據(jù)集標注的工作量。最終發(fā)布數(shù)據(jù)集。目前已經(jīng)支持標注團隊進行合作標注。

(4)利用moxing文件系統(tǒng)訪問OBS獲取帶有標簽的數(shù)據(jù)集文件,劃分訓(xùn)練集和測試集,修改標簽文件labelmap_voc.prototxt,注意0默認是留給背景的,將數(shù)據(jù)集轉(zhuǎn)換為caffe所需要的LMDB格式的數(shù)據(jù)集,并打包配置文件上傳至OBS
(5)準備訓(xùn)練腳本,創(chuàng)建訓(xùn)練作業(yè),在訓(xùn)練的過程中查看訓(xùn)練日志,觀察是否存在異常。
(6)利用caffe-ssd下自帶的模型推理文件進行模型推理,計算模型的準確率。
利用ModelArts的模型轉(zhuǎn)換功能將.caffemodel轉(zhuǎn)換至.om模型,需要注意的是需要將deploy.prototxt的輸出type轉(zhuǎn)化為HiLens上的昇騰支持的算子SSDDectectionOutput,即可部署至HiLens的設(shè)備上。
3.4 訓(xùn)練過程及初步結(jié)果
在使用ModelArts進行模型訓(xùn)練時,為探究數(shù)據(jù)集的合適大小,訓(xùn)練過程是否發(fā)生過擬合。團隊試探性地采取了2929張圖像利用SSD進行了訓(xùn)練,得到了初步的損失值變化和準確率變化。在ModelArts自帶的jupyter notebook中進行模型推理,將訓(xùn)練日志log中推理的結(jié)果可視化。

下面是我們團隊訓(xùn)練SSD的超參數(shù)。

從損失值變化和準確變化可以看出,準確率比較低,同時損失值的變化較小,證明模型質(zhì)量較低;對于光照、背景與訓(xùn)練集差異較大的測試圖片效果比較差,證明數(shù)據(jù)集采樣不夠多樣化;迭代批次在5萬次左右發(fā)生了過擬合現(xiàn)象,證明數(shù)據(jù)集中圖片數(shù)量不夠。為解決這些問題,在數(shù)據(jù)采樣時盡量使背景多樣性和光照多樣性;同時對數(shù)據(jù)集進行了數(shù)據(jù)增強,將數(shù)據(jù)集擴充至10381張。對數(shù)據(jù)集的標注,我們將數(shù)據(jù)集分為多個數(shù)據(jù)集,利用ModelArts的數(shù)據(jù)集標注功能按照統(tǒng)一的規(guī)則生成統(tǒng)一xml格式的標注文件。ModelArts提供了在線手動標注和智能標注兩種模式。
3.5 基于自動搜索的數(shù)據(jù)增強方案
傳統(tǒng)的數(shù)據(jù)集擴增是隨機圖像變換的,以其為代表的是keras中數(shù)據(jù)集自動擴增的API,這樣的數(shù)據(jù)增強是沒有目的性的,在圖像重復(fù)比例較大的數(shù)據(jù)集中效果不夠明顯,并不能有效解決由于數(shù)據(jù)量較少帶來的模型過擬合問題。本文采用了在cifar100上表現(xiàn)比較優(yōu)秀的基于強化學(xué)習的數(shù)據(jù)增強算法。該論文提供了利用強化學(xué)習在數(shù)據(jù)增強中進行自動搜索改進的數(shù)據(jù)擴充方法。
論文中每個操作都是圖像處理功能(圖2),如平移旋轉(zhuǎn)和剪切,以及應(yīng)用該操作的概率和變換幅度,將兩個不同操作組合為一個子策略、5個子策略組成一個策略、若干個策略共同形成一個搜索空間。針對經(jīng)典的數(shù)據(jù)集(如CIFAR-10, CIFAR-100, SVHN, and ImageNet)使用智能搜索算法在搜索空間中找到更好的增強策略,當默認數(shù)據(jù)集的分布符合高斯分布的情況下,得到的較好的增強策略在一般的數(shù)據(jù)集有更好的算法魯棒性。
筆者還曾經(jīng)嘗試過用對抗神經(jīng)網(wǎng)絡(luò)GAN生成圖像來做數(shù)據(jù)增強,若感興趣的開發(fā)者也可以嘗試。如有興趣的同學(xué),也可以進行嘗試。本文中提到的數(shù)據(jù)增強算法來源于參考文獻:
*AutoAugment: Learning Augmentation Strategies from Data :https://arxiv.org/pdf/1805.09501.pdf
基于智能搜索算法的自動數(shù)據(jù)增強大大提升了單個圖像的增強效果,小樣本條件下有利于模型的快速收斂。
對擴增后的數(shù)據(jù)集進行訓(xùn)練。

新的數(shù)據(jù)集2在相同的迭代批次上表現(xiàn)效果要明顯好于原數(shù)據(jù)集1;使模型準確率顯著提高至92.45%,得到了不同的模型。使用了集成學(xué)習,將五個模型進行融合得到了95.01%的識別效果


四、端云協(xié)同AI開發(fā)應(yīng)用平臺HiLens的使用
4.1 HiLens的通信
HiLens的使用需要經(jīng)歷網(wǎng)絡(luò)連接、設(shè)備注冊、模型導(dǎo)入、技能創(chuàng)建、技能部署、技能查看和結(jié)果演示等七個步驟。其中在網(wǎng)頁端進行模型導(dǎo)入是HiLens和ModelArts平臺交匯的接入口;技能創(chuàng)建是使用華為HiLens平臺最為關(guān)鍵的步驟之一,可以有很靈活地方式來利用媒體數(shù)據(jù)處理函數(shù)和神經(jīng)網(wǎng)絡(luò)模型來實現(xiàn)目標功能。

在使用HiLens Kit之前,需要開通HiLens服務(wù)。首先注冊華為云賬號,并完成實名認證,接著進入控制臺選擇登錄HiLens管理控制臺,完成HiLens的權(quán)限申請。
(1)連接PC與HiLens,并注冊新設(shè)備。
通過PC 與 HiLens Kit 組網(wǎng)后,通過web可以界面化地登錄到HiLens Kit 管理平臺,進行一鍵式操作鏈接無線網(wǎng)絡(luò)。Windows平臺SSH聯(lián)通HiLens后,若能夠ping通網(wǎng)絡(luò),則表明HiLens能夠正常訪問外網(wǎng)。。需要注意的是HiLens節(jié)點必須在北京4,設(shè)備狀態(tài)為在線狀態(tài)時表明該設(shè)備在此賬號上完成了設(shè)備注冊。同時需要實現(xiàn)工控機同HiLens Kit的連接
(2) HiLens Kit同工控機聯(lián)通
將HiLens Kit的消息通過Python Flask后端框架發(fā)送至工控機上面,在工控機上面運行接收程序,可接收HiLens Kit發(fā)送的檢查消息。如下圖所示,分別是Windows和Ubuntu系統(tǒng)的頁面。

無人車項目中我們并未采取http通信協(xié)議進行傳輸,而是socket通信。Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組接口。在設(shè)計模式中,Socket其實就是一個門面模式,它把復(fù)雜的TCP/IP協(xié)議族隱藏在Socket接口后面,對用戶來說,一組簡單的接口就是全部,讓Socket去組織數(shù)據(jù),以符合指定的協(xié)議。Socket通信分為基于TCP和基于UDP兩種。TCP協(xié)議是基于連接的協(xié)議,需要先建立可靠的連接,而UDP不需要事先建立可靠的鏈接,而是直接把數(shù)據(jù)包發(fā)送出去,是不穩(wěn)定的連接。對于無人車環(huán)境中,客戶端比較少又需要穩(wěn)定可靠的傳輸?shù)那闆r,采取了穩(wěn)定可靠的基于TCP協(xié)議的Socket雙工通信。在無人車項目中,我們使用了不止一個訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)模型。單向傳輸時(例程代碼),若算法設(shè)計為依次運行多個模型,會帶來不必要的時間、算力開銷。雙向傳輸時(socket),工控機可以請求HiLens Kit運行特定的模型,執(zhí)行特定的功能,從而大大減少了復(fù)雜場景下HiLens Kit頻繁運算導(dǎo)致的開銷。Socket的使用讓HiLens Kit與工控機的通信更加靈活準確。后續(xù)了解到通過post接口可以與HiLens Kit進行雙向通信,更加方便于算法編排和優(yōu)化。
4.2 多模型多任務(wù)的Skill開發(fā)
添加已經(jīng)訓(xùn)練好的技能.在訓(xùn)練好的技能是識別跟蹤目標的AI應(yīng)用,此處要自身根據(jù)算法(交通轉(zhuǎn)向燈、泊車標識等)。點擊圖上的新建技能創(chuàng)建自己的技能。
在新建技能頁面,填寫基本信息和技能內(nèi)容,OS平臺選擇Linux,選擇轉(zhuǎn)換好的所需模型, 函數(shù)執(zhí)行入口要與代碼中名稱相對應(yīng)。將main.py的內(nèi)容復(fù)制在代碼編輯區(qū)內(nèi)。將新建的技能部署至HiLens Kit設(shè)備,然后啟動技能即可。

在無人車項目中,我們團隊一共開發(fā)了3個skill。其中HiLens_final.py 是比賽中采集圖像進行模型推理并通信的代碼;test_camera.py 是用來測試HiLens Kit本身運行狀況及圖像質(zhì)量的代碼;test_socket.py 是用來測試HiLens Kit與工控機連接的代碼。HiLens Kit也可以將采集到的圖像傳輸至其他設(shè)備,用作保存或者進一步的處理,HiLens Kit目前能滿足大眾開發(fā)者的需要。
4.3信息流的后端處理
在HiLen Kit部署神經(jīng)網(wǎng)絡(luò)模型的過程中,盡管采用了集成學(xué)習提升了對單幀圖像的識別準確率,但也并非百分百準確;由于車在運動過程中,也存在拖影、未知光源干擾、反光燈等問題,盡管制作數(shù)據(jù)集盡量考慮了此類情況,但是有不小影響,從而單幀圖像的識別可能會出現(xiàn)偏差。我們采取了數(shù)字濾波中的窗口濾波處理來做圖像信息的后端處理。
采用長度為k的定長隊列做為觀察窗口;
選取k個元素中出現(xiàn)最多類別作為當前階段預(yù)測類別;
集成學(xué)習配合窗口濾波濾掉了信息流中的噪聲,確保了階段內(nèi)信號的準確識別。我們也設(shè)計很多算法,對雷達信息做了后端處理,工控機上實現(xiàn)的功能在此不再贅述。
整體框架完成后,建立仿真環(huán)境;在仿真環(huán)境中反復(fù)調(diào)試,調(diào)整狀態(tài)機跳轉(zhuǎn)邏輯,減少對實車的依賴。
五、聯(lián)合使用ModelArts和HiLens體驗
在無人車項目中聯(lián)合使用ModelArts和 HiLens,這全流程的解決方案對項目的進行提供非常高質(zhì)量的服務(wù)。筆者在使用華為云的全棧式解決方案之前,也接觸過很多AI解決方案,但是無論是云還是端都沒有華為云ModelArts和HiLens的聯(lián)合使用便捷高效。其便捷高效主要體現(xiàn)在以下幾個方面:
(1)支持數(shù)據(jù)集上傳、存儲、標注、處理一體化;
(2)智能標注可以節(jié)省很多時間用以算法的開發(fā);
(3)已配置各種開發(fā)環(huán)境供開發(fā)者直接使用,支持AI全流程的開發(fā);
(4)可視化管理讓開發(fā)配置更容易,可以節(jié)省寫各環(huán)節(jié)接口的時間;
(5)云端協(xié)同,模型可以直接通過skill進行部署,不用擔心開發(fā)環(huán)境不支持模型推理的問題;
(6)不用自行解決攝像頭驅(qū)動等各種圖像接入問題;自帶媒體數(shù)據(jù)處理庫,支持各種自定義操作;
(7)昇騰處理器使得模型推理更加迅速,使得時延更低,之前單一模型推理時間能推理,因此能部署多模型多任務(wù),能適用動態(tài)實時的系統(tǒng),使得應(yīng)用場景更為豐富
(8)ModelArts市場上有豐富的模型;HiLens技能市場上預(yù)置了豐富的AI技能,可以站在前人的肩膀上解決問題,提升開發(fā)效率