使用Keras训练自动驾驶(使用Udacity自动驾驶模拟器)
使用Keras訓練自動駕駛(使用Udacity自動駕駛模擬器)
1.完成項目所需要的資源
(1)模擬器下載
? Linux
 ? macOS
 ? Windows
(2)Unity 下載
運行Udacity模擬器需要Unity,這是下載鏈接。
 https://unity.cn/releases
(3)Behavioral Cloning Project
此存儲庫包含Behavioral Cloning Project的起始文件。
 連接:https://github.com/udacity/CarND-Behavioral-Cloning-P3
2.獲取訓練數據
若正確安裝unity和模擬器,則打開Udacity的模擬器,會出現如下畫面
 
 點擊TRAINING MODE
 
 點擊右上角RECORD,選擇保存模型路徑。
 按R開始記錄訓練數據,再按R停止記錄數據。生成如下所示的數據
 
 這就是訓練用的照片和其對應的轉向角了。
3.訓練判斷轉向角的全連接模型
有了訓練數據我們就可以搭建我們的訓練模型了,我們使用csv庫讀取數據,利用Keras建立模型。
    import csvimport cv2import numpy as npfrom keras.models import Sequentialfrom keras.layers import Flatten, Dense# 初始化行的數組,將csv中的數據傳入到數組中lines = []# 讀取csv文件with open('.../data/driving_log.csv') as csvfile:reader = csv.reader(csvfile)for line in reader:lines.append(line)# 初始化圖片矩陣和轉向角images = []measurements = []for line in lines:source_path = line[0]filename = source_path.split("/")[-1]# 圖片路徑current_path = '.../data/IMG/' + filename# 將所有的圖片數據存入images數組中image = cv2.imread(current_path)images.append(image)# 將相對應的轉向角數據存入measurement數組中measurement = float(line[3])measurements.append(measurement)# 將images和measurements作為訓練數據X_train = np.array(images)y_train = np.array(measurements)# 使用Keras建立模型model = Sequential()model.add(Flatten(input_shape=(160, 320, 3)))model.add(Dense(1))model.compile(loss='mse', optimizer='adam')model.fit(X_train, y_train, validation_split=0.2, shuffle=True, nb_epoch=10)model.save('model.h5')
這樣就可以簡單的利用Keras訓練了一個控制轉向角的網絡,最后模型以model.h5的名稱保存。在訓練過程中,我將csv文件中的\全部替換成了/解決了模型輸入不匹配的問題。
因為神經網絡太過簡單,導致這個模型的實際效果非常差,所以我們需要對模型進行改進。
3.模型改進
(1)數據預處理
對模型進行改進,需要預處理。使用數據歸一化和均值中心化。
 數據歸一化:
    pixel_normalized = pixel / 255pixel_mean_centered = pixel_normalized - 0.5
均值歸一化,使均值大約為0
    Lambda(lambda x: (x / 255.0) - 0.5)
使用Lambda圖層
 在Keras中,lambda圖層可用于創建任意函數,這些函數在每個圖像通過圖層時對其進行操作。
 在這個項目中,lambda層是并行化圖像規范化的便捷方式。lambda圖層還將確保模型在進行預測時將輸入圖像標準化drive.py。
該lambda圖層可以獲取圖像中的每個像素并通過公式運行它:
model = Sequential()
model.add(Lambda(lambda x:x / 255.0 - 0.5))
(2)擴充訓練數據
模型在訓練初期容易出現一直向左拐的情況,我們可以將圖片翻轉作為新的訓練數據。使用numpy庫或者cv2庫可以輕松實現將圖片翻轉。
這樣不但擴充了訓練數據,還使得整個模型有著更好的魯棒性。
import cv2
image = cv2.imread('.../image.jpg')
# 實現圖片的水平翻轉
image1 = cv2.flip(image, 1)
# 垂直翻轉
image2 = cv2.flip(image, 0)
(3)使用更復雜的模型
由于之前給的例子中只構建了一層全連接神經網絡,導致訓練出來的模型效果非常的差。我們可以使用LeNet-5模型來構建我們的神經網絡。
4.新的模型訓練
經過模型改進之后,小車的自動駕駛有了更好的效果。其如下代碼所示。
    import csvimport cv2import numpy as npfrom keras.models import Sequentialfrom keras.layers import Flatten, Dense, Convolution2D, MaxPooling2D, Lambda, Cropping2D# 初始化行的數組,將csv中的數據傳入到數組中lines = []# 讀取csv文件with open('.../data/driving_log.csv') as csvfile:reader = csv.reader(csvfile)for line in reader:lines.append(line)# 初始化圖片矩陣和轉向角images = []measurements = []for line in lines:source_path = line[0]filename = source_path.split("/")[-1]# 圖片路徑current_path = '.../data/IMG/' + filename# 將所有的圖片數據存入images數組中image = cv2.imread(current_path)images.append(image)# 將相對應的轉向角數據存入measurement數組中measurement = float(line[3])measurements.append(measurement)# 增加訓練數據數量,將圖像鏡像augnented_images, augnented_measurements = [], []for image, measurement in zip(images, measurements):augnented_images.append(image)augnented_measurements.append(measurement)augnented_images.append(cv2.flip(image, 1))augnented_measurements.append(measurement*-1.0)# 將images和measurements作為訓練數據X_train = np.array(augnented_images)y_train = np.array(augnented_measurements)# 使用Keras建立模型model = Sequential()# Cropping層用于裁剪圖像,下面是距離圖像頂部50像素,距離圖像底部20像素,左側右側各0model.add(Cropping2D(cropping=((50,20), (0, 0)), input_shape=(160, 320, 3)))# 在Keras中Lambda層用于創建任意函數,這些函數在每個圖像通過圖層對其進行操作 。對輸入圖片進行預處理。model.add(Lambda(lambda x:x / 255.0 - 0.5))# 加入卷積層和池化層model.add(Convolution2D(6, 5, 5, activation='relu'))model.add(MaxPooling2D())model.add(Convolution2D(6, 5, 5, activation='relu'))model.add(MaxPooling2D())model.add(Flatten())model.add(Dense(120, activation='relu'))model.add(Dense(84, activation='relu'))model.add(Dense(1))# 模型訓練model.compile(loss='mse', optimizer='adam')model.fit(X_train, y_train, validation_split=0.2, shuffle=True, nb_epoch=3)model.save('model_new.h5')
5.在模擬器上測試效果
在CarND-Behavioral-Cloning-P3-master目錄下運行drive.py
python drive.py model_new.h5
打開模擬器
 
 選擇AUTONOMOUS MODE就可以查看效果。
 到此我們就實現了利用自己的訓練神經網絡來實現模擬器的自動駕駛。
環境:python3.6
 IDE:pycharm2019.2
總結
以上是生活随笔為你收集整理的使用Keras训练自动驾驶(使用Udacity自动驾驶模拟器)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 【Relax人生法则之躺平方法论】那些看
- 下一篇: Udacity机器人软件工程师课程笔记(
