DeepTesla

這個項目和上次的行為克隆有點相像,只不過這個實在現實生活中,而上次那個是在模擬程序中,而且這次用的數據是行車記錄儀視頻,而上次用的是左中右三張圖片,不過我們這次還是把視頻轉化成圖片來出來,所以他們區別並不大。

數據來自deeptesla

安裝要求

  • Python3
  • Numpy
  • Pandas
  • TensorFlow
  • Keras
  • opencv
  • imageio

數據預處理

  • 將視頻轉化為圖片

import cv2nimport imageionimport pandas as pdnimport numpy as npnepoch_ids = [i+1 for i in range(10)]nimg_data=[[] for i in range(10)]nlabel_data=[[] for i in range(10)]nnfor epoch_id in epoch_ids:n print(---------- processing video {} ----------.format(epoch_id))n csv_path = epochs/epoch{:0>2}_steering.csv.format(epoch_id)n df = pd.read_csv(csv_path)n label_data[epoch_id-1] = df[wheel].valuesn mkv_path = epochs/epoch{:0>2}_front.mkv.format(epoch_id)n vid = imageio.get_reader(mkv_path, ffmpeg)n for i in range(len(df)):n img = cv2.resize(vid.get_data(i),(224,224))n img_data[epoch_id-1].append(img)n print(end of video {},.format(epoch_id),n img_count:,len(img_data[epoch_id-1]),img_shape:,img_data[epoch_id-1][0].shape,labels:,label_data[epoch_id-1].shape)nnimg_data = np.concatenate(img_data, axis=0)nlabel_data = np.concatenate(label_data, axis=0)nprint(-------------end of all---------------,nimg_data:,img_data.shape,label_data:,label_data.shape)n

  • 由於我們此次會用到遷移學習,使用的預訓練模型是VGG16,所以我們的圖片形狀為(224, 224, 3)

  • 數據混洗、分割

##shufflenp = np.random.permutation(len(img_data))nimg_data,label_data = img_data[p],label_data[p]n##splitnindex = int(len(img_data)*0.8)ntrain_image,test_image = img_data[:index], img_data[index:]ntrain_label,test_label = label_data[:index], label_data[index:]nprint(train_image.shape,test_image.shape)nprint(train_label.shape,test_label.shape)n

模型構建與訓練

from keras.models import Modelnfrom keras.optimizers import SGD,RMSpropnfrom keras.callbacks import TensorBoardnfrom keras.layers import Input, Flatten, Dropout,Dense,Reshape,Convolution2D, MaxPooling2D,GlobalAveragePooling2Dnfrom keras.applications.vgg16 import VGG16nbase_model = VGG16(weights=imagenet,include_top=False)nnx = GlobalAveragePooling2D()(base_model.output)nx = Dense(1024, activation=relu)(x)nx = Dense(512, activation=relu)(x)nx = Dropout(0.7)(x)noutput = Dense(1)(x)nmodel = Model(input=base_model.input,output=output)nnfor layer in base_model.layers:n layer.trainable = Falsennopt = RMSprop(lr=1e-6)nmodel.compile(optimizer=Adadelta,n loss=mse)nnmodel.fit(train_image,train_label,validation_split=0.2,batch_size=32, callbacks=[TensorBoard(log_dir=./log)])nmodel.evaluate(test_image, test_label)nnmodel.save(./models/model.h5)nwith open(./models/model.json, w) as f:n f.write(model.to_json())n

評估與預測

model.evaluate(test_image, test_label)n

模型的loss為0.7065757193388762

  • 預測可視化

pred = model.predict(train_image[0:100])nplt.plot(pred,r)nplt.plot(train_label[0:100],b)nplt.show()n

藍色為真實值,紅色為預測值,相比上次的行為克隆真是太好了

模擬

黑色方向盤為人類駕駛,綠色方向盤為模型預測,右下角的曲線圖展示了兩者方向盤角度的區別。上圖只是告訴你模擬方式,並不是具體效果。

結尾

代碼/數據地址ciozhang

推薦閱讀:

Tesla自動駕駛的前世今生
【乾貨】擁有神秘技能,讓你成為自動駕駛領域的香餑餑
自動駕駛令沃爾沃谷歌特斯拉長安等使盡洪荒之力?
淺談自動轉向功能ACSF
如何看待最近谷歌放棄研發自動駕駛輔助系統?

TAG:机器学习 | 深度学习DeepLearning | 自动驾驶 |