智能车 2024 第二次作业:车道线检测¶
0. 背景介绍¶
随着自动驾驶技术的迅猛发展,车道线检测作为视觉感知模块的重要组成部分,受到广泛关注。车道线为车辆提供了行驶路径的参考,对实现自动驾驶中的路径规划、环境感知和决策控制起到至关重要的作用。传统的驾驶辅助系统依赖于车道线检测来实现车道保持辅助(LKA)等功能,而在完全自动驾驶(Level 4 及以上)中,精准的车道线检测则是实现全自动导航的基础。
车道线检测在自动驾驶和 ADAS 中的意义主要体现在以下几个方面:
- 提升行车安全:精准的车道线检测能够辅助驾驶员保持车道,预防偏离车道引发的交通事故。
- 实现自动驾驶:作为自动驾驶系统的基础感知模块,车道线检测为路径规划和控制指令提供必要的前提信息。
- 优化驾驶体验:通过车道保持辅助、自动变道等功能,提高驾驶的便捷性和舒适性。
- 支持交通管理:车道线检测数据可用于交通流量分析、道路维护等公共管理领域。
1. 任务要求¶
本次作业要求大家使用 ROS2 完成一个车道线检测的节点。通过 topic 获取图像信息,并输出车道线检测结果。作业的考核点包括:
- 基本 ROS2 程序的实现 (60%)
- 图像信息获取
- 车道线检测
- 结果输出
- 车道线检测算法的性能 (40%)
- 车道线检测的准确性
- 车道线检测的效率(通过运行时间进行评估)
任务的评分将会由上面两个部分组成。也就是说,只要你能够完成基本要求,你就可以获得 60% 的分数。然后,你可以通过优化车道线检测算法来获得额外的分数(我们会通过对所有的同学的输出结果进行排名,然后按照排名给分)。
在这里,车道线检测被定义为:给定一张图像,输出图像中所有车道线的坐标点。什么是车道线?车道线是道路上的线条,用于指示车辆的行驶方向,通常由白色或黄色油漆涂成。
Tip
项目中所有的代码都放在 Github 上,大家可以在 这里 找到所有的代码。
2. 任务分析¶
本次作业我们不限制大家使用任何现成的车道线检测算法,大家可以选择合适的算法进行实现,可以是传统的方法也可以是基于深度学习的方法。并且,我们不限制大家使用的编程语言,你可以使用 C++ 或者 Python 进行实现,甚至其它可以运行在 ROS2 上的语言也可以。
但是,为了大家能够获得更好的成绩,我们给大家一定的忠告:
- 我们不保证评测服务器上将会有 GPU,所以大家需要使用 CPU 进行计算。如果你需要使用深度学习的算法,请确保你使用了 OpenVINO 或者 ONNX Runtime 来针对 CPU 推理进行优化。
- 由于在本次作业中,检测算法的实时性也是考核的一部分,所以大家需要确保你的算法在 CPU 上的运行时间尽可能短。这要求大家需要考虑你选择的算法和编程语言的运行效率。
- 为了方便评测,你需要将你的程序所有需要的依赖和运行的步骤都写在报告中。如果助教不能够根据你的报告成功复现你的结果,那么这个作业将会直接计算为 0 分。
3. 任务实现¶
3.1 数据集¶
3.1.1 常用的车道线数据集¶
- TuSimple Lane Detection Dataset:包含约 6,000 张高速公路图像,提供车道线标注,主要用于基线算法的评估。
- CULane:规模较大的数据集,涵盖城市道路、高速公路、乡村道路等多种场景,超过 55,000 张图像,具有丰富的标注信息。
- LLAMAS:专注于多车道标记和复杂场景,适用于多实例车道线检测的研究。
- LaneNet:提供多样化的车道线标注,支持端到端网络的训练与测试。
- Baidu ApolloScape:包含高清车道线标注和 3D 信息,适用于多任务学习与复杂环境下的车道线检测。
在本次实验中,我们选择使用 CULane 数据集。我们会从 CULane 数据集中选择一部分数据用于本次作业。其中一部分用于大家测试,另一部分用于大家提交时评测。注意:我们选择的图片都是在天气良好,光照充足的情况下拍摄的。
3.1.2 评测数据集下载地址¶
3.1.3 数据集格式¶
- 图片格式:
*.jpg
,单张图片 - 标注格式:
*.lines.txt
,单张图片的标注信息 - 整合的 rosbag 文件:
*.bag
,包含图片信息和标注信息(评测数据集不包括)
标注文件采用 .lines.txt 格式,每行对应一条车道线,包含 [x_1, y_1, x_2, y_2, …, x_n, y_n] 的坐标点对序列。具体格式如下:
例如,一条车道线标注信息如下:
另外,为了测试的方便,我们会将测试数据集和标注信息放在一个 rosbag 文件中。你需要播放这个 rosbag 文件,并使用图像信息进行车道线检测。
3.2 基本要求¶
你需要完成一个 ROS2 节点,该节点需要完成以下功能:
- 从 topic 中获取图像信息
- 对图像信息进行预处理
- 使用你选择的车道线检测算法进行车道线检测
- 将车道线检测结果在图像上进行可视化
- 将检测结果按照存储到指定的消息格式中
- 将检测结果(包括可视化结果)发布到 topic 中
相关的信息可以参考我们提供的教程:
3.2.1 图像信息获取¶
图像信息将会通过 /detection_target
这个 topic 进行发布。你需要订阅这个 topic,并获取图像信息。你可能会用到的库如下:
cv_bridge
:用于将 ROS 图像消息转换为 OpenCV 图像格式: cv_bridgesensor_msgs.msg.Image
:ROS 中图像消息的定义: sensor_msgs/Imagecv2
:OpenCV 库,用于图像处理: OpenCV
具体来说: /detection_target
这个 topic 是我们自定义的一个消息格式, 格式如下:
其中,frame_id
是图像的帧 id,image_raw
是图像信息。
3.2.2 图像信息预处理¶
在获取到图像信息后,你可能需要对图像进行一些预处理操作。例如,将图像转换为灰度图像、进行图像增强、调整图像大小等。你可以使用 OpenCV 库来完成这些操作。你可以参考 代码 来完成图像的预处理。
3.2.3 车道线检测¶
在完成图像信息的预处理后,你可以使用你选择的车道线检测算法进行车道线检测。你可以使用 OpenCV 库来完成这些操作。也可以调用深度学习的推理引擎来进行车道线检测。
3.2.4 车道线检测结果可视化¶
在完成车道线检测后,你需要将车道线检测结果在图像上进行可视化。你可以使用 OpenCV 库来完成这些操作。
3.2.5 车道线检测结果发布¶
在完成车道线检测结果的可视化后,你需要将检测结果按照存储到指定的消息格式中,并发布到 topic 中。你可以使用 ROS2 的 lane_detection_msgs/DetectionResult
消息格式来存储检测结果。
具体来说,我们提供的参考代码中定义了如下的消息:
# Detection Result
std_msgs/Header header
uint32 frame_id
Lane[] lanes
Lane[] gt_lanes
float64 run_time
其中,Lane
是一个结构体,包含了车道线的信息。run_time
是车道线检测的运行时间(从接收到图像信息到检测完成的时间, 用 \(ms\) 作为单位)。coordinates
是一个数组,包含了车道线的所有坐标点,按照 x1, y1, x2, y2, ..., xn, yn
的顺序存储。
Tip
在 lane_detection_msgs/DetectionResult
消息中,lanes
是模型推理的结果,gt_lanes
是真实标注的结果。对于 gt_lanes
, 你只需要把 /detection_target
消息中的 gt_lanes
信息复制过来就好。这个会用于可视化和评测。
Tip
在我们提供的 starter code 中,我们提供了可视化结果的代码,将会把检测结果在图像上进行可视化。你可以使用 rviz 或者 rqt_image_view 来查看可视化结果。结果发布在 /detected_image
这个 topic 下。
3.3 结果评测¶
我们会使用 CULane 数据集中的一部分数据作为测试数据集和评测数据集。
具体来说,我们会考核以下几个方面:
- 车道线检测的准确性:我们会根据车道线检测的准确性进行评分。车道线检测的准确性是指车道线检测结果与真实标注结果的匹配程度。
- 车道线检测的效率:我们会根据车道线检测的效率进行评分。车道线检测的效率是指车道线检测结果的运行时间。
我们提供了两个个 ROS2 的包来帮助大家完成作业:
lane_detection_starter_py
: 这个包提供了车道线检测的参考实现,使用 Python 实现。代码地址:GitHub。lane_detection_starter_cpp
: 这个包提供了车道线检测的参考实现,使用 C++ 实现。代码地址:GitHub。
3.3.1 车道线检测的准确性¶
我们主要通过以下指标来评测车道线检测的准确性:
- Precision:Precision 是指在所有被检测为车道线的像素中,实际为车道线的像素所占的比例。计算公式如下:
- Recall:Recall 是指在所有实际为车道线的像素中,被检测为车道线的像素所占的比例。计算公式如下:
- F1 Score:F1 Score 是 Precision 和 Recall 的调和平均值。计算公式如下:
- mIoU:mIoU 是指所有车道线检测结果的 IoU 的平均值。IoU 是指预测的车道线与真实标注的车道线的交集面积占两者面积之和的比例。 mIoU 是所有车道线 IoU 的平均值。计算公式如下:
对于我们的这次作业,我们主要通过对 F1 Score 和 mIoU 进行加权来评测车道线检测的准确性。
为了方便大家进行测试,我们在提供的工具包中提供了 detection_evaluation
节点,该节点会对你的车道线检测结果进行评测并输出评测结果。
3.3.2 车道线检测的效率¶
我们主要通过以下指标来评测车道线检测的效率:
- 运行时间:运行时间是指从接收到图像信息到检测完成的时间。
3.3.3 综合排名¶
我们将会计算每个同学的车道线检测算法在 \(n\) 个测试数据上的准确性得分平均值和效率得分平均值,然后按照分别进行排名。 其中,准确性得分占整个项目得分的 \(30\%\), 运行效率得分占整个项目得分的 \(10\%\)。
对于每个评测指标,我们会根据排名从高到低进行打分。例如,如果一个同学在所有测试数据上的准确性得分排名为 \(k\),那么这个同学在准确性得分这一项的得分为 \(100 - \frac{k-1}{n-1} \times 100\)。
Warning
也就是说准确性和效率是分别进行排名的,两者互相不影响。
4. 作业提交¶
你需要提交三个文件:
- 代码:你实现的代码, 是一个
tar.gz
格式的压缩包, 包括一个README.md
文件, 其中需要包含完整的运行步骤,包括依赖的版本和安装方式。 - 报告:你实现的报告, 是一个
pdf
格式的文件, 包括算法的原理、实现步骤、结果分析等。 - 结果:你实现的算法在测试数据集上的输出,注意只需要录制
/detection_result
这一个 topic 的信息。不要录制可视化结果。这个包需要打包为tar.gz
格式。
你需要在 互动教学平台 上提交你的作业。
注意作业提交的截止日期为 2024 年 10 月 30 日 23:59:59。
5. 学术诚信¶
我们要求所有同学在完成作业时,遵守学术诚信原则,不得抄袭他人代码,不得使用任何未经授权的辅助工具。一旦发现学术不诚信行为,将按照相关规定严肃处理,包括取消成绩、记录学术不诚信行为等。请同学们自觉遵守,共同维护一个公正、公平、诚信的学术环境。
具体来说,我们要求所有同学在完成作业时,遵守以下规定:
- 不能直接将真值信息直接写在代码中,然后提交。我们会有严格的检查机制来检查是否存在真值信息。
- 不能抄袭他人代码,你可以参考网上的代码,但是你不能直接将他人代码复制粘贴到你的代码中。
- 不能使用任何未经授权的辅助工具,包括但不限于 ChatGPT、DeepSeek Coder 等 AI 工具。
- 不能将本次作业的任何内容泄露给他人,包括助教、同学等。
- 不能有任何形式的代做、代考等行为。
Warning
一旦发现学术不诚信行为,将按照相关规定严肃处理,包括取消成绩、记录学术不诚信行为等。请同学们自觉遵守,共同维护一个公正、公平、诚信的学术环境。
6. 参考资料¶
联系方式
如果大家有任何问题,欢迎大家随时提问。联系邮箱:dengqi@shanghaitech.edu.cn