無人駕駛車初識(shí)

翻譯來源:
https://www.youtube.com/watch?v=hBedCdzCoWM


今天要講的是自動(dòng)駕駛車是怎樣工作的褪那,然后在一個(gè)模擬的環(huán)境中應(yīng)用我們自己的自動(dòng)駕駛車杰刽。

自動(dòng)駕駛車再也不是只能在科幻小說里面才能看到的東西了岖常,很多大的公司比如說谷歌,優(yōu)步伦糯,豐田和福特都在研發(fā)甚至上路了颇象。

在不久的將來安疗,我們將會(huì)看到有越來越多的消費(fèi)者可以購買自動(dòng)駕駛車。

自動(dòng)駕駛車是怎樣工作的呢暗赶?

當(dāng)我們?nèi)祟愖谲嚿系臅r(shí)候鄙币,我們需要觀察周圍的環(huán)境,同時(shí)操作我們的車蹂随,作出決定該向哪個(gè)方向轉(zhuǎn)動(dòng)方向盤十嘿。

這個(gè)可以被建模成一個(gè)機(jī)器學(xué)習(xí)問題,SLAM岳锁,simutaneous localization and mapping绩衷,這就是自動(dòng)駕駛車要做的事情。

無人駕駛車激率,會(huì)裝備GPS咳燕,一個(gè)慣性導(dǎo)航系統(tǒng),一些傳感器乒躺。然后用GPS傳過來的地理數(shù)據(jù)來定位自己招盲,用傳感器傳過來的數(shù)據(jù)來構(gòu)造它所在環(huán)境的內(nèi)部地圖,


在自己構(gòu)建的這個(gè)內(nèi)部地圖中找到自己的位置之后嘉冒,就會(huì)尋找一個(gè)從此位置到目標(biāo)地點(diǎn)的優(yōu)化路徑曹货,并且避免任何一個(gè)障礙物咆繁。

當(dāng)它已經(jīng)確定了這個(gè)最優(yōu)路徑之后,就會(huì)把它分解成一系列的電機(jī)命令控乾,這些命令會(huì)被送到汽車的致動(dòng)器么介。

但是在實(shí)際的開車的過程中有很多問題,不僅僅是躲避障礙物蜕衡,還有不同的天氣條件下如何控制速度壤短,不同類型的道路,比如說彎路慨仿,還有遇到不同的道路標(biāo)志時(shí)采取什么樣的行動(dòng)久脯。

最近有一篇論文叫 Long term Planning for Short Term

文中介紹了一個(gè)規(guī)劃的算法。這個(gè)算法可以使無人駕駛車在優(yōu)化一個(gè)長期的目標(biāo)時(shí)镰吆,做出一個(gè)即時(shí)的反應(yīng)

一個(gè)應(yīng)用場景實(shí)例就是在環(huán)島時(shí)帘撰,當(dāng)一個(gè)汽車想要進(jìn)入這個(gè)環(huán)島時(shí),它需要做出一個(gè)是加速還是減速的決定万皿,這個(gè)決定的長期效果就是是否成功進(jìn)入環(huán)島摧找。

通常來講,一個(gè)無人駕駛車的規(guī)劃問題牢硅,是一個(gè)強(qiáng)化學(xué)習(xí)問題蹬耘。一個(gè)汽車是通過很多次的嘗試和犯錯(cuò),不斷的糾正錯(cuò)誤减余,來強(qiáng)化它的駕駛能力的综苔。

一個(gè)汽車觀察到周圍環(huán)境的一個(gè)狀態(tài) s,經(jīng)過判斷某個(gè)行為是好還是壞后采取行動(dòng) a位岔,然后它會(huì)收到一個(gè)反饋如筛,如果這個(gè)行為是對(duì)的就會(huì)獎(jiǎng)勵(lì)它,然后重復(fù)上面這個(gè)過程抒抬。

這個(gè)過程是想要最大化這個(gè)獎(jiǎng)勵(lì)杨刨,它依賴于將狀態(tài)映射到行動(dòng)的規(guī)則,這個(gè)函數(shù)被稱作 Q擦剑,用這個(gè)函數(shù)來找到最優(yōu)的規(guī)則拭嫁。


但是在實(shí)際的道路上,狀況是非常復(fù)雜的抓于,有很多車做粤,而且這個(gè)狀態(tài)是動(dòng)態(tài)的,這就不僅需要要預(yù)測自己的車的行為捉撮,還要能夠預(yù)測其他車輛的行為怕品。

為了能夠?qū)W習(xí)出這個(gè)函數(shù),論文的作者們構(gòu)建了一個(gè)深度神經(jīng)網(wǎng)絡(luò)巾遭。

向這個(gè)神經(jīng)網(wǎng)絡(luò)中投入的數(shù)據(jù)包括肉康,可預(yù)測的部分-車的速度和不可預(yù)測的部分-其他車的速度闯估,這樣就同時(shí)學(xué)習(xí)這兩個(gè)部分。

模型里只有兩個(gè)特征吼和,一個(gè)是 Adaptive Cruise Control涨薪,一個(gè)是 Merging Roundabouts。

有一個(gè)術(shù)語叫 End to End Learning for Self-Driving Cars炫乓,三個(gè)月前Nvidia的一個(gè)團(tuán)隊(duì)發(fā)了一篇新的論文刚夺。他們在擋風(fēng)玻璃上裝了三個(gè)攝像頭來獲取數(shù)據(jù),把這些數(shù)據(jù)投入到一個(gè)卷積神經(jīng)網(wǎng)絡(luò)中末捣,然后自動(dòng)學(xué)習(xí)特征侠姑。

用這個(gè)模型,并不需要把不同的場景明確的分解成不同的子問題箩做。模型里的卷積神經(jīng)網(wǎng)絡(luò)莽红,將把從輸入數(shù)據(jù)看到的東西直接映射成轉(zhuǎn)向命令。

它會(huì)先在一個(gè)提前錄制的虛擬模擬環(huán)境中訓(xùn)練邦邦,然后再由一個(gè)司機(jī)去駕駛它安吁。他們得到一個(gè)非常好的結(jié)果,但是這個(gè)作者覺得很難區(qū)分這個(gè)神經(jīng)網(wǎng)絡(luò)的特征提取部分和控制部分燃辖,也就很難去檢驗(yàn)它們鬼店。

一個(gè)叫 George Hotz 在他的車庫里構(gòu)建了自己的無人駕駛車,只用了一對(duì)手機(jī)相機(jī)郭赐,成本只有1000美元。

接下來讓我們訓(xùn)練一下自己的無人駕駛車

讓它通過 Q Learning 來自動(dòng)駕駛而不會(huì)碰到其它的障礙物确沸。

篇幅有限捌锭,只貼上主要代碼一部分,邏輯請看代碼注釋的漢語部分罗捎,完整repo請看文末資源列表观谦。

from flat_game import carmunk
import numpy as np
import random
import csv
from nn import neural_net, LossHistory
import os.path
import timeit

NUM_INPUT = 3
GAMMA = 0.9  # Forgetting.
TUNING = False  # If False, just use arbitrary, pre-selected params.

# 訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò),有一些hyper parameters
def train_net(model, params):   

    filename = params_to_filename(params)

    # 定義變量:觀察數(shù)據(jù)
    observe = 1000  # Number of frames to observe before training.
    epsilon = 1
    train_frames = 1000000  # Number of frames to play.
    batchSize = params['batchSize']
    buffer = params['buffer']

    # 定義變量:位置
    # Just stuff used below.
    max_car_distance = 0
    car_distance = 0
    t = 0
    data_collect = []
    replay = []  # stores tuples of (S, A, R, S').

    loss_log = []

    # 創(chuàng)建一個(gè)新的游戲?qū)嵗?    # Create a new game instance.
    game_state = carmunk.GameState()

    # 得到這個(gè)實(shí)例的第一個(gè)狀態(tài)
    # Get initial state by doing nothing and getting the state.
    _, state = game_state.frame_step((2))

    # 用一個(gè)timer來追蹤
    # Let's time it.
    start_time = timeit.default_timer()

    # 當(dāng)我們開始建立experience replay時(shí)
    # Run the frames.
    while t < train_frames:

        t += 1
        car_distance += 1

        # 我們會(huì)更新位置變量桨菜,然后依據(jù)狀態(tài)隨機(jī)選擇行為
        # Choose an action.
        if random.random() < epsilon or t < observe:
            action = np.random.randint(0, 3)  # random
        else:
            # 如果這個(gè)隨機(jī)變量在我們的限制條件之外豁状,我們會(huì)得到每個(gè)行為的Q值,
            # 來幫我們找到最優(yōu)的決策
            # Get Q values for each action.
            qval = model.predict(state, batch_size=1)
            action = (np.argmax(qval))  # best

        # 如果它是有效的倒得,我們會(huì)得到一個(gè)reward
        # Take action, observe new state and get our treat.
        reward, new_state = game_state.frame_step(action)

        # Experience replay storage.
        replay.append((state, action, reward, new_state))

        # 當(dāng)它結(jié)束觀察游戲和建立經(jīng)驗(yàn)回放時(shí)泻红,會(huì)開始訓(xùn)練采樣記憶experience replaying,得到訓(xùn)練值
        # If we're done observing, start training.
        if t > observe:

            # If we've stored enough in our buffer, pop the oldest.
            if len(replay) > buffer:
                replay.pop(0)

            # Randomly sample our experience replay memory
            minibatch = random.sample(replay, batchSize)

            # Get training values.
            X_train, y_train = process_minibatch(minibatch, model)

            # 然后訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型
            # Train the model on this batch.
            history = LossHistory()
            model.fit(
                X_train, y_train, batch_size=batchSize,
                nb_epoch=1, verbose=0, callbacks=[history]
            )
            loss_log.append(history.losses)

        # 然后更新狀態(tài)
        # Update the starting state with S'.
        state = new_state

        # Decrement epsilon over time.
        if epsilon > 0.1 and t > observe:
            epsilon -= (1/train_frames)

        # 當(dāng)car dies霞掺,
        # We died, so update stuff.
        if reward == -500:
            # Log the car's distance at this T.
            data_collect.append([t, car_distance])

            # Update max.
            if car_distance > max_car_distance:
                max_car_distance = car_distance

            # Time it.
            tot_time = timeit.default_timer() - start_time
            fps = car_distance / tot_time

            # Output some stuff so we can watch.
            print("Max: %d at %d\tepsilon %f\t(%d)\t%f fps" %
                  (max_car_distance, t, epsilon, car_distance, fps))

            # 記錄距離谊路,重啟
            # Reset.
            car_distance = 0
            start_time = timeit.default_timer()

        # 每25000 frames保存一下模型和weights
        # Save the model every 25,000 frames.
        if t % 25000 == 0:
            model.save_weights('saved-models/' + filename + '-' +
                               str(t) + '.h5',
                               overwrite=True)
            print("Saving model %s - %d" % (filename, t))

    # Log results after we're done all frames.
    log_results(filename, data_collect, loss_log)

下面是訓(xùn)練的結(jié)果,然后看一下在模擬環(huán)境中是如何work的菩彬,可以看到它可以通過強(qiáng)化學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)缠劝,不斷地躲避障礙物:

來潮梯,把你的小汽車放回宇宙吧

The code in the video is here:
https://github.com/llSourcell/Self-Dr...

More on Reinforcement Learning:
https://www.quora.com/Artificial-Inte...
http://www2.econ.iastate.edu/tesfatsi...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市惨恭,隨后出現(xiàn)的幾起案子秉馏,更是在濱河造成了極大的恐慌,老刑警劉巖脱羡,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萝究,死亡現(xiàn)場離奇詭異,居然都是意外死亡轻黑,警方通過查閱死者的電腦和手機(jī)糊肤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來氓鄙,“玉大人馆揉,你說我怎么就攤上這事《独梗” “怎么了升酣?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長态罪。 經(jīng)常有香客問我噩茄,道長,這世上最難降的妖魔是什么复颈? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任绩聘,我火速辦了婚禮,結(jié)果婚禮上耗啦,老公的妹妹穿的比我還像新娘凿菩。我一直安慰自己,他們只是感情好帜讲,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布衅谷。 她就那樣靜靜地躺著,像睡著了一般似将。 火紅的嫁衣襯著肌膚如雪获黔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天在验,我揣著相機(jī)與錄音玷氏,去河邊找鬼。 笑死腋舌,一個(gè)胖子當(dāng)著我的面吹牛预茄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼耻陕,長吁一口氣:“原來是場噩夢啊……” “哼拙徽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起诗宣,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤膘怕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后召庞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岛心,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年篮灼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了忘古。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诅诱,死狀恐怖髓堪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情娘荡,我是刑警寧澤干旁,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站炮沐,受9級(jí)特大地震影響争群,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜大年,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一换薄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧翔试,春花似錦轻要、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赢底。三九已至失都,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間幸冻,已是汗流浹背粹庞。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留洽损,地道東北人庞溜。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親流码。 傳聞我的和親對(duì)象是個(gè)殘疾皇子又官,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 2017年無人駕駛還處于積極研發(fā)和普及期,民用的測試和技術(shù)探索也主要在小型汽車方面漫试,各大巨頭都將2020年作為一個(gè)...
    方弟閱讀 7,080評(píng)論 1 16
  • 桐城三月盼春歸六敬, 堪念西湖玉柳垂。 猶問金山塔下誰驾荣。 恨崔巍外构, 千載幾多鴻雁飛。
    木十八先生閱讀 167評(píng)論 0 1
  • 早上起來有點(diǎn)起床氣播掷,原因在于昨天夜里沒有睡好覺审编,孩子一直在哭鬧,她哭鬧的原因可能是 由于睡得不踏實(shí)歧匈,外面很多野狗垒酬,...
    踏上筆尖閱讀 511評(píng)論 0 0
  • S(情景)需要讓對(duì)方產(chǎn)生共鳴,必須讓對(duì)方聽完以后產(chǎn)生一種“對(duì)對(duì)眯亦,你說的沒錯(cuò)”的反應(yīng)伤溉。只有情景被認(rèn)同了故事才能夠繼續(xù)...
    Fly_Catkin閱讀 546評(píng)論 0 0
  • 在這么火辣辣的天氣里乱顾, 一向人氣火爆的ChinaJoy又來了! 2016中國國際數(shù)碼互動(dòng)娛樂展覽會(huì)宫静, 這屆展會(huì)走净,除...
    kkk_eazer閱讀 295評(píng)論 0 0