计算机视觉:图像内容分类

这篇博客介绍了图像内容分类的挑战,包括视角变化、尺寸大小、变形等因素。接着详细讲解了K邻近分类法(KNN)的工作原理和在图像识别中的应用。此外,还探讨了稠密SIFT(Dense SIFT)作为特征提取方法的优势。博主通过代码实现展示了KNN的可视化效果,并进行了手势识别的实验,得出增大训练集能提高分类准确率的结论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、图像内容分类

1.1 图像识别的难点

图像识别看似很直接。但实际上包含很多挑战,人类可是经过数亿年的进化才获得如此强大的大脑,对于各种物体有着精准的视觉理解力。总体而言,我们想『教』会计算机去认识一类图,会有下面这样一些困难:

视角不同,每个事物旋转或者侧视最后的构图都完全不同
尺寸大小不统一,相同内容的图片也可大可小
变形,很多东西处于特殊的情形下,会有特殊的摆放和形状
光影等干扰/幻象
背景干扰
同类内的差异(比如椅子有靠椅/吧椅/餐椅/躺椅…)

在这里插入图片描述

1.2.K邻近分类法(K Nearest Neighbor Classifier)

KNN算法是分类方法中最简单且应用最多的一种方法。,这种算法把要分类的对象(例如一个特征向量)与训练集中已知类标记的所有对象进行对比,并由k近邻对指派到哪个类进行投票。利用图片与图片之间的距离。根据距离最近的N张图片的标签决定预测图片的分类。图片之间的距离可以用曼哈顿距离、欧式距离或者余弦距离表示。
KNN的优点是思路简单,但是预测的时候需要与所有训练集图片比较,时间长。而且效果也不好。基本上是颜色一致的图片是最近邻的。

1.3.稠密SIFT(Dense SIFT)

Dense SIFT算法,是一种对输入图像进行分块处理,再对每一块进行SIFT运算的特征提取过程。Dense SIFT根据可调的参数大小,来适当满足不同分类任务下对图像的特征表征能力;而传统的SIFT算法则是对整幅图像的处理,得到一系列特征点。

Dense-SIFT在非深度学习的模型中,常常是特征提取的第一步。采样的点提取SIFT描述子后,经过码书投影,投影在同一个码字上的采样点都代表了一组描述子相似的点。不同的码字(相当于直方图的每一个bin)之间,采样点的区分能力是不一样的。我们以下图图1为例,bin2代表的是一块很平坦的区域,于是dense采样时,很多点产生的描述子都会投影在bin2上。而bin1,bin3,bin4分别代表一块特有的区域,仅仅在dense采样到自行车,大提琴和眼睛等部位时,才能够形成类似的描述子。换而言之,bin2的重要性最低,而其他码字的重要性都很高。

二、代码实现

1.KNN可视化

1.1数据初始化

from numpy import * 

class KnnClassifier(object):
    
    def __init__(self,labels,samples):
        """ Initialize classifier with training data. """
        
        self.labels = labels
        self.samples = samples
    
    def classify(self,point,k=11):
        """ Classify a point against k nearest 
            in the training data, return label. """
        
        # compute distance to all training points
        dist = array([L2dist(point,s) for s in self.samples])
        
        # sort them
        ndx = dist.argsort()
        
        # use dictionary to store the k nearest
        votes = {}
        for i in range(k):
            label = self.labels[ndx[i]]
            votes.setdefault(label,0)
            votes[label] += 1
            
        return max(votes, key=lambda x: votes.get(x))


def L2dist(p1,p2):
    return sqrt( sum( (p1-p2)**2) )

def L1dist(v1,v2):
    return sum(abs(v1-v2))

1.2.Pickle模块保存创建的数据

# -*- coding: utf-8 -*-
from numpy.random import randn
import pickle
from pylab import *

# create sample data of 2D points
n = 200
# 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值