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

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

3.3 模型處理流程
(1)下載OBS Browser,配置OBS桶,將原始采集數(shù)據(jù)上傳至OBS桶內(nèi)。
對(duì)象存儲(chǔ)服務(wù)(Object Storage Service)是一款穩(wěn)定、安全、高效、易用的云存儲(chǔ)服務(wù),具備標(biāo)準(zhǔn)Restful API接口,可存儲(chǔ)任意數(shù)量和形式的非結(jié)構(gòu)化數(shù)據(jù)
對(duì)象存儲(chǔ)服務(wù)OBS配置說明文檔:https://support.huaweicloud.com/obs/index.html
OBS控制臺(tái)說明文檔: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ù)增強(qiáng),并將處理好的數(shù)據(jù)返回至OBS桶。
如移動(dòng)一個(gè)文件: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)進(jìn)入ModelArts平臺(tái)的數(shù)據(jù)標(biāo)注模塊,創(chuàng)建數(shù)據(jù)集,選擇物體檢測(cè),添加標(biāo)簽集。既可以選擇手動(dòng)標(biāo)注,也可以在手動(dòng)標(biāo)注一部分后選擇智能標(biāo)注,最終再修改確認(rèn)智能標(biāo)注。當(dāng)數(shù)據(jù)集較大的時(shí)候,智能標(biāo)注可以有效降低數(shù)據(jù)集標(biāo)注的工作量。最終發(fā)布數(shù)據(jù)集。目前已經(jīng)支持標(biāo)注團(tuán)隊(duì)進(jìn)行合作標(biāo)注。

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

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

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

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


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

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

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

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