用词袋模型对图片分类

转自:http://zipperary.com/2013/12/16/classify-pictures/


这学期人工智能留了几个大作业,目前大家几乎都停留在第一个作业中。作业的要求是这样的:「使用一种监督学习方法和非监督学习方法,借鉴非监督学习课件中所述Bag-of-visual-words的例子实现图像分类,描述你的算法与实验结果。」Google 了一番,找到了 c++ 和 matlab 的实现,但我最近懒得学 openCV,也不想看 matlab 的代码,打算用 python 实现一下。

老师在附件中给出了两个文件夹「恐龙」和「汽车」;每个文件夹中有95个 txt 文件,如「0.txt」,文件中每一行表示一个局部向量,为128维,文件的首行给出了局部向量的个数和维数。每个 txt 文件都是对应的图片文件通过 sift 算法提取的局部特征向量集合。我们的任务就是基于这些数据,完成老师给出的任务要求。

首先是要理解词袋模型,这个在之前的文章《Bag of Words》中介绍过了。

用词袋模型构建对图片的向量表示中还会用到 Kmeans 聚类方法。得到图片的表示之后,便可以调用 svm 算法训练分类器了。

下面是 python 的实现代码:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
         
#!/usr/bin/env python
#coding=utf-8
import os
from numpy import array
from scipy.cluster.vq import vq, kmeans, whiten, kmeans2
from sklearn import svm
from sklearn import cross_validation
ncluster = 6 #聚类数
 
########
#读入数据
root = '/Users/moxie/Documents/dat' #目录
dir1 = root + '/kl' #恐龙文件夹
dir2 = root + '/qc' #汽车文件夹
 
#kl数据读取
kl = [] #恐龙文件夹
inf_kl = [] #局部特征的个数
for i in range( 95):
pic = []
f_name = '%s.txt' % i
file1 = os.path.join(dir1,f_name)
for line in open(file1, 'rb'):
localf = [] #每行
for dms in line.strip().split():
localf.append( float(dms))
pic.append(localf) #每个图片
inf = pic.pop( 0)
kl.extend(pic)
count = int(inf[ 0])
inf_kl.append(count)
 
#qc数据读取
qc = []
inf_qc = []
for i in range( 95):
pic = []
f_name = '%s.txt' % i
file2 = os.path.join(dir2,f_name)
for line in open(file2, 'rb'):
localf = []
for dms in line.strip().split():
localf.append( float(dms))
pic.append(localf)
inf = pic.pop( 0)
qc.extend(pic)
count = int(inf[ 0])
inf_qc.append(count)
kl.extend(qc) #所有的局部特征
inf_kl.extend(inf_qc) #所有的特征数量信息
#print inf_kl,len(inf_kl)
 
#######
#kmeans 处理为 k 类,同时标记每个数据的所属类别,之后用;另外,均值就是代表点了;根据均值点建立词典。
features = array(kl)
whitened = whiten(features) #scale一致化
cent,label = kmeans2(whitened,ncluster) #label 为每个局部特征所属类别
 
#######
#把每个图片表示为 bow 形式
#求 x
codebook = list( set(label))
x = []
begin = 0
label = list(label)
#print 'label:' , label
for n in inf_kl:
end = begin + n
temp = label[begin:end]
picf = [] #每个图片
for ii in codebook:
nn = temp.count(ii)
picf.append(nn)
x.append(picf)
begin = end
 
#print len(x),len(picf)
 
#求 y
y = [ 0] * 95 + [ 1] * 95
 
#print x,y,len(x),len(y)
 
#######
#分开为 train 和 test
 
X_train, X_test, y_train, y_test = cross_validation.train_test_split(x, y,
test_size = 0.3, random_state = 0)
 
#x_test = x[:32] + x[158:]
#x_train = x[32:158]
#y_test = y[:32] + y[158:]
#y_train = y[32:158]
 
#分类
clf = svm.SVC( kernel = 'linear', C = 1)
clf.fit(X_train,y_train)
print '正确率为:',clf.score(X_test,y_test)
 
#正确率:0.982456140351
view raw bow.py  hosted with ❤ by   GitHub

代码中已经进行了比较详细的注释,就不再单独解释了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值