本文概述

利用SIFT特征进行简单的花朵识别

SIFT算法的特点有:

  1. SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;
  2. SIFT算法提取的图像特征点数不是固定值,维度是统一的128维。
  3. 独特性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;
  4. 多量性,即使少数的几个物体也可以产生大量的SIFT特征向量;
  5. 高速性,经优化的SIFT匹配算法甚至可以达到实时的要求;
  6. 可扩展性,可以很方便的与其他形式的特征向量进行联合。

KMeans聚类获得视觉单词,构建视觉单词词典

现在得到的是所有图像的128维特征,每个图像的特征点数目还不一定相同(大多有差异)。现在要做的是构建一个描述图像的特征向量,也就是将每一张图像的特征点转换为特征向量。这儿用到了词袋模型,词袋模型源自文本处理,在这儿用在图像上,本质上是一样的。词袋的本质就是用一个袋子将所有维度的特征装起来,在这儿,词袋模型的维度需要我们手动指定,这个维度也就确定了视觉单词的聚类中心数。

将图像特征点映射到视觉单词上,得到图像的特征向量:

熟悉聚类算法的同学已经明白了,上面讲的簇就是通过聚类算法得到的,聚类算法将类别相近,属性相似的样本框起来,是一种无监督学习算法。在本文中,我使用了Kmeans算法来聚类得到视觉单词,通过聚类得到了聚类中心,通过聚类得到了表征词袋的特征点。

我们得到k个聚类中心(一个聚类中心表征了一个维度特征,k由自己手动设置)和先前SIFT得到的所有图片的特征点,现在就是要通过这两项来构造每一张图像的特征向量。

在本文中,构造的思路跟简单,就是比对特征点与所有聚类中心的距离,将特征点分配到距离最近的特征项,比如经计算某特征点距离leg这个聚类中心最近,那么这个图像中leg这个特征项+1。以此类推,每一张图像特征向量也就构造完毕。

pickle读取文件

pickle可以存储什么类型的数据呢?

  1. 所有python支持的原生类型:布尔值,整数,浮点数,复数,字符串,字节,None。

  2. 由任何原生类型组成的列表,元组,字典和集合。

  3. 函数,类,类的实例

  4. pickle模块中常用的方法有:

     1.pickle.dump(obj, file, protocol=None,)

    必填参数obj表示将要封装的对象

    必填参数file表示obj要写入的文件对象,file必须以二进制可写模式打开,即“wb”

    可选参数protocol表示告知pickler使用的协议,支持的协议有0,1,2,3,默认的协议是添加在Python 3中的协议3

     2.pickle.load(file,*,fix_imports=True,encoding="ASCII", errors="strict")

    必填参数file必须以二进制可读模式打开,即“rb”,其他都为可选参数

支持向量机

支持向量机的两个参数(调参增大准确率)

SVM模型有两个非常重要的参数C与gamma。其中 C是惩罚系数,即对误差的宽容度。c越高,说明越不能容忍出现误差,容易过拟合。C越小,容易欠拟合。C过大或过小,泛化能力变差

gamma是选择RBF函数作为kernel后,该函数自带的一个参数。隐含地决定了数据映射到新的特征空间后的分布,gamma越大,支持向量越少,gamma值越小,支持向量越多。支持向量的个数影响训练与预测的速度。

此外大家注意RBF公式里面的sigma和gamma的关系如下:

这里面大家需要注意的就是gamma的物理意义,大家提到很多的RBF的幅宽,它会影响每个支持向量对应的高斯的作用范围,从而影响泛化性能。我的理解:如果gamma设的太大,会很小,很小的高斯分布长得又高又瘦, 会造成只会作用于支持向量样本附近,对于未知样本分类效果很差,存在训练准确率可以很高,(如果让无穷小,则理论上,高斯核的SVM可以拟合任何非线性数据,但容易过拟合)而测试准确率不高的可能,就是通常说的过训练;而如果设的过小,则会造成平滑效应太大,无法在训练集上得到特别高的准确率,也会影响测试集的准确率。

算法流程:

  1. SIFT提取每幅图像的特征点:

     import csv
    import os
    from sklearn.cluster import KMeans
    import cv2
    import numpy as np def knn_detect(file_list,cluster_nums, randomState = None):
    content = []
    input_x = []
    labels=[]
    features = []
    count = 0
    csv_file = csv.reader(open(file_list,'r'))
    #读取csv文件
    for line in csv_file:
    if(line[2] !='label'):
    subroot = 'F:\\train\\g' + str(line[2])
    #路径拼接成绝对路径
    filename =os.path.join(subroot, line[1])
    sift = cv2.xfeatures2d.SIFT_create(200)
    img = cv2.imdecode(np.fromfile(filename,dtype=np.uint8),-1)
    #用np读图像,避免了opencv读取图像失败的问题
    if img is not None: gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    kpG, desG = sift.detectAndCompute(gray, None)
    #关键点描述符 if desG is None:
    #关键点不存在就结束循环
    continue
    print(count)
    count+=1
    ll = np.array(line[2]).flatten()
    labels.append(ll)
    #得到标签
    features.append(desG)
    #得到图像的特征矩阵
    input_x.extend(desG)
    print(len(input_x))
    return features,labels,input_x #训练集图片处理
    des_list = []
    labelG = []
    input_x1 = []
    des_list,labelG,input_x1 = knn_detect('E:\\py\\train.csv',50)
    #测试机图片处理
    festures_test = []
    labels_test = []
    input_x2 = []
    features_test,labels_test,input_x2 = knn_detect('E:\\py\\test.csv',50)

结果截图:

  1. 保存中间变量:

     #利用pickle保存中间变量
    import numpy as np
    import matplotlib.pyplot as plt
    import pandas as pd
    import pickle output = open('input_x2.pkl', 'wb')
    pickle.dump(input_x2, output)
    output.close() output = open('features_test.pkl', 'wb')
    pickle.dump(features_test, output)
    output.close() output = open('labels_test.pkl', 'wb')
    pickle.dump(labels_test, output)
    output.close() output = open('input_x22.pkl', 'wb')
    pickle.dump(input_x2, output,protocol=2)
    output.close()
  2. 将图像特征点映射到视觉单词上,得到图像特征:

     df=open('input_x2.pkl','rb')#注意此处是rb
    #此处使用的是load(目标文件)
    input_x1=pickle.load(df)
    df.close()
    kmeans = KMeans(n_clusters = 50, n_jobs =4,random_state = None).fit(input_x1)
    #开四个线程加快计算
    centers = kmeans.cluster_centers_
  3. 将图像特征点映射到视觉单词上,得到图像的特征向量:

     def des2feature(des,num_words,centures):
    '''
    des:单幅图像的SIFT特征描述
    num_words:视觉单词数/聚类中心数
    centures:聚类中心坐标
    计算特征矩阵中特征点离聚类中心最近的加1
    return: feature vector 1*num_words
    '''
    img_feature_vec=np.zeros([num_words])
    for fi in des:
    diffMat = np.tile(fi, (50, 1)) - centers
    sqSum = (diffMat**2).sum(axis=1)
    dist = sqSum**0.5
    sortedIndices = dist.argsort()
    idx = sortedIndices[0] # index of the nearest center
    #排序得到距离最近的聚类中心坐标的索引
    img_feature_vec[idx] += 1
    return img_feature_vec def get_all_features(des_list,num_words):
    # 获取所有图片的特征向量
    allvec=np.zeros((len(des_list),num_words),'float32')
    for i in range(len(des_list)):
    if des_list[i].any()!=None:
    allvec[i]=des2feature(centures=centers,des=des_list[i],num_words=num_words)
    return allvec df=open('des_list.pkl','rb')#注意此处是rb
    #此处使用的是load(目标文件)
    des_list=pickle.load(df)
    df.close()
    a =get_all_features(des_list,50)
    print(len(a))
    output = open('特征向量.pkl', 'wb')
    pickle.dump(a, output)
    output.close()
  4. svm训练,查看准确率:

     import numpy as np
    import matplotlib.pyplot as plt
    import pandas as pd
    import pickle
    from sklearn.preprocessing import StandardScaler
    df=open('label_train.pkl','rb')#注意此处是rb
    #此处使用的是load(目标文件)
    label_train=pickle.load(df)
    df.close()
    df=open('label_test.pkl','rb')#注意此处是rb
    #此处使用的是load(目标文件)
    label_test =pickle.load(df)
    df.close()
    sc = StandardScaler()
    X_train = sc.fit_transform(a)
    X_test = sc.fit_transform(b) from sklearn.svm import SVC
    classifier = SVC(C=15)
    #适当调整参数,不是一个固定值
    classifier.fit(X_train,label_train) y_pred = classifier.predict(X_test) print(classifier.score(X_train,label_train))
    from sklearn.metrics import classification_report
    print(classification_report(label_test,y_pred))

结果截图:

图像识别sift+bow+svm的更多相关文章

  1. 汽车检测SIFT+BOW+SVM

    项目来源于 <opencv 3计算机视觉 python语言实现> 整个执行过程如下: 1)获取一个训练数据集. 2)创建BOW训练器并获得视觉词汇. 3)采用词汇训练SVM. 4)尝试对测 ...

  2. 第十九节、基于传统图像处理的目标检测与识别(词袋模型BOW+SVM附代码)

    在上一节.我们已经介绍了使用HOG和SVM实现目标检测和识别,这一节我们将介绍使用词袋模型BOW和SVM实现目标检测和识别. 一 词袋介绍 词袋模型(Bag-Of-Word)的概念最初不是针对计算机视 ...

  3. BoW(SIFT/SURF/...)+SVM/KNN的OpenCV 实现

    本文转载了文章(沈阳的博客),目的在于记录自己重复过程中遇到的问题,和更多的人分享讨论. 程序包:猛戳我 物体分类 物体分类是计算机视觉中一个很有意思的问题,有一些已经归类好的图片作为输入,对一些未知 ...

  4. SIFT+BOW 实现图像检索

    原文地址:https://blog.csdn.net/silence2015/article/details/77374910 本文概述 图像检索是图像研究领域中一个重要的话题,广泛应用于医学,电子商 ...

  5. py4CV例子2汽车检测和svm算法

    1.什么是汽车检测数据集: ) pos, neg = , ) matcher = cv2.FlannBasedMatcher(flann_params, {}) bow_kmeans_trainer ...

  6. Bag of Words/Bag of Features的Matlab源码发布

    2010年11月19日 ⁄ 技术, 科研 ⁄ 共 1296字 ⁄ 评论数 26 ⁄ 被围观 4,150 阅读+ 由于自己以前发过一篇文章讲bow特征的matlab代码的优化的<Bag-Of-Wo ...

  7. OpenCV 学习笔记 07 目标检测与识别

    目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...

  8. Bag of word based image retrieval

    主要参考维基百科Bag of Word 在DLP领域里,bow(bag of word)是一个稀疏的向量,向量的每个元素记录词的出现次数,相当于对每篇文章都关于词典做词的直方图统计.同样的道理用在co ...

  9. Bag of Features (BOF)图像检索算法

    1.首先.我们用surf算法生成图像库中每幅图的特征点及描写叙述符. 2.再用k-means算法对图像库中的特征点进行训练,生成类心. 3.生成每幅图像的BOF.详细方法为:推断图像的每一个特征点与哪 ...

随机推荐

  1. asp.net ToString() 格式化字符串

    c# ToString() 格式化字符串  格式化数值:有时,我们可能需要将数值以一定的格式来呈现,就需要对数值进行格式化.我们使用格式字符串指定格式.格式字符串采用以下形式:Axx,其中 A 为格式 ...

  2. Asp.Net MVC实现优酷(youku)Web的上传

    优酷第三方上传API没有.NET版本的SDK,让从事.NET开发人员要实现开放平台上传文件无从下手.本文经过一天的预读优酷文档,以NET方式实现了视频上传. 参考: 优酷开放文档 http://ope ...

  3. MinGW 编译 libsndfile-1.0.25(只要有 MSYS,./configure make make install 就行了)

    最近做的一个项目需要读写 wav 文件.在网上找到 libsndfile 刚好满足我的需要.但是编译的时候遇到了点小麻烦,这里记录一下编译的过程,免得下次再编译时忘记了. 因为是在编译完成若干天后写的 ...

  4. How Qt Signals and Slots Work(感觉是通过Meta根据名字来调用)

    Qt is well known for its signals and slots mechanism. But how does it work? In this blog post, we wi ...

  5. 基于ASP.NET的新闻管理系统(三)代码展示

    5.1.1栏目部分 增加栏目(addLanMu.aspx): <html xmlns="http://www.w3.org/1999/xhtml"> <head  ...

  6. Spring Boot配置篇(基于Spring Boot 2.0系列)

    1:概述 SpringBoot支持外部化配置,配置文件格式如下所示: properties files yaml files environment variables command-line ar ...

  7. Spark之常用操作

    -- 筛选 val rdd = sc.parallelize(List("ABC","BCD","DEF")) val filtered = ...

  8. ABP开发框架前后端开发系列---(4)Web API调用类的封装和使用

    在前面随笔介绍ABP应用框架的项目组织情况,以及项目中领域层各个类代码组织,以及简化了ABP框架的各个层的内容,使得我们项目结构更加清晰.上篇随笔已经介绍了字典模块中应用服务层接口的实现情况,并且通过 ...

  9. Spring Boot2(二):使用Spring Boot2集成Mybatis缓存机制

    前言 学习SpringBoot集成Mybatis的第二章,了解到Mybatis自带的缓存机制,在部署的时候踩过了一些坑.在此记录和分享一下Mybatis的缓存作用. 本文章的源码再文章末尾 什么是查询 ...

  10. 用composer安装php代码(以安装phpmailer为例)

    1.安装composer.exe软件 2.下载composer.phar 3.创建composer.json文件 { "require": { "php": & ...