【機器學習】遷移學習和端到端無人駕駛

作者簡介:申澤邦(Adam Shan),蘭州大學在讀碩士研究生,主攻無人駕駛,深度學習;

原文地址:https://blog.csdn.net/AdamShan/article/details/82414275

前面我們介紹了神經網絡和深度學習的基礎知識,在本文中我們將介紹遷移學習的概念,並將遷移學習應用於端到端無人駕駛模型。一般來說,大型深層神經網絡的訓練對計算資源要求較高。然而,很多普通開發者只擁有簡單的深度學習計算環境,這成爲阻礙深度學習廣泛應用的瓶頸之一。例如,爲了訓練一個深度爲50層的殘差神經網絡,利用NVIDIA M40 GPU需要大約14天才能完成模型訓練。如果換做普通PC機可能需要幾十年的時間才能完成訓練。對於此類問題,採用遷移學習是一種比較好的策略。
端到端無人駕駛,是無人駕駛中的一項基本技術,在實施過程中僅利用無人車上裝載的攝像頭獲取路況的圖像數據來訓練深層神經網絡模型,之後將攝像頭採集到的實時路況圖像數據輸入到訓練好的深度模型,並輸出控制參數來決定無人車的駕駛策略。本質上端到端無人駕駛是一個簡化的無人車模型,而實際路況的處理可能非常複雜,但它可以很直觀地幫助我們理解深度學習在無人駕駛中的應用。

遷移學習

深度學習在工業界得到越來越廣泛地應用。但是,從頭搭建並訓練深度學習模型是一件耗時耗力的事,工程師需要重新設計網絡架構,並進行大量訓練和測試實驗才能得到合適的模型。一個好的策略是採用一個現有的深度學習模型,在原始模型的基礎上進行微調來適應新的應用場景,這就是遷移學習(Transfer Learning)[1]。

因此,在開發深度學習應用時,並不一定需要從頭開始訓練模型。目前很多常見的應用場景都已經有相關的研究團隊訓練出了高精度的深度學習模型。ImageNet[2]數據集是一個擁有1600萬張圖片的大規模數據集,這些圖片數據已經由網上的大量志願者進行了標記,該數據集涵蓋了生活中很多重要的圖像應用,因此是一個非常有價值的公開數據集。針對ImageNet數據集的識別分類等問題,最著名的是ImageNet挑戰賽(ImageNet Large Scale Visual Recognition Challenge, ILSVRC)。ImageNet挑戰賽雖然已經於2017年終止,但是其中湧現出了很多針對ImageNet數據集的優秀識別模型,例如AlexNet、VGGNet、Google Inception Net和ResNet等。遷移學習可以方便地將這些經典模型移植到新的應用場景,這主要取決於兩個因素:新應用的數據量大小,新應用和原始模型的相似度。一般來說,遷移學習主要適用於四種應用場景,如下表所示。

  • 第一種情況,如果要開發一個常見且數據量大的物體識別應用,就可以直接借鑑這些成熟的優秀模型。實際操作中,我們只需要下載這些模型的權值並載入模型,之後將新的數據集輸入網絡進行微調即可得到理想的模型。
  • 第二種情況是新的應用數據集比較大,但是並沒有合適的預訓練模型。這種情況下,數據集多采集於專用的應用場景,例如醫學圖像識別。處理這種情況可以先選擇一個深度學習模型,利用新數據進行微調,如果效果不理想就需要採用新數據重新訓練該模型。
  • 第三種情況是新的數據量比較小,但是已經有相似的識別模型。例如,要基於一個部門的幾十名員工做一個人臉識別應用,可以簡單的從網上下載訓練好的基於卷積神經網絡的人臉識別分類模型,然後將新數據輸入該模型進行前向傳播,在得到全連接層之前的數據輸出以後,停止前向傳播並將這些輸出數據當作全連接層的輸入、原始輸出作爲全連接層的輸出進行訓練。換句話說,在整個訓練過程中,我們保持卷積和池化這些層的參數不變,同時也保持了原網絡的特徵提取能力。全連接層實際上是對卷積和池化層提取的人臉特徵進行分類工作,因此,對全連接層的重新訓練可以使得新模型能夠適應新數據的分類情況。用於圖像識別的深度卷積神經網絡可能非常複雜,需要較長的訓練時間,但是在該情況下整個訓練過程實際的計算只有樣本數據的一次前向傳播過程和針對全連接層(通常不超過兩層)的反向傳播訓練。因此,可以極大減少模型的訓練時間,提高開發效率。
  • 最差的情況是新的訓練數據集比較少,同時也沒有現成的相似模型可用。此種情況下,一般可以考慮重新設計網絡模型,並對新設計的網絡模型進行訓練,以求得最好的預測效果。因爲沒有成功模型的借鑑,無論網絡設計還是模型訓練都需要花費很多時間,但也因此使得重新設計訓練的模型在本領域具有更高的學術和工程價值。

端到端無人駕駛

深度學習在無人駕駛領域扮演着重要角色,其中,基於深層神經網絡的端到端無人駕駛技術就是很重要的一環。在實踐中,一般先採用模擬器模擬端到端無人駕駛的效果。端到端無人駕駛的基本思路非常簡單:首先通過人爲操作車輛(模擬器)行駛來採集控制數據。在該過程中,需要記錄下當前車輛前方的道路場景圖像,這些圖像通常由攝像頭採集。在實踐中,爲了提高模型的泛化能力可以使用多個(例如三個)攝像頭同時採集不同角度的路況圖像。在採集不同路況場景的同時,需要記錄下人在駕駛車輛(正確操作)時的控制參數,例如方向盤的轉角、剎車和油門等。在訓練深層神經網絡模型的時候,採集到的路況圖像數據作爲模型的輸入參數,汽車的控制參數作爲模型的輸出數據。基於這些路況圖像和控制參數訓練完神經網絡模型之後,該模型就具有一定的能力對當前攝像頭採集到的路況場景進行預測,進一步可以給出車輛的控制參數,這些參數被輸入到汽車線控單元(或者作爲模擬器輸入參數),從而達到控制車輛自動行駛的目的。

如上圖所示,端到端無人駕駛的核心爲深度學習模型。通過實時駕駛過程採集到不同路況場景的圖像數據,同時記錄不同路況下人類對汽車的控制參數。這些數據作爲訓練數據被輸入到深度學習模型進行訓練。在利用深度學習模型控制汽車自動駕駛時,通過攝像頭採集實時路況圖像,並將圖像輸入深度學習模型得到汽車線控參數,這些參數可以控制汽車自動駕駛。因此,端到端無人駕駛實際上是一個非常簡潔的無人駕駛模型,它忽略掉除攝像頭以外的其它傳感器採集的數據信息,僅僅根據攝像數據進行操作決策。這在實際無人駕駛中肯定是不合適的,但作爲研究,我們可以測試深度學習模型對無人汽車的控制能力。

端到端無人駕駛模擬

在模擬端到端無人駕駛的時候,需要幾個組件,包括模擬器、圖像處理、深度學習框架等。

模擬器的選擇

爲了模擬深度學習模型對無人車的控制,可以在PC上通過無人車模擬器來實現。Udacity[3]是一個在線教育機構(非常適合於自學者),它也提供了無人駕駛汽車模擬器,有關該模擬器的細節我們可以在GitHub上找到詳細說明[4]。GitHub上還有很多開源的無人車模擬器供我們研究使用,在實驗的時候可以靈活地選擇,但重要的是模擬器要能夠實時採集路況圖像數據和控制數據。在訓練自動駕駛模型之前,需要先採集一遍訓練數據,該訓練數據由圖像數據作爲模型輸入,相應的控制數據作爲模型輸出。爲了簡化問題,可以將模擬器的運行速度設置爲固定值,這種情況下,我們只需要方向盤的控制參數就可以控制汽車模擬器進行無人駕駛。整體而言,構建這種深度學習模型最常見的就是卷積神經網絡模型,輸入爲圖片數據,輸出爲單個控制參數。

數據採集和處理

(1) 對於數據採集操作,有如下幾個基本原則:

  • 需要不斷控制汽車回到道路中心位置。端對端無人駕駛就是讓模型學習如何控制汽車行駛在道路中央,所以在採集數據時,需要穩定地控制汽車行駛在道路中心,並儘量保持平穩行駛,這樣更符合人類對汽車的實際操控。
  • 除了平穩的環境,還要讓汽車儘量多在彎曲道路行駛,從而使得模型可以對需要轉彎的路況做出正確的控制操作。
  • 應該儘可能讓汽車嘗試在更多路況下的駕駛操作。實際上我們需要採集更多的駕駛數據來泛化模型的操作能力,使得模型對更多的未知狀況做出正確的控制預測,甚至可以採集倒車等情況下汽車的控制數據,使得模型在極端情況下也能做出正確反應。對於採用模擬器的情況,建議至少採集十圈以上的無人駕駛正確行駛狀況下的操作數據來訓練端到端模型,從而提高模型泛化能力。
  • 可以採用多個攝像頭蒐集不同角度的路況信息,例如從汽車的左、中、右三個角度同時蒐集路況圖像數據,一方面,增加了數據量,從而提高模型泛化能力;另一方面,不同角度的路況可以爲模型提供更合適的決策判斷。
  • 圖像採集幀率不宜太高,否則會採集到很多內容重複或者相似的路況數據。這種情況下部分測試集裏的樣本已經出現在了訓練集裏,這將導致模型的測試精度虛高。另外,這不但會造成計算資源的浪費,還會使得訓練好的模型頻繁對模擬器發出相似的控制信號。一般情況下,路況圖像的採集幀率應控制在10幀/秒左右。

(2) 對採集到的數據,應該執行如下預處理操作:

  • 所有圖像應該裁剪成合適大小,例如NVIDIA無人駕駛模型標準爲66像素高,200像素寬。還應該裁剪掉一部分對模型決策不起作用的圖像區域,例如攝像頭拍攝到圖像下端的汽車底盤和上端的天空雲彩等圖像內容。一些深度學習庫(例如Keras)已經自帶了圖像裁剪函數,而使用GPU會使得操作效率更高。
  • 對圖像像素值採用歸一化操作,實際上,像素值範圍爲0到255,因此可以按照下式將像素值x變換到[-1, 1]的範圍內。在該範圍裏,神經網絡的激活函數可以更好地工作。在Python語言裏,可以定義如下操作歸一化圖像像素值:
lambda x: x / 127.5 - 1.0

深度神經網絡模型構建

在構建端到端神經網絡控制模型時,可以嘗試多種神經網絡結構。最常見的神經網絡結構是全連接神經網絡,我們開始可以嘗試一個四層全連接神經網絡模型(含兩個隱藏層),利用採集到的數據訓練好模型以後,就可以利用訓練好的模型輸出控制參數到汽車模擬器。有些開源模擬器已經自帶了無人駕駛模式,這種情況下,只需要模擬器打開自動駕駛模式,就可以利用訓練好的深度學習模型控制汽車執行自動駕駛操作。

實際操作中,四層全連接神經網絡的效果並不好,我們需要設計合適的深度神經網絡模型。根據之前的遷移學習理論,我們可以將一些經典圖像識別模型遷移到該任務上,該任務屬於數據集較大,但是應用相似度較低的任務。因此,我們可以借鑑經典模型的結構,然後利用新採集的數據重新訓練模型或者微調模型。

前面章節,我們已經介紹了一些卷積神經網絡相關的內容。實際上,卷積神經網絡特別適合處理二維圖像問題。端到端無人駕駛模型的輸入爲路況圖像,因此可以嘗試採用卷積神經網絡來構建模型。實際上,我們可以借鑑很多經典深度模型的設計經驗,遷移到端到端無人駕駛的深度模型構建中。

LeNet深度無人駕駛模型

很多經典的用於圖像的神經網絡模型都是基於卷積神經網絡模型,LeNet[5]是最早用於商業手寫數字識別的卷積神經網絡模型,現在重構的LeNet和原來的結構有一些差別,但是一般仍保留兩個卷積層和兩個池化層的結構。需要注意的是,現在的LeNet一般採用ReLu系列激活函數取代原始的Sigmoid函數,ReLu函數對圖像特徵提取具有更好的效果,同時可以極大地節省訓練網絡和激活網絡的計算量。需要注意的另一點是,原生LeNet接收的輸入爲32×32的灰度(單通道)圖像,而我們的模型輸入爲66×200(高66,寬200)的彩色圖象(三通道),因此模型的輸入和原生LeNet並不相同。爲了方便,在構建模型時卷積操作對輸入特徵圖的填充方式(padding)採用same填充且步長(stride)爲1,這種情況下經卷積得到的特徵圖大小和輸入特徵圖大小一致。池化層採用常見的寬高均爲2的池化方式且步長爲2,因此池化層可以起到降維的作用(輸出特徵圖爲輸入特徵圖大小的四分之一)。在經過兩層卷積和兩層池化以後,模型連接兩個節點數爲1024的全連接層,緊接着是模型的輸出節點。模型的實際輸出不再是原始LeNet的分類函數,而是控制參數。在模擬端到端無人駕駛時,我們只輸出一個控制汽車轉向的參數(爲了方便,我們固定汽車行駛速度),因此整個模型只有一個輸出節點。經過改造以後的LeNet無人駕駛模型如下圖所示:

目前有很多深度學習框架可以用來構建深度學習模型,例如TensorFlow、TFLearn、Theano、Caffe、PyTorch、MXNet和Keras等等。其中Keras是一個非常簡潔的框架,其後端多采用TensorFlow或Theano,目前Keras已經被Google官方支持。本章節通過Keras庫來構建端到端無人駕駛模型。利用Keras深度學習框架(後臺採用TensorFlow),我們僅僅需要十幾行代碼就可以構建並訓練上述LeNet模型,代碼如下:

model = Sequential()
model.add(Conv2D(32, (5,5), padding='same', activation='relu',
input_shape=(32,32,3)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (5,5), padding='same', activation='relu',
input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(1024, activation='relu'))
model.add(Dense(1024, activation='relu'))
model.add(Dense(1))
model.compile(loss='mse', optimizer='adam')
model.fit(x_train, y_train, batch_size = 128, epochs = 10,
verbose=1, validation_data=(x_val, y_val))
model.save('selfdriver.h5')

其中模型的損失函數loss設置爲 均方誤差(Mean Squared Error, MSE),其含義爲模型對當前輸入的路況圖像x給出的控制參數與人類(正確)操作汽車時的控制參數之間的差值。優化算法採用自適應矩估計(Adaptive moment estimation,Adam [6])算法,該算法爲 隨機梯度下降算法(Stochastic Gradient Descent,SGD) 的優化版本。因爲Keras和TensorFlow已經對此進行了封裝,我們在此也無需深究細節。模型的具體訓練只需要調用fit函數並傳入訓練數據即可,fit函數會執行具體的Adam算法完成自動微分等優化操作。模型訓練好以後被保存到’selfdriver.h5’文件,該文件會在模擬器執行無人駕駛時被調用。

在利用上述LeNet訓練的模型執行無人駕駛模擬時,可以看出採用LeNet模型的端到端無人駕駛表現要優於採用四層全連接神經網絡,車輛的整個行駛過程也基本平穩。但是,從整個駕駛過程可以看出汽車並非如採集的訓練數據那樣總是行駛在道路中央的最優位置,因此還需要對模型改進。

NVIDIA深度無人駕駛模型

實際上,NVIDIA公司發佈了一種端到端無人駕駛模型[7],如下圖所示:

該模型依然採用66×200(高66像素,寬200像素)的三通道彩色輸入圖像,不同的是,整個模型裏不再出現池化操作。輸入圖像首先經過三次卷積操作,前三次卷積操作的卷積核固定爲5×5,卷積核的個數分別爲24、36、48依次遞增。因爲前三次卷積操作均採用2×2的步長,這相當於同時執行了池化操作,且特徵圖的維度從66×200降到5×22。此後,卷積核的大小降爲3×3,卷積核個數設爲64,經過兩次卷積操作之後特徵圖的維度降爲1×8,至此完成了輸入圖像的特徵提取操作。爲了輸出合適的控制參數,最後的64個1×8的特徵圖被拉平(Flatten)以後,連接了4個全連接層,每一層的隱含層節點數分別爲1164、100、50和10個,之後是一個輸出控制節點。在實踐中,爲了提升模型的泛化能力,我們在每一個全連接層都使用了丟棄技術(Dropout ),且丟棄率設爲0.5。模型的優化依然採用均方誤差和Adam優化算法。利用Keras提供的卷積API,我們依然可以非常簡潔地實現該模型,其代碼如下:

model = Sequential()
model.add(Conv2D(24, (5, 5), strides=(2, 2), activation='relu',
input_shape=(66,200,3)))
model.add(Conv2D(36, (5, 5), strides=(2, 2),activation='relu'))
model.add(Conv2D(48, (5, 5), strides=(2, 2), activation='relu'))
model.add(Conv2D(64, (3, 3), strides=(1, 1), activation='relu'))
model.add(Conv2D(64, (3, 3), strides=(1, 1), activation='relu'))
model.add(Flatten())
model.add(Dense(1164, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(50, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.compile(loss='mse', optimizer='adam')
model.fit(x_train, y_train, batch_size = 128, epochs = 10,
verbose=1, validation_data=(x_val, y_val))
model.save('selfdriver.h5')

在實踐中,我們發現NVIDIA提供的無人駕駛模型具有很好的預測性能:經過充分地迭代訓練以後,在模擬器裏,汽車可以比較平穩地行駛在道路中央。但是,在一些非常崎嶇的盤山公路上,長時間的無人駕駛模擬可能會出現操作失誤的情況。此時,一方面我們需要採集更多無人駕駛路況場景來增加模型訓練樣本的數量,另一方面可以通過控制車的行駛速度來保持平穩。控制車的運行速度時,我們可以人爲將模擬器中的行駛速度設置爲一個較低值,或者將車速當作一個控制參數由深度學習模型學習其規律。這種情況下,深度學習模型的輸出有兩個節點,分別爲轉向控制和速度控制。

實際上,我們還可以將很多其它經典深度學習模型遷移到端到端無人駕駛模型的構建中。長短期記憶網絡(Long Short Term Memory, LSTM)[8]因爲可以記憶歷史數據信息而被越來越多的學者研究。目前來看,將LSTM應用到端到端無人駕駛中是一種比較熱門的研究方法。LSTM一個很好的特性是可以基於之前的場景來對後續的場景進行決策,從理論上講也是一種非常適合於端到端模型構建的深度學習模型。一種更好的策略是結合CNN模型的圖像特徵提取功能和LSTM模型的時序記憶功能,組成混合深度學習模型應用到端到端無人駕駛。利用Keras這種簡潔的深度學習庫,讀者可以很容易構建自己的端到端無人駕駛模型,具體本章不再贅述。

小結

本文主要講述了遷移學習和端到端無人駕駛的內容。爲了更快地開發新的深度學習應用,遷移學習策略經常被應用到工程實踐中。雖然很多深度學習應用場景均具有較大的差異性,但是多數情況下我們可以通過微調或者重新訓練模型達到新場景的應用目的。最差的情況下,我們依然可以參考一些經典的深度學習模型來設計自己的深度學習應用模型。

端到端無人駕駛是一種非常直觀的無人駕駛模型,它忽略了無人車的多種傳感器數據,僅僅通過攝像頭採集到的路況數據來模擬無人駕駛,從而簡化了整個過程,可以作爲無人駕駛研究的基礎。在探討端到端無人駕駛模型的時候,我們主要提到了三種深度學習模型:淺層神經網絡模型、類LeNet卷積神經網絡模型和NVIDIA端到端無人駕駛模型。但是需要明確的是,在真實的無人駕駛環境中,僅僅依靠攝像頭採集到的路況圖像信息進行駕駛決策顯然是不安全的。因此,我們還需要綜合考慮多種傳感器採集到的數據共同決策。

參考文獻

[1] Pan S J, Yang Q. A Survey on Transfer Learning[J]. IEEE Transactions on Knowledge & Data Engineering, 2010, 22(10):1345-1359.
[2] Deng J, Dong W, Socher R, et al. ImageNet: A large-scale hierarchical image database[C]. Computer Vision and Pattern Recognition, 2009. CVPR 2009. IEEE Conference on. IEEE, 2009:248-255.
[3] https://cn.udacity.com/
[4] https://github.com/udacity/self-driving-car-sim
[5] Lecun Y, Bengio Y. Convolutional networks for images, speech, and time series[M].The handbook of brain theory and neural networks. MIT Press, 1998.
[6] Kingma D P, Ba J. Adam: A Method for Stochastic Optimization[J]. Computer Science, 2014.
[7] Bojarski M, Del Testa D, Dworakowski D, et al. End to End Learning for Self-Driving Cars[J]. 2016.
[8] Graves A. Long Short-Term Memory[M].Supervised Sequence Labelling with Recurrent Neural Networks. Springer Berlin Heidelberg, 2012:1735-1780

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章