目标检测简单系统的理解

快过年了,简单总结一下今年目标检测的学习经历和经验。希望对大家有用。

 

    从2017年末就开始准备国家自然科学基金。首先写了一个中央高校专项资助作为铺垫,到了春节的时候一直在家写国家自然基金的方案。2018年3月份结束。

    3月份开始参加全国物联网创新应用大赛,将一个对模糊、细小人脸检测效果非常好的论文用来做教室的人数实时检测,统计绘制成学校教室人流分布,提出一个在各大高校不断扩招且不扩建校园的情况下教室资源的优化方案。不得不说这个模型真的好用,检测速度快、准确率极高。用了多尺度训练的手段。做比赛的感觉跟研究有点区别,要想着写一个系统性的应用方案,就要考虑变量的意义和价值,能够解决什么问题,有什么优点等等。相当于要自己构思一个应用系统。实际上比较复杂,要自己想得很多。在清华比赛的时候有几个人跟我同一个题目,但是算法上,只有我一个用了dp,效果是最好的。当然这是一个比较水的PPT比赛。主要是说其实这是个比较老套的思路,每年都有很多人做,但并不代表着每年都有人更新内部的算法且根据算法扩展构思。

项目主页:https://www.cs.cmu.edu/~peiyunh/tiny/

Github主页: https://github.com/peiyunh/tiny

个人写了一个环境搭建过程记录,需要的话可以发。

之后写了几个目标了检测的横向,检测火灾、输电金具目标以及细小缺陷。

    期间一直在做数据库及数据库优化方案。到了8月份开始研究GBD-Net,商汤科技拿了一个比赛冠军的目标检测模型。调试环境调试了1个月,发现开源得还不彻底,作者只提供了他修改模型跑出的中间结果,就是RPN输出的得分和座标,个人感觉复现有难度,后来就没做了。最开始的blog写了一些记录。其实采用的很多策略被证明是很成功的,比如多尺度,GBD中的G是gate,门的意思。就是说,在同一层的神经元之间加入连接,这个连接是一个sigmoid函数,来控制门的开关程度。相当于借用了RNN的思想用于目标检测。这个提升理论上很大,实际效果不是特别高。反而我觉得作者在ROI层多尺度的输入是一个特别棒的点子。

intro: CVPR 2016. Cascade Region-proposal-network And FasT-rcnn. an extension of Faster R-CNNproject

page: http://byangderek.github.io/projects/craft.html

arxiv: https://arxiv.org/abs/1604.03239

paper: http://www.cvfoundation.org/openaccess/content_cvpr_2016/papers/Yang_CRAFT_Objects_From_CVPR_2016_paper.pdf

github: https://github.com/byangderek/CRAFT

有些部分要翻墙下载。

    之后老师的横向需要专利,用传统的SIFT特征配准图像,结合颜色特征,膨胀和腐蚀,提出最近邻区元融合的异物检测方法去检测异物,其实就是把分割得到的多个区域进行以下运算,把最近的融合在一起。之后开始写北京自然科学基金。写完之后写了中科院的开放项目基金。到了年底这些纵向都中了。

    18年去北京参加了ADL93培训,去了Valse,去了MLA,去了PRCV,去了CCKS知识图谱与语义计算大会。每一次开会都会有新的感悟。慢慢的对目标检测有了一个较为全面的理解。

   简单来讲就是从给定信息中找到一个具有一定规律的信息子区域,在图像里,就是在一张图片里面找到目标,而基于图像的目标查找,首先得搭建一个体系去描述目标,这个体系就是特征空间。我们先尝试用各种特征提取算法,在特征空间中找到目标比较稳定统一又精简又专一的描述,然后把这个描述当成目标的定义。然后在其他图像里利用这个特征去找目标。目标分割也是一样,只不过他不仅仅找到目标的这个特征,还把这个特征之外的信息区域定义为背景,全部不要或者变黑、白,就相当于将目标'浮'起来,分割出来了。传统的特征定义方式与现在常用的学习方法不一样。传统方法人为的定义目标特征,也就是手工特征。学习方法我们只需要画出目标区域,模型会根据自己的可学习结构,当数据一遍遍在里面过的时候,它就会在目标函数的强迫下,将模型自身的参数拟合目标。所以其实目标通过会有很高的得分,而非目标通过得分就很低,就像滤波器一样,卷积滤波因此来。

    关于传统的目标检测,其实是包含了目标分割。而在深度学习时代,这两个分得就很清楚,因为处理的结构和最后呈现的结果区别都很大,但两者关系依然紧密。

    传统做目标检测比较倾向于直接做目标分割,因为既然我已经手工把目标的特征定义出来了,那我干脆就直接把不是目标的信息丢掉,目标留下来就好了。所以其实我们可以发现,传统的手工特征的一个特点就是,目标的特征是与图片其他区域信息较为完全的区分的。一方面,我们要佩服一下传统特征,但是另一方面,我们会发现基于传统特征的目标检测局限性很大,比如不能接受复杂背景、遮挡等等,可以去翻翻论文,传统方法发的论文基本都是小图像,清晰背景,目标明显且规则的任务。既然锤子不大,就找软柿子捏了的意思。后来深度学习方法构造了一个很高维度的特征空间,然后又提供了在这个高维度特征空间寻找目标特征的学习结构,使得表达目标特征的方法性能得到了飞跃,简单实用易上手。

    到这里,其实深度学习解决的是特征表达问题。但是检测问题其实是要考虑实际的,因为图片是将三维空间中的信息投影到二维存储,本身就有很大的信息丢失,那么同一个语义的目标,在不同二维平面上呈现出的视觉表征,有可能是一样的,也有可能是不一样的。这种不一样一方面表现为特征的不同,另一个方面表现为大小的区别。所以其实我们希望深度模型通过我们喂进去的数据能够学习到目标在三维空间中的特征,虽然我们给的只是二维数据。所以如果我们把这些目标都标记为一类,同一个语义,其实相当于描述一个三维空间中目标视觉特征,也相当于N个二维空间中的目标视觉特征。如果我们网路能够有很高的准确率,我们可以反过来推断,网络学到的特征是一种能够包容多个从二维平面看长得可能非常不一样的目标,就好像从一个人的头顶看和从正面看,模型学习到的特征都能把这个人检测出来。这是我们常常看到别人说的“能够学习到更本质的特征刻画”、“更好的特征表达”的意思。对于人来说这个就很简单了。但是相比于传统算法,这两者要单独设计特征,再把结果输出为一类。

    上面解释了网络强大的特征表达能力。那么对于目标大小呢?目标大小其实是一个很相对的问题,在一个白色背景上,检测一颗黑色的芝麻。无论多小我都能检测出来且100%确定我是对的。但是背景如果稍微没那么理想一点,就无法了。比如在地上掉了一颗芝麻,我们会说:啊,太小了,我找不出来。所以目标的大小至少是一个和背景相关的相对的问题对吧。

    那么通常一点的目标大小问题是指什么呢?看了很多论文,加上自己的思考。我有了很多定义,但最想跟大家分享的,还是把其当成一个绝对的问题来研究,就是相当于无论什么背景而言,都有对的,比较广义的描述:像素能够描述出目标的基本结构。这个定义意味着如果我们单独把这个目标从图片从剪切出来,不依赖场景的推理和提问,我们也能知道他是什么。在目标检测标注的过程中,对于小目标的标注,在输电线路这个数据库看来,很多是人潜意识依赖场景推断标注的,比如他看到这个位置以前有螺栓,那么这张图片他就会下意识的标个螺栓,哪怕那个框里面仅仅是4个像素的黑块,剪切下来一看都不知道是什么。所以我的定义是从目标本身视觉结构来定义的,在几乎所有问题中都通用的目标大小定义。不过其实也有程度问题,有些人想象力好,看四个黑块也能说是螺栓也不一定是吧。所以这还是一个模糊原则,不能给出每一种目标多大叫大多小叫小,但是在做目标检测数据集的时候是一个很有用的原则。

    上面问题的两个大方向,下面说说上面两点在实际研究中对应的问题。一个类,包含了多个差别很大的视觉状态,在视觉表征上区别就很明显,明显的差异,明显的不相似,这是我们想在二维空间解决三维空间中目标检测问题必然会遇到的---相似性问题。一类目标的相似性差,就容易误检,会衍生出很多解决提高相似性的模型和策略。另一类小目标的问题,就复杂一点,分为绝对小目标和相对小目标,绝对小目标是几乎没法解决的。除非是白纸找芝麻这类任务。相对小目标就常见一点,同样也会衍生出很多模型和策略,比如多尺度特征。

    上面对问题的分析是不考虑模型的。我们得到这么好的视觉特征,得益于模型层层深入的特征学习以及分布式的特征表达,但这带也是一种特征提取方式,也是有适用范围的。对于小目标,如果一个模型输入resize太小,如ssd的312x312,或者池化太多、层数太深,那么最后一层的特征往往是语义特征(语义特征就是高度抽象的跟一个词汇相关的特征,区别与轮廓、颜色、形态、边缘纹理等视觉特征。相当于我们看到一只狗最后脑海里会出现一个狗字,而不会出现这个狗的毛是什么颜色的、多高多大公的母的,毛长,毛亮等等视觉特征。)。出现语义特征的原因很简单,因为我们的标签是语义啊。我们学习的时候,也是妈妈、老师告诉我们万事万物的名字。所以其实可以这样说,小目标经过这个网络,也有语义特征,但是相对于大目标而言,这个语义非常的模糊,就是说,这个模型结构不适应这种大小的目标。简单的适应有一个很简单的思路,就是把模型的感受野调小,生成的proposals都小一点,用比较前面的特征层的特征去分类。但这样计算量就会大很多。所以我们可以得到一个结论,现有模型,并不是一个固定死的算法,而是对于某一种数据的适应结构,这个数据就是Imagenet,里面大目标居多。就像我们每家每户会定做衣柜一样,如果我们家小一点,定做的衣柜也可以小一点。这解释了两点,为什么现在搞深度学习就业工资这么高,就是因为实际上还是比较灵活的,它提供的是一些基本组件,根据问题,我们要灵活组装,再加上各种自己的trick。

    上面从加入了模型这一变量重新考虑小目标问题,小目标问题就变成了具体在模型某个地方的问题,也有了改进的思路。现在再深入的说一下目标检测的模型。其实本质就是在图片上剪出一个个的框,丢入深度卷积神经网络提取特征,然后用特征分类。two-stage顺便用深度卷积神经网络将前景和背景先分一下,这样少点框丢到分类器,也少了很多学习的负样本,然后再对前景细分,所以是两级结构。One-stage就没有了前面筛选的过程,所以快了很多。从图像的角度讲,分类器还是分类器,主要是特征提取换成卷积神经网络,特征换成了深度卷积特征。现在的分类器为了拟合这种结构,以前的svm用得少了,直接用softmax,实际来说softmax只是一个score转概率的层,并不是分类器,加上整个DCNN构成了分类效果。这样与另外设置一个SVM的区别我没分析过。

    从目标检测问题到模型实际问题,到模型结构,我们一层层深入了。接下来再深一点吧。模型很复杂,参数很多,抛开那些跟目标检测不直接相关的Backbone研究,做目标检测的会考虑网络结构和参数对目标的影响,比如base anchor,reshape大小,anchor 长宽,特征选择等等。从内部上,试着从各个方面让模型更适应数据,这样做往往是有效的。因为模型是通用的,所以在专业数据集上调参是会有提升的。从外部上,有的加算法,加反馈,加自适应,加注意力机制,加知识,加一些层,加传统特征,加特征融合,增加预处理层,增加后处理层(比如对检测出来的结果再进行处理)等等。每一个方向都能提升性能。

    开会的时候,发现目标检测的研究报告少了很多,我觉得有很多原因。一方面是目标检测因为偏向应用,其实很多比赛都做得很好很极致了,限制在于任务本身、数据、模型性能本身限制。反而模型的可解释性、元学习、迁移学习、图像生成等等对模型本身的结构研究是个更大的反向,因为那里面可能性还是太多了。最主要的是,实验周期长,所以还有很多可以挖掘的。做目标检测的我们基本不会去大改模型对吧,不然我们就去做深度模型结构优化研究了,可以去搞结构,也可以去搞理论。

    今年写了很多跑模型过程中使用的代码共享,我自己是觉得很好用,现在开始写写复杂点的。最近在最一个基于迁移学习的目标聚类,将目标先进行形态的区分,再丢如模型里面训练,这样主要是利用迁移学习拉近目标的类内相似性,不像一类就分两类的思路。提出一种基于形态比分布的无参数k-means聚类算法,并且结合形态比来优化深度特征使得我们能不设计类数的使用k-means,很好的将同一类进行形态的区分,然后将结果以标签的形式打回xml上,在后面加后缀,再去学习。最后呢,就用我之前写过的大类合并AP检测代码。我试了一下提升是有的。

再往下深入的话,就是具体的模型如Yolo\RFCN\Faster\SSD等,一个结论:Two-stage准确率>One-stage。具体很多,可以看看这个:

https://github.com/amusi/awesome-object-detection

从事输电线路航拍图像目标检测应用研究(生)。真的有人看的话,欢迎讨论。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章