一、图像内容分类
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
#