深度学习驱动的自动驾驶技术解析

自动驾驶汽车使用深度学习技术

自动驾驶汽车无疑将成为未来的标准交通方式。许多大型机构都投入巨资使其成为现实,预计未来市场价值将达到数万亿美元。过去几年,该领域取得了巨大发展,多家机构的自动驾驶汽车已累计行驶800万英里。

自动驾驶汽车之所以成为现实,得益于硬件和软件方面的多项技术进步(剧透:主要是深度学习)。激光雷达传感器、摄像头、GPS和超声波传感器协同工作,从各种可能来源接收数据。这些数据通过先进算法进行实时分析,使自动驾驶功能成为可能。

编程自动驾驶汽车的关键步骤

自动驾驶流程包含以下5个基本步骤:

定位

定位是自动驾驶汽车精确知道自身在世界中位置的过程。在此步骤中,系统从上述所有传感器获取数据(传感器融合),并使用卡尔曼滤波技术以最高精度确定位置。卡尔曼滤波是一种概率方法,使用随时间变化的测量值来估计物体位置状态。另一种广泛使用的技术是粒子滤波。

感知

感知是汽车感知和理解环境的方式。这是计算机视觉和神经网络发挥作用的地方。

预测

在预测步骤中,汽车预测周围每个物体(车辆或行人)的行为:它们将如何移动、朝哪个方向、以什么速度、将遵循什么轨迹。这里最常用的模型之一是循环神经网络,因为它可以从过去的行为中学习并预测未来。

路径规划

路径规划不言自明,是汽车规划要遵循的路线或生成其轨迹的地方。这通过搜索算法(如A*)、格子规划和强化学习来实现。

控制

最后,控制工程师接手工作。他们使用前一步生成的轨迹相应地改变汽车的方向、加速度和刹车。最常用的方法是PID控制,但还有其他几种方法,如线性二次调节器(LQR)和模型预测控制(MPC)。

构建自动驾驶汽车

我们将使用某机构开源的自动驾驶汽车模拟器。要使用它,需要安装Unity游戏引擎。

模拟器从3个不同角度产生了1551帧图像,并为不同的517个状态记录了转向角、速度、油门和刹车值。

在keras中构建模型之前,必须读取数据并将其拆分为训练集和测试集。

def load_data():
    data_df = pd.read_csv(os.path.join(os.getcwd(),data_dir, 'driving_log.csv'), names=['center', 'left', 'right', 'steering', 'throttle', 'reverse', 'speed'])
    X = data_df[['center', 'left', 'right']].values
    y = data_df['steering'].values
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
    return X_train, X_test, y_train, y_test

之后,我们将构建包含5个卷积层、1个Dropout层和4个密集层的模型。

def build_model():
    model = Sequential()
    model.add(Lambda(lambda x: x/127.5-1.0, input_shape=INPUT_SHAPE))
    model.add(Conv2D(24, kernel_size=(5, 5),strides=(2,2) ,activation='elu'))
    model.add(Conv2D(36, kernel_size=(5, 5),strides=(2,2) ,activation='elu'))
    model.add(Conv2D(48, kernel_size=(5, 5),strides=(2,2),activation='elu'))
    model.add(Conv2D(64, kernel_size=(3, 3), activation='elu'))
    model.add(Conv2D(64, kernel_size=(3, 3), activation='elu'))
    model.add(Dropout(0.5))
    model.add(Flatten())
    model.add(Dense(100, activation='elu'))
    model.add(Dense(50, activation='elu'))
    model.add(Dense(10, activation='elu'))
    model.add(Dense(1))
    return model

网络将仅输出一个值:转向角。

在将输入传递给模型之前,应该进行一些预处理。这是使用OpenCV完成的,这是一个为图像和视频处理构建的开源库。

首先,必须通过增强现有数据来产生更多数据。例如,可以翻转现有图像、平移它们、添加随机阴影或更改其亮度。

image, steering_angle = choose_image(data_dir, center, left, right, steering_angle)
image, steering_angle = random_flip(image, steering_angle)
image, steering_angle = random_translate(image, steering_angle, range_x, range_y)
image = random_shadow(image)
image = random_brightness(image)

接下来,必须确保裁剪和调整图像大小以适合网络。

def preprocess(image):
    image = crop(image)
    image = resize(image)
    image = rgb2yuv(image)
    return image

训练时间:

def train_model(model, X_train, X_valid, y_train, y_valid):
    model.compile(loss='mean_squared_error', optimizer=Adam(lr=0.001))
    model.fit_generator(batch_generator(data_dir, X_train, y_train, batch_size, True),
                        steps_per_epoch,
                        num_epochs,
                        verbose=1,
                        validation_data=batch_generator(data_dir, X_valid, y_valid, batch_size, False),
                        validation_steps=40
                        )

现在有了训练好的模型。它基本上克隆了驾驶行为。

为了测试模型,需要一个简单的服务器(socketio服务器)将模型预测实时发送到模拟器。重要的是使用模拟器实时生成的帧和日志预测转向角的部分。

steering_angle = float(data["steering_angle"])
throttle = float(data["throttle"])
speed = float(data["speed"])
image = Image.open(BytesIO(base64.b64decode(data["image"])))
image = np.asarray(image)
image = preprocess_data.preprocess(image)
image = np.array([image])

steering_angle = float(model.predict(image, batch_size=1))
throttle = 1.0 - steering_angle ** 2 - (speed / speed_limit) ** 2

send_control(steering_angle, throttle)

结果表现相当不错。

某机构的模拟器是开始学习自动驾驶汽车的最简单方法。要继续自动驾驶汽车的学习之旅,推荐某学习平台的自驾汽车专业课程。如果对该领域真正感兴趣,它包含了入门所需的一切内容。

总之,自动驾驶汽车已经开始成为主流,毫无疑问,它们将比大多数人想象的更早普及。构建自动驾驶汽车极其复杂,需要从传感器到软件的许多不同组件。深度学习肯定会在实现这一目标方面发挥重要作用。但这里只是迈出了非常非常小的第一步。

最重要的是:未来已来,而且令人兴奋...
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)或者 我的个人博客 https://blog.qife122.com/
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

posted @ 2025-10-18 09:35  CodeShare  阅读(10)  评论(0)    收藏  举报