您的位置:首页 > 理论基础 > 计算机网络

使用深度卷积网络和支撑向量机实现的商标检测与分类的例子

2015-10-19 01:50 746 查看
大概是翻译和解释一篇2014年发表在JCSSE上的一篇《Vehicle Logo Detection Using Convolutional Neural Network and Pyramid of Histogram of Oriented Gradients》。由于涉及到版权问题(其实我也不太懂相关的版权是什么),我尽可能不要贴出原文,而是写一点结合实验室之前做相关项目的团队和论文的内容自己的理解和说明。

首先解释一下什么叫做深度卷积网络(convolution neural network,后简称CNN)。这个东西就是大名鼎鼎的深度学习(deep learning)。这个东西据说是和灵长类(primates)的大脑,特别是人类的大脑中的某个部分(关于生物的部分真心不懂贴出来也怕错)十分特别地相似。然后09年出来的时候发现,卧槽效果不错啊,吹得有点玄学。但是嘛,吹牛归吹牛,究其数学本质就是神经网络和卷积。

随便翻阅一本关于机器学习或者人工智能的书上面都有关于支撑向量机(support vector machine)和神经网络(neural network)的相关知识。如果是数学系的同学,大家对卷积绝对不陌生;如果是计算机系的同学,如果不懂的话稍微打过一点算法竞赛的同学,也不需要了解什么是卷积,因为实际上的深度卷积网络(CNN)里的所谓卷积的实现和我们打算法竞赛的使用的一些办法更接近。所以我就把神经网络(neural network)和卷积(convolution)当做预备知识,当做大家都已经懂了来讲了。

读过人工智能相关的书的同学大概也知道了,神经网络在20世纪90年代之后衰落的原因是由于svm的兴起。svm基于数学,可以分析;svm的对计算的消耗比神经网络低;同时由于计算能力的限制,神经网络只能有很少的层数,并且层数一旦增加就难以控制。等等原因svm替代了神经网络成为了一时机器学习的宠儿。然而历史总是螺旋地进步的。2009年当CNN被提出来之后,机器学习界发生了巨大的震动。

我们就拿图像处理中的使用的CNN作为例子来说明。CNN抛弃了强调节点和链接这两个东西。把图像的每一个像素当做神经元这个抽象直接抛弃,直接用原始图像进行处理,把模拟神经元这个“链接”行为进行抽象变成卷积。这带来的极大的好处:

1.神经网络一个不好搞的地方就是每一层的意义,传统的神经网络,对于靠近输出节点的层,从肉眼直觉上来看基本属于黑箱,属于直觉上搞不清楚的(当然实际上传统的NN没人会这么搞)。但CNN每一层都保留的原来的二维的形式,相对于每一层都是一张图,随着一层又一层地处理,这个图越来越抽象,语义越来越清晰,你关心的东西越来越突出。就好像抽象派画家画画一样,把眼里看到的具体的东西,加上自己的感情和关注点,画出一张极具感情和思想的画。而对于CNN来讲,对于一个输入图像,你给他训练,让他关心图片中的脸,通过训练之后,他会输出所有他觉得像脸的东西,把其他的不相关的比如脖子啊手啊给忽略掉。是不是有点加入了自己的感情和思想的感觉啊,这个概念在机器学习里面也有专门的名词叫做语义分割。

2.图像最重要的一个就是变换不变性。那什么叫做变换不变性?比如说我这个脸靠近摄像机是脸,离摄像机远一点也是脸;侧脸是脸,正脸也是脸;在屏幕上面也是脸在屏幕下面也是脸。(这个用卷积那套来处理非常合适,对照后来的Image Pyramid来讲:convolution对应的是就是金字塔的高斯filter,这个基本是在实际实现上就已经对应了的;而pooling呢,那就是各种类似于SIFT,SURF啊这些想要在图片金字塔里面提取旋转不变性的特征的提取器。)

3.这玩意儿完全可以并行的,而且并行程度很高,甚至不需要什么搞cpu那套什么数据冒险/选择冒险的东西,完全可以再GPU上跑。快得炸了。

4.关于第一点的补充。第一点虽然是讲道理的,实际上我们对一个模型的分析不能仅仅停留于感性推理层面,需要进行数学的分析。比起原来的神经网络那套,CNN有了干掉了全连接,换上了convolution和pooling,利于数学建模分析,而且很多像3.里面提到的之前研究图像处理的东西可以拿过来用。细节嘛。。。我数学差就不瞎说了。。。


接下来我们提一下图像金字塔。啊这个也是讲烂了的东西了。这里只讲简单是这么做的以及为什么要这么做。简单来讲图像金字塔。首先又撤回来之前我们说过图像处理最重要的一点就是解决变换不变形,变换不变性包括旋转不变性,尺度不变形,位置不变性等。而图像金字塔就是结局尺度不变形的。图像金字塔通过高斯模糊(实际上是一种convolution)把图片不断地降采样(sub-sampling),得到更小的图片,然后重复很多次,把一张大图片分成不同尺寸的等比缩小的图片集合。有点像模拟我们从远处走到近处看同一个物体的所看到的图像的过程。具体实现不多说,有兴趣可以去网上搜一下相关的blog。

顺便再说一下SIFT,SURF特征点。这些特征其实就是实现其他不变性,什么平移不变性,旋转不变性,拉伸不变性什么的。实现上就是从图像金字塔里面的图片做一下求极值这样类似的过程,把一些特殊的点提取出来并且计算出这个点的特征向量(特征向量可以理解成这个特征点长什么样的一个数值表示),然后发现,哇这些点居然旋转和拉伸之后变化不大,于是就用这些点来比较解决了不变性的问题。

讲了这些东西之后我们来看一下论文。这个论文讲的实现的一个思路就是

从原图切出有可能存在商标的区域 -> 把这些区域给CNN跑一下提取一下图像特征,如果发现特征不对头丢掉,对头的话丢给下一步 -> 用Pyramid Histogram Of Gradients算法进行进一步的特征提取 -> SVM把这些分类,找到对应的商标

其中CNN和PHOG部分是unsupervised,只是用于提取图像特征(边缘特性,显著度等),而SVM是supervised,在添加更多商标之后可以更方便地修改参数。这个搭配非常好,CNN和PHOG属于图像特征提取器,适合unsupervised,而最后一步分类是用svm,适合用supervised。

接下来我们来简单讲一下提到的PHOG.

========待续===========
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息