Auto Byte

专注未来出行及智能汽车科技

微信扫一扫获取更多资讯

Science AI

关注人工智能与其他前沿技术、基础学科的交叉研究与融合发展

微信扫一扫获取更多资讯

BOT大赛计算机视觉赛题经验分享:赛题详解与思路分析

历时三个月的上海 BOT 大数据应用大赛完满收官,其中「计算机视觉识别」子赛题吸引了来自世界各地的 100 支团队参赛,赛后为了促进计算机视觉技术与创新应用交流与合作,BOT 大赛组委会联合机器之心、清数 D-LAB,邀请大赛优胜团队导师及成员,围绕大赛解题思路和计算机视觉领域前沿技术及创新应用开展分享交流。


内容目录:


Ⅰ 赛题解读

Ⅱ 冠军团队指导教授王金桥:大数据时代的视觉智能

Ⅲ 大唯团队陶进:小样本图像检测深度学习算法研究

Ⅳ DeeeeeeeeeepNet 团队陈朝才:深度学习在目标检测领域的应用

Ⅴ 现场精彩问答

Ⅰ 赛题解读


赛题好变态,这样的赛题是怎么来的?


BOT 大赛组委会赛题组组长尹相志:计算机视觉识别赛题的设计解读


本次计算机识别初赛赛题的主题:基于机器视觉的认知情境理解 (CCRCV 2016, Congnitive Context Reasoning for Computer Vision)


赛题里的每一个子赛题的设计其实都代表了我们在机器视觉领域里的一次尝试或者实验。目前的机器视觉已经进入到深度学习阶段,那么机器视觉在当下人工智能的实现过程中,有哪些需要过的「坎」?大赛组委会特意把这些坎找出来,融入到赛题的设计中。组委会希望通过这样的方式,让参赛的团队联手对付这些难坎并期待有新的突破。即使只有一点小小的推进,对于整个人工智能来说都是很重要的突破。


具体到我们这次大赛的试题,我们的赛题来源于对现在机器视觉盲点的思考。虽然随着深度学习技术的发展,单纯的图像识别对于计算机来说已不是一件难事,甚至可以做得比人类更好,但前提是必须要给机器足够的训练图片。然而这个训练与人类的认知过程是背道而驰的,人类的小孩不会需要上万张图片才能够理解什么是狗,而且当他看到其他品种的狗,也许初期会叫错,但是慢慢会理解狗这个物种的抽象特征,进而理解狗——这一「概念」。因此未来不管是看到吉娃娃或是藏獒,都能认出这是「狗」。这正是现在机器视觉的盲点,人类可以对图片进行理解,透过小数据去进行泛化的推论,而目前机器视觉则专注于如何从大量数据中抽取图像特征,因此庞大的图片标注以及计算力的考量成为现在计算机视觉识别商业应用落地的最大障碍。本次计算机视觉识别初赛与复赛分别从不同角度来考量这个问题。


1. 初赛题目设计


大数据和神经网络之下的机器视觉图像分类,在分类的实现方式上已经有了非常大的改进并且在识别的准确率上有很大的突破,但是我们认为目前的分类做法只是让机器「识别」待分类对象,并不是「懂得」分类对象。即便今天机器认出了长颈鹿,但是长得像长颈鹿的其他对象并不在它的认知范围内。所以对于这个「坎」,我们希望图像分类的做法能够让机器真正懂得分类对象,而不只是识别,比如看到了一个长颈鹿的皮毛或者是斑点就认为这是长颈鹿。


「我们在这次大赛的命题上,从一开始就有很清楚的规划,我们希望参赛队能做出的分类是基于认知场景的,是对待分类对象的真正认知和理解,而不只是单纯的识别,这是我们在这次大赛赛题设计中的一个关键考虑点。」


如何透过认知解决无法穷举的变体,用一个实体去推演其所有的衍生物。


我们今天看到一个「实实在在」的动物,我要知道哪些布娃娃,哪些雕塑,哪些绘画,哪些抽象的形态都是来自于它,这个题目要求参赛选手要建立客观存在的实体和与之相关的抽象形态之的连接,是一个理解并推论的过程。


初赛有 7 个隐藏题目这 7 个隐藏题目来自于我们机器视觉的实验


第一个隐藏题目是扮演装扮,在这张图片里大家可以看出来,这是一只扮成长颈鹿的狗。所以机器需要有里跟外的概念,谁是本体,谁是附属,有了这样一个概念才有办法继续进行后面的处理。

第二个隐藏题目是图片里有两种动物,我们一开始就没有跟他们说一张图里只有一种动物,我们有的在图片里面放两只,而且有的是抱在怀里,几乎是看不到的,两只的话就可以得到比较高的分数。

第三个隐藏题目是特殊品种,这个长得像拖把的其实是一只天竺鼠,我们也是后来在收集图片时才知道原来有这种物种。在狗的图片集里我们把全世界最丑的狗也都放进去了,甚至丑的都不具狗形了。其实这些都是个体的变异,怎样去从这些个体的变异中识别出其中的差别是我们这个题目的考察点。

第四个隐藏题目是微小线索,我个人一直很好奇机器学习到底会怎样去看待那些肉眼几乎找不到动物在哪里的图片。我们人觉察到的微小线索跟机器的认知可能会有所不同,因为人不是从像素层去看动物特征的,而机器可以做到。这其实是一个很难的题目,不知道大家能不能看出,这张图片中有只猫,机器识别出来的概率有 15.7%,稍微差一点。由此看出,当图片的背景变得复杂,卷积层网络从底层抽取特征的时候会提取过度复杂的特征,而真正有用的与动物相关的特征所占有的比例太小,都会使机器降低辨识出动物的可能性。

大家能看出来这张图片里面有动物什么吗?很奇怪,我拿给十个人看,有九个人看不出来,剩下一个人告诉我说有鳄鱼。这是人跟机器的最大差别,人类的视觉成像会有错觉影响,事实上在这张图片里很难找到好大一只,右边有只长颈鹿,但是人可能就看不到。周围环境的背景色跟它太像了,所以机器学习到的视觉特征很容易与其他树叶交叠所学习到的特征产生误判,这也是比较容出错的地方。


第五个隐藏题目是高度抽象图片的识别,这个题目也是大家觉得很可怕的,因为我们高度抽象的图片选取了几种不同类型的图片,包括非洲十万年前石壁上的原始壁画,这是我们煞费苦心收集的而且还特别对应到本次考题范围的动物中。另外,我们选取的剪纸和对联也是高度抽象化的东西。

第六个是堆叠。我们在设计考题时,想到既然卷积神经网络是从像素层级去提取特征,那如果要给卷积神经网络一个最大的考验该如何下手设计题目呢?我们的设想是,如果有一系列的东西,从像素层级来看都是一模一样的单元构建出来的,那么卷积神经网络在处理时是不是就没有像素层级的特征了?那有这样的物体吗?答案是乐高积木或者是游戏我的世界。一个同样的单元做出来的图片,不会有像素级的特征。我们可以看到,机器在这里面的表现也是稍微差一点点。

第七个是生成模型的图片识别。第 7 个隐藏赛题的出题概念是源于什么呢?中国有一个很古老的寓言是矛与盾,当一支最强的矛遇上一支最强的盾谁会赢?我们使用了强大的图片生成模型来对抗选手们的图像理解模型。在决赛里我们准备了许多风格迁移的图片。也就是,通过风格迁移的方式,我们将图片中的风格融合到既有的动物图片里去,这种融合可以做到无缝融合,对人来说分辨这样的图片也很勉强,但仍可以看出来原来的痕迹,对机器呢?在这些风格迁移图片里,我们不但做了图片风格不是很强烈的图片的迁移,还做了几个风格极为强烈的日本现代艺术家的作品的风格迁移图片,包括草间弥生和蜷川实花,他们的风格在人看来极为明显。当这样的迁移风格的照片出现的时候,所有的像素细节都被替换掉了,机器能够判断出来的可能性微乎其微,也因此出现了这次大赛第一次发生的状况。

这张图片答对率是 0,没有任何参赛选手的识别模型能识别出来,这张是融合了草间弥生作品的迁移图片,图中有两种动物,一个是猫,一个是天竺鼠,当草间弥生的风格迁移到这张原图的时候就会生成下图这样的图片,对我们人来说依旧能认得出来,但对机器则是遇到一个难题。我认为对于机器的视觉模型来说,最难的不是其他,就是来自图像生成模型。我们知道现在有很多如 GAN(generative adversarial networks) 这样的生成对抗模型,怎么样通过对抗的方式来让模型不断的进步,这也是未来视觉里很有趣的一个主题。


初赛的一个整体思路其实是帮助我们去理解现代的机器视觉能做到什么不能做到什么限制在哪里我们只有认清楚了这些限制才有可能让大家变得更好。」


2. 复赛题目设计


复赛主题侧重对机器视觉实际应用层面的考察 (初赛主要是基本理论的理解)。


有很多问题是抽象的,没有一个绝对的操作型的定义。也就是说,没有任何人可以告诉你什么是标准答案,这在人的世界里是很常见的,因为很多事情,一百个人有一百种看法,那么在这样的问题里机器如何去得到一个相对精准的判别呢?这是挑战之一,另外一个很重要的挑战是行车记录仪赛题中需要选手们预测行车标志,但其中有几个标志在我们提供的训练集照片里一张都没有出现过。这时候又该怎么办?


行车纪录器图像评估驾车操作场景


在这个赛题里面,我们希望要看到的是,当你去做端对端的学习时,你需要把整个复杂场景的转换逻辑或者是整个思路全部都依次排列在里面,你的模型得是一个泛用性的模型,否则你没有办法去处理这样的问题。


如果能够把问题做一个适度的化简拆解,这个问题就没有那么难。例如让许多选手们觉得困难的如何判断压线与逆向的问题,不直接让机器从整张照片去理解有没有压线,而是先解决车跟线之间的关系,再从车跟线的关系往外延伸。这个赛题里面主要是看大家能不能撇开对深度学习端到端实现的过度追求,有一些追求固然很好。但对于解决真实世界问题的时候,它不应该变成你的枷锁。

 

接下来这个是最大的难题,行车标志,我们当初附上了一张行车标志全图给选手,为什么给了一份标志全图?因为在所有图像里行车标志是不会变的,都有固定的外形。唯一有影响的是你的视角,还有就是呈现的远近。在这里可以用两个策略来解决,第一个策略,用深度学习方法来做,应该可以把这些图做一些 3D 的旋转、变形、色调的数据增强,从而来解决这一类的问题。第二可以不用深度学习,用传统的机器视觉中的模版比对可能效果会更好一些。


「我一直觉得新旧方法都有它的各自优缺点,怎么把新的去做新的擅长的,旧的去做旧的擅长的,数据量不够的情况下,新的方法可以通过数据增强来解决,或者可以请旧的方法来帮忙。我认为把这些方法做一些融合,这是有助于机器更好的来理解这个任务的一个重要方法。」


卖场货架自动计算产品货架占有率


货架这个题目是我们花费最多心思的,除了拍照片之外,我们拍回来的 1600 张照片,将近 12 个人去标了 2 两个多礼拜。这个题目的最大难点,其实在于要在给出的 1000 张训练集照片中,去识别 240 种的商品。我们当时在设计这道题的时候还考虑题目会不会过难,因此给选手许多参考性的材料,包括将多边形转换为 Mask 以及提供裁切过后的商品碎片。当我们给出裁剪干净的商品之后,能够对这些图片做数据增强的方法就有很多了。


「我们在这里其实考的是怎么样通过小样本进行学习,因为我们认为现在深度学习最大的问题还是在于样本数。」


3. 决赛题目设计


中文视觉智能问答

 

选手在做这道题的时候不可以用电脑屏幕把任何一个照片投出来,一投出来就算丧失资格。因此是在完全不知道图片内容的情况下,去回答这些中文的视觉智能问答,这也是我们希望未来可以继续的一个比较有意思的研究,希望有更多技术强大的团队们可以一起在这个领域钻研。未来的这种智能的对答,以前都是只注重在所谓的语料生成的方式来找到一些似人类的像鹦鹉学舌一样的回答。但是我认为通过图像的理解来产生一个有意义的回答,这是一个更有趣的东西,这是我们的第一次尝试,我也希望可以把它慢慢的扩充,包括一些有场景式的问答,也许下一次就是一个菜单,或者是一张地图。


Ⅱ冠军团队指导教授王金桥:大数据时代的视觉智能


1. 研究背景:视频语义理解


预计在 2020 年,互联网数据里大概 90.6% 的数据都是以视频的方式进行呈现。第二就是在物流空间,监控视频每年也以 20% 的速度在增长,在这种海量数据爆炸性增长下进行数据分析,为实现我们的需求带来了很大的挑战。


当前主要经历了三个阶段,从最初城市里任何视频监控都没有到平安城市,安装了一些普通模拟的摄像头,有了数字化的数据,到现在我们基于大量数据以及大量积累的算法,慢慢的可以把这些数据变成知识数据,进入到智慧计算的阶段。

从认知的角度来讲,人工智能可以说是摄像头的大脑。从人工智能发展的角度来讲,经历了从看得见到看得清的过程,我们首先通过安装各种各样的摄像头,现在每个县,每个村都安装了摄像头。另外就是看得清,原来我们在 80 年代的时候,最初来做这种图像识别的时候,当时机器只有 586、486 这种设置,非常复杂,数据非常少,原来的摄像头数据每个图像是 320、240 的分辨率。在这个分辨率下很难提出我们要识别的是内容,以及使用我们人眼的看法。现在随着计算能力的提高以及 GPU 的出现,整个视频发展到了一个大数据深度学习的时代,使大家通过一些专家系统,能够使我们从视频数据中得到更有价值,更加智能的一些分析。

从技术发展的角度来看,当前的发展经历了从规则式到大数据时代的,经过了目标检测、车牌识别、人脸识别、文本识别到视频检索,通过模拟其他的特征,都是通过人工设计的特征,符合边缘的某些特性或者是支持向量阶的方式,来得到一个基本的算法,能满足一些规则的应用。这里面最成功的是车牌识别以及一些文本的检测,手写的识别和人脸检测。


慢慢我们的数据量在不断增加,我们慢慢的支持向量级,整个在小数据的时代,基本上是知识向量统治机器学习的时代。而现在随着 GPU 的出现,数据的海量增加,现在达到了一个全数据驱动与深度架构、智能分析算法三者深度结合的时代,是一个大数据的深度学习。包括现在各种成千上万的分类识别,目前都是基于这种大数据的智能视频分析深度学习框架。

2. 研究项目节选


智能物件识别的检测


这个网络设计得非常复杂,包括卷积层、反卷积层、STN 的校正网络、空间变换校正网络、空间上下文描述的学习网络以及空间变换的随机扰动、随机定位,对不同尺度敏感的自动回归以及最后的 NMS 做的这种精细的目标分类和空间关系建模。它是一种由粗到细的一个精细的检测分类融合的框架。目前我们主要是针对生鲜领域,包括苹果、梨、蔬菜,以及各种牛奶,如光明的、蒙牛的。目前已经实现了 50 个大类,200 个子类精细的识别和检测。目前在食物产品中基本上达到 90%,主要目标遮盖小于三分之一,基本上就可以精确检测到。

图像语义分割


这是一个像素级的语义分割,包括人的场景,主要是做机器人的,就是服务型机器人,常见的床、桌子、椅子、茶杯、手机、水杯、电视、冰箱这种 3C 类的,还有服务类的,比如吃饭,家庭常见的这些目标,让机器人来辅助人完成它所寻找的这个目标的功能。最后是基于服装的解析,就是我们把人分成 22 个部分,包括他的头发长短、性别、年龄,有没有拎包,他拉没拉箱子,长裤短裤,长裙短裙。这是我们当前的一个效果,这是 22 类人的解析,我们可以把人大概在 10 到 20 个小米之内分割成 22 个区域,主要是面向公安的一些拍照购物搜索做一些应用。网络视频的录像当中是没有标签的,我们通过这些录像的区域之间的关系来判断这个视频的镜头和场景的分割,给它做一些视频镜头和场景之间的标签,以及做一些图像的区域和图像集,以及图像整体的一些水平,这个我们主要是用图模型。这是我们从 2004 年做到现在,做了十几年的一个工作,这个工作目前在很多场景下应用。这是基于图的视频图像标注,基本上是我们组一个标志性的工作。

 

哈希的大规模图像检索


这是一个哈希的大规模图像检索,就是把一个图像通过各种变换,我们一个哈希检索做法是在 2014 年发表 fab,影响非常大,我们把这个代码已经开源了,已经被很多公司和企业应用,可以实现这种快速的三维重建以及快速的目标检索,基本上可以实现在一秒内亿级数据的海量查询。

3. 研究经验分享


基于图像视频的处理工作,是一个科学和工程深度结合的一个事情。它的数据就是你必须要对这个方法理解得非常深刻,你才能够针对这个方法去选取适合方法的数据,就是你的方法是解决哪个问题的,你根据这个问题去发现什么样的数据更适合它,你当前的这个方法对那些数据不适合。另外就是数据的清洗非常重要,你在准备数据的时候,这个需要大量经验的积累,因为它也是一个实验性的科学,就是说你在数据标注的时候,这个框是不是要标得特别紧凑,比如说你这个目标遮挡三分之一还是露出来一点,都是需要经验积累的。所以说包括这次 BOT 比赛他们数据标注里不是特别有经验,我们都会对数据进行一个清洗。数据清洗对最后算法性能的影响大概在 10% 到 20%。


从框架选取的角度来说,以不同的应用选取不同的框架。比如说你要用人脸的,ConvNet 的卷积方式更适合,你要想做简单的分类,或者是做一些跨平台的融合,TensorFlow 是大家关注最多的,而且我们现在每个框架基本上都用。另外 MX Net 本身的 Bug 比较多,大多数都是中国人,模型释放的比较少,如果你自己选择转模型就会有大量的损失。所以我建议你以 TensorFlow 为主,或者你做 OCR 或者是语音相关的,你要做时序相关的,一般这种 Touch 的也很多,就看你的应用方向,还有你最后的发布平台。


Ⅲ大唯团队陶进:小样本图像检测深度学习算法研究


1. 图像检测需要做一件什么样的事情


图像检测顾名思义,就是模拟人看图片,能够判断图中有什么物体以及这些物体在什么位置。简单来说,给一张有飞机的图片,图像检测需要做的事情是,首先要找出飞机所在的位置,然后对这些所在的位置进行判断里面的物体是什么。传统上做图像检测会把它分三步来做:


第一步是区域选择,这是为了支持目标位置的定位。


第二步是特征提取,当你把目标的位置定位之后,就可以进行图像特征提取,往往这一阶段对整个检测环境起到非常关键的作用。在特征提取时,边界信息的提取很重要,也是容易忽略掉的信息。


第三步是分类器分类,当我们获取到了整个特征的时候,最后一步会给分类器进行分类的操作。


2. 复赛赛题解析


超市商品分割分类的问题上,整个过程种最关键的难点是我们的训练样本量非常少,需要分类的种类非常多。我们把下面的数据统计出来,三大类里面,主办方给了我们 363 张图片,其中只有 336 张图片包含了有改进的图片框,后面依此类推。我们要识别 239 个主类,分别对应每个类别我们需要时间的数目。最后是我们做检测的人非常熟悉的一个词,Bounding Box 就是检测框,给了我们 1319 个。

 

总而言之,我们怎么在这么少的数据量之下识别这么多的种类?可能很多人一开始就会说,我把所有的检测框架跑一遍,去比对哪个效果最好。可是我想给到大家的一个小小的建议是,在跑框架之前,其实我们是可以对最需要的数据预测一个最直观的分析。我们可以看到,这两张图片上面最大的特征其实是一个集群的物体,就是说某一个泡面旁边种类的泡面和他是一个类型的,我们就通过去找相应的资料处理这个问题。在我们阅读查找文献的时候,SSD 也就是一个检测框架,论文作者提出这个框架的时候,他是基于另一个检测框架选取特征,对小物体和集群物体无法很好识别的问题做了改进。


第二个是我们查到陈新鹏同学在自己的博文上展示了 SSD 模型在面对小规模数据集上的良好效果,他把这个 SSD 模型应用在了自然场景的文本检测上。实际上我们一个单词,或者一个成语也是相当于有点集群的概念在里面。这样的话,就相当于我们可以省掉很多的时间去试一些我们不需要试的框架。但是还有一点是说,数据量实在真的非常少,我们可能还是会想到要做数据增广,依然还是那个建议,你是根据你的数据性质进行适当有效的数据增广。

 

我们这边看超市物品的时候,我们可以想像,超市的物品出现在不同货架的不同位置上,所以我们从位置的角度去实现增广是一个合理的方式。同时超市倾向于将同一类别的物体摆放在一起供顾客选择。也就是我们左边的图片,后面的会集中摆在一起,泡面会不太常见的出现在一个超市上下货架的两层。所以我们最后依据这样两个假设,我们看到这个其实也验证了我们中国的一个习惯,就是同一类别的物体基本上都放在同一货架上。我们最后采用的增广的方式,就是把一张训练图片进行上下左右三分之一切割,取其中三分之二上的图片,这样一张训练集被变成五张。唯一需要注意的是,分割之后检测目标要进行相应的量化。


ⅣDeeeeeeeeeepNet 团队陈朝才:深度学习在目标检测领域的应用


1. 检测的应用


第一个是做人脸检测,这个做完检测之后还会有很多应用,比如人脸识别会先去检测这个人脸,还有人脸的特征点定位。就是检测到人脸之后,再去点击鼻子,做一些美化或者是其他的特效,还有旁边行人的检测。下面是车行的检测,这个在交通当中应用是很多的。比如说首先需要检测到这些车,再去对这些车进行分类,看看这些车是什么车。

2. 常用检测框架


这些检测的方法我大体上分为三类:一是 Cascade CNN,这是一个 CNN 的结构;二是 RCNN 相关的,这里面我列了几种,当然还有特别多的优化这里没有放出来。包括 RCNN,然后 FastRCNN、FasterRCNN 和 R-FCN、PVANet。三是 YOLO、SSD。

Cascade CNN


首先说一下 Cascade CNN,我们做目标检测的时候有一种非常暴力的方法就是用一个框去辨别这个图像,做一些分类。比如第一个框我框出来了,用一个分类器去分类,比如我这里检测是人脸,我就去做分类,看看这个框里面是不是人脸,我去扫一遍的话,扫到一个区域是人脸。如果我分类的概率大于某一个阈值的话,输出这个地方是人脸,这是一种非常暴力的方法。针对这个方法我们有很多的改进,比如说这里会有很多框,几万个框计算代价太高了,我会先初步的做一个筛选,比如先用一些大的框去扫,扫到某一个区域可能有人脸,我再对这个区域进行检测。这样的话,我通过一个极连的步骤,可以大大的减少计算的时间。更详细的方法在下面,大家有兴趣可以去看一下,它主要是针对暴力扫的话,这种极连不断的去减少这种计算复杂度的方法。(附该结构的 Github 代码地址 https://github.com/anson0910/CNN_face_detection)

RCNN


RCNN 是目标检测里面的一个开放性的模块,其他的主要思想也和刚才的类似。刚才在扫这个区域的过程当中有三步:第一步去决定一些框,第二步要对这个框进行分类,第三步要根据我刚才得到的这些框好输出最后的结果。这三步 CRNN 里面做了相应的改进。第一步刚才我们的框是暴力的,RCNN 里面会有一个 Region Proposal 的方法,先看哪些地方有物体,先把这些框作为候选的区域,大概只有 2000 个,比刚才要小特别多。得到这些候选框之后,第二步我们要对这个框进行分类,都有一个卷积神经网络,这个卷积神经网络针对这个框,比如我们常用的是 24×24 的,通过卷积神经网络最后的全链接,一般是 4.96,得到一个 4096 位的特征。得到这个特征之后,我们有些常见的特征,对每一类进行训练一个分类器,我们就可以判断出来,比如提取这一项之后进行分类是机器还是人。这个改进了刚才的三步:第一步就是我们用 Region Proposal 的方法替代暴力扫的方法;第二步就是用 CNN 的特征做分类,不是用传统的一些特征;第三步是用一个 SVM 的分类对候选区域进行分类。这里面还有一个改进,就是我这个候选区域框的位置可能不对,这个人就提出来一个框的回归方法,就去纠正这个 Proposal 的位置,这样的话也带来一个检测效果的提升。(附该结构的 Github 代码地址:https://github.com/rbgirshick/rcnn)

实际上在这里还有一个改进就是,比如说在这个 CNN 的部分,我们一般是用这个模型直接去提这个 4096 位的特征。这样的话就会导致一个问题,就是说你的模型是在这个上面训练的,但是应用在这个检测的里面,可能我的数据跟你原始数据的分布是有一定差异的,它会把这个模型拿过来,在我的检测数据上面进行一些微调。微调的意思就是说,比如这里分类一般是 1000 类,我把这 1000 类,这个检测只有 21 类的话,把这个全链接层换掉,把这个网络拿到我的数据下面训练一下,会带来很大的分类效果的提升。最后综合这三步,RCNN 相对于传统的目标检测的方法效率、速度和精度上都有了特别大的提升。下面的工作基本上都是针对这三步分别进行改进。


FastRCNN


FastRCNN 部分,刚才在目标检测的后两步,要针对每个区域先提取特征,然后再分类,FastRCNN 就是想把这两步融合起来作为一步。这里就提出来 ROI 的方法,其实就是刚才的这个候选时序。第二步就是设计了这一部分,实现了一个 End to End 的训练。这个当中一个核心的 ROI 有一个解释,这张图片通过我的一些卷积层,比如任何一个网络,我会得到一个 Feature Map,这是 N×W,相当于一般的卷积神经网络最后的卷积层。针对我下面这个候选区域,我会把我的候选区域分为一些块,比如说常用的我会分成 7×7 的一共 49 个,分成 49 个之后,我会把这个区域映射到对应的 Feature Map 这个区域当中。这里有一个特殊的方法,一般的神经网络有四个值我取一个最大的。这里是针对这个区域,比如左上角的区域是取一个值,针对大的或者小的输入,都会生成一个特征向量,这样的话就会解决这个问题,虽然我的候选区域大小不同,但是我最后得到的特征维数是一样的,这样的话就可以做一个批处理。最后通过这里有一个分类的损失和合规的损失,就可以分配到这个序列。(附该结构的 Github 代码地址:https://github.com/rbgirshick/fast-rcnn)

FasterRCNN


FastRCNN 解决了刚才这三步当中的一步,还有一个部分没有解决,要去提这个候选框,这个是非常耗时的。FasterRCNN 就解决这个问题,看能不能通过深度学习直接提出这些候选框。这里有一个非常好的设计是 Anchors,比如刚才我通过一张图得到一个 Feature Map 之后,比如这个是 H×W 的话,那么我对于这个 Feature Map 上面,我认为这个点会默认的存在一些光。在 FasterRCNN 当中,我把这个原图做了一个可视化,比如我默认这个点大概存在 9 个不同的框,这个框我设计完之后就可以直接从图片里得到这些框,也会针对每一个框输出。比如你默认设置一个 K 框的话,会默认得到一个分类的框,还有一个是坐标 4。这里只是分类物体,就相当于解决了刚才的提取框,哪些为了可能存在物体。通过 Region Proposal Network,用一个简单的网络可以达到每秒 14 帧的处理速度。当然这里面有很多训练的细节,大家如果感兴趣的话可以看一看。


我这里给了一个 FasterRCNN 一个整体的结构。比如这里是图片的话,这里是我们常用的卷积网络,在这里得到我的 Feature Map,就是这个地方。通过这个 Feature Map 有两个分支,通过这个 Feature Map 可以提刚才的候选区域,通过候选区域又映射回刚才得到的这个特征,Feature Map 就相当于提取了某一个候选区域的特征,这里再加一些全链接层或者卷积层,直接得到它的结构。我们可以看到,整个就是一个端对端的训练。这里是 FasterRCNN 的一个介绍。(附该结构的 Github 代码地址:https://github.com/rbgirshick/py-faster-rcnn)

RFCN


下面是 RFCN 的结构。RFCN 解决了什么问题呢?在刚才的这个图当中,如果这里得到了 2000 个的候选区域,每一个区域都要进行分类,这一部分要运算 2000 次,这个特别是在残差网络,在运行过程当中,会把最后的做分类,这样的话预算代价特别高,RFCN 的提出就是为了解决这个问题。这里也是设计了一种特殊的呼应的方法,就是刚才通过这张图得到了我的特征图之后,向大家强制输出跟我的类别相关的一个特征图的数目,比如我一般是 256 个,我把这里强制输出是乘以类别数的 Feature Map。这里有什么好处呢?这个好处就是,我针对每一个类别,比如我输出的是九个 Feature Map,,这里是特征图,这是对应到特征图的区域,把这个分为九块。做铺列的时候,针对第一个 Feature Map 图只举左上的一小块进行铺列,得到第一个图,第二个得到第二个图,九个特征图最后得到九个小块。这个是跟刚才 FasterRCNN 里面是一样的,我这里也给了一个 RFCN 整体的架构,这一部分跟刚才不一样,我如果得到特征图之后,这里是一个新加的卷积层,这里是让大家强制输出成和我类别数相关的一个卷积层,就是 Feature Map 的数目,这边是一个分类,这边是采用刚才这种铺列的方法,最后也得到了检测的结果。这里是一个效果对比图,FasterRCNN 的话速度是 420 毫秒一张图,通过这个简化之后,RFCN 是 170 毫秒一张图,相当于提升了三倍的速度。对应的准确率比 FasterRCNN 要高。(附该结构的 Github 代码地址: https://github.com/daijifeng001/caffe-rfcn)

 

PVANET


这一部分介绍的是 PVANET。我们常用的这一部分,通过图像得到这个特征图的时候,我们一般常用的是这些网络,这个提特征值的时候有没有更好的网络设计?PVANET 对这一部分做了三步改进:第一步使用了 CReLU 的激活方法,一般的卷积层比如有 200 个,会输出 256 个 Feature Map,这相当于有一大部分是冗余的,这个 CReLU 就可以让输出的数量变少,比如 256 个 Feature Map 变成 128 个,这样的话就可以减少预算量。第二步是引入 Inception 网络,Inception 模块是有多个不同大小的卷积组合,得到下一层的 Feature Map。这样有一个好处就是说,相当于做了一个特征的融合,就是说我得到的特征是有不同的特征,不同大小的卷积得到的特征。第三步是把卷积神经网络不同层的输出进行结合,这里有一个什么好处呢?比如说一个网络有五层的话,第五层可能是结构化信息非常高的。这样的话,可能对一些小的物体,这些小的物体到高层的话损失特别大。这里就把低层的 Feature Map 和高层的 Feature Map 进行融合,得到了最后的这个,这一层包含的信息比传统的信息更多。而且更重要的是,这里通过一些设计,让卷积层 Feature Map 的数量变少,达到了很大速度的提升。下面这个图可以看出来,PVANET 可以达到 46 毫秒一张图,比刚才的 RFCN 还要快,刚才的 RFCN 是 133 毫秒,这样就可以达到一个实时的效果,大约 120 帧 1 秒的速度,而且是不同的融合方法,最后检测的准确率是非常高的。(附该结构的 Github 代码地址: https://github.com/lvchigo/PVANet_train)

YOLO


YOLO 的出发点是什么呢?在刚才这个检测流程当中,我通过这里得到一个 Feature Map 之后,先要在这个 Feature Map 上面得到一些候选区域,又要针对这些候选区域,再从这个 Feature Map 上面提一遍特征。这里会造成对每一个候选区域要做两次预算,这里等于是不需要的。下面的方式就是直接从图片得到最后分类检测的框。YOLO 就是把一张图分为很多的区域,对于一张图有一个狗,怎么对应呢?我的中心框如果对着这里,这里就负责解决这个问题,这里得到最后的结果。这个自行车对应到这个点,轿车对应到这个点,最后直接通过这个网络得到一个输出。这里要注意的是,这个输出可以看到是 7×7×30 的矩阵。首先要判断是什么物体,在这个检测当中是 20 倍,在这里有 20 维去表示是什么物体。还有 8 维,要对这个框的位置进行修正,这 8 维是负责对这个框的区域进行修正。

下面是它的整个网络的设计图,这里一共有 24 层的卷积,这里直接通过图片,448×448,最后得到 7×7×30。通过这 30 维,就直接可以算出一个 49 个格子当中,每个格子可能包含什么物体,在什么位置。这样的话,我一次运算就得到了最后的检测结果。这里训练还有一些细节,就比如说这个网络的初始化,会先把一些卷积层在更大的范围内预训练一下,采用 RCNN 的方法,最后再拿到检测训练。这个后面还做一些改进,大家有兴趣的话也可以关注一下。(附该结构的 Github 代码地址: https://github.com/xingwangsfu/caffe-yolo)

SSD


下面是 SSD 的结构,SSD 是这个比赛当中用的很多的一种方法。它解决的是什么问题呢?刚才 YOLO 看上去是非常暴力的,一个图片直接分为 49 个格子。这样的话,如果是这种小的物体的话,可能检测效果会更好。SSD 做了这个改进,比如说看这个网络当中,这里前面是一个 16 层的,到这里如果是 300×300 的话会输出一个 38×38×512,针对这 38× 38 我们会在每一个点上预设一些默认的框,这个地方和前面 FasterRCNN 的 Anchors 有点像,YOLO 只在这个地方输入了一个。SSD 是在网络当中不同的层都有输出。这样的话,其实也相当于一些特征的磨合。当然这个 SSD 在实际的训练当中还有非常多的训练的策略,比如说一个图片是 300×300,之前要做一些图像的增强,可以剪切一些区域去做训练,如果大家对这个感兴趣的话可以看一下这个论文。这里是 SSD 的一个检测效果。我们刚才把这个网络定位一致的话,都用 VGG16 的话 FPS 是 7。这个 SSD 做检测的时候有一个地方,这里是一个 Match 的检测,每次可以处理 8 张图片同时做检测,如果大家去测这个速度的话可能会有损失。(附该结构的 Github 代码地址: https://github.com/zhreshold/mxnet-ssd)

3. 所述框架总结


Deep Learning 的运用 CNN 的方法去提取物体的特征,比传统手动设置的特征更好,这样带来检测的准确度更高。我们引入了回归的方法,对于检测的位置做一些修正,这样的话检测的位置是更准的。刚才我介绍的这几个框架都是端对端的,这样的话,可以让我的检测速度非常快,而且可以用到 GPU 加度。


Ⅴ 现场精彩问答


1. 视频检测相关的内容问答


提问:您刚才提到了很多解决方案,我想问的是解决的过程是什么样子?以及在这个过程当中,比如申请数据集的时候,有训练数据集、开发数据集和测试数据集,在选择数据集的时候需要注意到什么?还有就是在选取框架的时候需要注意什么?以及在迭代的过程当中需要注意什么?


王金桥:我觉得整个的基于图像视频的模式,也是一个科学和工程深度结合的一个事情。它的数据就是你必须要对这个方法理解得非常深刻,你才能够针对这个方法去选取适合方法的数据,就是你的方法是解决哪个问题的,你根据这个问题去发现什么样的数据更适合它,你当前的这个方法对那些数据不适合。另外就是数据的清洗非常重要,你在准备数据的时候,这个需要大量经验的积累,因为它也是一个实验性的科学,就是说你在数据标注的时候,这个框是不是要标得特别紧凑,比如说你这个目标遮挡三分之一还是露出来一点,这个都是需要经验积累的。所以说包括这次 BOT 比赛他们数据标注里不是特别有经验,我们都会对数据进行一个清洗。数据清洗对最后算法性能的影响大概在 10% 到 20%。


从框架选取的角度来说,以不同的应用选取不同的框架。比如说你要用人脸的,CoverNet 的卷积方式更适合,你要想做简单的分类,或者是做一些跨平台的融合,Test Flow 应该是大家关注更多的,而且我们现在每个框架基本上都用。另外 MX Net 本身的 Bug 比较多,大多数都是中国人,模型释放的比较少,如果你自己选择转模型就会有大量的损失。所以我建议你以 Test Flow 为主,或者你做 OCR 或者是语音相关的,你要做时序相关的,一般这种 Touch 的也很多,就看你的应用方向,还有你最后的发布平台。


提问:刚才您有些例子是在手机端实现的,在手机端识别的话都有哪些技术要点?


王金桥:手机端识别就是多核多线程要解决的,我们的代码都是自己写的,你要有一个很好的框架来解决这个问题。另外就是说你要把库减少到最小,在 ARM 上做优化。另外就是网络要设计得非常浅,要做一些定点化,目前支持定点化的是 Test Flow,其他的都要你自己去更新,就是你是网络的压缩,要设计一个网络,把计算的样本控制到最小,多线程、多核的调用以及你最后性能的调优,最后代码的移植,目前这些公司应该都在做。


尹相志:我补充问一下,最近有些论文提出来说,可以把一些很复杂的网络通过一些 Training 的手法做缩减和压缩,你认为这是一个比较重要的方向吗?还是说先从比较浅层的规则来做?


王金桥:网络的剪枝、裁减和网络的压缩一般是同时来做的,一般是裁减,我们先用一个非常深的网络,要布这些核心数据,要让它性能最优,我们会减某些层。减了之后,我发现性能损失在 2% 左右,我不能再减了,再减性能损失就下来了。我们要压缩,包括小网络拟合大网络,这种训练的方式的话就要特别依赖你的数据,这种就是进行网络训练不是特别的敏感,目前大部分的方法还是通过剪枝的方式,一般的通过训练的方式得到这种剪枝或者层级量化,不但工作量比较大,而且目前一般的能做 MPGA 或者芯片的,目前倾向于这种方式。


提问:我比较外行,我问一个问题。深度网络输入的应该是一些图片,最后得到的特征,比如说人脸是什么脸形或者什么头发,或者是他背包没有,就是你输出的一些特征。中间层会是一些什么东西呢?是一些小的图片还是一些有意义的标签之类的东西?


王金桥:它输入的都是图像,是一个完整的人,他在训练的时候有两种方式,一个是全局的属性,就是这个人的年龄、性别、男女,是整个人体的框直接做一个全局的分类。第二个就是说局部的,是否背包,是否拉着箱子,是什么发形,穿的衣服是什么颜色,基于这些标签,我们输出的是这个序列的标签,和标注是一样的。


提问:中间层是一些什么?


王金桥:中间层次就是对这些区域的一些响应,神经网络做一些可视化,通过卷积层,Cover1、Cover2、Cover3 都是和我们的人脸一样,看上去之后都是一些简单的纹理特征,看不出什么差别,他们在 Cover4 和 Cover5 这几层,有结构的特征,比如人脸的话有眼的特征、鼻子,Cover5 就有很明确的特征,比如裙子,这个裙子的轮廓就出来了,响应度很高,别的响应度很低。就是低层到高层的抽象机制,但是这个理解跟我们人并不一致。


2. 深度学习框架的内容问答


提问:你刚才介绍了这么多检测的框架,大概会分为 RCN 系列、SSD 和 YOLO。我想问一下,针对不同的问题,我们选择哪一个框架比较好?SSD 和 FasterRCNN 会有什么优点?


陈朝才:我觉得针对不同的问题需要对应用场景做配置。SSD 这里的设计就是导致你可以一下子可以检测 8 张图,FasterRCNN 一下子只能检测 1 张图片,这样的话会导致会有 8 张图片的延迟。但是我觉得如果你用 FasterRCNN 的话,你可以优化前面的这个,在实际使用的时候可以把这个网络简化一下。YOLO 做了这样一些设计,在做 3×3×256 的运算之前先有一个 1×1×128 的卷积层,这样的话,它会让你下一层的运算量减少一半。就是说前面一层输出的维数变为一半,下一层再做大卷积和的时候,这样的运算更小了。也可以针对这个做一个相同的优化,让这个网络结构变得更小。这样的话,也可以让这个检测速度提升得更快。


还有另外一点,SSD 的输入是 300×300,其实这个图片的大小和处理速度也是有很大的影响。比如说如果你要检测一个很大的物体的话,我们觉得在计算的时候并不需要像 FasterRCNN 那样有成就感。如果你去看卷积的运算过程的话,这个图片大小是和运算量有一个关系的。就是你实际做检测的话,可以尽量的去压缩输入的大小,得到速度的提升,另外一方面就是这种网络结构。最近谷歌有专门讲检测的速度和精度的平衡。


提问:如果只考虑精度的话,是不是 FasterRCNN 比 SSD 要好一些?


陈朝才:我觉得这个问题和场景有关系。因为 SSD 很多训练的策略是非常有效的,因为 FasterRCNN 已经出得非常久了,这个检测效果我觉得可以针对实际场景去看一下这几个框架在做训练的时候采用了一些数据增强的方法,包括一些训练之类的,我觉得这个对于检测效果影响也非常大。像 SSD 最开始其实效果并没有这么好,并没有这么高。但是它通过一些策略,让它训练的精度达到了这个效果。


提问:刚才看到 FasterRCNN 有两个改进,其中一个改进是 Feature Map 的改进,有没有一种方法是这两个改进的融合?


陈朝才:也可以,这个论文里面针对的,你去做论文的话是针对一个主要的点。我觉得你个人做实验的话,你可以去尝试把这两种方法结合,这个也很方便,因为这两种方法并没有冲突。


提问:有人做过这两种方法的融合吗?


陈朝才:目前没有。但是我个人认为,这两种方法,RFCN 侧重的是用残差网络,后者是得到了检索的,服务的提升也是很大的。


提问:选择这些的依据是什么?是计算量吗?


陈朝才:这是很基础的,残差网络分类的效果是非常好的,我觉得你在世及应用当中,可能并不会用到残差网络这种特别强大的网络,这种网络还是非常复杂的。在这个论文当中是为了做标准的对比,所以采用的是相同的网络做对比。


提问:你的意见主要还是从计算量来考虑选择分类器是吗?


陈朝才:我觉得如果你追求精度的话,像 SSD 里面做了非常多的数据增强,包括一些针对这种特别小的物体的优化,这都是非常细的,我这里没有涉及到。


提问:这次竞赛当中好多人都选择 SSD 是为什么?


陈朝才:因为 SSD 的话,我个人认为其实是 RFCN,因为 SSD 的效果我觉得可能在训练的过程当中根据输入的图片做了一些采样。给出的分辨率都是非常大的,3000×200,他是随机采一些小块做的。我在训练 RFCN 的时候并没有采用这种方法。


提问:是不是 SSD 相对来说是做好训练的?其他的这些网络训练难度有什么区别?


陈朝才:这个我觉得区别并不大,是两种不同的思想。如果应用在你的场景当中可以都去看一下,测试一下。


提问:还有一个问题就是,如果我想检测,比如针对一个现有的,增加一个新的内部检测,从原理上直接是重新训练分类器再训练网络?还是说整个都是你自己写的?


陈朝才:像一般的标准数据,如果你自己想加一个的话,我觉得可以这样做,先在上面训练一个 20 倍的检测器,针对你的图片,先把 FasterRCNN 的检测结果标在你的数据上面,我就把这个检测出来的框当做我的标准方式去训练,这样相当于做一个检测的迁移。然后你再用这种标出来的结果去训练另外一个 FasterRCNN 的网络,这样的效果是很好的。

入门计算机视觉入门大数据图像识别竞赛
1
看题目设计好屌的样子,要是有优胜队伍开源的项目就好了