图像处理_KNN算法原理与实现&dense SIFT算法实现图像分类

上一篇博客中,我们已经介绍了图像检索的原理与实现,这篇要介绍图像分类,什么是图像分类呢?图像分类就是输入一张图像,找到它属于哪一类。比如拍照识花,我们拍一张花的图像上传系统,然后系统就会告诉你这是什么花。那么图像分类是怎么怎么实现的呢?

一、KNN算法

1.算法概述

2.基本思想

3.算法流程

4.算法的优缺点

5.用KNN实现简单的二维数据分类

二、dense SIFT算法

1.算法原理

2.算法流程

3.实现

三、图像分类:手写数字集识别

1.对图像进行Dense SIFT特征提取

2.建立分类器进行手写数字集识别

一、KNN算法

1.算法概述

KNN(K-Nearest Neighbor,KNN)算法,又叫K最近邻分类算法,是著名的模式统计学方法。在分类方法中,KNN算法是最简单且用的最多的一种方法之一。

2.基本思想

KNN算法的基本思想是在特征空间中,如果要分类的对象(例如一个特征向量),在它的k个最近邻的已知对象中,大多数属于一个类别,则该要它也属于这个类别,并具有这个类别样本的特性。其基本思想示意图如下:

如图所示,已知红色三角和蓝色正方形都是已知对象,那么绿色圆圈属于哪一类呢?如果我们取K=1,我们可以很清楚的看见离它最近的是红色的三角,那么它就属于红色三角的那类;如果我们取K=5,在离它最近的5个已知对象中,有2个红色三角和3个蓝色正方形,蓝色正方形的数量大于红色三角的数量,所以它属于蓝色正方形。从这里我们也可以看到,K值的选取,对于分类的好坏起着至关重要的作用。K值过小,整体模型会变得复杂,容易过拟合;K值过大,会增加误差。

3.算法流程

KNN算法的流程如下:

  1. 输入训练数据和标签,输入测试数据,设置K值
  2. 计算测试数据与各个训练数据之间的距离(本文选取欧式距离,大家也可以选取其他距离)
  3. 按照距离的递增关系进行排序,选取距离最近的K个点
  4. 确定前K个点所在类别的出现频率,返回频率最高的那个类别作为测试数据的类别

4.算法的优缺点

KNN算法的优点:

  • KNN可以用来做分类也可以用来做回归;
  • 可用于非线性分类;
  • 训练时间复杂度比支持向量机之类的算法低,仅为O(n);
  • KNN与朴素贝叶斯之类的算法比,对数据没有假设,准确度高,对异常点不敏感;
  • KNN方法主要靠周围有限个邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合;
  • KNN算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分;
  • 特别适合于多分类问题(对象具有多个类别标签),KNN要比SVM表现要好。

KNN算法的缺点:

  • 特征数比较多时,计算量很大;
  • 样本各类别数量不平衡时,对稀有类别的预测准确率低;
  • KD树,球树的模型建立需要大量的内存空间;
  • 预测时需要现算预测点到训练集中所有点的距离,因此预测速度比逻辑回归算法要慢。

5.用KNN实现简单的二维数据分类

(1)随机生成二维的训练数据和测试数据

# -*- coding: utf-8 -*-
from numpy.random import randn
import pickle
from pylab import *
###生成数据

# 创建二维样本数据
n = 200
#两个正态分布的数据集
class_1 = 0.5 * randn(n,2)
class_2 = 1.5 * randn(n,2) + array([5,1])
labels = hstack((ones(n),-ones(n)))
#用Pickle模块保存
with open('points_normal.pkl', 'wb') as f:
#with open('points_normal_test.pkl', 'wb') as f:
    pickle.dump(class_1,f)
    pickle.dump(class_2,f)
    pickle.dump(labels,f)
#正态分布,并使数据成环绕状分布
print ("save OK!")
class_1 = 0.5 * randn(n,2)
r = 1.0 * randn(n,1) + 5
angle = 2*pi * randn(n,1)
class_2 = hstack((r*cos(angle),r*sin(angle)))
labels = hstack((ones(n),-ones(n)))
#用Pickle模块保存
with open('points_ring.pkl', 'wb') as f:
#with open('points_ring_test.pkl', 'wb') as f:
    pickle.dump(class_1,f)
    pickle.dump(class_2,f)
    pickle.dump(labels,f)
    
print ("save OK!")

根据上面的代码,运行两次,我们可以得到四个数据集,其中两个是训练集,两个是测试集,规模都是200,我们将前100个数据定义标签为-1,剩下的100个数据定义标签是1。两个训练集的不同之处在于一个是正态分布,另一个是环绕状分布。有个训练集和测试集,我们就可以用KNN来实现分类啦。

(2)KNN算法实现分类

### 常见的用于图像分类的机器学习和深度学习算法 #### 一、传统机器学习算法 传统的机器学习算法可以应用于图像分类任务,通常需要先通过手工设计特征提取方法(如SIFT、HOG等)来获取图像的关键特性,然后再利用这些特征输入到分类器中完成分类。 一些常用的监督学习算法包括但不限于: - **支持向量机 (Support Vector Machine, SVM)**:这是一种强大的二分类模型,在高维空间表现良好,可以通过核函数扩展到非线性情况[^1]。 - **决策树 (Decision Tree)** 和其改进版本 **随机森林 (Random Forests)**:它们能够处理复杂的非线性关系并提供直观的结果解释能力[^3]。 - **K近邻算法 (K-Nearest Neighbors, KNN)**:简单易实现,适合小型数据集上的快速原型开发。 此外还存在集成学习技术比如 Bagging 或 Boosting 方法用来提升单个弱分类器的表现效果。 #### 二、深度学习算法 随着计算资源的增长以及大数据时代的到来,基于人工神经网络特别是卷积神经网络(Convolutional Neural Networks,CNNs) 的深度学习框架逐渐成为解决视觉识别问题的主要工具之一。相比起依赖于手动选取特征的传统方式而言,CNN可以从原始像素级别自动抽取高层次语义信息从而达到更好的泛化性能。 以下是几种广泛使用的深度学习架构: - **LeNet**: 这是一个早期的经典 CNN 结构,最初被设计用于手写字符辨识任务。 - **AlexNet**: 它标志着现代深度学习革命起点,并赢得了2012年ImageNet竞赛冠军位置;引入了ReLU激活函数Dropout正则化手段以促进收敛速度及防止过拟合现象发生. - **VGG系列(Very Deep ConvNets)**: 提出了堆叠更多层的小型滤波器作为构建模块的理念,进一步推动了网络加深趋势的发展方向. - **GoogLeNet/Inception Family**: 利用了多分支结构探索不同尺度的感受野组合可能性,有效减少了参数数量的同时提高了表达力. - **ResNet(Residual Network)**: 解决了非常深网络难以训练的问题,提出了残差连接机制允许梯度直接传播至更深层次节点处. - **DenseNet(Dense Connectivity)**: 所有层之间都相互连接在一起形成密集连通图谱形式,促进了特征重用效率最大化目标达成. 对于实际应用场景来说,预训练模型迁移学习策略往往能带来事半功倍的效果——即先在一个大规模公开可用的数据集上完成初步训练过程之后再针对特定领域需求微调最后几层权重即可满足定制化要求[^5]. ```python import torch from torchvision import models # 加载预训练 ResNet 模型 model = models.resnet50(pretrained=True) # 替换最后一层全连接层适应新类别数 num_ftrs = model.fc.in_features model.fc = torch.nn.Linear(num_ftrs, num_classes) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值