首页 > 其他分享 >干货——图像分类(上)

干货——图像分类(上)

时间:2022-10-07 12:38:16浏览次数:43  
标签:标签 分类 分类器 干货 Neighbor 图像 图片




今天我们开始给大家带来基础理论知识,有兴趣同学可以跟着我们一起,在新的一年里学习新知识,并巩固基础知识!

今天,计算机视觉战队给大家分享的是图像分类基础知识,分享的内容译自斯坦福CS231n课程笔记。非常感谢那些无偿奉献的专业人士,在此代表所有爱好学习者向您们致敬,谢谢!

这是斯坦福大学的课程,希望对即将入门DL的同学们打下基础,还是给已经处在DL届的同学巩固,都希望大家对基础知识有深入的理解。

CS231n的网址:http://cs231n.github.io/

图像分类

目标:这一节先介绍图像分类基本特征。

图像分类,简单的来说其实就是一个输入图像,输出对该图像内容分类的描述结果的问题。图像分类是计算机视觉领域核心知识之一,实际应用广泛。图像分类的传统方法是特征描述及检测,这可能对于一些简单的图像分类是非常有效,但现实生活中的实际情况非常复杂,传统的分类方法效果较差。其主要任务是给定一个输入图片,在一定的标签几个中,输出该输入对应的集合中其中一类的标签。 

举例:在下面猫的图片中,图片被表示成一个3维数字矩阵(RGB彩色图片)。其中,图像分类的目标就是将这组数字矩阵转换到一个单独的标签(如“Cat”),主要任务是对于一个给定的图片,预测其类别标签。 

——————————————————

干货——图像分类(上)_图像分类

困难&挑战:对于我们人类来说,识别猫已经是特别简单的事情,因为我们之前就大量接触猫这类图像,对其独特的特征有深入的认识,所以人类识别猫就是一个简单的任务,但是对于计算机,那就难于上青天。

在下面,我们列举了至今计算机视觉领域的棘手问题,也是现在亟待需解决的困难:

  • 刚体&非刚体的变化:不同类型其变化都不一样;
  • 多视角:收集同一个物体图像,获取的角度是多变的;
  • 多尺度:在实际应用中,很多物体的尺寸都是千变万化;
  • 随机遮挡:图片中的目标可能被随意挡住。有时候只有小部分是可见的,学习特征较偏面;
  • 光照条件:在像素层面上,光照的影响非常大;
  • 类内差异:一类物体的个体之间有许多不同的对象,每个都有自己的外形。

数据驱动方法:如何写一个图像分类的算法呢?怎么写一个从图像中认出猫的算法?

因此,我们采取的方法和教小孩儿看图识物类似:给模型很多图像数据,让其不断去学习,学习到每个类的特征。这就是数据驱动方法!

既然第一步需要将已经做好分类标注的图片作为训练集,下面就看看训练数据集长什么样?如下图:

干货——图像分类(上)_数据_02

图像分类流程。在课程视频中,图像分类就是输入元素为像素值的数组(灰色图片和彩色图片维度不一样),然后给它分配一个分类标签。完整流程如下:

  • 输入:输入是包含N个图像的集合,每个图像的标签是K种分类标签中的一种。这个集合称为训练集。
  • 训练:该阶段的任务是使用训练集来学习每个类到底长什么样,也就是学习每个类别独特的特征。一般该步骤叫做训练分类器或者训练一个分类模型
  • 测试:让分类器来预测它未曾见过的图像的分类标签,并以此来评价分类器的质量。我们会把分类器预测的标签和图像真正的分类标签对比。毫无疑问,分类器预测的分类标签和图像真正的分类标签如果一致,那就是好事,这样的情况越多越好。

Nearest Neighbor分类器

作为课程介绍的第一个方法,我们来实现一个Nearest Neighbor分类器。虽然这个分类器和卷积神经网络没有任何关系,实际中也极少使用,但通过实现它,可以让读者对于解决图像分类问题的方法有个基本的认识。

图像分类数据集:CIFAR-10一个非常流行的图像分类数据集是CIFAR-10​。这个数据集包含了60000张32X32的小图像,一共有10个类别。这60000张图像被分为包含50000的训练集和包含10000的测试集。在下图中你可以看见10个类的10张随机图片。

干货——图像分类(上)_数据_03

假设现在我们有CIFAR-10的50000张图片作为训练集,我们希望将余下的10000作为测试集并给他们打上标签。Nearest Neighbor算法将会拿着测试图片和训练集中每一张图片去比较,然后将它认为最相似的那个训练集图片的标签赋给这张测试图片。上面右边的图片就展示了这样的结果。请注意上面10个分类中,只有3个是准确的。比如第8行中,马头被分类为一个红色的跑车,原因在于红色跑车的黑色背景非常强烈,所以这匹马就被错误分类为跑车了。

那么具体如何比较两张图片呢?在本例中,就是比较32x32x3的像素块。最简单的方法就是逐个像素比较,最后将差异值全部加起来。换句话说,就是将两张图片先转化为两个向量干货——图像分类(上)_计算机视觉_04干货——图像分类(上)_数据_05,然后计算他们的L1距离:

干货——图像分类(上)_计算机视觉_06

这里的求和是针对所有的像素。下面是整个比较流程的图例:

干货——图像分类(上)_图像分类_07

以图片中的一个颜色通道为例来进行说明。两张图片使用L1距离来进行比较。逐个像素求差值,然后将所有差值加起来得到一个数值。如果两张图片一模一样,那么L1距离为0,但是如果两张图片很是不同,那L1值将会非常大。

在代码中,首先将CIFAR-10的数据加载到内存中,并分成4个数组:训练数据和标签,测试数据和标签。如下面的代码:

Xtr, Ytr, Xte, Yte = load_CIFAR10('data/cifar10/')# a magic function we provide# flatten out all images to be one-dimensionalXtr_rows = Xtr.reshape(Xtr.shape[0], 32 * 32 * 3)# Xtr_rows becomes 50000 x 3072Xte_rows = Xte.reshape(Xte.shape[0], 32 * 32 * 3) # Xte_rows becomes 10000 x 3072

现在得到所有图像数据,并且把他们拉长成为行向量了。接下来展示如何训练并评价一个分类器:

nn = NearestNeighbor() # create a Nearest Neighbor classifier classnn.train(Xtr_rows, Ytr) # train the classifier on the training images and labelsYte_predict = nn.predict(Xte_rows) # predict labels on the test images# and now print the classification accuracy, which is the average number# of examples that are correctly predicted (i.e. label matches)print 'accuracy: %f' % ( np.mean(Yte_predict == Yte) )

作为评价标准,我们常常使用准确率,它描述了我们预测正确的得分。请注意以后我们实现的所有分类器都需要有这个API:train(X, y)函数。该函数使用训练集的数据和标签来进行训练。从其内部来看,类应该实现一些关于标签和标签如何被预测的模型。这里还有个predict(X)函数,它的作用是预测输入的新数据的分类标签。现在还没介绍分类器的实现,下面就是使用L1距离的Nearest Neighbor分类器的实现套路:

import numpy as npclass NearestNeighbor(object):
def __init__(self):
pass

def train(self, X, y):
""" X is N x D where each row is an example. Y is 1-dimension of size N """
# the nearest neighbor classifier simply remembers all the training data
self.Xtr = X
self.ytr = y

def predict(self, X):
""" X is N x D where each row is an example we wish to predict label for """
num_test = X.shape[0]
# lets make sure that the output type matches the input type
Ypred = np.zeros(num_test, dtype = self.ytr.dtype)

# loop over all test rows
for i in xrange(num_test):
# find the nearest training image to the i'th test image
# using the L1 distance (sum of absolute value differences)
distances = np.sum(np.abs(self.Xtr - X[i,:]), axis = 1)
min_index = np.argmin(distances) # get the index with smallest distance
Ypred[i] = self.ytr[min_index] # predict the label of the nearest example

return Ypred

如果你用这段代码跑CIFAR-10,你会发现准确率能达到38.6%。这比随机猜测的10%要好,但是比人类识别的水平(据研究推测是94%​)和卷积神经网络能达到的95%还是差多了。点击查看基于CIFAR-10数据的Kaggle算法竞赛排行榜​。

距离选择:计算向量间的距离有很多种方法,另一个常用的方法是L2距离,从几何学的角度,可以理解为它在计算两个向量间的欧式距离。L2距离的公式如下:

干货——图像分类(上)_图像分类_08

换句话说,我们依旧是在计算像素间的差值,只是先求其平方,然后把这些平方全部加起来,最后对这个和开方。在Numpy中,我们只需要替换上面代码中的1行代码就行:

distances = np.sqrt(np.sum(np.square(self.Xtr - X[i,:]), axis = 1))

注意在这里使用了np.sqrt,但是在实际中可能不用。因为求平方根函数是一个单调函数,它对不同距离的绝对值求平方根虽然改变了数值大小,但依然保持了不同距离大小的顺序。所以用不用它,都能够对像素差异的大小进行正确比较。如果你在CIFAR-10上面跑这个模型,正确率是35.4%,比刚才低了一点。

L1和L2比较。比较这两个度量方式是挺有意思的。在面对两个向量之间的差异时,L2比L1更加不能容忍这些差异。也就是说,相对于1个巨大的差异,L2距离更倾向于接受多个中等程度的差异。L1和L2都是在p-norm​常用的特殊形式。

k-Nearest Neighbor分类器

你可能注意到了,为什么只用最相似的1张图片的标签来作为测试图像的标签呢?这不是很奇怪吗!是的,使用k-Nearest Neighbor分类器就能做得更好。它的思想很简单:与其只找最相近的那1个图片的标签,我们找最相似的k个图片的标签,然后让他们针对测试图片进行投票,最后把票数最高的标签作为对测试图片的预测。所以当k=1的时候,k-Nearest Neighbor分类器就是Nearest Neighbor分类器。从直观感受上就可以看到,更高的k值可以让分类的效果更平滑,使得分类器对于异常值更有抵抗力。

——————————————————

干货——图像分类(上)_数据_09

上面示例展示了Nearest Neighbor分类器和5-Nearest Neighbor分类器的区别。例子使用了2维的点来表示,分成3类(红、蓝和绿)。不同颜色区域代表的是使用L2距离的分类器的决策边界。白色的区域是分类模糊的例子(即图像与两个以上的分类标签绑定)。需要注意的是,在NN分类器中,异常的数据点(比如:在蓝色区域中的绿点)制造出一个不正确预测的孤岛。5-NN分类器将这些不规则都平滑了,使得它针对测试数据的泛化(generalization能力更好(例子中未展示)。注意,5-NN中也存在一些灰色区域,这些区域是因为近邻标签的最高票数相同导致的(比如:2个邻居是红色,2个邻居是蓝色,还有1个是绿色)。

——————————————————

在实际中,大多使用k-NN分类器。但是k值如何确定呢?接下来就讨论这个问题。

图像分类笔记(上)完。

干货——图像分类(上)_图像分类_10


标签:标签,分类,分类器,干货,Neighbor,图像,图片
From: https://blog.51cto.com/u_15726357/5734391

相关文章

  • 干货——图像分类(下)
    用于超参数调优的验证集今天我们接着上次图像分类上继续说说分类。首先,我来来介绍参数和超参数的基本知识。在机器学习或者深度学习领域,参数和超参数是一个常见的问题,个人根......
  • KAL1 LINUX 官方文档之arm板版本 --- 使用 Raspberry Pi Imager 软件编写 Kali Raspbe
    使用RaspberryPiImager软件编写KaliRaspberryPi图像将KaliRaspberryPi映像写入MicroSD卡或USB设备的另一个选项是使用适用于Windows、macOS和Linux的......
  • 重磅干货来袭 | 关系网络用于目标检测(文末源码)
    目标检测各位关注的同学,在此向向大家表示歉意,没有及时给大家带来好的分享及推送。马上入秋了,相信很多同学都有很多科研成果,祝大家科研顺利,硕果累累。今天我们继续说说目标检......
  • 干货 | 视频显著性目标检测(文末附有完整源码)
    显著性检测近年来引起了广泛的研究兴趣。这种日益流行的原因在于在各种视觉任务(如图像分割、目标检测、视频摘要和压缩等)中有效地使用了这些模型。显著性模型大致可分为两......
  • 数据增强方法 | 基于随机图像裁剪和修补的方式(文末源码共享)
    深度卷积神经网络(CNNs)在图像处理中取得了显著的效果。然而,他们的高表达能力有过度适应的风险。因此,提出了在丰富数据集的同时防止过度拟合的数据增强技术。最新的CNN体系......
  • 学习迁移架构用于Scalable图像的识别
    论文出自GoogleBrain,是对前一篇论文的改进,前一篇文章讲述了用RNN去搜索一个最好的网络结构,而这篇文章认为之前的搜索空间太大,效果不好,所以改成搜索CNN的效果最好的convce......
  • 3.修改图像
    1.总结:昨天主要是编写了根据uid和username以及avatar上传图像,但是还是没有实现上传图像的功能,今天再琢磨一下,代码好像无误,但是功能却没有达到效果主要是在mapper......
  • 详解线性分类-背景&感知机【白板推导系列笔记】
    本文已参与「新人创作礼」活动,一起开启掘金创作之路。传统的机器学习方法或多或少都有线性回归模型的影子:线性模型往往不能很好地拟合数据,因此有三种方案克服这一劣势:......
  • 基于支持向量机的图像分类(下篇:MATLAB实现)
    摘要:本文通过图文详细介绍如何利用支持向量机对图像进行分类,经过上篇文章对原理的介绍,这里介绍利用MATLAB编程实现。更多相关资源详解也可参考博主最新博文基于支持向量机......
  • 基于支持向量机的图像分类(上篇)
    摘要:本文通过图文详细介绍如何利用支持向量机对图像进行分类。这篇文章从什么是图像分类任务开始一步步详细介绍支持向量机原理,以及如何用它解决图像多分类任务。将这部分......