apollo源码阅读——红绿灯感知识别模块

因为学习的原因,最近要研究一下百度apollo自动驾驶平台的红绿灯识别模块,写下点东西作为学习的记录,apollo版本为6.0

目录

  • apollo感知模块
  • apollo红绿灯相关代码
  • 红绿灯感知流程
    • 红绿灯状态定义
    • 预处理阶段
      • 摄像头选择
      • 图片同步
    • 处理阶段
      • 调整阶段
      • 检测阶段
      • 识别阶段
      • 修正阶段
    • 红绿灯检测识别神经网络模型


apollo感知模块

apollo感知模块的总体架构如图所示,我们看到在红绿灯模块中用到了6mm和12mm的前置摄像头,这个6mm指的是焦距为6毫米,6mm是广角镜头,拍摄范围比较大,而12mm是长焦距摄像头,拍摄的距离比较远,在后面我们可以知道,同一个时间点只以一个摄像头的图片为依据

在这里插入图片描述
下面这张是展现更多细节的模块图
在这里插入图片描述
apollo总体的感知模块如图所示,红绿灯模块相关的流程在最上面一行,通过图片预处理,神经网络识别,以及后处理过程,最终输出识别的结果

apollo红绿灯相关代码

红绿灯相关的代码模块大部分都在apollo/modules/perception/camera下面,解释一下每个文件夹的大致内容:

  • app:包含红绿灯相关内容的主体流程,主流程在traffic_light_camera_perception.cc中,主要是包含了检测,识别以及追溯这三个部分的内容,定义了cameraframe这个类,把所需的数据都封装起来,在识别过程中不断读取该类的数据或者往该类中写入数据。
  • common:包含红绿灯模块中常用的函数
  • lib:主要看traffic这个文件夹,流程中的算法细节和调用都写在了这里,便于应用主体的使用,分为四个文件夹,preprocess,detect,tracker和proto,前三个就是红绿灯模块的主体内容
  • proto:配置文件相关的内容
  • test:测试用例
  • tools:工具类

红绿灯感知流程

在这里插入图片描述

红绿灯状态定义

代码位置apollo/modules/perception/base/traffic_light.h

一般情况下,红绿灯有红,黄,绿这三种状态,不过考虑到红绿灯会有闪烁的或者坏掉的情况,定义了第4种颜色黑色,并且有可能所有的摄像头都无法拍摄到红绿灯的位置,所以还要定义一个未知颜色,所以在这个枚举类中,我们看到一共定义了5种红绿灯的颜色

  • 未知
  • 绿
enum class TLColor {TL_UNKNOWN_COLOR = 0,TL_RED = 1,TL_YELLOW = 2,TL_GREEN = 3,TL_BLACK = 4,TL_TOTAL_COLOR_NUM = 5
};

预处理阶段

预处理阶段的输入数据有四种,分别是:

  • 摄像头图像数据
  • 定位信息
  • 高精度地图
  • 校准结果

输出数据为:

  • 被选择的摄像头输出的的图像信息
  • 从世界坐标系投射到图像坐标系的信号灯边界盒

预处理相关的代码均在apollo/modules/perception/camera/lib/traffic_light/preprocessor文件夹下

摄像头选择

每个红绿灯拥有唯一id,并且边界上的四个点表示一个红绿灯,每个点都是世界坐标系中的3维坐标点

一个信号灯的记录方式大致上如下面的代码所示,当有汽车的定位信息后,4个边界点可以通过查询高精度地图获取

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

3维世界坐标系中的边界点随后被投射到每个摄像头图像的2维坐标系,最后会选择具有最长的焦距且能够看到所有信号灯的摄像头图片作为输出图像。投射到该图像上的信号边界盒将作为输出的边界盒。

之后会将摄像头id和缓存图片存储在队列中

图片同步

因为没有必要时时刻刻去检测红绿灯,毕竟计算资源有限,而且红绿灯变化也是周期性的,所以系统设定了一个时间间隔去,每隔一段时间去缓存队列中获取图片信息,被选取的图像会被输送到处理阶段,不适合的图片会被丢弃。

处理阶段

处理阶段有四个部分

  • 调整阶段,画出ROI,用于红绿灯检测
  • 调用神经网络,检测ROI中的红绿灯,画出边界盒
  • 识别边界盒中红绿灯的颜色
  • 对识别出来的颜色进行修正并输出最终结果

调整阶段

前面经过预处理阶段的投射,在图片上得到了一个投射框,但是得到的投射框不是完全可靠的,所以要通过投射的信号灯位置计算的一个更大的兴趣区域(Region of Interest ROI)被用来确定信号灯精确的边界盒。

检测阶段

信号灯检测(detect)是一个常规的卷积神经网络检测任务,它接收带有ROI信息的图像作为输入数据,顺序输出边界盒。输出结果中的信号灯数量可能多于输入数据。

红绿灯检测相关的代码调用在apollo/modules/perception/camera/lib/traffic_light/detector/detection/detection.cc中

Apollo会根据输入信号灯的位置、形状及检测的评分选择合适的信号灯(这部分选择的逻辑在https://github.com/ApolloAuto/apollo/blob/master/modules/perception/camera/lib/traffic_light/detector/detection/select.cc中,大致为计算2D平面中框出的红绿灯的中心点,以及投影框的中心点,利用公式计算出一个GaussianScore,然后GaussianScore占0.7的权重,置信度占0.3的权重,最终计算出一个总的分数来进行比较)。如果CNN在ROI内找不到任何的信号灯,则输入数据中的信号灯将被标记为未知,且跳过剩下的两个步骤。

识别阶段

红绿灯识别任务的目的是识别红绿灯的颜色,该任务使用常规的卷积神经网络完成,相关的调用代码在apollo/modules/perception/camera/lib/traffic_light/detector/recognition/recognition.cc中

识别模块接受的输入是带有ROI信息的图像和一组边界盒信息作为输入数据,输出的是一个四维向量,分别表示每个边界盒是黑色、红色、黄色和绿色的概率,当且仅当概率足够大时,有最大概率的类别会被识别为信号灯的状态。否则信号灯状态被设置为未知,表示状态未确定

修正阶段

在识别阶段,因为遮挡或者红绿灯闪烁问题,输出的状态可能不是真正的状态,所以要对对应的结果进行修正

修正相关的逻辑在apollo/modules/perception/camera/lib/traffic_light/tracker/semantic_decision.cc中

修正分为很多种情况

第一,在ReviseBySemantic函数中修正了识别多个红绿灯的情况,如果有多个红绿灯出现,那么将会识别每个红绿灯的颜色,某个颜色出现,那么这个颜色计数就会加1,如果存在这个最多的数量是唯一的,那么就输出这个颜色,如果有两种及两种以上的颜色计数并列第一,那么会输出未知

第二,如果识别的结果是红色或者绿色,那么就会直接输出。如果接收到黑色或者未知,修正器会检测状态保存列表。如果信号灯状态已经确定持续了一段时间,那么将保存的状态输出。否则将黑色或者未知输出。

第三,因为时间顺序关系的存在,黄色只会在绿色之后红色之前出现,所以为了安全的考虑,在绿色出现之前任何红色之后的黄色都会被设置为红色。

红绿灯检测识别神经网络模型

在一次红绿灯图片检测和识别的流程中,一共会用到两个神经网络模型,分别是红绿灯检测以及红绿灯识别,检测用于在ROI中画出红绿灯的边界盒,红绿灯识别用于检测边界盒中红绿灯的颜色信息,两者在apollo中使用的都是caffe卷积神经网络模型

红绿灯检测神经网络配置信息位置
apollo/modules/perception/production/data/perception/camera/models/traffic_light_detection/detection.pt

红绿灯识别神经网络配置信息位置
apollo/modules/perception/production/data/perception/camera/models/traffic_light_recognition/recognition_caffe.pt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/252098.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

PowerBI如何在报表中添加红绿灯

PowerBI是微软推出的一种交互式报表工具,能够将静态的数据字段用各式图表进行表示,比如柱状图、折线图以及饼状图等一系列视觉对象,通过视觉对象组合成的报表,可使管理人员更加直观的了解所有项目的详细信息,包括项目下…

Open cv2 识别红绿灯

1. 导入相关库 import cv2 import numpy as np 2. 导入视频 cap cv2.VideoCapture("红绿灯.mp4") 3. 修改视频尺寸 frame cv2.resize(frame, (1620, 900)) 4. 转换hsv颜色空间 hsv cv2.cvtColor(img,cv2.COLOR_BGR2HSV) 5. 红灯 lower_hsv_red np.array…

【Arduino实验03 智能红绿灯】

目录 一、实验目的 二、实验设备与环境 三、实验重点 四、实验难点 五、实验内容 5.1实验任务 5.2实验原理 5.3实验内容 5.4实验结果 5.5思考题 一、实验目的 (1)熟悉掌握Arduino编程基本语法; (2)熟悉按键、蜂鸣器的功能,掌握接口电路连接&am…

turtle绘制红绿灯,实现灯闪烁效果

画出边框 首先导入库,并且画出边框,画完之后可以选择隐藏海龟,如果不隐藏你的红绿灯中间会出现画笔,像这样 import turtle import timeturtle.width(20)#线的粗细 for i in range(2):#画出边框turtle.left(90)turtle.fd(300)tu…

如何添加打印机到电脑

首先你要知道打印机的ip 可以先打印测试页 找到控制面板——点击设备与打印机 左上角选择添加打印机 选择 我所需的打印机未列出 点击add aprinter usinga … 然后下一页 输入你的打印机的ip地址 和端口号 点击下一步

共享打印机连接方法

点击开始-运行(快捷键:开始键R),键入连接共享的打印机的电脑网络IP地址,如\\192.168.1.250, 点击确定,就可以查看到共享的打印机及文件夹啦。选择要添加的共享打印机,双击,就会自动添…

计算机无法打印图片,电脑中打印机可以打印文档却无法打印图片如何解决

我们在使用电脑过程中,很容易会碰到一些问题,遇到问题时也只能耐心寻找原因进行解决。比如,现在,有位用户反馈自己的电脑中打印机可以打印文档却无法打印图片,这该怎么办呢?接下来,就随系统城小…

计算机图桌面打印出来,桌面图片打印设置方法

以电脑Windows7系统为例,打印桌面图片的具体步骤是: 1、在电脑桌面上打开需要打印的图片。 2、点击图片上方的打印图标。 3、设置好打印参数后,点击【打印】按钮即可。 打印通常指把电脑或其他电子设备中的文字或图片等可见数据,通…

如何批量打印jpg图片

图片打印在标签制作中的应用也很广泛,因为现在很多用户在制作标签时会添加相对应的图片,这里所需的图片数量会很多,如果将图片逐个导入标签内进行打印,费力还容易出错。这时只需将图片放在一个文件夹里,通过条码软件生…

win11自带的照片查看器无法打印问题解决

参考文章:https://blog.csdn.net/weixin_39589644/article/details/112708068 文章目录 问题解决方法 问题 win11自带的照片查看器无法打印。其它查看图片的应用,都可以正常用打印机打印。唯独win11自带的查看照片的应用,按了打印键以后打印…

epson喷墨一体机打印照片偏色的调整

本文经验针对普通用户。 打印机 有一台EPSON L365系列墨仓式打印一体机,使用状况良好。该款打印机定位于家用,墨仓式设计降低了打印成本。功能齐全,支持Wi-Fi无线打印,支持复印,扫描。支持从手机/IPAD移动设备APP打印照…

Ipad使用技巧之——打印机

一 概述 有iPad使用需求的人可能会使用iPad进行打印照片或文档,对于首次进行打印的人可能会有几个疑问: iPad自身是否提供打印功能打印机提供商是否提供对应的软件支持(appstore商店是否有对应应用) 二 硬件支持 iPad pro2021款佳能G3800 三 iPad打印…

比手机还小的打印机?极印·立可印N1潮玩口袋照片打印机评测体验

在移动互联网高度普及的今天,智能手机早已成为了许多人每天不可或缺的随身伴侣。究其原因,无非是智能手机既轻巧便携又功能强大,我们日常工作和生活中的许多事情,都可以通过手机上的各种APP应用轻松搞定。 那么亲爱的读者朋友们是…

vue-router使用

router中 hash模式和 history 的区别: 不同的路由,,哈希值会被修改,但是不会向服务器发送新的请求,,VueRouter会监听 url中哈希值变化去匹配组件 hash模式优点: 兼容性好简单配置,…

简单了解固态硬盘(SSD)

简单了解SSD SSD VS HDD机械硬盘HDD固态硬盘SSD SSD的“解剖图”——系统框架图SSD的“基石”——存储介质闪存器件闪存芯片架构三维闪存闪存存在的问题 SSD的“大脑”——FTL映射管理垃圾回收修剪Trim坏块管理掉电恢复磨损平衡 SSD的“荣誉”——参数指标 SSD VS HDD 机械硬盘…

编程示例:求排列的逆,反序表,以及从反序表计算排列

编程示例:求排列的逆,反序表,以及从反序表计算排列 计算机程序设计艺术的第三卷 第五章排序中,第5.1.1节中 提到了排列的反序,反序表,逆的概念。 首先,简单地介绍一下这两个概念。例如一个排列…

JS实现计时器/秒表功能

系统学习JS时的一个小练习 直接上代码吧&#xff0c;注释写得还算详细&#xff0c;就不赘述了&#xff0c;很简单的一个练习。 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta http-equiv"X-UA-C…

JavaScript 计时器

1.在JavaScript中&#xff0c;我们可以在设定的时间间隔之后来执行代码&#xff0c;而不是在函数被调用后立即执行。 2&#xff0e;计时器类型&#xff1a; &#xff08;1&#xff09;一次性计时器&#xff1a;仅在指定的延迟时间之后触发一次。 &#xff08;2&#xff09;间…

window遇到 stopcode: 0xc000021a 无法启动的问题解决

今天朋友电脑window10遇到以上问题&#xff1a;stopcode: 0xc000021a 无法自动修复和启动的问题。 解决办法如下&#xff1a; 第一步、进入dos命令行 点击其他选项&#xff08;Advanced options&#xff09; 点击工具 第二步、确定系统盘 进入dos之后 输入一下命令 回车…