QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

吴子章:关键点检测技术在自动驾驶视觉感知中的应用

  • 2019-10-08
  • 本文字数:5450 字

    阅读完需:约 18 分钟

吴子章:关键点检测技术在自动驾驶视觉感知中的应用

6 月 30 日下午,在七牛架构师实践日第二十九期吴子章进行了《关键点检测技术在自动驾驶视觉感知中的应用》为题的实战分享。本文是对演讲内容的整理。


在自动驾驶中,环境感知是一个非常重要的环节,它不仅可以帮助无人驾驶汽车进行定位,还可以告知障碍物等信息以帮助决策模块去调整驾驶行为。在视觉感知任务中,实际上有很多细分的任务类型,比如目标检测、目标跟踪、语义分割、实例分割、关键点检测等,而这些细分任务在我们的环境感知中都有着非常重要的应用。


本次分享主要从以下内容展开:


介绍关键点检测技术的基本原理、关键点检测的基本方法、该技术自动驾驶当中的应用,以及关键点检测技术现存哪些问题,未来发展的方向以及在自动驾驶中的发展潜力。

01 关键点检测技术简介

在图像处理中,关键点本质上是一种特征。它是对一个固定区域或者空间物理关系的抽象描述,描述的是一定邻域范围内的组合或上下文关系。它不仅仅是一个点信息,或代表一个位置,更代表着上下文与周围邻域的组合关系。



比如在人脸关键点检测任务当中,有 28 个关键点,或是现在比较流行的 64 个、128 个关键点,这里面每个点在不同的人脸当中,代表了一类的特征,且具有一定的通用性。这一类特征不仅包含了像素的一些特性,比如嘴唇的特征点,包含了嘴唇与面部的位置关系。


右边的图片是前段时间比较火的阿里推出的服饰关键点比赛,比如在这件服饰中提供了 13 类关键点,每个关键点之所以被定位为一类关键点,因为它代表了服饰当中某一个特定的位置,或者某一个特定的位置所能代表的周围的关系。而在人体姿态检测当中,这个关键点不仅代表一个关节,还代表着这个关节和其他关节之间的关系,比如这个关节能跟其他哪些关节联系得比较紧密。

02 关键点检测的两个类型和方法


一个方面是用点回归的方式来解决,另一个是用点分类的方法。但是这两个方法,都是一种手段或者是途径,解决的问题就是帮助我们把这个点在图像当中的位置与关系给找出来。

关键点检测技术原理

以 openpose 的人体关键点为例,这是大家比较熟悉的一个人体关键点检测的网络。



网络从输入图像开始经过基础段提取特征,这些特征帮助后面进行关键点回归和关系回归提供一些素材。如果前面的特征不够丰富的话,后面处理的结果也很难达到理想的效果。这也是大网络普遍会比小网络处理问题具有更高精度的最主要的一方面原因。但是对于小网络来说,把这些特征都保持下来,或者提出比原来大网络更加丰富的特征,但是占用的空间不需要那么大,这样会比过去的大网络具有更加精确的处理结果,占用的空间和效率都可以看到这方面的探索。这方面的探索在许多自动驾驶当中都会被用到,所有算法需要跑到汽车上去测,需要在嵌入式的板块上面实时跑起来,而不需要在其他比较大的平台上面跑。



这是比较经典关键点检测网络,它的设计非常简明:一个分支去回归它的点,另一个分支去回归它的关系。这个点标签和关系标签,都是用上图的类似方式去定义。这种定义的方法减轻了回归的难度。所用的多阶段的方式,相当于每个阶段给我们提供出来一定的结果。下一个阶段对这个结果进行多阶段精度的实验,在我们没有检测当中或者是其他分割当中,其他领域当中都有很多类似方法出现。



从上面右图当中可以看到,通过多阶段的精度看到点的效果是整体上是在不断提高的,即便有个别的点可能下降,这也属于是正常的情况,因为它做了多阶段的融合。这种处理方法,在基于深度学习的处理手段当中是比较常见的。现在关系的回归,也是经过这样多阶段的精修,能够考虑或结合到各种不同阶段的信息,它的处理结果也在不断提高。这种方法在我们三维的车辆检测当中,或者是二维的检测当中,也是经常用到的。


在关键点检测当中,关系的回归是非常重要的一种。对关系的定义,可以在两个点之间定义一部分的关系,或者是定义一个比较窄的领域去做的一件事情,这也就是我们论文当中经常会提到的一种场的定义。



场的定义相当于在一个领域范围之内,对它进行一定的加强定义,包括位置和朝向等,这属于是一个多维度的考量。这种方式可以帮助我们解决在一个图片当中或者是一次检测任务当中,出现出现多个目标、关系,同时多个目标和当中的点需要进行互相关系的联连通的时候,这个方法会有优势。因为它会帮助我们剔除掉不同标签之间点的错误连接,同时也能够帮助剔除掉一些不符合关系约束的点。



以刚才 openpose 的方法为例,它回归的精度,受限于图片下采样的倍数。比如在 MIT 的论文当中,它的精度就是在 8 x 8 这样一个像素范围之内。


如果要提高我们回归的精度,有两种方式:一种就是降低下载的倍数,尽量在大图上做这个事情。原作者不在大图上做这件事情是因为在大图上得不到这么好的效果,图越大,回归难度,也就是回归的范围就越大,所以采取了这样一个降采样,把任务的难度降低。

关键点检测的通用性

这个通用关键点可以体现在以下几个方面:



在自动驾驶当中,通过这个关键点可以找出人的行为,比如在停车场中看到一个保安正在向我们挥手,这个车位是有特殊用途的,你们不可以停。或者是在一些驾驶环境当中,做一些人脸关键点的检测,帮助我们去识别出驾驶人员的情绪、精神的状态等。另外一方面,可以用这种方式去帮助识别出一些马路边突然出现的一条小狗。在我们自动驾驶车辆跑的过程当中,如果遇到这种问题,要识别出的不能只是一个简单的障碍物,是一个不可控的动物,也要通过关键点识别出它的动作,是要下蹲还是横穿这条路。


其次,车辆在外面跑的时候,我们通过观察路面上的一些路面标志,比如路牌、地面上的箭头,或者是其他一些关键标志,这些标记的点是可以帮助我们去定位,可以在地图上找到这些定位点,我们通过这些点能够辅助我们更精确地获得我们实时的位置,起到更精确的定位作用。

03 关键点检测在自动驾驶中的应用

在自动驾驶当中,有一些关键点检测的应用。



比如箭头的检测,检出箭头的同时,可以把它的关键节点回归出来,不同的颜色的点代表不同的类型,并且不同的点有它的位置信息。通过这些点,作为地图上的坐标,可以实时、精确地告诉车辆,告诉自动驾驶的大脑,我们现在的位置。箭头的关键点检测,也是用了类似的方法,虽然它的网络模型已经改得面目全非了,但是它的原理是一样的,通过不同等级的金字塔级别,可以把不同级别的点信息融合起来,从而提高它的精度,另一方面提高它的检测率。



在箭头或者是其他的一些关键点当中,也是需要知道每个点和另外一个点之间连接的关系,也就是它关系的回归。



并不是所有的点回归都能够很精确。比如有些点在图像上,车辆运行过程中,有些箭头的关键点可以准确地回归出来,有些可能识别出来错误,这受限于我们之前学习到的经验等。这类问题可以通过一些后续的改进,比如说网络的改进、摄像本身的改进。另外也可以通过后期的其他公式、其他算法上用的多一帧或是匹配的方式,去修正一下错误。




另外在自动泊车或者自主泊车当中,需要先检测出车位,我们用点回归的方式可以把车位的顶点回归出来。在一个图象当中,可以回归出车位当中的一些关键点,这个关键点是有不同类型的。通过车位的关键点,我们可以精确获知到我们实车或者是车辆自身距离这些关键点和车位之间距离是多少,我们相对的要调整控制模块,使得我们能够自动泊进去这个车位。所以,回归的车位顶点信息,对我们自动泊车或者是自主泊车来说是非常重要的信息。



另外,利用点回归的方式,同时结合语义分割的手段,可以给出一个信息更加丰富的结果,网络可以输出这方面的结果,相当于是分割出来的车位信息、车库当中车辆数的信息、车位是不是空车位、这个区域是不是空车位的信息。



同时通过点回归的方式,在网络的另一个分支,可以得到关键点的位置在哪里。比如我们知道这个地方是个空车位,我们也知道它车位的位置,这样对我们自动泊车来说,就可以直接去停,这是很好的感知功能。



除此之外,在室外的一些定位当中,可以用关键点回归的方法去回归路牌的定点。可以通过这个点反馈在地图上,更加精确地知道我们实时的位置。对路牌来说,2D 目标检测并不能全面描述其信息,因为图像中有很多倾斜的路牌。通过点回归的方式,可以清晰地得到它在图像中的真实形状与位置。通过一些摄像机的成像原理,或其他的修正手段,可以把这个位置信息投影到真实的三维信息当中去,更好地帮助我们确定车辆自身在三维世界当中的位置。



在图象当中做二维 bounding box 之或做三维 bounding box 的目标检测,点和点之间的关系后剩下的顶点其实就可以看做是关键点,去掉的这个关系就是它的框,也就是它的连接关系。所以,去掉连线之后,就可以看成一个点回归的问题。做目标检测或者是做三维目标检测当中,比较重要的研究问题是如何把这个点回归的问题做得更精确。有很多人用一些模板的方式,比如说像目前百度的 Apollo 2.5 当中,其实有一个模式是相当于把这边真实的三维的候选做了很多匹配,看哪个跟检测出来的更相近或者更相匹。



这个方法,其他公司也有类似的状况,在做点回归的时候,都是直接在图片当中做三维的点回归,因为二维的点回归是比较相似的。我们可以看到在比较远处时候,就直接二维回归,在稍微近一点的时候,可以做三维的点回归。因为在远处的时候,这个侧面是很难看出来的,在相对比较近的时候,可以精确地描述。目标车辆下面这个斜边代表着它的航向角,这个航向角和公共的航向角定义不太一样,相当于这个车身的航向角,这个航向角对我们来说很主要的,可以判断出或者是辅助我们判断出前方车辆运动的趋势或者是运动的范围。


因为结合多帧信息,这个航向角会有变化的曲线,我们根据这个曲线可以预测出这个车辆是否有变道,或者是否有急转这样的趋势。通过这样的信息,可以帮助决策模块做一些重要的决策。比如预测出前方车辆要变道插队了,防插队也是我们自动驾驶当中遇到的很重要的问题;比如很多车,做 L1 和 L2 的方案当中,在尝试编程当中,前方车辆如果要插队,对我们自动驾驶的车辆来说很难识别。前面的车有没有插队的趋势,一般都是是有一定经验的司机能够准确或者是最高精度地判断出来。因为是否能够判断出前方车辆司机有插队趋势,对于我们正常的人类司机来说,也造成了很多的事故。因为判断不出来前面的车辆是否有插队的趋势,而前面的很多新手司机突然变道,这样就会发生一些比较经典的擦碰或者是追尾事故。这类事故放在自动驾驶车辆上来说,理论上可以做到比人类更高的精度。


用点回归的方式,可以去解决在一些场景当中三维目标检测的问题。对于点回归来说,需要根据周围的关系去判断这个点是不是应该在这里。而在三维检测的时候,经常会出现目标不全或者是目标存在一定遮挡的问题,这就需要我们去增加它的感受范围,或者是增强它在这方面的处理能力,这是可以去有效规避的事情。



可以用一些小的网络去做,比如说这张表当中描述的是用不同的方法去回归点不同的任务,如人体、箭头、车位线、路牌、车辆等,还有很多其他类型的点回归任务,都可以用这种方法,总体上来说,都是可以去解决,但是处理的能力是有限的。比如在车辆的关键点上来说,车辆的关键点回归的时候,整体回归的效果一般,因为车辆本身也是一个比较难的问题,整体的精度也比 2D 的要低很多。目前精度比较高的方法仍然是以激光雷达数据为辅助的方法,以视觉为主的方法目前还没有打进前三名,甚至只能排前十。


另外一方面,在用经典的 mask-rcnn 方法去做这类问题的时候,也受限于刚才所说的精度问题,下采样的倍数越高,回归得到的结果精度就越难以保证。这方面用到了很多级联的方法来提高精度,比如先用一个 28 x 28 的,再用 56 x 56 的,再用一个 112 x 112 的,这样精度逐渐提高了,但是它的运算量并没有被提高,或者复杂度并没有被提高,不是乘的关系而是加的关系,用两者的策略做的事情。这在我们的算法工程师或者是同行业当中,应该不是什么难的问题。

04 目前关键点检测存在的几个问题


以上这三点,是我们在探索点回归任务当中,所遇到的比较典型的三类问题。


另外,在城市道路或者是园区、停车场这些场景当中,点回归任务或关键点停车的任务可以有更多的应用。但凡是能够被抽象出来作为一个典型的位置和关键代表的点的事物,都可以把它抽象出一些点。这些点都可以利用这种技术,去回归、检测出来,从而提高我们的感知处理能力。

05 未来的发展方向及潜力

1.通用性

指的是需要能够在一个网络,把里面很多种类型的点回归,全部做出来。而不是说做一个任务,就要一个网络,因为网络本来就很小。通用性就是我们要用一个网络去做很多类任务的回归。

2.小型化

在网络基础上可以用更小、但细节仍然丰富的网络。目前在 1 - 2M 这样的大小也可以够用,尽管正常的 VGG16 在 500M 左右。即便这样,模型信息其实仍然有很大的冗余,这里面还有很多探索的空间。

3.更高的精度

有的精度受限于 mask 下采样的分辨率,或者说下采样的倍数。这就要提高算法的处理能力,以便可以在更大的搜索空间中回归出点的位置,即降低下采样的倍数,以提高精度。

4.更强的泛化

曾经也碰到了很多候选框稍微偏一点关键点就回归不出来的问题。遇到这种情况需要提高算法对候选框偏移的适应能力,或者想办法减少或削弱候选框偏移的问题。这也是很多做自动驾驶方案的公司或研究机构共同面临的问题,大家一直在尝试做出泛化能力更强的方法来。


以上为本次演讲全部内容,谢谢大家。


作者介绍:


吴子章,纵目科技自动驾驶感知算法经理,主要研究道路场景下的目标检测、分割及跟踪,并推进相关算法性能优化与嵌入式移植等。


本文转载自公众号七牛云(ID:qiniutek)。


原文链接:


https://mp.weixin.qq.com/s/UxM1k1TlayrcrNucDtr8Pg


2019-10-08 16:101906

评论

发布
暂无评论
发现更多内容

MyBatis之启动分析(一)

ytao

面试 mybatis

读懂才会用 : 带你见识 Redis 的 zset

小眼睛聊技术

redis 学习 程序员 架构 redis6.0.0

Flink 1.10 SQL、HiveCatalog 与事件时间整合示例

Apache Flink

大数据 flink 流计算 实时计算

普通二本,毕业三年,北漂之后,我是怎么成为程序猿的。

why技术

个人成长 程序人生 随笔杂谈 北漂

如何挑选一份工作

池建强

求职 找工作

如何更好的交谈(以英语为例)

董一凡

学习 生活

缓存与存储的一致性策略:从 CPU 到分布式系统

伴鱼技术团队

缓存 系统设计 cpu 系统架构 架构模式

千万别学编译原理

池建强

编译原理

女朋友跟我吐槽Java中ArrayList遍历时删除元素的各种姿势

NotFound9

Java 架构 面试 编程语言 后端

Java 走过的创新25年

田晓旭

Java25周年

吉德热泵烘干机解放阳台,引领生活品质新风尚

infoq小陈

产品的本质,知道却看不到

Neco.W

产品 产品经理 需求 产品开发

Mobaxterm (安装 、汉化、使用)入门教程

Geek_Offset

2020年6月3日 对象与类

瑞克与莫迪

Shell 文本处理一则

wong

Shell sed grep

浅谈敏捷开发中的设计

czjczk

敏捷开发

CSS Tricks网站创始人作序推荐,这本书助你成为Web开发高手

图灵社区

CSS Web 开发 设计思维

一文让你快速上手 Mockito 单元测试框架

mghio

Java spring 单元测试 Mockito

Kafka的生产者优秀架构设计

奈学教育

kafka 分布式

Docker 容器优雅终止方案

米开朗基杨

Docker

手撕编译原理:汇编语言不会编

贾献华

入门到放弃:理清前端技术概念

大伟

Java ecmascript 大前端 Node

JAVA后端学习路线

敖丙

Java 学习 程序员 Java25周年

计算机超全核心技术知识

苹果看辽宁体育

后端 计算机基础

我的个人知识管理方法

lidaobing

个人成长 知识管理 PKM

Flink Weekly | 每周社区动态更新-20200520

Apache Flink

大数据 flink 流计算 实时计算

奈学教育:Hadoop源码编译全流程分享

奈学教育

分享一份阿里架构师 651 多个技术分支的脑图

奈学教育

大数据

这场大数据+AI Meetup,一次性安排了大数据当下热门话题

Apache Flink

大数据 flink 流计算 实时计算

原创 | TDD工具集:JUnit、AssertJ和Mockito (十六)编写测试-有条件执行测试

编程道与术

Java 编程 TDD 单元测试 JUnit

一周信创舆情观察(5.25~5.31)

统小信uos

基础软件 操作系统 新基建

吴子章:关键点检测技术在自动驾驶视觉感知中的应用_文化 & 方法_吴子章_InfoQ精选文章