人在驾驶过程中会注意红绿灯的信息,而自动驾驶更离不开红绿灯信息,有了红绿灯信息,自动驾驶车辆才能更好地与车路进行交互。本篇分析 Apollo 6.0 中红绿灯检测和识别中的相关算法逻辑及部分代码实现。

先看感知架构图。

Apollo 中的红绿灯

Apollo 默认有 2 个前视摄像头:

  • 25mm 焦距看远处,视距长,但 FOV 小。
  • 6mm 焦距看近处,视距短,但 FOV 大。

两个摄像头都可以检测到红绿灯,它们相互冗余,但是同一时刻只能以一个为主。

上面的图片是来自于长焦相机,能看得很远,但视野窄,下面的正好相反。

Apollo 红绿灯模块定义了红绿灯 5 种状态:

  • 绿
  • 未知

算法流程

在 Apollo 中红绿灯模块有一套固定的处理流程:

  1. 预处理阶段
  2. 处理阶段

预处理阶段-信号灯投影

预处理阶段第一个任务就是要根据车辆定位信息从高精度地图中查询红绿灯的物理信息,得到信号灯的物理坐标,然后再通过相机模型和标定好的相机内参,将信号灯从 3D 世界中投影到 2D 图像当中变成一个 Bounding Box。

信号灯的物理位置信息长这样:

signal info:
id {id: "xxx"
}
boundary {point { x: ...  y: ...  z: ...  }point { x: ...  y: ...  z: ...  }point { x: ...  y: ...  z: ...  }point { x: ...  y: ...  z: ...  }
}

预处理阶段-相机选择

前面讲到有 2 个相机,那么选用哪个呢?

优先选择长焦的相机,因为长焦能将远处的信号灯显示的比较大且清晰,容易做颜色识别。

什么时候选择短焦呢?

当长焦没有办法检测到所有红绿灯的时候。

同一个算法处理周期,只有一个摄像头的图片才能够进行处理。

预处理阶段-图片信息及缓存同步

在自动驾驶中,因为考虑到车辆行驶速度很快,因此障碍物的识别一般要求实时,也就是 30FPS 以上。

但相对于障碍物,红绿灯的位置信息没有那么重要,重要的是它的语义信息,也就是红绿颜色变化,但这种频率是非常低的,所以对于红绿灯检测而言,我们不需要那么高的频率,也因此不需要针对每一帧图片都做红绿灯处理。

因此,我们可以隔一个固定的时间周期去查询高精度地图中的红绿灯信息,然后选择最近的图片缓存一起送入到红绿灯处理模型当中,其它的图片就可以丢掉了。

处理阶段-修整(Rectifier)

预处理会产生一张图片和对应的红绿灯信息(2D bbox),但因为误差问题,2D bbox 和实际上观察到的红绿灯是有偏差的,甚至很大,所以要基于 bbox 设置一个 ROI 区域。

将带有 ROI 信息的图片传输给一个 CNN 做检测,最终会输出一系列的信号灯结果。

处理阶段-识别(Recognizer)

检测是为了估算位置,而识别是要分辨信号灯的颜色。

将 ROI 和信号灯结果连同图像输入给一个 CNN,这个 CNN 就会给出信号灯的颜色信息。

预处理阶段-修正(Revisor)

因为交通灯都会闪烁,所以前一个流程的结果可能不准确,因此需要结合历史信息进行推断。

比如,收到的信号是绿或者红,那么直接输出。

如果是黑色,或者是未知状态,就要根据历史缓存进行推断,如果前面的状态不是黑色或者未知就输出历史状态,否则输出黑色或者未知。

并且,黄灯只能在绿色和红色之间,如果顺序不对就会被丢弃。

上面的内容来自于 Apollo Gitee 仓库的说明,很明显红绿灯识别是个多阶段任务。

我一直在想能不能用端到端的模型一步到位呢?

比如用 LSTM 直接输出最终的结果?

这个需要尝试一下。

理论知识讲解完后,就要开始在代码层面验证了。

参考

  1. https://gitee.com/ApolloAuto/apollo/blob/master/docs/specs/traffic_light.md

自动驾驶 Apollo 源码分析系列,感知篇(三):红绿灯检测和识别相关推荐

  1. 自动驾驶 Apollo 源码分析系列,感知篇(六):车道线 Dark SCNN 算法简述及车道线后处理代码细节简述

    本文大纲 自动驾驶中的车道线检测思路 SCNN 算法思想 Apollo 中对应的 dark scnn 代码逻辑 dark scnn 模型结构 SCNN 方向的简化 heatmap 对应代码逻辑 灭点提 ...

  2. 自动驾驶 Apollo 源码分析系列,感知篇(八):感知融合代码的基本流程

    说起自动驾驶感知系统,大家都会谈论到感知融合,这涉及到不同传感器数据在时间.空间的对齐和融合,最终的结果将提升自动驾驶系统的感知能力,因为我们都知道单一的传感器都是有缺陷的.本篇文章梳理 Apollo ...

  3. 自动驾驶 Apollo 源码分析系列,感知篇(二):Perception 如何启动?

    从 Apollo 的官方文档,我们很容易得知 Perception 是核心的组件之一,但像所有的 C++ 程序一样,每个应用都有一个 Main 函数入口,那么引出本文要探索的 2 个问题: Perce ...

  4. 自动驾驶 Apollo 源码分析系列,感知篇(七):Lidar 障碍物检测基本流程

    Apollo 系统传感器是以 Lidar 为主的,本文整理在 Apollo 6.0 中 Lidar 的基本代码流程. 1. 从 Component 出发 因为有了之前红绿灯检测代码分析的经验,我们自然 ...

  5. 自动驾驶 Apollo 源码分析系列,系统监控篇(二):Monitor模块如何监控硬件

    前面的文章有分析,Monitor 模块监控的内容分为 Hardware 和 Software 两位. 本篇分析硬件监控部分. 首先,可以观察一下 Apollo 官方文档给出的硬件连接图. 跟自动驾驶本 ...

  6. 自动驾驶 Apollo 源码分析系列,感知篇(九):感知融合中的数据关联细节

    前一篇文章讲了,Apollo 6.0 中融合的代码逻辑流程,但那是基于软件的角度进行梳理和分析的,这一篇文章基于上篇的成果进一步对算法进行更详细的分析,因为代码量奇大,所以本文重点讨论数据关联的一些细 ...

  7. 自动驾驶 Apollo 源码分析系列,系统监控篇(四):Monitor模块如何监控进程 Process 的存活状态?

    本篇文章分析 Apollo 中监控模块中监控进程状态的相关代码. 1. ProcessMonitor ProcessMonitor 是一个普通的定时器组件,内部函数也只是常规的 RunOnce 和 U ...

  8. 百度自动驾驶apollo源码解读4:/cyber/task 模块

    在这里就不贴源代码,太占空间了,源码连接:https://github.com/ApolloAuto/apollo/tree/master/cyber/task cyber下面的task包是使用cyb ...

  9. 【Apollo源码分析】系列的第三部分【prediction】_slamcode的博客 -CSDN博客

    [Apollo源码分析]系列的第三部分[prediction]_slamcode的博客 -CSDN博客

  10. MyBatis 源码分析系列文章导读

    1.本文速览 本篇文章是我为接下来的 MyBatis 源码分析系列文章写的一个导读文章.本篇文章从 MyBatis 是什么(what),为什么要使用(why),以及如何使用(how)等三个角度进行了说 ...

最新文章

  1. 上海 |《PMCAFF产品经理第一课》报名倒计时手慢无,微博副总裁、丁香园、1号店、淘宝产品总监私房干货分享...
  2. python函数式编程读取数据-python学习笔记9:函数式编程
  3. 如何在 SAP Commerce Cloud Portal 构建和部署 SAP Spartacus Storefront
  4. AlienVault Ossim各版本镜像下载地址
  5. IDEA---SpringBoot同一个项目多端口启动
  6. 新能源汽车简史——电动汽车沉浮录
  7. 无法重新声明块范围变量。此处也声明了 。_Go 语句块与作用域
  8. 软件工程网络15个人阅读作业2(201521123010徐璐琳)
  9. 阶段3 2.Spring_02.程序间耦合_6 工厂模式解耦
  10. pythonweb测试_python的web自动化测试
  11. 用友NC6.5 6.33 6.3 5.7 5.5 5.02最新补丁下载
  12. 会员管理系统单机版哪里有?
  13. pyodbc 测试连接 SQL Server 数据库
  14. linux 防火墙 防ddos,Linux防火墙iptables以及如何防御DDOS攻击
  15. Win32反汇编(三)深层次的了解各种转移指令:IF语句有符号与无符号跳转
  16. ASP.Net+XML打造留言薄
  17. 两码一号(四):蚂蚁产品大盘
  18. Wab开发————jQuery
  19. 网络课程学习视频的快进播放和去除鼠标移动视频暂停的问题
  20. Java EE结构理解 与Dao模式 no7.

热门文章

  1. java日志:一、JUL使用
  2. 针孔微创牙龈手术(Pinhole Gum Rejuvenation)
  3. 人生的第一篇博客φ(>ω<*)
  4. mac上传文件到ftp服务器,mac上传文件到ftp服务器
  5. 锁(synchronized和Lock)
  6. date.getMonth() date.getDate())
  7. Tomcat端口配置(详细)
  8. 计算机为什么不能装win7,i5 8400 cpu能装win7吗?为什么安装不了win7
  9. UML10种图例之包图
  10. 以下哪些属于计算机应用领域,以下哪些计算机的应用领域?()