图像分类_01图像分类简介:挑战+近邻分类器+CIFAR-10数据集概述

2.1.1 图像分类

  • 任务目的:对输入的图像赋予一个标签,这个标签在指定类别集合中。

下面这个例子中,图像分类模型拍摄一张图像并将概率分配给4个标签{cat,dog,hat,mug}。如图所示,请记住,对于计算机而言,图像表示为一个大型3维数字数组。在此示例中,猫图像的宽度为248像素,高度为400像素,并具有红色,绿色,蓝色(简称RGB)三个颜色通道。因此,图像由248 x 400 x 3个数字或总共297,600个数字组成。每个数字都是一个整数,范围是0(黑色)到255(白色)。我们的任务是将这一百万分之一的数字变成一个单独的标签,例如“ cat”

图像分类的任务是预测给定图像的单个标签(或标签上的分布,如图所示,以表示我们的可信度)。图像是0到255之间的三维整数数组,大小为宽x高x 3。3表示红色、绿色、蓝色三个颜色通道。

2.1.1.1 挑战:

由于识别视觉概念的任务对人类来说相对来说是微不足道的,因此从计算机视觉算法的角度考虑所涉及的挑战存在并且具有价值的。图像的原始表示为亮度值的三维数组:

  • Viewpoint variation:单个物体从不同的角度照出来的图像

  • Scale variation:展现出的图像大小会变化

  • Deformation:许多物体的边缘可以形成不同的形状形式

  • Occlusion:关注的某个物体会被遮挡,只有一小部分会被显示出来

  • Illumination conditions: 光照对像素级的影响很大

  • Background clutter: 感兴趣的物体与环境融合,很难进行区分

  • Intra-class variation: 物体的类别非常广泛相近,例如椅子,这些对象有许多不同的类型,每个都有自己的外观

所以一个好的图像分类模型必须解决上述问题,对各种变化的交叉存在具有敏感性。

2.1.2 近邻分类器

首先我们将介绍一个最近邻分类的方法,虽然这个方法没有用到深度学习的方法,并且也很少在实践中使用。但是能够给我们提供一个去解决图像分类问题的基础思路。

  • 数据驱动方式

如何编写一个算法进行将一个张图片分类到具体一个类别,会给计算机提供每个类别的很多样本,然后使用算法去学习这些样本学习每个类别的视觉特点。这样的方式依赖于大量的指定类别的训练数据。如下所示

2.1.2.1 CIFAR-10例子介绍

图像分类数据集示例:CIFAR-10,一个流行的图像分类数据集。这个数据集由60000个32像素高和宽组成的小图像组成。每个图像都被标记为10个类之一(例如“飞机、汽车、鸟等”)。这60000个图像被分割成50000个图像的训练集和10000个图像的测试集。在下图中,您可以看到10个类中每个类的10个随机示例图像:

上面图中就是数据集的类别和图像的示例,右边展示了一部分测试图像以及最相近的在训练集中前10张图片集合。

2.1.2.2 算法思路

假设现在我们得到了cifar-10训练集,它包含50000个图像(每个标签有5000个图像),我们希望标记预测剩下的10000个图像。

  • 最近邻分类器将得到一个测试图像,将其与每个训练图像进行比较,并预测其标签,为最近的训练图像的标签。

在上面和右边的图像中,您可以看到10个示例测试图像的这种过程的示例结果。注意,在大约10个示例中,只有3个检索到同一类的图像,而在其他7个示例中则不是这样。例如,在第8排,离马头最近的训练图像是一辆红色的汽车,大概是由于强烈的黑色背景。因此,在这种情况下,马的图像会被错误地标记为汽车。

如何比较图像两张图片

每个图像都是32 x 32 x 3的像素。最简单的方法之一是逐像素比较图像,并将所有差异相加。

如果两个图像一样,结果为0,如果两个图像相差很大,结果会很大

  • 训练数据集与测试数据L1距离代码实现
    • Xtr为所有训练数据,
distances = np.sum(np.abs(Xtrain - Xtest[i,:]), axis = 1)

设定输入的图片和标签形状为

Xtrain_rows = Xtrain.reshape(Xtrain.shape[0], 32 * 32 * 3) # Xtr_rows becomes 50000 x 3072
Xtest_rows = Xtest.reshape(Xtest.shape[0], 32 * 32 * 3) # Xte_rows becomes 10000 x 3072

完整代码实现(Numpy)

import numpy as npclass NearestNeighbor(object):def __init__(self):passdef train(self, X, y):"""X:N x D形状,N为样本数,D为像素数量Y:1维,大小为N"""# 所有最近邻需要的训练数据集self.Xtrain = Xself.ytrain = ydef predict(self, Xtest):"""对输入的X若干个测试图片,每个进行预测"""num_test = Xtest.shape[0]# 确保输出类型一样Ypred = np.zeros(num_test, dtype = self.ytrain.dtype)# 循环所有测试数据for i in xrange(num_test):# 使用L1距离找到i最近的训练图片distances = np.sum(np.abs(self.Xtrain - Xtest[i,:]), axis = 1)min_index = np.argmin(distances)# 获取最近的距离的图像下标Ypred[i] = self.ytrain[min_index]# 预测标签(获取对应训练那张图片的目标标签)return Ypred

结果

使用上述方法,我们在CIFAR-10的测试机上面只能达到38.6% 的准确率,距离目前人类的测试结果(大概)94%的准确率,还有后面着重介绍的state of the art(SOTA,前沿的)的卷积神经网络取得的效果95%

距离选择

距离有很多种方式,在计算两个向量的距离时候,也可以选择L2,欧式距离。 d_2 (I_1, I_2) = \sqrt{\sum_{p} \left( I^p_1 - I^p_2 \right)^2}d​2​​(I​1​​,I​2​​)=√​​p​∑​​(I​1​p​​−I​2​p​​)​2​​​​​只要去修改其中的距离计算即可

distances = np.sqrt(np.sum(np.square(Xtrain - Xtest[i,:]), axis = 1))

但是在实际的最近邻应用程序中,我们可以省略平方根操作,因为平方根是单调函数。缩放距离的绝对大小,因此有或没有顺序的最近邻是相同的。如果您使用L2距离在cifar-10上运行最近邻分类器,将获得35.4%的精度(略低于L1距离结果)。

2.1.3 近邻分类器的优缺点

  • 优点是实现和理解起来非常简单。此外,分类器不需要时间进行训练,因为所需的只是存储并可能索引训练数据。

  • 缺点是我们在测试时候的计算成本,因为对测试示例进行分类需要与每个单独的训练示例进行比较。这是向后的,因为在实践中,我们通常更关心测试时间的效率,而不是训练时间的效率。

    • 利用L1和L2进行距离测量不适合描述图片的相似度,不适合描述图片在视觉感知上的差异
    • 测试太慢
    • 维数灾难

注:最近邻分类器的计算复杂度是非常值得研究的领域,现有的几种近似最近邻(ann)算法和库可以加速数据集中的最近邻查找。这些算法允许在检索过程中权衡最近邻检索的正确性和其空间/时间复杂性,并且通常依赖于涉及构建kdtree或运行k-means算法的预处理/索引阶段。在某些情况下(尤其是在数据低维的情况下),最近邻分类器有时可能是一个不错的选择,但它很少适用于实际的图像分类设置。一个问题是,图像是高维对象,高维空间上的距离可能非常反直观。

  • 存在问题:

基于高维数据(尤其是图像)的像素距离可能非常不直观。上述原始图像(左)和它旁边的其他三个图像,根据L2像素距离,三个变化后的图像都离原始图像同样远。显然,像素级的距离根本不符合图像的语义相似性。

2.1.4 总结

  • 图像分类任务引入以及挑战
  • 最近邻分类器
  • L1与L2距离在图像距离的计算和存在的问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469484.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构之图:有向图的拓扑排序,Python代码实现——26

有向图的拓扑排序 拓扑排序介绍 什么是拓扑排序? 一个有向图的拓扑排序(Topological sort 或 Topological ordering)是根据其有向边从顶点U到顶点V对其所有顶点的一个线性排序举个例子:让一个拓扑排序的图中的所有顶点代表某项…

图像分类_02神经网络(NN)简介:定义+ 感知机+历史

2.2.1 什么是神经网络 人工神经网络( Artificial Neural Network, 简写为ANN)也简称为神经网络(NN)。是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)结构和功能的 计算模型…

图像分类_03分类器及损失:线性分类+ SVM损失+Softmax 分类+交叉熵损失

2.3.1 线性分类 2.3.1.1 线性分类解释 上图图中的权重计算结果结果并不好,权重会给我们的猫图像分配⼀个⾮常低的猫分数。得出的结果偏向于狗。 如果可视化分类,我们为了⽅便,将⼀个图⽚理解成⼀个⼆维的点,在下⾯坐标中显示如下…

数据结构之图:加权无向图与寻找最小生成树,Python——27

加权无向图与prim算法和Kruskal算法寻找最小生成树 加权无向图的介绍 引入 加权无向图是一种为每条边关联一 个权重值或 是成本的图模型。这种图能够自然地表示许多应用。在一副航空图中,边表示航线,权值则可以表示距离或是费用。在一副电路图中,边表示导线,权值则可能表示导…

图像分类_04神经网络最优化过程:反向传播+代码实现

logistic模型原理与推导过程分析(1)https://blog.csdn.net/qq_39237205/article/details/121031296https://blog.csdn.net/qq_39237205/article/details/121031296 logistic模型原理与推导过程分析(2)https://blog.csdn.net/qq_3…

数据结构之图:加权有向图与dijkstra算法找到最短路径,Python——28

加权有向图与dijkstra算法找到最短路径 加权有向图的构造 最短路径问题与最短路径树 最短路径问题(The shortest path problem)定义 最短路径可以是时间花费最短,也可以是距离最短,或是花费最少在图论中,最短路径问…

李沐动手学深度学习pytorch :问题:找不到d2l包,No module named ‘d2l’

同学你好!本文章于2021年末编写,已与实际存在较大的偏差! 故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现, Pytorch深度学习理论篇(2023版)…

解决loaded more than 1 DLL from .libs和No metadata found in lib\site-packages两个错误

### 卸载numpy pip uninstall numpy 解决No metadata found in lib\site-packages 去这个文件夹下找到numpy的两个文件夹 删除 然后重新输入pip install numpy

ERROR 2002 (HY000): Can‘t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock‘

启动数据库时报错,代码ERROR 2002 (HY000) 报错截图: 原因:网络环境发生改变,mysql配置文件中绑定的IP与现在系统的IP不一致 解决:修改配置文件中绑定的IP地址为本系统的IP地址 使用命令: sudo vi /etc/…

图像目标分割_1 概述

6.1.1 什么是目标分割 定义:在计算机视觉领域,图像分割(Object Segmentation)指的是将数字图像细分为多个图像子区域(像素的集合)的过程。 图像分割的目的:简化或改变图像的表示形式&#xff0…

字符数组和strcpy

已知strcpy函数的原型是char *strcpy(char *strDest, const char *strSrc);,其中strDest是目的字符串,strSrc是源字符串。 (1)Write the function strcpy, dont call C/C string library.(不调用C/C的字符串库函数&…

Django开发中问题和报错集合

记录django项目开发过程中的遇到的问题,导致原因和已经奏效的解决方法 常见报错UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xbc in position 852: invalid start byte 这个问题在一些电脑上做django开发时经常出现 要么是py文件运行是就报这个类似…

图像目标分割_2 FCN(Fully Convolutional Networks for Semantic Segmentation)

6.2.1 FCN 背景介绍 图像语义分割:给定一张图片,对图片上每一个像素点进行分类!但是与图像分类目的不同,语义分割模型要具有像素级的密集预测能力才可以。 6.2.2 FCN介绍 6.2.2.1 全卷积网络 全卷积网络,模型由卷积…

求4个数字组成的不重复三位数,Python简洁解法

求4个数字组成的不重复三位数,Python解法 题目要求: 求所有由5,6,7,8组成的数字不重复的三位数 不重复的三位数,即不能出现555,566这种 通过分析,可以使用画树的方法来确定要求的三位数的值与个数 按照上图所示可以确定由5&am…

图像目标分割_3 SegNet + U-Net

6.3.1 SegNet背景 SegNet的主要动机是场景理解的应用。 难点:因此它在设计的时候考虑了要在预测期间保证内存和计算时间上的效率。分割的任务其实应用非常地广,需要理解各个像素之间的关系,比如要区分出人行道和车行道,建筑物和…

MIPI屏数据发送命令解析

MIPI数组发送那里有一个数组,这个数组包含寄存器和寄存器的值: 相当于: 0XC480寄存器下参数0X9C; 0XFF00寄存器下参数0XFF,0XFF,0XFF; 0XC0B5 尝试一下寄存器 0x08 0x18 0x48 0x58 试一下能不能旋转

面向对象之类的内建函数

类的特殊成员 上文介绍了Python的类成员以及成员修饰符,从而了解到类中有字段、方法和属性三大类成员,并且成员名前如果有两个下划线,则表示该成员是私有成员,私有成员只能由类内部调用。无论人或事物往往都有不按套路出牌的情况&…

图像目标分割_4 DeepLab-V1

6.4.1 DeepLab 背景 相比于传统的视觉算法(SIFT或HOG),Deep-CNN以其end-to-end方式获得了很好的效果。这样的成功部分可以归功于Deep-CNN对图像转换的平移不变性(invariance),这根本是源于重复的池化和下采样组合层。平移不变性增强了对数据分层抽象的能…

图像目标分割_5 DeepLab V2 V3 V3+

6.5.1 DeepLab V2 6.5.1.1 改变特点 atrous convolution采用ASPP ( atrous spatial pyramid pooling) 多尺度获得更好的分割效果合并深度卷积网络和概率图模型方法,增强对物体边界的定位。基础层由VGG16转为ResNet 和v1不同: 通过多尺度输入处理或者多…

Python导包、模块报错的问题

import报错No module named "xxx"的问题 如何将指定目录作为项目根目录,让项目根目录下的包/模块都可以直接导入?(linux下) Python导入模块时,解释器如何定位模块: 1.当前目录 2.内置模块列表 3…