運(yùn)用 Intel OpenVINO 自制自動(dòng)駕駛車視覺(jué)系統(tǒng)
這兩年人工智慧當(dāng)?shù)?,無(wú)人自動(dòng)駕駛汽車技術(shù)也隨之興起,我想超過(guò)四十歲的大叔們心中最完美的自駕車莫過(guò)於 1980 年代電視影集「霹靂游俠」中李麥克開(kāi)的那臺(tái)「伙計(jì)」了。
「伙計(jì)」擁有高度人工智慧,不但可以自動(dòng)駕駛,遇到狀況也會(huì)自動(dòng)閃避,還可以輕松和人對(duì)話解決各種問(wèn)題,李麥克拿起手表還可呼叫「伙計(jì)」開(kāi)到指定地方,簡(jiǎn)直就是現(xiàn)代人工智慧自駕車及語(yǔ)音助理的最佳范本!
不過(guò)自駕車這項(xiàng)技術(shù)聽(tīng)起來(lái)就很難,那 Maker 們有沒(méi)有機(jī)會(huì)自己土炮一臺(tái)呢?
1980 年代經(jīng)典電視影集「霹靂游俠」李麥克和人工智慧自駕車「伙計(jì)」(圖片來(lái)源)
說(shuō)起自駕車(Autonomous Car)或是先進(jìn)駕駛輔助系統(tǒng)(Advanced Driver Assistance Systems, ADAS)主要都是希望車輛在沒(méi)有人為操作下即可自動(dòng)導(dǎo)航(GPS 衛(wèi)星定位、路線規(guī)畫(huà))、避障(閃避車輛、行人或異物)及環(huán)境感測(cè)(看懂燈號(hào)、路標(biāo)),同時(shí)將使用者安全地帶到目的地。目前各國(guó)爭(zhēng)相投入研發(fā)資源,大到無(wú)人公車、卡車、貨柜車,小到無(wú)人計(jì)程車、送貨車、電動(dòng)輪椅甚至無(wú)人農(nóng)業(yè)耕耘機(jī)、采收機(jī),就是不想錯(cuò)過(guò)新一波的交通革命。
在自駕車眾多技術(shù)中最不可缺少的一項(xiàng)就是電腦視覺(jué)技術(shù),但要搞懂一大堆數(shù)學(xué)、人工智慧理論、程式撰寫(xiě)方式、系統(tǒng)框架和硬體架構(gòu),還得懂得如何建立資料集、訓(xùn)練及優(yōu)化(加速)模型,這可就難倒大多數(shù)人了,難道就不能「快快樂(lè)樂(lè)學(xué) AI」,站在巨人的肩膀上看世界嗎?
英特爾(Intel)為了讓大家能夠快速入門(mén),因此提出了一項(xiàng)免費(fèi)、跨硬體(CPU、 GPU、FPGA、ASIC)的開(kāi)放電腦視覺(jué)推論及神經(jīng)網(wǎng)路(深度學(xué)習(xí))優(yōu)化工具包「OpenVINO」(Open Visual Inference & Neural Network Optimization Toolkit),同時(shí)提供很多預(yù)先訓(xùn)諫及優(yōu)化好的神經(jīng)網(wǎng)路模型可供大家直接使用。
影像辨識(shí)目標(biāo)
在進(jìn)入主題之前,首先要先認(rèn)識(shí)一下影像辨識(shí)的常見(jiàn)項(xiàng)目及定義,如下圖所示:
A. 影像分類:一張影像原則上只能被分到一個(gè)類別,所以影像中最好只有一個(gè)主要物件。若影像中出現(xiàn)多個(gè)物件,那分類時(shí)則可能出現(xiàn)多個(gè)分類結(jié)果,同時(shí)會(huì)給出每個(gè)分類的不同機(jī)率,此時(shí)誤分類的可能性就會(huì)大大提昇。
B.物件定位:一張影像中可同時(shí)出現(xiàn)多個(gè)相同或不同物件,大小不據(jù),辨識(shí)後會(huì)對(duì)每個(gè)物件產(chǎn)生一個(gè)邊界框(Bounding Box),如此即可獲得較為準(zhǔn)確的物件位置(座標(biāo))及尺寸(邊界框長(zhǎng)寬)。
C.語(yǔ)義分割:是一種像素級(jí)分類,意思就是每個(gè)像素都只會(huì)被歸到某一分類,如此就可取得接近物件真實(shí)邊界(Edge)。但缺點(diǎn)是多個(gè)相同物件類型的像素都會(huì)被分到同一類,當(dāng)物件太靠近或部份重疊時(shí)就不易分清楚共有多少物件。
D.實(shí)例分割:這也是一種像素級(jí)的分類,和語(yǔ)義分割的差別是相同類型的不同物件所屬像素就會(huì)被區(qū)分成不同分類(顏色),包括物件有部份重疊時(shí),如此就能更正確判別影像中的內(nèi)容。
影像辨識(shí)的常見(jiàn)項(xiàng)目(圖片來(lái)源)
上視覺(jué)辨識(shí)難度依序遞增,同時(shí)在樣本訓(xùn)練及推論時(shí)間也隨之巨幅成長(zhǎng)。在自駕車領(lǐng)域較常用到「物件定位」,比方說(shuō)找出前方車輛、行人、號(hào)志位置,但當(dāng)場(chǎng)景較復(fù)雜(如市區(qū))時(shí),同一影像中物件數(shù)量大增,且邊界框大量、大面積重疊,可能會(huì)影響辨識(shí)結(jié)果,因此更需要像語(yǔ)義分割及實(shí)例分割這類像素級(jí)分類。
不過(guò)由於實(shí)例分割的計(jì)算量大過(guò)語(yǔ)義分割許多,且現(xiàn)實(shí)中不需要分的如此仔細(xì),所以大部份僅采用語(yǔ)義分割來(lái)偵測(cè)場(chǎng)景中的多種物件,比方說(shuō)道路、人行道、地面標(biāo)線、背景、天空、植物、建物等等,如下圖所示:
語(yǔ)義分割應(yīng)用於自駕車,(a)僅道路,(b)道路、車輛、路標(biāo)等多物件辨識(shí)(圖片來(lái)源)
Intel OpenVINO簡(jiǎn)介
玩過(guò)「電腦視覺(jué)」的朋友肯定對(duì)開(kāi)源工具「OpenCV」不會(huì)陌生,這個(gè)強(qiáng)調(diào)不要自己造輪子的開(kāi)源視覺(jué)函式庫(kù),是英特爾(Intel)於西元 2000 年釋出的,不管是個(gè)人或商業(yè)用途皆可任意使用,不必付任何費(fèi)用。OpenCV 除了原有對(duì) Intel CPU 加速函式庫(kù) IPP (Integrated Performance Primitives)、 TBB (Threading Building Blocks)的支援外,發(fā)展至今已陸續(xù)整合進(jìn)許多繪圖晶片(GPU)加速計(jì)算的平臺(tái),如 OpenVX、OpenCL、CUDA等。
近年來(lái),由於深度學(xué)習(xí)大量應(yīng)用於電腦視覺(jué),自 OpenCV 3.0 版後就加入 DNN (Deep Neural Network)模組,3.2 版更是加入深度學(xué)習(xí)常用的 Caffe 框架及 YOLO 物件定位模組。今(2018)年 Intel更是推出開(kāi)放(免費(fèi))電腦視覺(jué)推論及神經(jīng)網(wǎng)路(深度學(xué)習(xí))優(yōu)化工具包「OpenVINO」(Open Visual Inference & Neural Network Optimization Toolkit
OpenVINO整合了OpenCV、 OpenVX、OpenCL 等開(kāi)源軟體工具并支援自家 CPU、 GPU、FPGA、ASIC (IPU、VPU)等硬體加速晶片,更可支援 Windows、Liunx (Ubuntu、CentOS)等作業(yè)系統(tǒng),更可支援常見(jiàn) Caffe、TensorFlow、Mxnet、ONNX 等深度學(xué)習(xí)框架所訓(xùn)練好的模型及參數(shù)。同時(shí),兼顧傳統(tǒng)電腦視覺(jué)和深度學(xué)習(xí)計(jì)算,從此不用再糾結(jié)到底要選那一種組合來(lái)完成電腦視覺(jué)系統(tǒng)了。
INTEL OpenVINO 架構(gòu)及支援硬體加速裝置(圖片來(lái)源)
OpenVINO主要是用來(lái)推論用的,特定模型的參數(shù)必須在其它框架(TensorFlow、Cafee、Mxnet)下訓(xùn)練好才可使用。OpenVINO除了可提供硬體加速外,更提供模型優(yōu)化器(Model Optimizer)功能,可協(xié)助去除已訓(xùn)練好的模型中的冗余參數(shù),并可將 32bits 浮點(diǎn)數(shù)的參數(shù)降階,以犧牲數(shù)個(gè)百分點(diǎn)正確率來(lái)?yè)Q取推論速度提升數(shù)十倍到百倍。
優(yōu)化后,產(chǎn)出二個(gè)中間表示(Intermediate Representation、IR)檔案(*.bin, *.xml),再交給推論引擎(Inference Engine)依指定的加速硬體(CPU、GPU、FPGA、ASIC)進(jìn)行推論,如下圖所示:
OpenVINO 模型優(yōu)化及推論引擎架構(gòu)(圖片來(lái)源)
影像語(yǔ)義分割原理
OpenVINO中提供了多種預(yù)訓(xùn)練及優(yōu)化好的深度學(xué)習(xí)模型,包括影像分類(AlexNet、GooLeNet、VGG、SqueezeNet、RestNet)、物件定位(SSD、Tiny YOLO)及一種類似全卷積神經(jīng)網(wǎng)路(Fully Convolutional Networks、FCN)的語(yǔ)義分割模型(like FCN-8s),接下來(lái)就簡(jiǎn)單說(shuō)明 FCN 的運(yùn)作原理。
一般傳統(tǒng)用於影像分類的卷積神經(jīng)網(wǎng)路(Convolution Neural Network, CNN)是經(jīng)過(guò)多次卷積層(Convolution Layer)取出特徵圖(Feature Map)加上池化層(Pooling Layer)令影像縮小一半後,再經(jīng)過(guò)全連結(jié)層(Fully Connection Layer)產(chǎn)生不同分類的機(jī)率,最後再找出機(jī)率最高的分類當(dāng)作輸出結(jié)果(如下圖上半部)。
影像分類(CNN)與語(yǔ)義分割(FCN)深度學(xué)習(xí)模型概念(圖片來(lái)源)
因?yàn)槿B結(jié)層把所有的空間資訊全部壓縮掉,因此無(wú)法了解到每個(gè)像素被分到那個(gè)類別。為了,能得到每個(gè)像素的分類(語(yǔ)義分割),Jonathan Long 在 2015 年提出 FCN論文解決了這個(gè)問(wèn)題。主要方式是把全連結(jié)層也改用卷積層,產(chǎn)出和原影像尺寸相同的熱力圖(Heatmap),用以表示每個(gè)像素屬於某一類的機(jī)率有多高。
如同上圖所顯示,最後會(huì)產(chǎn)出 1000 千張熱力圖,接著再對(duì) 1000 張圖相同位置像素計(jì)算出最大機(jī)率的分類,最後將所有分類結(jié)果組成一張新的圖即為語(yǔ)義分割結(jié)果圖。
原始影像(image)經(jīng)多次卷積(conv)及池化(pool),到了 pool5 時(shí)影像尺寸已到了原尺寸的 1/32,此時(shí)再經(jīng)二次卷積(conv6, conv7)後,最後將影像上采樣(Upsample)放大 32 倍,即可得語(yǔ)義分割結(jié)果圖 FCN-32s(如下圖所示)。這樣的結(jié)果非常粗糙,為了得到更精細(xì)結(jié)果,可把 conv7 結(jié)果放大 2 倍加上 pool4 後再放大 16 倍,就可得到更精細(xì)的結(jié)果圖 FCN-16s。
FCN 不同上采樣語(yǔ)義分割結(jié)果(圖片來(lái)源)
同理,將高(pool3)、中(2 倍 pool4)、低(4 倍 conv7)解析度的內(nèi)容加在一起,再放大就可得到 FCN-8s 更高精度的語(yǔ)義分割圖。雖然 FCN 得到的結(jié)果和真實(shí)內(nèi)容(Ground truth)分割正確度還有滿大的差距,但此方法卻是開(kāi)創(chuàng)以卷積神經(jīng)網(wǎng)路達(dá)成語(yǔ)義分割最具代表性的算法,同時(shí)也是電腦視覺(jué)最頂級(jí)研討會(huì) CVPR 2015 最佳論文。這幾年陸續(xù)有多種算法被推出,但大部份仍是仿效此種多重解析度整合方式改良而得。
OpenVINO 安裝執(zhí)行
接下就開(kāi)始說(shuō)明如何以 Intel 電腦視覺(jué)推論及神經(jīng)網(wǎng)路(深度學(xué)習(xí))優(yōu)化工具包「OpenVINO」土炮自駕車的視覺(jué)系統(tǒng)。首先到 OpenVINO 官網(wǎng),如下圖所示,按下左上角黃色按鈕,依所需的作業(yè)系統(tǒng)(Windows, Liunx)下載工作包并依指示將開(kāi)發(fā)環(huán)境(Visual Studio 2015/2017, GCC)安裝完成。
雖然官方指定要 Windows 10 64bit, Intel Core 6 ~ 8 代 CPU 才能執(zhí)行,經(jīng)實(shí)測(cè)在 Windows 7 64bit/Intel Core i5 480M (i5 第一代筆電用 CPU)、Visual Studio 2017 (含 MSBuild)環(huán)境下還是可以順利編譯及執(zhí)行。
以 Windows + Visual Studio2017 組合安裝為例:
可參考官網(wǎng)提供的網(wǎng)址,預(yù)設(shè)軟體開(kāi)發(fā)工具包(SDK)會(huì)安裝在C:Intel路徑下,而主要開(kāi)發(fā)工具會(huì)安裝在computer_vision_sdk_XXXX.X.XXXdeployment_tools (XXXX 表示版本),其中較重要的內(nèi)容包括以下四點(diǎn):
computer_vision_algorithms 傳統(tǒng)視覺(jué)算法
inference_engine 推論引擎及相關(guān)范例程式
intel_models 預(yù)先訓(xùn)練模型
model_optimizer 模型優(yōu)化器
安裝完成後,開(kāi)啟inference_enginesamplesbuild_2017ALL_BUILD.vcxproj,經(jīng)編譯後即可在inference_enginebinintel64Release 路徑下找到所有編譯好的范例執(zhí)行檔。
Intel OpenVINO 官網(wǎng)畫(huà)面(圖片來(lái)源)
接著可在 inference_enginesamplessegmentation_sample 路徑下找到本次土炮自駕車的視覺(jué)系統(tǒng)所需用到的范例程式,而程式主要工作內(nèi)容包括下面步驟:
載入推論引擎插件(Plugin)
讀取由模型優(yōu)化產(chǎn)出的中間檔(*.xml, *.bin)
配置輸入和輸出內(nèi)容
載入模型給插件
產(chǎn)生推論需求
準(zhǔn)備輸入
進(jìn)行推論
處理輸出
若不想了解程式碼及工作細(xì)節(jié)的人亦可直接拿來(lái)用,只要準(zhǔn)備好輸入的影像即可得到已做好語(yǔ)義分割的結(jié)果影像。目前 OpenVINO 提供二種預(yù)先訓(xùn)練及優(yōu)化好的語(yǔ)義分割模型,分別為 deployment_tools intel_models 路徑下的 semantic-segmentation-adas-0001 (20 類)和road-segmentation-adas-0001 (4 類)。
前者提供較多的分類包括道路、人行道、建物、墻壁、籬笆、電線桿、紅綠燈、交通號(hào)志、植物、地面、天空、行人、騎士、汽車、卡車、公車、列車、機(jī)車、自行車、自己的車頭等 20 類;後者僅分道路、人行道、標(biāo)線和背景共 4 類;單純使用 CPU 時(shí),前者推論時(shí)間約為後者十倍左右。
使用時(shí)主要有兩個(gè)參數(shù),-i 輸入影像名稱,-m 模型名稱,指定時(shí)須包含完整路徑。另外預(yù)設(shè)是使用 CPU 計(jì)算,所以只接受 32bit 浮點(diǎn)數(shù)(FP32)而不接受 16bit 浮點(diǎn)數(shù)(FP16)。輸入影像尺寸不據(jù),而在 20 類語(yǔ)義分割時(shí)輸出影像尺寸為 2048×1024 像素,而 4 分類時(shí)為 896×512 像素。輸出檔名固定為 out_0.bmp(如下圖所示)。
自駕車影像語(yǔ)義分割范例執(zhí)行結(jié)果(圖片來(lái)源:Jack 提供)
由於 CPU 計(jì)算時(shí)會(huì)受作業(yè)系統(tǒng)是否忙碌影響,所以同一張影像計(jì)算每次推論時(shí)間都會(huì)有所不同。當(dāng)在 Windows 7 64bit/Intel Core i5 480M 2.6GHz CPU/2GB RAM 環(huán)境下測(cè)試時(shí),20 分類推論時(shí)間大約在 3.7~4.3 秒,4 分類則在 0.3~0.4 秒左右,推論時(shí)間和影像內(nèi)容復(fù)雜度無(wú)關(guān)。後續(xù)若改成高階 CPU 或 GPU 後相信推論時(shí)間肯定能大幅縮短。完整執(zhí)行范例指令如下所示
20 類語(yǔ)義分割指令:
segmentation_sample-iC:Intelsample_picinput_image.bmp-m C:Intelcomputer_vision_sdk_XXXX.X.XXXdeployment_toolsintel_modelssemantic-segmentation-adas-0001FP32semantic-segmentation-adas-0001.xml
4 類語(yǔ)義分割指令:
segmentation_sample-iC:Intelsample_picinput_image.bmp-mC:Intelcomputer_vision_sdk_XXXX.X.XXXdeployment_toolsintel_modelsroad-segmentation-adas-0001FP32road-segmentation-adas-0001.xml
OpenVINO 實(shí)例應(yīng)用
接著,在網(wǎng)路上隨機(jī)收集一些道路影像,包括白天、晚上、郊區(qū)、市區(qū)、遠(yuǎn)近鏡頭等,并用二種模型進(jìn)行測(cè)試影像語(yǔ)義分割,其結(jié)果如下圖所示,左為原始影像,中為 20 分類,右為 4 分類。從結(jié)果來(lái)看,大致還分得還不錯(cuò),像(b)中圖汽車和卡車重疊及自身車頭,(c)的道路和人行道雖然顏色及紋理很像,都能分得很好。不過(guò)晚上的影像就有些小誤判,可能和影像過(guò)暗及物件過(guò)小影響。
自駕車影像語(yǔ)義分割測(cè)試結(jié)果。左為原始影像,中為 20 分類,右為 4 分類(圖片來(lái)源:Jack 提供)
為了進(jìn)一步了解這兩種模型對(duì)類似道路場(chǎng)景是否能適用,另外收集了公園步道(g)、賣(mài)場(chǎng)彎道(h)、客廳走道(i)、百貨公司走道(j)、候機(jī)室走道(k)進(jìn)行測(cè)試(結(jié)果如下圖所示)。由測(cè)試結(jié)果來(lái)看,在 20 分類時(shí)(g)的天空、地面、植物、建物算是正確分辨,而紅黑磚路則被當(dāng)成人行道(淺紫色),(h)、(k)勉強(qiáng)能分出道路(深紫色), (i)、(j)則把道路當(dāng)成人行道(淺紫色)也勉強(qiáng)可以算對(duì),(j)、(k)中的行人(暗紅色)都有正確被辨別出,但(i)的沙發(fā)則被誤判為行人和汽車(藍(lán)色)。
在4分類時(shí)(g)、(h)、(k)比較能分辨出道路(淺紫色),(h)甚至還能正確認(rèn)出地面標(biāo)線(暗藍(lán)色),而(i)、(j)則是完全無(wú)法辨識(shí),全部都被當(dāng)成背景(深紫色)。所以當(dāng)測(cè)試影像是室內(nèi)或非正常道路時(shí),誤判率明顯提高,歸究其原因應(yīng)該是訓(xùn)練的資料集中并沒(méi)有這些類型的影像,加上室內(nèi)光滑地面有大量反光及擺放大量物件造成影響。若想應(yīng)用這些模型在室內(nèi)場(chǎng)景,則需要另外大量收集相關(guān)影像重新標(biāo)注後再重新訓(xùn)練,才能讓正確率有所提升。
非標(biāo)準(zhǔn)道路影像語(yǔ)義分割測(cè)試結(jié)果。左為原始影像,中為 20 分類,右為 4 分類(圖片來(lái)源:Jack 提供)
小結(jié)
Intel 所提供的開(kāi)放(免費(fèi))電腦視覺(jué)推論及神經(jīng)網(wǎng)路(深度學(xué)習(xí))優(yōu)化工具包「OpenVINO」讓不懂電腦視覺(jué)和深度學(xué)習(xí)原理的小白可以在很短的時(shí)間上手,不必?fù)?dān)心如何建置開(kāi)發(fā)平臺(tái)、選擇深度學(xué)習(xí)框架、訓(xùn)練及優(yōu)化模型和硬體加速等問(wèn)題,只需利用預(yù)先訓(xùn)練及優(yōu)化過(guò)的語(yǔ)義分割模型,瞬間就可土炮出一組看起來(lái)很專業(yè)的自駕車視覺(jué)分析系統(tǒng)。
若覺(jué)得執(zhí)行效能不佳,未來(lái)還可輕松從 CPU 移植到 GPU、FPGA 甚至 Maker 最愛(ài)的 Movidius 神經(jīng)計(jì)算棒(VPU),實(shí)在讓使用者方便許多,而其它更多更方便的功能就有賴大家親自體驗(yàn)一下羅!
想要查看更多OpenVINO相關(guān)技術(shù)與資料,請(qǐng)戳>> http://2s4d.com/openvino
評(píng)論