day2 图像分类数据驱动方法

                                               day2 图像分类驱动方法

关于图像分类(这是一个计算机视觉中一个非常重要的任务),当我们做图像分类的时候,我们的分类系统接收到一些输入图像,比如说可爱的猫咪,我们的系统是明确知道其中这些图像的分类,或者说是分类的集合,这些标签可能是一只狗狗,一只猫咪,也有可能是一辆卡车。。。。那计算机的工作就是看图片,并且给它分配起哄一些固定的分类标签。计算机从这么多的矩阵中提取特征貌似是叫semantic gap(语义鸿沟)。当然我们可爱的猫咪,不会一直坐着不动,当我们的相机旋转一个角度,根据唯物主义,它还是一只猫,不过图片中的像素值会变,这就需要我们的算法对这些变化很robust(鲁棒性),当然不光是角度问题,也有别的证明问题,不同的光照等,但是图片中始终是只猫。

day2 图像分类数据驱动方法


这听起来很简单,因为我们人脑中视觉系统,天生就是做这个的,但是对于一台机器来说,就很困难了,所以,我们就要考虑到,在做这些图像识别分类问题的时候,它肯定没有一只猫咪的整体概念,而不像我们人一样有一个直观的感受,在计算机中所呈现的图片的方式其实就是一大堆数字,即图像的矩阵,如下图所示。所以对于这张猫咪来说,计算机只能接收到一些800*600的像素点。其中每一个像素由三个数字表示(rgb),这很难从中提取猫咪的特性。

day2 图像分类数据驱动方法


当然猫咪可以有千奇古怪的姿势跟位置,当然也有遮挡的问题,我们只能看到一部分,在人看来,我们很容易,不过,计算机就会很困难,。


day2 图像分类数据驱动方法


day2 图像分类数据驱动方法


还有猫的种类等,我们算法需要处理不同种类,不同年龄的猫,来识别出来,这是猫。

目前来说,我们没有直接一个算法,来判断这是猫还是别的动物,但是我们做过一些实验,比如我们提取图像的边缘,对于猫来说,我们都知道,猫有鼻子,有眼睛,等特征,根据hubel还有wiesel(记住前辈们做过的努力),我们了解到了边缘,这一研究对于计算机视觉来说,是十分重要的。

day2 图像分类数据驱动方法

我们可以尝试识计算出图像的便于,然后把边,角,各种形状分类好,比如有三条线这样相交,那可能就是一个角点,比如猫的耳朵有这样那样的角,诸如此类,我们可以写一些规则来识别这些猫,但实际上,这种算法容易出错。不是很好的算法,当我们要重现做另一种分类,我们就需要从头再来一遍,所以这不是一个可推演的方法,我们想发明一个识别算法,可以拓展到识别世界上所有的物体,所以,我们想基于数据驱动的方法,我们不写具体的分类规则来识别一只猫或者鱼,取而代之,我们从网上通过各种手段,抓取大量图片数据集,我们做出一个程序,来识别出所有我们要去识别的物体,我们通常写两个函数,其中一个函数是训练函数,这些函数接收图片跟标签,然后输出模型,另一个函数接收这个模型,对图片分类,进行预测。


day2 图像分类数据驱动方法


我们今天讨论的主题也是深度学习,但是这种数据驱动类的算法,是比深度学习更广的一种理念(大佬说的,就是那意思),举个栗子,我们现在有cifar10的数据集,大约分10类,额外还有10w张测试图片供你试验你的算法,首先我们说到我们最简单的一种比较两张图片相似性的算法,KNN,K近邻算法,我们将输入的图片与所有训练图片进行比较,我们采用的是曼哈顿距离(L1范式),来判断两张图片相似程度,如下图,其L1范式的值为456。

day2 图像分类数据驱动方法


以下是最简单的KNN的代码,我们可以看到KNN最简单的思想,我们有两个函数,其中一个train,与predict。


day2 图像分类数据驱动方法

其实我们仔细考虑,这是KNN中Train的时间复杂度是O(1),predict的时间复杂度是O(N),不过实际中我们希望是训练的时间越长,预测的时间短,自然的过度到下一步,卷积神经网络,我们会花相当长的时间在训练上,而在测试时间的时间会短点。

下一个博客中,我们来介绍下KNN。。。。。。。