搭建一个开源ADAS项目的步骤流程

发布者:JoyfulExplorer最新更新时间:2024-12-03 来源: elecfans关键字:感知算法 手机看文章 扫描二维码
随时随地手机看文章

一、项目范围

该项目是一个高级驾驶辅助系统的原型,专注于感知算法(目标检测、车道线分割和交通标志分类)。它提供了3个主要功能:


前方碰撞警告

车道偏离警告

交通标志检测及超速预警

它还提供了「有限的」虚拟硬件访问权限,作为迈向商业产品的一步:

通过 LAN 中的 GPS 源的 GPS 读取器

一个 CAN 读取器,用于从虚拟 can 总线读取车速和转向信号

但是,可以使用 GPS 模块或 CAN 转 USB 电缆收集 GPS 和 CAN 信号。我将提供一些关于如何设置这些设备的说明。

二。硬件设置

30b0433c-daa3-11ed-bfe3-dac502259ad0.png?imageView2/2/w/1000

处理该项目所有输入的中心组件是中央处理器。这台计算机接收两个输入:(i) 来自相机的图像,以及 (ii) 汽车底盘数据,例如汽车速度和转向信号。中央处理负责处理这些输入以在需要时发出警告。在这个项目的范围内,由于实验条件有限,我们实施了一个「模拟模块来提供相机和传感器读取器输入的替代方案」。在商业产品中,传感器读取器模块可以通过 GPS 模块和 CAN 总线读取器(例如 CAN 转 USB 电缆)来实现;可以使用 USB 摄像头提供摄像头输入。

「硬件清单:」

Jetson Nano 开发者套件

Sandisk Ultra 64GB class-10 SD 卡

Wareshare 5寸液晶触摸屏

Wareshare 8Ω 5W 喇叭

Jetson Nano 2寸5V散热风扇

透明外壳。

1.如何获取汽车传感器(速度,转向灯)

使用 GPS 模块

「出于开发和教育目的:」

从您的手机共享 GPS:

从 Google Play 商店下载「共享 GPS应用程序。」

设置您的手机局域网地址,src/sensors/car_gps_reader.cpp并使用此应用程序与您的 Jetson Nano 共享 GPS 信息。这样,我们就可以获取GPS信号,估计车速。

使用 USB GPS 接收器

「对于商业产品:」

查看此模块精度:< 3m。

如何设置CAN总线以读取车速和转向信号

「基本信息」

在这个项目中,我们没有在真车上设置物理 CAN 总线(只是一个使用 socket CAN 的仿真系统)。但是,它可以通过使用 CAN 转 USB 电缆来实现。

CAN总线的一些信息:

一般信息

如何侵入您的车辆?:hacking-can-bus.pdf

开源 CAN 电缆:CANtact。这将支持您将 CAN 总线连接到 linux 套接字,「我的 ADAS 源代码已经支持该套接字」。

硬件设计

固件:

在韩国

您还需要 OBD-II 到 DB9 电缆来连接汽车 OBD-II

一旦 CANtact 设备处理了来自车辆的 CAN 消息,它们就会通过 USB B 型端口输出。因此,这需要 USB-B 到 USB-A 电缆:https://www.amazon.com/AmazonBasics-USB-2-0-Cable-Male/dp/B00NH11KIK

「我们在哪里可以找到要连接的 CAN 总线?」

在这个项目中,我们只使用虚拟 CAN 总线,因此项目源代码仍然不支持与汽车 CAN 总线的真实连接。不幸的是,虽然 CAN 总线是汽车行业的标准,但如果您想找到您的 can 线在哪里,您通常需要查看汽车电气图才能找到内部 CAN 总线。自 1996 年以来,有一个名为 OBD2 的汽车标准,可以提供一种方便的方式连接到 CAN 总线。

「OBD2接口在哪里?」

OBD-II 端口通常位于仪表板下方,方向盘柱下方(下图中的 1 - 3)。如果端口不在转向柱下方,请在数字 4 - 9 指示的区域中寻找端口。

30c60780-daa3-11ed-bfe3-dac502259ad0.png?imageView2/2/w/1000

「我怎样才能反转CAN工程并读取速度?」

您可以使用 Wireshark 或 candump 查找车速和转向灯在哪里。CAN总线是没有加密的,大家可以根据下面的说明尝试查找。

2. 如何标定相机

将 USB 摄像头连接到 Jetson Nano 板后,我们需要运行 OpenADAS 软件来校准摄像头。校准实际上是基于透视变换的距离估计。这是为距离计算校准相机的便捷方式。

变换参数包括从真实世界距离到鸟瞰图像空间的米到像素映射,以及鸟瞰图像到相机图像之间的透视变换矩阵。为了计算这些参数,我们使用以下解决方案:在汽车前面放一块红地毯,测量距离 W1、W2、L1、L2。地毯应该足够大,并且必须对称地放置在汽车的长轴上。

30ccd4e8-daa3-11ed-bfe3-dac502259ad0.png?imageView2/2/w/1000

单击设置按钮以打开相机校准。

在 UI 中输入 L1、L2、W1、W2。

30ddf9ee-daa3-11ed-bfe3-dac502259ad0.png?imageView2/2/w/1000

之后,通过单击「重新拍摄照片」选择 4 个点,选择一个点并移动滑块。这些点必须以正确的顺序拾取。相机标定后,标定文件将被保存data/camera_calib.txt并在每次启动程序时加载回来。

三、感知模型和算法

1. 物体检测与交通标志分类模型

该物体检测模块负责检测前方障碍物物体,如其他车辆或行人,以及交通标志。这些结果可用于前方碰撞预警和超速预警。为了提供这些功能,该模块包含两个主要组件:基于 CenterNet 的对象检测神经网络和基于 ResNet-18 的交通标志分类网络。因此,我们将在下图中看到 2 个深度学习模型。

30e79670-daa3-11ed-bfe3-dac502259ad0.png?imageView2/2/w/1000

1.1.使用 CenterNet 进行目标检测

CenterNet 是一种简单但高效的对象检测模型。与其他流行的目标检测模型相比,CenterNet 可以非常有效地适应速度-精度权衡。与其他流行的基于锚框的对象检测网络不同,CenterNet 依靠关键点检测器来检测对象的中心,然后回归其他属性。

30ecf43a-daa3-11ed-bfe3-dac502259ad0.png?imageView2/2/w/1000

CenterNet管道 「论文:」作为点的对象 - Xingyi Zhou、Dequan Wang、Philipp Krähenbühlhttps://arxiv.org/abs/1904.07850。

「训练」

我使用 CenterNet 作者的官方存储库来训练对象检测器(进行了一些修改)。请阅读此处的安装步骤以安装培训所需的环境。

「笔记:」

我建议使用 Anaconda 或 Miniconda 为每个任务创建一个虚拟环境。不要混合你的环境,因为我们必须使用不同的 Python 和包版本。

您「必须使用」PyTorch v0.4.1 并将其设置为此处的说明:https://github.com/xingyizhou/CenterNet/blob/master/readme/INSTALL.md。不保证其他版本有效。

我修改了官方存储库以使用 Berkeley DeepDrive (BDD) 数据集](https://bdd-data.berkeley.edu/)。您可以在此处克隆源代码以开始训练。在我的存储库中,我用10个类训练了 CenterNet:person、、、、、、、、、和。ridercarbustruckbikemotortraffic lighttraffic signtrain

「使用 TensorRT 进行模型优化」

使用 PyTorch 框架训练 CenterNet 后,我们获得 PyTorch 模型格式(.pth)的模型文件。为了优化 NVIDIA Jetson Nano 上的推理速度,我们需要将这些模型转换为 TensorRT 引擎文件。转换是通过称为 ONNX(开放式神经网络交换)的中间格式完成的。首先使用 PyTorch ONNX 模块将 PyTorch 模型转换为 ONNX 格式(步骤 1)。

之后,我们将 ONNX 模型转换为每个推理平台的 TensorRT 引擎(步骤 2)。因为从ONNX到TensorRT引擎的转换时间比较长,所以在我的实现中,我将TensorRT引擎转换后序列化到硬盘,每次程序启动时加载。在此步骤中,我们必须注意 TensorRT 引擎在不同计算机硬件上的构建方式不同。所以,

30f9eb5e-daa3-11ed-bfe3-dac502259ad0.png?imageView2/2/w/1000

使用此存储库将预训练模型转换为 ONNX 格式

「笔记:」

创建另一个虚拟环境,这与培训不同。这个新的 Python 环境应该使用 Pytorch v1.0 或 v1.1。我为上面的这个转换任务准备了一个存储库。您可以使用此处的说明来设置您自己的环境。

您可以从该文件夹convert_to_onnx_mobilenet.py中阅读(对于 MobileNetv2 主干)和convert_to_onnx_rescdn18.py(对于 ResNet-18 主干)中的一些转换示例源代码。

拥有 ONNX 模型后,转到 OpenADAS 以更新配置文件中新对象检测模型的路径:src/configs/config_object_detection.h.您还可以使用此存储库进行转换。

1.2.交通标志分类

由于「BDD 数据集」的限制——它只包含 1 类交通标志(未指定标志类型),我不得不训练另一个神经网络来识别标志类型。由于速度和准确性高,因此也选择了「ResNet-18来完成这项任务。」我使用 Tensorflow 和 Keras 框架训练了模型。

「数据集」

在这个项目中,我只设计了对最大速度标志进行分类的系统,并将每个速度级别视为一个单独的对象类。为了收集足够的训练数据,我使用了 2 个数据集:Mapillary Traffic Sign Dataset (MTSD) 和 German Traffic Sign Recognition (GRSRB) 数据集。由于 MTSD 是一个交通标志检测数据集,我使用标志边界框来裁剪它们以进行分类任务。裁剪后,我合并了 2 个数据集,得到 18,581 个最高限速交通标志图像分为 13 个类别,以及 879 个末端限速标志(将所有末端限速标志仅视为 1 类)。

此外,我使用来自其他交通标志和物体的 20,000 张裁剪图像作为“未知”类别。该数据集中共有 15 个类别:最大速度标志(5km/h、10km/h、20km/h、30km/h、40km/h、50km/h、60km/h、70km/h、80km/h , 90 公里/小时, 100 公里/小时, 110km/h、120km/h)、限速终点(EOSL)等标志(OTHER)。之后,这个数据集被分成 3 个子集:训练集(80%)、验证集(10%)和测试集(10%)。每个交通标志类别的分布是随机的。

「训练步骤」

使用此存储库中的源代码来训练交通标志分类器

「第一步:初始化环境」

创建anaconda环境:

conda create --name python=3.6

激活创建的环境并安装所有要求:

pip install requirements.txt

「第 2 步:训练模型」

准备如下结构的数据集:

3106392c-daa3-11ed-bfe3-dac502259ad0.png?imageView2/2/w/1000

使用以下命令训练模型:


pythontrain.py


「使用 TensorRT 进行模型优化」

转换为 UFF

convert_h5_to_pb.py修改和中的模型路径convert_pb_to_uff.py。

将.h5模型转换为.pb, 最后.uff:


pipinstallrequirements-h5-to-uff.txt
pythonconvert_h5_to_pb.py
pythonconvert_pb_to_uff.py


拥有 ONNX 模型后,转到 OpenADAS 以更新配置文件中新交通标志分类模型的路径:src/configs/config_sign_classification.h.

2.车道线分割模型

车道线检测模块负责检测车道线和车道偏离情况。然后将该结果用于车道偏离警告。我使用深度神经网络和霍夫变换线检测器进行车道线检测。下面介绍车道线检测的流程。

31100150-daa3-11ed-bfe3-dac502259ad0.png?imageView2/2/w/1000

车道线检测流水线

用于车道线分割的 U-Net 模型

U-Net 是一种在生物医学图像分割中表现良好的全卷积网络,它可以用较少的训练图像数据展示高精度的分割结果。我将 U-Net 应用于车道线分割问题,并结合霍夫变换以线方程的形式找到车道线。

3121f6ee-daa3-11ed-bfe3-dac502259ad0.png?imageView2/2/w/1000

U网模型

为了在嵌入式硬件上运行轻量级分割模型,我对原始 U-Net 模型进行了两次修改:

(1) 将decoder filters的数量调整为128, 64, 32, 16, 8个filters,从decoder的顶部到网络的输出;

(2) 用 ResNet-18 主干替换原来的主干。

这些修改减少了 U-Net 中的参数数量,并为我们提供了一个可以超过 200 帧每秒 (FPS) 运行的轻量级模型(模型 U-Net ResNet-18 输入大小 384x382,RTX 2070 GPU 上的 TensorRT float 16 ).

数据集

数据集是从Mapillary Vista 数据集准备的,并进行了一些修改。原始数据集包含训练集中约 18000 张图像和验证集中约 2000 张图像。我合并这些集合,删除一些不包含车道线或有太多噪音的图像。最终数据集有 15303 张图像。我将这个集合随机分成三个子集:10712 张图像用于训练(~70%),2296 张图像用于验证(~15%)和 2295 张图像用于测试(~15%)。因为 Mapillary Vista 的标签包含很多对象类,所以我只保留车道线类来生成二值分割掩码作为新标签。

312c315e-daa3-11ed-bfe3-dac502259ad0.png?imageView2/2/w/1000

Mapillary Vistas 数据集预处理——图像 A、B 来自 Mapillary Vitas

训练

使用我的存储库训练 U-Net 进行车道线分割

「第一步:初始化环境」

创建anaconda环境:

conda create --name python=3.6

激活创建的环境并安装所有要求:

pip install requirements.txt

「第 2 步:训练模型」

在目录中创建新的配置文件list_config请不要修改旧的配置文件,以便我们更好地观察,模型和训练历史将自动保存到saved_models文件夹中。

对于培训,只需运行:

python model/train.py

或者

./train.sh

使用 TensorRT 进行模型优化

转换为 UFF

为此任务创建另一个虚拟环境。

convert_h5_to_pb.py修改和中的模型路径convert_pb_to_uff.py。

.h5将模型转换为.pb,并最终使用这些命令(请更新和.uff中模型的正确路径)convert_h5_to_pb.pyconvert_pb_to_uff.py


pipinstallrequirements-h5-to-uff.txt
pythonconvert_h5_to_pb.py
pythonconvert_pb_to_uff.py


拥有 UFF 模型后,转到 OpenADAS 以在车道检测配置文件中更新该新模型的路径:src/configs/config_lane_detection.h.

使用霍夫变换进行车道线检测

霍夫变换是一种在图像处理中非常有效的线检测算法。该算法的总体思想是创建从图像空间(A)到新空间(B)的映射,空间(A)中的每条线对应空间中的一个点(B),空间中的每个点(A)对应空间中的正弦曲线 (B)。将 (A) 中的所有点投影到空间 (B) 中的正弦曲线后,我们找到交点密度最高的地方。然后将这些位置投影到 (A) 成线。通过这种方式,霍夫线变换算法可以在图像空间(A)中找到线。

寻找候选车道线的过程如下图所示。从线分割网络产生的分割掩码,车道线检测模块使用概率霍夫变换来检测原始线段(1)。之后,使用由 Bernard A. Galler 和 Michael J. Fischer 在 1964 年反转的不相交集/联合查找森林算法将这些线划分为组。我们使用线之间的空间距离和角度差将属于一个线段分组同一条线。经过步骤(2),我们可以看到不同的线组被绘制成不同的颜色。步骤 (3) 接收这些线组作为输入,并使用具有 L2 距离的最大似然估计在每个组中拟合一条线。

313b71e6-daa3-11ed-bfe3-dac502259ad0.png?imageView2/2/w/1000

线候选检测

该系统将车道分割模型与上述车道检测算法相结合,可以检测不同环境下的车道线,判断车道偏离情况。它为车道偏离警告模块创建可靠的输入。

4.警告规则

该系统使用基于规则的警告算法。


关键字:感知算法 引用地址:搭建一个开源ADAS项目的步骤流程

上一篇:低压差线性稳压器如何满足汽车摄像头模块的功率要求
下一篇:基于ISO 21434的汽车网络安全实践案例解析

推荐阅读最新更新时间:2026-03-21 05:51

电子警察的分类及步骤流程
电子狗和电子警察,大家可能难以区分,现在我和大家讲讲电子警察的原理,具体如下:     电子警察的业务流程可以分为三步:1、前端抓拍;2、数据传输,后端存储并且人工确认;3、发布违章通知书,申述,处罚。大家最关心的就是前端怎样抓拍。   现在的电子警察根据功能可以分为:闯红灯抓拍、单点超速抓拍、区间测速、压实线抓拍、驶入禁停区抓拍等。根据抓拍方式可以分为常见的有:视频抓拍、地感线圈抓拍、雷达测速抓拍,不太常见的有:红外、激光、超声波抓拍。抓拍的工具是摄像机或照相机。根据安装位置可以分为:路中间立杆安装、路边安装、移动电子警察等。   一般压实线抓拍和驶入禁停区抓拍,都是人工操作带云台的摄象机(云台就是可以托着摄
[单片机]
电子警察的分类及<font color='red'>步骤</font><font color='red'>流程</font>
金脉发布基于地平线征程6智驾平台的雷达AI感知算法解决方案
2024年12月9日,以先进AI算法赋能感知系统性能提升,上海金脉电子科技有限公司发布基于地平线征程®6智驾平台的域控毫米波雷达感知算法解决方案,进一步推进雷达与场景的精准识别融合,为智能驾驶带来全新体验。 传统车规级毫米波雷达通过接收物体反射回来的电磁波信号并输入到计算单元进行识别运算,输出数据包含测量目标物位置、类别、速度以及强度等多维信息。传统的信号处理方法很难完全过滤掉雷达原始数据中的噪声且在处理过程中会造成部分有效信息丢失,导致雷达在探测目标时出现漏检和误检的情形。 金脉基于地平线征程6E/M智驾平台和域控(集中式)雷达感知系统,以数据为驱动力,最大化有效信息的收集,搭建以神经网络算法为核心的深度学习计算模型并自
[汽车电子]
金脉发布基于地平线征程6智驾平台的雷达AI<font color='red'>感知</font><font color='red'>算法</font>解决方案
智能驾驶感知算法梳理 高阶自动驾驶落地关键分析
  感知算法升级是L2级向L 3级智能驾驶系统跨越的关键。与传统2D+CNN算法相比,BEV+ Transformer算法优势体现在: 1)感知输出信息精准度更高; 2)鲁棒性高; 3)泛化能力强,有助于城市高阶智能驾驶落地。感知算法突破+工信部明确扶持L3级商业化落地,国内向L3级商业化加速迈进。
[嵌入式]
智能驾驶<font color='red'>感知</font><font color='red'>算法</font>梳理 高阶自动驾驶落地关键分析
视觉感知进入深水区,算法决定谁才是最后的赢家
佐思汽研发布《2019-2020 汽车视觉产业链研究报告(下)双目及其他》。 据舜宇光学观点,汽车摄像头分为感知摄像头和影像摄像头。 感知摄像头用于主动安全,需要准确捕捉图像,一般用于前视和内视。影像摄像头用于被动安全,并将所拍摄的图像存储或发送给用户,一般用于环视和后视。因此,感知摄像头和影像摄像头在成像质量要求和温度可靠性要求方面完全不同。 感知摄像头用于车道检测、信号灯检测、道路标志识别、车内监测等。如果感知摄像头拍摄的图像有任何错误,将会引起软件计算错误,并导致不可避免的后果。所以,感知摄像头的价格敏感性相对较低。 影像摄像头对价格非常敏感,因此存在激烈的价格战,对性能的要求不是很高,国内企业介入较多,但是绝大多数都不
[嵌入式]
视觉<font color='red'>感知</font>进入深水区,<font color='red'>算法</font>决定谁才是最后的赢家
南加州大学研究新数学算法 识别自动驾驶汽车上路前感知系统故障
在洛杉矶此类交通密集的城市,很多人都在问自动驾驶汽车什么时候会出现?但是由于在美国发生了一系列自动驾驶汽车重大事故,自动驾驶汽车的安全问题让普及自动驾驶汽车的梦想戛然而止。 但是,据外媒报道,美国南加州大学(USC)的研究人员发布了一项新研究,解决了自动驾驶汽车开发人员长期面临的一个问题:如何测试自动驾驶系统的感知算法,该算法可让汽车“理解”“看到”的东西。 南加州大学研究人员与亚利桑那州立大学(Arizona State University)的研究人员合作,采用了新数学算法,能够在自动驾驶汽车上路之前,识别其系统中存在的异常情况或是故障。 感知算法基于卷积神经网络,由机器学习(一种深度学习)提供动力。众所周知,很难对此类算法进
[机器人]
一键获得LiDAR感知能力!速腾聚创首次发布LiDAR算法
“ 不要低估你车载LiDAR的威力。”今年4月份,速腾聚创宣布“普罗米修斯”计划,以“负责、开放、共享”的理念,向合作伙伴提供一系列由软硬结合的自动驾驶激光雷达解决方案。公司致力于推动自动驾驶技术发展的伙伴们一起,更好更快探索地自动驾驶领域。 半年时间,我们和首批来自汽车OEM厂商、科技公司与高校等领域的深度合作伙伴戮力齐心,基于不同的真实驾驶场景做了大量的实测工作,各个算法模块验证了稳定性。 现在,RS-LiDAR-Algorithms感知算法1.0版本正式向“普罗米修斯”计划合作伙伴开放啦! 一个让你的自动驾驶车立刻获得LiDAR感知能力的开发套件 RS-LiDAR-Algorithms感知算法SDK是专门为自动驾驶
[汽车电子]
一键获得LiDAR<font color='red'>感知</font>能力!速腾聚创首次发布LiDAR<font color='red'>算法</font>
Linux系统下超线程感知的调度算法研究
  随着计算机应用的日益普及,用户对计算机的处理能力的需求成指数级增长。为了满足用户的需求,处理器生产厂商采用了诸如超流水、分支预测、超标量、乱序执行及缓存等技术以提高处理器的性能。但是这些技术的采用增加了微处理器的复杂性,带来了诸如材料、功耗、光刻、电磁兼容性等一系列问题。因此处理器设计人员开始寻找新的途径来提高处理器的性能。Intel公司于2002年底推出了超线程技术,通过共享处理器的执行资源,提高CPU的利用率,让处理单元获得更高的吞吐量。    1 超线程技术背景   传统的处理器内部存在着多种并行操作方式。①指令级并行ILP(Instruction Level Paramllelism):同时执行几条指令,单CP
[嵌入式]
打败原有思路,重塑新机器人
身处于21世纪的我们,就算是没有听说过任何高科技产品的名字,也一定会听说过机器人这个字眼,在这个时代,机器人技术尤其热门,各个国家也都在大力发展该行业,可想而知,该行业在本世纪的地位。作为世界最为热门的技术之一,几乎每个地方都有在研究机器人,他们在该领域都各有特色,但波士顿动力公司无疑是其中的佼佼者,而作为公司的明星Atlas无疑是最出色的。 关于人形机器人坠毁在地上的一些事情往往会引起旁观者的同情。甚至许多机器人专家都试图让他们的机器人不跌倒,仅仅是因为当它们坏了时修理它们既费时又昂贵。 但在波士顿动力公司,碰撞和跌倒是开发过程中不可或缺的一部分。通过将 Atlas 推向(有时甚至超出)其极限,团队不断地了解其能力以及如
[嵌入式]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved