红绿灯识别方案分享
附赠自动驾驶最全的学习资料和量产经验:链接
方案概述
检测: 首先依靠一个基于图像的 2D 目标检测网络(本文中选取的是 YoloX), 并对该网络进行简单修改, 加入一个 extra head, 专门用于输出每个检测目标的多个属性(如颜色/朝向等).
跟踪: 随后使用简单的跟踪算法(如SORT算法)对检测到的目标进行跟踪, 以确保为每个灯分配唯一 ID, 方便对其状态进行时序校正.
聚类: 再之, 本方案会进行一个聚类算法, 对出现在同一区域的红绿灯进行合并簇, 这样可以在随后的选择处理中, 筛选出感兴趣的一簇灯, 而不是所有目标都参与红绿灯的投票中.
校正: 最后, 对每个状态的灯进行投票/校正等操作, 确保输出的结果状态稳定可靠, 不会因为前面步骤的偶发错误而出现跳变
数据标注
为了兼容各种各样的红绿灯的识别, 需要设计合适的数据标注方案, 本方案开发的标注方法, 理论上适用于常见的各种红绿灯.
对前向相机拍摄的图片进行人工标注,记录信号灯的 ID, 位置坐标、目标大小、颜色、符号等各种属性。经常出现的有如下几种类型的信号灯需要进行标注:
-
机动车信号灯
-
非机动车信号灯
-
人行横道信号灯
-
倒计时信号灯
-
⻋道信号灯
-
其它类型信号灯
灯箱 bbox 标注
在每帧图片中,最先需要标注的即每个信号灯灯箱的位置和大小信息(即bbox),灯箱位置信息以2D包围矩形框的方式,应尽量贴合灯箱的外边缘。bbox 标注的原则有如下几条:
-
短边最小尺寸大于 4 像素的灯箱都要标注
-
对于遮挡不全(不超过90%)的情况,若结合信号灯位置可确认其他边缘位置,需脑补出整个信号灯的检测框,并注明遮挡属性(参考后文中 occlusion 属性的定义)
-
对于遮挡超过90%的灯箱,不需要标注
灯箱 ID标注
在同一帧图像中,每个灯箱都有其唯一的 ID。对于同一灯箱在不同帧图像之间,其 ID 应保持一致。ID 采用字符串或数字均可。
灯箱属性标注
指灯箱或子灯的某个类别的状态取值(如某子灯的颜色属性: 红色),本文涉及的属性分为灯箱和子灯两个大类,如下:
灯箱属性:
-
direction(朝向)
-
orientation(装置方向)
-
state(运行状态)
-
indication(指示类型)
-
occlusion(遮挡状态)
-
truncation(截断状态)
-
blur(模糊状态)
-
child_num(子灯数量)
-
relevance(相关性)
子灯属性:
-
color(子灯颜色)
-
shape(子灯形状)
这里不对每个属性一一介绍, 取几个主要类别图例如下:
灯箱朝向属性
子灯颜色属性
标注格式
每张图片对应一个json文件,如下图的样例图片的标注信息如下:
{
"infos":
{
"image_path" : "00001.jpg", # 图像数据的路径 # 相机编号
"image_height" : 1080, # 图像高度
"image_width" : 1920, # 图像宽度
},
"objects":
[
{
"id" : 103 # 灯箱的唯一ID(每个包内不得重复)
"class" : "traffic_light", # 灯箱类别名称,统一为 traffic_light
"bbox" : [ 55,46,110,177 ] # 灯箱的 bbox 坐标
"direction" : "front", # 灯箱朝向(属性1)
"orientation" : "vertical", # 灯箱的装置方向(属性2)
"state" : "on", # 灯箱运行状态(属性3)
"indication" : "motor", # 灯箱的指示类型(属性4)
"occlusion" : "not_occluded", # 灯箱的遮挡状态(属性5)
"truncation" : "not_truncated", # 灯箱的截断状态(属性6)
"blur" : "not_blur", # 灯箱的模糊状态(属性7)
"relevance" : "not_relevant", # 灯箱的相关性(属性9)
"child_num" : 4, # 灯箱的子灯数量(属性8)
"child_division" : [[55, 46, 110, 78], # 子灯的 bbox 坐标
[55, 78, 110, 110],
[55, 110, 110, 142],
[55, 142, 110, 177]]
"child_color" : ["red", "dark", "dark", "red"], # 子灯的颜色列表(子灯属性1)
"child_shape" : ['arrow_left', 'unknown', 'unknown', 'digit:32'] # 子灯的形状列表(子灯属性2)
},
{
此处省略第二个灯箱标注信息
},
{
此处省略第三个灯箱标注信息
},
{
此处省略第四个灯箱标注信息
},
{
此处省略第五个灯箱标注信息
},
{
此处省略第六个灯箱标注信息
},
{
此处省略第七个灯箱标注信息
},
{
此处省略第八个灯箱标注信息
},
{
此处省略第九个灯箱标注信息
}
]
}
TODO: 先写这么多吧, 有人看再继续…