sklearn SVM 图像识别

本文涉及的产品
视觉智能开放平台,分割抠图1万点
视觉智能开放平台,图像通用资源包5000点
视觉智能开放平台,视频通用资源包5000点
简介: sklearn SVM 图像识别

sklearn SVM 图像识别


SVM 应用于图像识别,这是一个具有非常大的维度空间的经典问题(图像的每个像素的值被视为一个特征)。


  • 给出一个人脸的图像,预测它可能属于列表中的哪些人
  • SVM 模型在训练模型时可能非常耗费计算量,并且它们不会返回数字指标,表明它们对预测的置信度
  • 可以使用一些技术,如 K 折交叉验证来避免这种情况,代价是增加计算成本


1.导入数据集


我们的数据集在 scikit-learn 中提供,所以让我们从导入开始并打印其描述。

>>> import sklearn as sk
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> from sklearn.datasets import fetch_olivetti_faces
>>> faces = fetch_olivetti_faces()
>>> print faces.DESCR

该数据集包含 40 个不同人脸的 400 张图像。拍摄的照片采用不同的光线条件和面部表情(包括睁眼/闭眼,微笑/不笑,戴眼镜/不戴眼镜)。有关数据集的其他信息,请参阅这个页面

查看faces对象的内容,我们得到以下属性:imagesdatatarget。图像包含表示为64 x 64像素矩阵的 400 个图像。 data包含相同的 400 个图像,但是作为 4096 个像素的数组。正如预期的那样,target是一个具有目标类的数组,范围从 0 到 39。

>>> print faces.keys()
['images', 'data', 'target', 'DESCR']
>>> print faces.images.shape
(400, 64, 64)
>>> print faces.data.shape
(400, 4096)
>>> print faces.target.shape
(400,)


2.归一化像素值


>>> print np.max(faces.data)
1.0
>>> print np.min(faces.data)
0.0
>>> print np.mean(faces.data)
0.547046432495


3.查看人脸


>>> def print_faces(images, target, top_n):
>>>     # set up the figure size in inches
>>>     fig = plt.figure(figsize=(12, 12))
>>>     fig.subplots_adjust(left=0, right=1, bottom=0, top=1, 
        hspace=0.05, wspace=0.05)
>>>     for i in range(top_n):
>>>         # plot the images in a matrix of 20x20
>>>         p = fig.add_subplot(20, 20, i + 1, xticks=[], 
            yticks=[])
>>>         p.imshow(images[i], cmap=plt.cm.bone)
>>>         
>>>         # label the image with the target value
>>>         p.text(0, 14, str(target[i]))
>>>         p.text(0, 60, str(i))

如果我们打印前 20 张图像,我们可以看到两个人脸。

>>> print_faces(faces.images, faces.target, 20)

image.png


4.支持向量机


sklearn.svm模块导入SVC类:

>>> from sklearn.svm import SVC

支持向量分类器SVC)将用于分类

SVC 实现具有不同的重要参数;使用最简单的核,即linear

>>> svc_1 = SVC(kernel='linear')


5.数据集划分


>>> from sklearn.cross_validation import train_test_split
>>> X_train, X_test, y_train, y_test = train_test_split(
    faces.data, faces.target, test_size=0.25, random_state=0)


6.K折验证


我们将定义函数来评估 K 折交叉验证。

>>> from sklearn.cross_validation import cross_val_score, KFold
>>> from scipy.stats import sem
>>>
>>> def evaluate_cross_validation(clf, X, y, K):
>>>     # create a k-fold croos validation iterator
>>>     cv = KFold(len(y), K, shuffle=True, random_state=0)
>>>     # by default the score used is the one returned by score 
     method of the estimator (accuracy)
>>>     scores = cross_val_score(clf, X, y, cv=cv)
>>>     print scores
>>>     print ("Mean score: {0:.3f} (+/-{1:.3f})").format(
        np.mean(scores), sem(scores))
>>> evaluate_cross_validation(svc_1, X_train, y_train, 5)
[ 0.93333333  0.91666667  0.95        0.95        0.91666667]
Mean score: 0.933 (+/-0.007)

交叉验证五次,获得了相当不错的结果(准确率为 0.933)


7.训练和评估


我们还将定义一个函数来对训练集进行训练并评估测试集上的表现。

>>> from sklearn import metrics
>>>
>>> def train_and_evaluate(clf, X_train, X_test, y_train, y_test):
>>>     
>>>     clf.fit(X_train, y_train)
>>>     
>>>     print "Accuracy on training set:"
>>>     print clf.score(X_train, y_train)
>>>     print "Accuracy on testing set:"
>>>     print clf.score(X_test, y_test)
>>>     
>>>     y_pred = clf.predict(X_test)
>>>     
>>>     print "Classification Report:"
>>>     print metrics.classification_report(y_test, y_pred)
>>>     print "Confusion Matrix:"
>>>     print metrics.confusion_matrix(y_test, y_pred)
>>> train_and_evaluate(svc_1, X_train, X_test, y_train, y_test)
Accuracy on training set:
1.0
Accuracy on testing set:
0.99


8.戴眼镜的人脸


>>> # the index ranges of images of people with glasses
>>> glasses = [
   (10, 19), (30, 32), (37, 38), (50, 59), (63, 64),
   (69, 69), (120, 121), (124, 129), (130, 139), (160, 161),
   (164, 169), (180, 182), (185, 185), (189, 189), (190, 192),
   (194, 194), (196, 199), (260, 269), (270, 279), (300, 309),
   (330, 339), (358, 359), (360, 369)
]

1标记带有眼镜的人脸,而0用于没有眼镜的人脸:

>>> def create_target(segments):
>>>     # create a new y array of target size initialized with 
     zeros
>>>     y = np.zeros(faces.target.shape[0])
>>>     # put 1 in the specified segments
>>>     for (start, end) in segments:
>>>         y[start:end + 1] = 1
>>>     return y
>>> target_glasses = create_target(glasses)

训练/测试

>>> X_train, X_test, y_train, y_test = train_test_split(
        faces.data, target_glasses, test_size=0.25, random_state=0)
>>> svc_2 = SVC(kernel='linear')
>>> evaluate_cross_validation(svc_2, X_train, y_train, 5)
[ 0.98333333  0.98333333  0.93333333  0.96666667  0.96666667]
Mean score: 0.967 (+/-0.009)

交叉验证获得 0.967 的平均准确率。

>>> train_and_evaluate(svc_2, X_train, X_test, y_train, y_test)
Accuracy on training set:
1.0
Accuracy on testing set:
0.99
Classification Report:
             precision    recall  f1-score   support
          0       1.00      0.99      0.99        67
          1       0.97      1.00      0.99        33
avg / total       0.99      0.99      0.99       100
Confusion Matrix:
[[66  1]
 [ 0 33]]
>>> X_test = faces.data[30:40]
>>> y_test = target_glasses[30:40]
>>> print y_test.shape[0]
10
>>> select = np.ones(target_glasses.shape[0])
>>> select[30:40] = 0
>>> X_train = faces.data[select == 1]
>>> y_train = target_glasses[select == 1]
>>> print y_train.shape[0]
390
>>> svc_3 = SVC(kernel='linear')
>>> train_and_evaluate(svc_3, X_train, X_test, y_train, y_test)
Accuracy on training set:
1.0
Accuracy on testing set:
0.9
Classification Report:
             precision    recall  f1-score   support
          0       0.83      1.00      0.91         5
          1       1.00      0.80      0.89         5
avg / total       0.92      0.90      0.90        10
Confusion Matrix:
[[5 0]
 [1 4]]

10 张图片中,只有一个错误, 仍然是非常好的结果

>>> y_pred = svc_3.predict(X_test)
>>> eval_faces = [np.reshape(a, (64, 64)) for a in X_eval]

然后使用我们的print_faces函数绘图:

>>> print_faces(eval_faces, y_pred, 10)

image.png

上图中的图像编号8带有眼镜,并且被分类为无眼镜。如果我们看一下这个例子,我们可以看到它与其他带眼镜的图像不同(眼镜的边框看不清楚,人闭着眼睛),这可能就是它误判的原因。

可以尝试使用多项式或 RBF 核。此外,Cgamma参数可能会影响结果。有关参数及其值的说明,请参阅 scikit-learn 文档。


目录
相关文章
|
人工智能 自然语言处理 测试技术
Claude 3非常厉害,但是国内用不上怎么办?
【2月更文挑战第16天】Claude 3非常厉害,但是国内用不上怎么办?
4333 1
Claude 3非常厉害,但是国内用不上怎么办?
|
机器学习/深度学习 数据可视化 算法
深度学习之梯度下降参数可视化
深度学习之梯度下降参数可视化
|
Java 开发者 Python
Python中的self是什么你知道嘛?
在Python类中规定,函数的第一个参数是实例对象本身,并且约定俗成,把其名字写为self。其作用相当于java中的this,表示当前类的对象,可以调用当前类中的属性和方法。
|
7月前
|
程序员
什么是后门
后门( Back Door )是指一种绕过安全性控制而获取对程序或系统访问权的方法。在软件的开发阶段,程序员常会在软件内创建后门以便可以修改程序中的缺陷。如果后门被其他人知道,或是在发布软件之前没有删除,那么它就成了安全隐患。
|
机器学习/深度学习 自动驾驶 算法
图像识别中的scikit-learn:从像素到分类
【4月更文挑战第17天】本文介绍了如何使用Python的scikit-learn进行图像识别,包括图像预处理、特征提取(如HOG、SIFT)和分类器训练(如SVM、决策树)。通过一个示例展示了从像素数据到图像分类的完整流程,强调了预处理和特征提取的重要性。虽然scikit-learn在图像识别中有应用,但随着深度学习的发展,卷积神经网络在该领域展现出更强的性能,暗示了未来结合深度学习与scikit-learn的研究趋势。
|
10月前
|
机器学习/深度学习 人工智能 测试技术
AI计算机视觉笔记二十五:ResNet50训练部署教程
该项目旨在训练ResNet50模型并将其部署到RK3568开发板上。首先介绍了ResNet50网络,该网络由何恺明等人于2015年提出,解决了传统卷积神经网络中的退化问题。项目使用车辆分类数据集进行训练,并提供了数据集下载链接。环境搭建部分详细描述了虚拟环境的创建和所需库的安装。训练过程中,通过`train.py`脚本进行了15轮训练,并可视化了训练和测试结果。最后,项目提供了将模型转换为ONNX和PT格式的方法,以便在RK3568上部署。
|
11月前
|
搜索推荐 Java 开发者
Java异常处理新高度:自定义异常,打造个性化的错误管理体系!
Java异常处理新高度:自定义异常,打造个性化的错误管理体系!
169 1
|
12月前
|
监控 数据可视化 搜索推荐
ERP系统中的财务预测与预算编制解析
【7月更文挑战第25天】 ERP系统中的财务预测与预算编制解析
467 0
|
Java 测试技术
员工管理系统
员工管理系统
392 2
|
存储 数据可视化 数据挖掘
利用Matplotlib实现地图可视化
【4月更文挑战第17天】使用Matplotlib结合GeoPandas和Basemap在Python中实现地图可视化。首先安装Matplotlib、GeoPandas和Basemap库。读取GeoJSON或Shapefile格式的地理数据,然后使用Basemap创建地图底图,绘制海岸线、国家边界和大陆湖泊。将GeoDataFrame数据转换后叠加到地图上,自定义地图样式和添加图例。利用颜色映射展示与地理位置相关的数值数据,创建颜色条。此外,可通过Folium实现交互式地图。通过学习和实践,提升地图可视化的技能。