【目标跟踪】红绿灯跟踪

本文详细描述了无人驾驶系统如何通过Yolo模型进行红绿灯检测,结合ByteTrack和BotSort进行稳定跟踪,并使用DNN进行分类。文章介绍了跟踪算法的关键步骤,包括检测输入处理、预测与运动补偿、多轮匹配,以及航迹管理和信息发布的过程。

一、前言

  1. 红绿灯场景对当前无人驾驶来说是个灾难性的挑战。暂且不说复杂的十字路口,譬如简单的人行道红绿灯也算挑战。
  2. 这里简述下一般的处理方式:建图定位告知前方是个人行道路口,此时车子在经过红绿灯前应先停止,此时规划接受感知发送的信号,如果接收到红灯or黄灯,则车子停止。直到接受到绿灯则进行。
  3. 本篇会初略分享红绿灯感知包括但不限于检测+跟踪+分类。重点讲解如何稳定跟踪。

二、结果

先看结果:

视频B站链接:https://www.bilibili.com/video/BV1Vm411r7Fx/?spm_id_from=333.999.0.0

  1. 检测用的 yolo 系列模型,这部分已经很成熟了,主要内容是标注数据与训练。由于当前训练数据不够,可以看出除了正前方,左右两方的检测效果并不理想。
  2. 跟踪结合了 byteSort 与 BotSort,效果可以说相当稳定。抛开其他的不谈,对于我们重点观察的红绿灯(正前方红绿灯)可以说是稳稳的跟踪,也算遥遥领先。
  3. 分类用的较为简单的 卷积神经网络推理 DNN,效果算是可圈可点,也是由于数据量缺失,导致偶尔出现误检。分类类别分别为 unkonw、green、red、yellow。

在刚刚结束的首届深圳国际人工智能环卫机器人大赛,在人行道这个赛道就出现了红绿灯的考核,有不少企业的无人车就在这里栽了跟头。

放一张通宵比赛测试的图:(右一是博主)

图片名称

三、跟踪

因为是基于 ros 做的开发,同时红绿灯这个节点又包含了三个部分(检测+跟踪+分类)。

为了使代码美观、思路清晰,所以对三个部分封装。只需调用对应的一个接口就可以输出前后的消息,所以写代码前一定要把消息接口定义好。

所以跟踪代码只开放一个接口,这里就写做 update 吧。输入是检测的结果与图片,输出是跟踪后的框与id等,这里输出是用的引用的方式。

void update(std::vector<DetectResult>& objects, cv::Mat &img, std::vector<TrackResult>& tflTracks);

lightTracker->update(detectResults, image, trackResults);

三、跟踪

3.1、检测输入

第一部分肯定是对检测输入处理,无论是更换数据类型,还是保存相应的结构体 typedef struct,都是方便我们后续处理。

(1)我们这里分类保存检测的结果,分为高置信度检测的结果与低置信度的检测结果。

这是借鉴了我们 ByteTrack 匹配的方法。 ByteTrack 匹配采用了多次匹配的方法,首先将得分较高的目标框与历史轨迹相匹配,然后将得分较低的目标框与第一次没有匹配上的轨迹匹配,用于检测目标遮挡的情形。

当然这里还有自己处理的细节与亮点,我们比 ByteTrack 更多次的匹配验证与处理,效果更加完美。我们文章后面再一一道来。

if (objects.size() > 0)
{
   
   
    for (auto i = 0; i < objects.size(); i++)
    {
   
   
        float score = objects.at(i).detConf;
        STrack strack( objects.at(i), 10, true, 0.8); 
        if (score >= track_thresh)
        {
   
   
            detections.push_back(strack);
        }
        else
        {
   
   
            detections_low.push_back(strack);
        }
    }
}

(2)原来存在的跟踪航迹我们也做处理,区分上一次 update (匹配)过的航迹与上一帧未匹配(un_update)的航迹进行区分。

for (int i = 0; i < this->tracked_stracks.size(); i++)
{
   
   
    if (!this->tracked_stracks[i].is_activated)
        unconfirmed.push_back(&this->tracked_stracks[i]);
    else
        tracked_stracks.push_back(&this->tracked_stracks[i]);
}

这里主要是为了我们第一次做匹配做准备,区分重要 or 不重要的目标是我们可以从 ByteSort 学习到的思想,如何区分以及区分后如何处理,我们可以根据我们实际情况去操作。

3.2、预测与运动补

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

读书猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值