交通灯感知模块利用摄像头来提供精确和全面的交通灯状态。通常情况下,交通灯有三种状态:红、黄、绿。然而,当交通灯不工作时,可能显示为黑色、闪烁红灯或者黄灯。有时,在摄像头的视野范围内无法找到交通灯,从而导致状态感知失效。为了覆盖所有情形,交通灯感知模块提供五种状态输出:红、黄、绿、黑、未知。
Apollo交通灯感知分为三个步骤:
1)过滤:选取感兴趣区域(Region of Interest,ROI);
2)识别:利用卷积神经网络(Convolutional Neural Network,CNN)对上述ROI进行交通灯识别;
3)修正:对上述识别结果进行修正。
(一)过滤(Rectifier)
受标定、定位和高精度地图的影响,投影位置不完全可靠,需要一个更大范围的ROI来找到交通灯的精确边框。选取ROI的优点是节省算力、保证实时性。当然,也可以在全图上直接进行检测分类。但是,为了保证推理的实时性,往往将原图缩放成较小的图后放入CNN网络,这样大目标变成小目标,降低了检测分类的准确率。
如果CNN在ROI中找不到任何信号灯,则输入信号灯的状态会被标记为“未知”,并跳过“Recognizer”和“Reviser”两个步骤。
(二)识别(Recognizer)
通过CNN来实现交通灯的检测,CNN接收带有ROI的图像作为输入,输出一系列的边框。Apollo根据检测评分、输入灯的位置和形状来选取合适的信号灯。
CNN的输出是一个四维向量,分别代表黑色、红色、黄色和绿色的概率。当且仅当最大概率足够大时,选取最大概率的颜色作为灯的状态,否则灯的状态会被设置为黑色,意味着状态不确定。
(三)修正(Reviser)
由于交通灯可能闪烁或者被隐藏,上述识别不一定完美,当前的状态可能并不是实际状态,这就需要对当前状态进行修正。如果接收到一个确定的状态,比如红色或者绿色,修正器保存并直接输出该状态。如果接收到的状态是黑色或者未知,修正器将查找已经保存的Map。当交通灯的状态持续了一段时间,修正器将输出该保存的状态,否则,将输出黑色或者未知。
由于存在一定的时序(先验性),黄色只可能出现在绿色后面、红色前面,出于安全角度考虑,任何检测到的出现在红色后面的黄色都被复位成红色,直到绿色显示。
参考:https://github.com/ApolloAuto/apollo/blob/master/docs/specs/traffic_light.md