小白都会玩的自动驾驶算法
在模拟器中,我们从三个不同的视角创建了1551个画面,同时记录了车辆在517个不同状态下的转角、速度、油门和刹车等数据。
本算法是在keras环境下开发的。首先,将数据划分为训练集和验证集。
1def load_data():
2 data_df = pd.read_csv(os.path.join(os.getcwd(),data_dir, 'driving_log.csv'), names=['center', 'left', 'right', 'steering', 'throttle', 'reverse', 'speed'])
3 X = data_df[['center', 'left', 'right']].values
4 y = data_df['steering'].values
5 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
6 return X_train, X_test, y_train, y_test
然后,我们进行模型的创建。模型包含5个卷积层、1个Dropout层和4个压缩层(Dense layer)。
1def build_model():
2 model = Sequential()
3 model.add(Lambda(lambda x: x/127.5-1.0, input_shape=INPUT_SHAPE))
4 model.add(Conv2D(24, kernel_size=(5, 5),strides=(2,2) ,activation='elu'))
5 model.add(Conv2D(36, kernel_size=(5, 5),strides=(2,2) ,activation='elu'))
6 model.add(Conv2D(48, kernel_size=(5, 5),strides=(2,2),activation='elu'))
7 model.add(Conv2D(64, kernel_size=(3, 3), activation='elu'))
8 model.add(Conv2D(64, kernel_size=(3, 3), activation='elu'))
9 model.add(Dropout(0.5))
10 model.add(Flatten())
11 model.add(Dense(100, activation='elu'))
12 model.add(Dense(50, activation='elu'))
13 model.add(Dense(10, activation='elu'))
14 model.add(Dense(1))
15 #model.summary()
16 return model
整个模型只输出一个值:车辆转角(steering angle)。将训练图像输入模型前,我们需要先做些预处理。
首先,为了增加训练样本数,我们需要进行数据增强处理:对已有图像进行翻转、平移、增加随机阴影或改变亮度等。
1image, steering_angle = choose_image(data_dir, center, left, right, steering_angle)
2image, steering_angle = random_flip(image, steering_angle)
3image, steering_angle = random_translate(image, steering_angle, range_x, range_y)
4image = random_shadow(image)
5image = random_brightness(image)
然后,我们对图像进行剪裁和重设大小(resize),以便输入图像能适合训练模型。
1def preprocess(image):
2 image = crop(image)
3 image = resize(image)
4 image = rgb2yuv(image)
5 return image
接下来,进行训练:
1def train_model(model, X_train, X_valid, y_train, y_valid):
2 model.compile(loss='mean_squared_error', optimizer=Adam(lr=0.001))
3
4 #Fits the model on data generated batch-by-batch by a Python generator.
5 model.fit_generator(batch_generator(data_dir, X_train, y_train, batch_size, True),
6 steps_per_epoch,
7 num_epochs,
8 verbose=1,
9 validation_data=batch_generator(data_dir, X_valid, y_valid, batch_size, False),
10 validation_steps=40
11 )
现在,我们获得了训练好的模型。然后,利用一个简单的服务器(socketio server)将模型预测的转角实时的传输给模拟器。
1steering_angle = float(data["steering_angle"])
2throttle = float(data["throttle"])
3speed = float(data["speed"])
4image = Image.open(BytesIO(base64.b64decode(data["image"])))
5image = np.asarray(image)
6image = preprocess_data.preprocess(image)
7image = np.array([image])
8
9steering_angle = float(model.predict(image, batch_size=1))
10throttle = 1.0 - steering_angle ** 2 - (speed / speed_limit) ** 2
11
12#send prediction to the simulator
13send_control(steering_angle, throttle)
车辆的运行情况如下:
可以看到,本算法实现了基本的自动驾驶功能,非常适合于初学者进行尝试。
-
汽车测试网V课堂
-
微信公众号
-
汽车测试网手机站
编辑推荐
最新资讯
-
Plus为自动驾驶卡车功能添加了H.E.L.P.警报
2024-12-23 17:18
-
美国能源部发布最新版氢计划
2024-12-23 17:16
-
系统级封装(SiP)在新能源汽车领域的应用
2024-12-23 08:51
-
车载通信框架 --- 智能汽车车载通信架构浅
2024-12-23 08:40
-
全国首例!武汉车网智联公司完成智能网联测
2024-12-23 08:39