人工智能测试:关于自动驾驶汽车数据

2024年06月26日 由 alex 发表 250 0

TLDR

测试车辆时,会产生大量时间序列数据。人工智能方法可以对这些数据进行预处理,并自动标记重要部分。这可以通过无监督学习方法来完成,无需标记和训练。时间序列数据可根据相似性进行分析,以构建数据结构,并为用户提供交互式可视化效果。



在动画中,使用一级方程式赛车的遥测数据对这种基于相似性的分析进行了说明。每完成一圈后,都会对前几圈的所有数据进行评估,并根据转速曲线的相似性图计算积分。随着时间的推移,模式逐渐显现,可用于识别异常事件,然后对其进行更详细的检查。


介绍: 汽车测试的挑战

测试对于开发安全舒适的汽车至关重要。然而,由于通道多、测量时间长、测试变化多,从 CAN 总线生成的测量和遥测数据以及传感器数据和音频记录非常广泛。有效评估来自 NVH(噪声、振动和颠簸)、动力传动系统、E/E 集成(电气和电子集成)、ADAS(高级驾驶员辅助系统)或被动安全等领域各种测试程序的数据,对于快速开发汽车非常重要。


基于人工智能的汽车测试解决方案

有时,基于规则的简单方法就足以自动预处理数据并减少工作量。但通常情况下,要发现异常事件,必须进行基于经验的人工操作。自动预处理可以缩短这一过程。有两种用于测试数据评估的人工智能方法可供选择,用于查找候选事件并按其相关性进行排序:


有监督的人工智能方法: 如果有已经评估过的带有事件标签的数据,就可以训练一种有监督的人工智能方法来检测数据中的特定事件,如刹车异响。


无监督人工智能方法: 这些方法无需标注和训练即可构建数据结构。

  • 聚类: 在这里,类似的数据点会被归类为簇。这有助于有效利用数据中的共性,例如,只检查每个聚类中的几个代表性成员,以节省时间。
  • 降维: UMAP 等降维方法可用于将高维数据投射到低维表示中。例如,可以使用 UMAP 将时间序列插值并投射到二维图像中,以创建说明性的可视化效果。局部和全局结构会尽可能得到保留。


减少汽车测试的尺寸: 以一级方程式遥测技术为例

只需几行代码即可复制尺寸缩减过程:


首先,设置环境:启动 Jupyter Notebook 并安装必要的 Python 软件包:


!pip install fastf1 pandas umap-learn renumics-spotlight


使用了以下软件包:

  • FastF1: 用于轻松访问 F1 历史数据(包括遥测数据和比赛结果)的 Python 库。
  • Pandas: 用于数据分析的 Python 库。
  • umap-learn: 用于降维的 Python 库,可将高维数据投射到低维表示中,同时保留本地和全局数据结构。
  • Renumics-Spotlight: 结构化和非结构化数据的交互式可视化工具。


首先,通过 FastF1 界面加载比赛数据:


import fastf1
session = fastf1.get_session(2023, "Montreal", "Race")
session.load(telemetry=True, laps=True)


现在,每位车手的每个单圈都可以作为 DataFrame 进行查询。其中包括:

  • 驾驶员: 车手
  • 圈数: 当前圈数
  • 速度(时间序列): 速度
  • 油门(时间序列): 油门位置 油门位置
  • 制动器(时间序列): 制动器的使用 使用制动器
  • 转速(时间序列): 发动机转速
  • X(时间序列): 表示车辆在轨道上位置的 X 坐标
  • Y(时间序列): 表示车辆在轨道上位置的 Y 坐标


然后用以下方法对数据进行初始转换


def dataframe_to_dict(df):
    """Converts a pandas DataFrame to a dictionary of lists.
    If a column has only one unique value, it is converted to a scalar."""
    result = {}
    for col in df.columns:
        unique_values = df[col].unique()
        result[col] = df[col].tolist() if len(unique_values) > 1 else unique_values[0]
    return result


将时间序列转换为遥测和一般信息的单独字典。时间序列被转换成列表:


# Load lap info and telemetry and telemetry as list of dicts
df_laps_telemetry, laps = [], []
for _, lap in session.laps.iterlaps():
    df_laps_telemetry.append(lap.get_telemetry())
    laps.append(lap.to_dict())


现在,所有听写都用来创建


# create a new DataFrame with one row for each lap of each driver
import pandas as pd
data = [dataframe_to_dict(tele) | lap for lap, tele in zip(laps, df_laps_telemetry)]
df = pd.DataFrame(data)


一个大型 DataFrame:


+----+----------------------+----------+-------------+-----------------+--------------------+----------------+----------------------+---------------------+
|    | Date                 | Driver   |   LapNumber | Speed           | RPM                | Brake          | X                    | ...                  |
|----+----------------------+----------+-------------+-----------------+--------------------+----------------+----------------------+---------------------|
|  0 | [Timestamp('2023-06- | VER      |           1 | [0, 0, 0, ...]  | [9812, 9753, ... ] | [False, False, | [3299, 3300,  ...]   |                     |
|    | 18, ...]             |          |             |                 |                    | ...]           |                      |                     |
|  1 | [Timestamp('2023-06- | VER      |           2 | [278, 278, ...] | [11033, 11045,     | [False, False, | [3356, 3374,  ...]   |                     |
|    | 18, ...}             |          |             |                 | ...]               | ...]           |                      |                     |
|  2 | [Timestamp('2023-06- | VER      |           3 | [279, 280, ...] | [11008, 11007,     | [False, False, | [3356, 3376,  ...]   |                     |
|    | 18, ...]             |          |             |                 | ...]               | ...]           |                      |                     |
...
+----+----------------------+----------+-------------+-----------------+--------------------+----------------+----------------------+---------------------+


为了简化后续步骤,需要分析的数据序列将被内插


import numpy as np
def interpolate_column(values):
    """Interpolates a list of values to a fixed length of 882."""
    x = np.linspace(0, 1, 882)
    xp = np.linspace(0, 1, len(values))
    return np.interp(x, xp, values)


为相同长度:


df["Speed_emb"] = df["Speed"].apply(interpolate_column)
df["RPM_emb"] = df["RPM"].apply(interpolate_column)


之后,就可以缩小它们的尺寸了:


import umap
import numpy as np
embeddings = np.stack(df["Speed_emb"].to_numpy())
reducer = umap.UMAP()
reduced_embedding = reducer.fit_transform(embeddings)
df["Speed_emb_umap"] = np.array(reduced_embedding).tolist()


结果可通过适当的可视化工具进行显示和探索。在本例中,Renumics-Spotlight 使用了


import pandas as pd
from renumics import spotlight
spotlight.show(df, dtype={"Speed": spotlight.Sequence1D}, port=5436)


来启动DataFrame的交互式可视化:


1


在左边的表格中,显示的是 DataFrame。你可以使用 "可见列 "按钮来控制在表格中显示哪些列。右上方显示的是相似性地图。选定的数据点显示在底部,在这里绘制速度曲线。


在线扩展示例

在 Hugging Face 上的演示空间中,我们创建了另一个示例,除了时间序列外,还包括赛道布局的可视化、速度和档位的彩色编码表示以及单个车手的肖像:


2


通过赛道布局的可视化,可以更轻松地分析比赛中的车辆数据。通过速度和档位的彩色编码,可以识别赛道上的关键点和车手的不同策略。


总结

在汽车行业使用人工智能方法对测试数据进行半自动评估具有显著优势。聚类和降维等无监督学习方法可通过自动标记相关部分,对大型时间序列数据集进行高效分析。这有助于更快地识别异常事件,加快开发进程。



文章来源:https://itnext.io/automotive-testing-automatic-ai-based-test-data-evaluation-f41a1ae17cd4
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
写评论取消
回复取消