Donkey Car 自動(dòng)駕駛小車指南

版本信息

版本號(hào) 修訂日期 修訂人
v0.1 2018/10/17 汪陽(yáng)
donkeycar

工作原理

如下圖所示贴膘,donkey car的工作原理很簡(jiǎn)單,通過(guò)行為克隆技術(shù)來(lái)實(shí)現(xiàn)自動(dòng)駕駛略号。想了解詳細(xì)的信息刑峡,請(qǐng)?jiān)L問(wèn)donkeycar官網(wǎng)。

donkeycar 原理

1. 克隆donkey代碼到高性能GPU實(shí)例 (google colab GPU or aws EC2 (g2.4xlarge))

這里以google colab 提供的免費(fèi)GPU實(shí)例為例

!git clone -b master https://github.com/wywincl/donkey.git donkey
Cloning into 'donkey'...
remote: Enumerating objects: 7, done.?[K
remote: Counting objects: 100% (7/7), done.?[K
remote: Compressing objects: 100% (7/7), done.?[K
remote: Total 6206 (delta 0), reused 0 (delta 0), pack-reused 6199?[K
Receiving objects: 100% (6206/6206), 30.79 MiB | 18.72 MiB/s, done.
Resolving deltas: 100% (3579/3579), done.

2. 源碼安裝donkey

!pip3 install -e donkey
Obtaining file:///content/donkey
Requirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from donkeycar==2.5.1) (1.14.6)
Requirement already satisfied: pillow in /usr/local/lib/python3.6/dist-packages (from donkeycar==2.5.1) (4.0.0)
Requirement already satisfied: docopt in /usr/local/lib/python3.6/dist-packages (from donkeycar==2.5.1) (0.6.2)
Requirement already satisfied: tornado==4.5.3 in /usr/local/lib/python3.6/dist-packages (from donkeycar==2.5.1) (4.5.3)
Requirement already satisfied: requests in /usr/local/lib/python3.6/dist-packages (from donkeycar==2.5.1) (2.18.4)
Requirement already satisfied: h5py in /usr/local/lib/python3.6/dist-packages (from donkeycar==2.5.1) (2.8.0)
Requirement already satisfied: python-socketio in /usr/local/lib/python3.6/dist-packages (from donkeycar==2.5.1) (2.0.0)
Requirement already satisfied: flask in /usr/local/lib/python3.6/dist-packages (from donkeycar==2.5.1) (1.0.2)
Requirement already satisfied: eventlet in /usr/local/lib/python3.6/dist-packages (from donkeycar==2.5.1) (0.24.1)
Requirement already satisfied: moviepy in /usr/local/lib/python3.6/dist-packages (from donkeycar==2.5.1) (0.2.3.5)
Requirement already satisfied: pandas in /usr/local/lib/python3.6/dist-packages (from donkeycar==2.5.1) (0.22.0)
Requirement already satisfied: olefile in /usr/local/lib/python3.6/dist-packages (from pillow->donkeycar==2.5.1) (0.46)
Requirement already satisfied: urllib3<1.23,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests->donkeycar==2.5.1) (1.22)
Requirement already satisfied: idna<2.7,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests->donkeycar==2.5.1) (2.6)
Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests->donkeycar==2.5.1) (3.0.4)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests->donkeycar==2.5.1) (2018.10.15)
Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from h5py->donkeycar==2.5.1) (1.11.0)
Requirement already satisfied: python-engineio>=2.2.0 in /usr/local/lib/python3.6/dist-packages (from python-socketio->donkeycar==2.5.1) (2.3.2)
Requirement already satisfied: Jinja2>=2.10 in /usr/local/lib/python3.6/dist-packages (from flask->donkeycar==2.5.1) (2.10)
Requirement already satisfied: click>=5.1 in /usr/local/lib/python3.6/dist-packages (from flask->donkeycar==2.5.1) (7.0)
Requirement already satisfied: Werkzeug>=0.14 in /usr/local/lib/python3.6/dist-packages (from flask->donkeycar==2.5.1) (0.14.1)
Requirement already satisfied: itsdangerous>=0.24 in /usr/local/lib/python3.6/dist-packages (from flask->donkeycar==2.5.1) (0.24)
Requirement already satisfied: greenlet>=0.3 in /usr/local/lib/python3.6/dist-packages (from eventlet->donkeycar==2.5.1) (0.4.15)
Requirement already satisfied: monotonic>=1.4 in /usr/local/lib/python3.6/dist-packages (from eventlet->donkeycar==2.5.1) (1.5)
Requirement already satisfied: dnspython>=1.15.0 in /usr/local/lib/python3.6/dist-packages (from eventlet->donkeycar==2.5.1) (1.15.0)
Requirement already satisfied: imageio<3.0,>=2.1.2 in /usr/local/lib/python3.6/dist-packages (from moviepy->donkeycar==2.5.1) (2.4.1)
Requirement already satisfied: tqdm<5.0,>=4.11.2 in /usr/local/lib/python3.6/dist-packages (from moviepy->donkeycar==2.5.1) (4.27.0)
Requirement already satisfied: decorator<5.0,>=4.0.2 in /usr/local/lib/python3.6/dist-packages (from moviepy->donkeycar==2.5.1) (4.3.0)
Requirement already satisfied: pytz>=2011k in /usr/local/lib/python3.6/dist-packages (from pandas->donkeycar==2.5.1) (2018.5)
Requirement already satisfied: python-dateutil>=2 in /usr/local/lib/python3.6/dist-packages (from pandas->donkeycar==2.5.1) (2.5.3)
Requirement already satisfied: MarkupSafe>=0.23 in /usr/local/lib/python3.6/dist-packages (from Jinja2>=2.10->flask->donkeycar==2.5.1) (1.0)
Installing collected packages: donkeycar
  Found existing installation: donkeycar 2.5.1
    Uninstalling donkeycar-2.5.1:
      Successfully uninstalled donkeycar-2.5.1
  Running setup.py develop for donkeycar
Successfully installed donkeycar

3. 創(chuàng)建donkey 自動(dòng)駕駛小車工程d2

!donkey createcar --template donkey2  ~/d2
using donkey v2.5.1 ...
Creating car folder: /root/d2
making dir  /root/d2
Creating data & model folders.
making dir  /root/d2/models
making dir  /root/d2/data
making dir  /root/d2/logs
Car app already exists. Delete it and rerun createcar to replace.
Car config already exists. Delete it and rerun createcar to replace.
Donkey setup complete.

4. 進(jìn)入d2工程玄柠,并獲取幫助信息

!cd d2  && python3 manage.py 
using donkey v2.5.1 ...
Usage:
    manage.py (drive) [--model=<model>] [--js] [--chaos]
    manage.py (train) [--tub=<tub1,tub2,..tubn>]  (--model=<model>) [--base_model=<base_model>] [--no_cache]

5. 上傳數(shù)據(jù)到計(jì)算實(shí)例

將無(wú)人駕駛小車手工采集到的數(shù)據(jù)壓縮并上傳到計(jì)算實(shí)例(google colab GPU or aws EC2 (g2.4xlarge))中突梦,
然后解壓縮到指定目錄中

!unzip -o d2/data/training_tubs_26.6.2018.zip -d d2/data/

6. 訓(xùn)練模型

采集到的多輪次數(shù)據(jù),首先進(jìn)行清洗羽利,丟棄不良數(shù)據(jù)宫患,然后作為訓(xùn)練數(shù)據(jù),開(kāi)始訓(xùn)練模型这弧,并保存模型文件

!cd d2  && python3 manage.py  train --tub="data/tub_16/, data/tub_17"  --model=models/mypilot.h5
using donkey v2.5.1 ...
loading config file: /content/d2/config.py
config loaded
tub_names data/tub_16/
train: 2624, validation: 657
steps_per_epoch 20
Epoch 1/100
2018-10-17 04:43:11.714513: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:964] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2018-10-17 04:43:11.715134: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1411] Found device 0 with properties: 
name: Tesla K80 major: 3 minor: 7 memoryClockRate(GHz): 0.8235
pciBusID: 0000:00:04.0
totalMemory: 11.17GiB freeMemory: 11.10GiB
2018-10-17 04:43:11.715206: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1490] Adding visible gpu devices: 0
2018-10-17 04:43:12.192129: I tensorflow/core/common_runtime/gpu/gpu_device.cc:971] Device interconnect StreamExecutor with strength 1 edge matrix:
2018-10-17 04:43:12.192207: I tensorflow/core/common_runtime/gpu/gpu_device.cc:977]      0 
2018-10-17 04:43:12.192278: I tensorflow/core/common_runtime/gpu/gpu_device.cc:990] 0:   N 
2018-10-17 04:43:12.192551: W tensorflow/core/common_runtime/gpu/gpu_bfc_allocator.cc:42] Overriding allow_growth setting because the TF_FORCE_GPU_ALLOW_GROWTH environment variable is set. Original config value was 0.
2018-10-17 04:43:12.192614: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1103] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 10758 MB memory) -> physical GPU (device: 0, name: Tesla K80, pci bus id: 0000:00:04.0, compute capability: 3.7)
19/20 [===========================>..] - ETA: 0s - loss: 2.8320 - angle_out_loss: 3.1369 - throttle_out_loss: 0.8777
Epoch 00001: val_loss improved from inf to 1.23087, saving model to models/mypilot.h5
20/20 [==============================] - 11s 532ms/step - loss: 2.7686 - angle_out_loss: 3.0668 - throttle_out_loss: 0.8459 - val_loss: 1.2309 - val_angle_out_loss: 1.3650 - val_throttle_out_loss: 0.2409
Epoch 2/100
19/20 [===========================>..] - ETA: 0s - loss: 1.4160 - angle_out_loss: 1.5702 - throttle_out_loss: 0.2761
Epoch 00002: val_loss did not improve from 1.23087
20/20 [==============================] - 5s 249ms/step - loss: 1.4174 - angle_out_loss: 1.5718 - throttle_out_loss: 0.2783 - val_loss: 1.2457 - val_angle_out_loss: 1.3812 - val_throttle_out_loss: 0.2536
Epoch 3/100
19/20 [===========================>..] - ETA: 0s - loss: 1.2386 - angle_out_loss: 1.3733 - throttle_out_loss: 0.2647
Epoch 00003: val_loss improved from 1.23087 to 1.06440, saving model to models/mypilot.h5
20/20 [==============================] - 5s 263ms/step - loss: 1.2361 - angle_out_loss: 1.3705 - throttle_out_loss: 0.2656 - val_loss: 1.0644 - val_angle_out_loss: 1.1799 - val_throttle_out_loss: 0.2526
Epoch 4/100
19/20 [===========================>..] - ETA: 0s - loss: 1.1434 - angle_out_loss: 1.2673 - throttle_out_loss: 0.2816
Epoch 00004: val_loss improved from 1.06440 to 1.04143, saving model to models/mypilot.h5
20/20 [==============================] - 5s 262ms/step - loss: 1.1412 - angle_out_loss: 1.2649 - throttle_out_loss: 0.2798 - val_loss: 1.0414 - val_angle_out_loss: 1.1544 - val_throttle_out_loss: 0.2453
Epoch 5/100
19/20 [===========================>..] - ETA: 0s - loss: 0.9802 - angle_out_loss: 1.0860 - throttle_out_loss: 0.2863
Epoch 00005: val_loss improved from 1.04143 to 0.98422, saving model to models/mypilot.h5
20/20 [==============================] - 5s 266ms/step - loss: 0.9714 - angle_out_loss: 1.0762 - throttle_out_loss: 0.2850 - val_loss: 0.9842 - val_angle_out_loss: 1.0908 - val_throttle_out_loss: 0.2452
Epoch 6/100
19/20 [===========================>..] - ETA: 0s - loss: 0.9049 - angle_out_loss: 1.0024 - throttle_out_loss: 0.2720
Epoch 00006: val_loss improved from 0.98422 to 0.97521, saving model to models/mypilot.h5
20/20 [==============================] - 5s 264ms/step - loss: 0.9020 - angle_out_loss: 0.9993 - throttle_out_loss: 0.2719 - val_loss: 0.9752 - val_angle_out_loss: 1.0809 - val_throttle_out_loss: 0.2425
Epoch 7/100
19/20 [===========================>..] - ETA: 0s - loss: 0.8303 - angle_out_loss: 0.9198 - throttle_out_loss: 0.2505
Epoch 00007: val_loss improved from 0.97521 to 0.95358, saving model to models/mypilot.h5
20/20 [==============================] - 5s 263ms/step - loss: 0.8286 - angle_out_loss: 0.9179 - throttle_out_loss: 0.2509 - val_loss: 0.9536 - val_angle_out_loss: 1.0569 - val_throttle_out_loss: 0.2408
Epoch 8/100
19/20 [===========================>..] - ETA: 0s - loss: 0.6880 - angle_out_loss: 0.7617 - throttle_out_loss: 0.2461
Epoch 00008: val_loss improved from 0.95358 to 0.85174, saving model to models/mypilot.h5
20/20 [==============================] - 5s 260ms/step - loss: 0.6867 - angle_out_loss: 0.7602 - throttle_out_loss: 0.2459 - val_loss: 0.8517 - val_angle_out_loss: 0.9437 - val_throttle_out_loss: 0.2440
Epoch 9/100
19/20 [===========================>..] - ETA: 0s - loss: 0.6130 - angle_out_loss: 0.6784 - throttle_out_loss: 0.2462
Epoch 00009: val_loss did not improve from 0.85174
20/20 [==============================] - 5s 258ms/step - loss: 0.6079 - angle_out_loss: 0.6728 - throttle_out_loss: 0.2462 - val_loss: 0.9572 - val_angle_out_loss: 1.0609 - val_throttle_out_loss: 0.2418
Epoch 10/100
19/20 [===========================>..] - ETA: 0s - loss: 0.5615 - angle_out_loss: 0.6212 - throttle_out_loss: 0.2436
Epoch 00010: val_loss did not improve from 0.85174
20/20 [==============================] - 5s 255ms/step - loss: 0.5630 - angle_out_loss: 0.6229 - throttle_out_loss: 0.2435 - val_loss: 0.9913 - val_angle_out_loss: 1.0988 - val_throttle_out_loss: 0.2400
Epoch 11/100
19/20 [===========================>..] - ETA: 0s - loss: 0.5203 - angle_out_loss: 0.5754 - throttle_out_loss: 0.2447
Epoch 00011: val_loss improved from 0.85174 to 0.82425, saving model to models/mypilot.h5
20/20 [==============================] - 5s 265ms/step - loss: 0.5158 - angle_out_loss: 0.5703 - throttle_out_loss: 0.2451 - val_loss: 0.8242 - val_angle_out_loss: 0.9132 - val_throttle_out_loss: 0.2378
Epoch 12/100
19/20 [===========================>..] - ETA: 0s - loss: 0.4146 - angle_out_loss: 0.4579 - throttle_out_loss: 0.2518
Epoch 00012: val_loss did not improve from 0.82425
20/20 [==============================] - 5s 257ms/step - loss: 0.4151 - angle_out_loss: 0.4584 - throttle_out_loss: 0.2515 - val_loss: 1.0301 - val_angle_out_loss: 1.1419 - val_throttle_out_loss: 0.2402
Epoch 13/100
19/20 [===========================>..] - ETA: 0s - loss: 0.3793 - angle_out_loss: 0.4188 - throttle_out_loss: 0.2400
Epoch 00013: val_loss did not improve from 0.82425
20/20 [==============================] - 5s 260ms/step - loss: 0.3852 - angle_out_loss: 0.4254 - throttle_out_loss: 0.2399 - val_loss: 0.9044 - val_angle_out_loss: 1.0022 - val_throttle_out_loss: 0.2393
Epoch 14/100
19/20 [===========================>..] - ETA: 0s - loss: 0.3562 - angle_out_loss: 0.3932 - throttle_out_loss: 0.2391
Epoch 00014: val_loss did not improve from 0.82425
20/20 [==============================] - 5s 258ms/step - loss: 0.3517 - angle_out_loss: 0.3881 - throttle_out_loss: 0.2393 - val_loss: 0.9473 - val_angle_out_loss: 1.0499 - val_throttle_out_loss: 0.2421
Epoch 15/100
19/20 [===========================>..] - ETA: 0s - loss: 0.3180 - angle_out_loss: 0.3507 - throttle_out_loss: 0.2434
Epoch 00015: val_loss did not improve from 0.82425
20/20 [==============================] - 5s 255ms/step - loss: 0.3207 - angle_out_loss: 0.3537 - throttle_out_loss: 0.2430 - val_loss: 1.1386 - val_angle_out_loss: 1.2624 - val_throttle_out_loss: 0.2394
Epoch 16/100
19/20 [===========================>..] - ETA: 0s - loss: 0.3302 - angle_out_loss: 0.3642 - throttle_out_loss: 0.2413
Epoch 00016: val_loss did not improve from 0.82425
20/20 [==============================] - 5s 261ms/step - loss: 0.3250 - angle_out_loss: 0.3585 - throttle_out_loss: 0.2412 - val_loss: 1.3519 - val_angle_out_loss: 1.4994 - val_throttle_out_loss: 0.2426
Epoch 00016: early stopping
!cd d2/data/tub_18 && cat record_2427.json
{"user/mode": "user", "cam/image_array": "2427_cam-image_array_.jpg", "user/angle": -0.05310220648823512, "user/throttle": 0.25}

7. 在小車上運(yùn)行自動(dòng)駕駛模型

通過(guò)ssh連接到小車的樹(shù)莓派3上娃闲,并將模型文件mypilot.h5從高性能實(shí)例上下載到小車d2工程中

小車系統(tǒng)同樣需要進(jìn)行步驟1~4操作

用自動(dòng)駕駛模型啟動(dòng)小車,并在賽道中自動(dòng)駕駛

!cd d2  && python3 manage.py drive --model=mypilot.h5

8. 在TensorBoard上查看訓(xùn)練過(guò)程

數(shù)據(jù)流圖
損失值

9. 其他

  • 注意小車的tensorflow版本需與訓(xùn)練模型的GPU實(shí)例所安裝的tensorflow版本保持一致匾浪。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末皇帮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蛋辈,更是在濱河造成了極大的恐慌玲献,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梯浪,死亡現(xiàn)場(chǎng)離奇詭異捌年,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)挂洛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)礼预,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人虏劲,你說(shuō)我怎么就攤上這事托酸。” “怎么了柒巫?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵励堡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我堡掏,道長(zhǎng)应结,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮鹅龄,結(jié)果婚禮上揩慕,老公的妹妹穿的比我還像新娘。我一直安慰自己扮休,他們只是感情好迎卤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著玷坠,像睡著了一般蜗搔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上八堡,一...
    開(kāi)封第一講書(shū)人閱讀 51,562評(píng)論 1 305
  • 那天碍扔,我揣著相機(jī)與錄音,去河邊找鬼秕重。 笑死不同,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的溶耘。 我是一名探鬼主播二拐,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼凳兵!你這毒婦竟也來(lái)了百新?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤庐扫,失蹤者是張志新(化名)和其女友劉穎饭望,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體形庭,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铅辞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了萨醒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斟珊。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖富纸,靈堂內(nèi)的尸體忽然破棺而出囤踩,到底是詐尸還是另有隱情,我是刑警寧澤晓褪,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布堵漱,位于F島的核電站,受9級(jí)特大地震影響涣仿,放射性物質(zhì)發(fā)生泄漏勤庐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望埃元。 院中可真熱鬧涝涤,春花似錦媚狰、人聲如沸岛杀。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)类嗤。三九已至,卻和暖如春辨宠,著一層夾襖步出監(jiān)牢的瞬間遗锣,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工嗤形, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留精偿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓赋兵,卻偏偏與公主長(zhǎng)得像笔咽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子霹期,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

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