当前位置: 代码迷 >> 综合 >> day07-----机器视觉
  详细解决方案

day07-----机器视觉

热度:26   发布时间:2023-09-19 10:42:48.0

文章目录

  • 补:交叉验证+参数调优(网格搜索)
  • 1.opencv的核心技术
  • 2.opencv的c++开发
  • 3.opencv的python开发
    • 3.1 特征点检测的使用
    • 3.2 特征描述与特征匹配
    • 3.3 人脸识别
  • 4.人脸识别+交叉验证

补:交叉验证+参数调优(网格搜索)

  • 样本数据集划分为:训练集、测试集
    • 划分方案:
      • 直接分
      • n-折
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.svm import SVC
#加载数据集
data,target=datasets.load_iris(return_X_y=True)
print(data.shape)#交叉验证:训练集+测试集
#test_size=0.2,测试集是原数据规模的0.2
data_train,data_test,target_train,target_test=train_test_split(data,target,test_size=0.2)
print(data_train.shape)#网格搜索:调用机器学习算法完成训练(常规训练+网格搜索训练)
#classifier=SVC(kernel='rbf',C=1000,gamma=0.1) #这个算法参数是固定的
#参数字典
dic_p={
    'C':[1,10,100,10000],'gamma':[0.01,0.1,1],
}
#这个是从参数字典里自动找到最佳参数
classifier=GridSearchCV(SVC(kernel='rbf'),dic_p)
classifier.fit(data_train,target_train)#结果
pre=classifier.predict(data_test)
#测试集一共三十个,打印正确预测的个数
print((pre==target_test).sum())
(150, 4)
(120, 4)
30

1.opencv的核心技术

  • 特征检测
    • feature2D
  • 目标检测
    • objectDetect
  • 分类识别
    • 人脸face

2.opencv的c++开发


3.opencv的python开发

3.1 特征点检测的使用

import cv2
import matplotlib.pyplot as plt#准备一张图像
img_src=cv2.imread('timg.jpg')
img_src=cv2.cvtColor(img_src,cv2.COLOR_BGR2RGB)#特征检测器,找出图像特征(关键点)
orb=cv2.ORB_create(10000)#10000个关键点
keypoints=orb.detect(img_src)#绘制带关键点的图像
img_out=cv2.drawKeypoints(img_src,keypoints,None,(255,0,0))
plt.imshow(img_out)

day07-----机器视觉

3.2 特征描述与特征匹配

import cv2
import matplotlib.pyplot as plt#加载两幅图像
img1=cv2.imread('timg.jpg')
img2=cv2.imread('timg2.jpg')#找出特征
orb=cv2.ORB_create(500)
kp1=orb.detect(img1)
kp2=orb.detect(img2)kp1,desc1=orb.compute(img1,kp1)
kp2,desc2=orb.compute(img2,kp2)#匹配器
bf=cv2.BFMatcher(cv2.NORM_HAMMING,crossCheck=True)
matches=bf.match(desc1,desc2)
img_out=cv2.drawMatches(img1,kp1,img2,kp2,matches,None)
plt.imshow(img_out)

day07-----机器视觉

3.3 人脸识别

import numpy as np
#机器视觉方面使用opencv
import cv2  
from cv2 import face# 接下来读取图像到矩阵,一共有四百张图
# 定义常量#每个人有十张自己的图像
ONE_PERSON_FACE_NUM = 10
#一共有40个人
PERSON_NUM = 40
#图像数量自然是40*10
SAMPLE_NUM = ONE_PERSON_FACE_NUM * PERSON_NUM
#每张图像高112,宽92
IMG_W = 92 
IMG_H = 112#定义存放图像信心的矩阵
#因为有400张图,因此行是SAMPLE_NUM,列是每张图的信息,最后效果是一行代表一张图
data_faces  = np.zeros(shape=(SAMPLE_NUM, IMG_W * IMG_H), dtype=np.int32) 
#一行代表一个图片的类别,因此只需要一列
label_faces = np.zeros(shape=(SAMPLE_NUM, 1), dtype=np.int32)#把图片信息复制到矩阵中
idx = 0   # 数据集的位置,即在哪个文件夹
for i in range(1, PERSON_NUM + 1):  # 40个人的目录,此处是使角标从1到PERSON_NUM,因为range不包含PERSON_NUM,所以得+1for j in range(1, ONE_PERSON_FACE_NUM + 1):path_ = "./att_faces/s{i}/{j}.pgm".format(i=i,j=j)#用到的文件url:https://download.csdn.net/download/qq_34405401/12208225img_ = cv2.imread(path_)#因为读取的是三通道图像,为了大大减少计算量,转化为灰度图像(因为做图像识别,颜色没有太大价值,所以可转灰度)gray_ = cv2.cvtColor(img_, cv2.COLOR_BGR2GRAY)data_faces[idx, :] = gray_.reshape(IMG_W * IMG_H)label_faces[idx, :] = iidx += 1#人脸分类算法
#model=face.EigenFaceRecognizer_create()#这个是基于特征脸的算法
model=face.FisherFaceRecognizer_create()#基于fisher判别式的算法
#训练模型
model.train(data_faces,label_faces)
#用第一张图看看模型预测效果
label,conf=model.predict(data_faces[0]) #label是图的类型即标签,conf是执行度,执行度越小越好
print(label)
print(conf)
1
0.0

4.人脸识别+交叉验证

import numpy as np
#机器视觉方面使用opencv
import cv2  
from cv2 import face
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.metrics import classification_report# 接下来读取图像到矩阵,一共有四百张图
# 定义常量#每个人有十张自己的图像
ONE_PERSON_FACE_NUM = 10
#一共有40个人
PERSON_NUM = 40
#图像数量自然是40*10
SAMPLE_NUM = ONE_PERSON_FACE_NUM * PERSON_NUM
#每张图像高112,宽92
IMG_W = 92 
IMG_H = 112#定义存放图像信心的矩阵
#因为有400张图,因此行是SAMPLE_NUM,列是每张图的信息,最后效果是一行代表一张图
data_faces  = np.zeros(shape=(SAMPLE_NUM, IMG_W * IMG_H), dtype=np.int32) 
#一行代表一个图片的类别,因此只需要一列
label_faces = np.zeros(shape=(SAMPLE_NUM, 1), dtype=np.int32)#把图片信息复制到矩阵中
idx = 0   # 数据集的位置,即在哪个文件夹
for i in range(1, PERSON_NUM + 1):  # 40个人的目录,此处是使角标从1到PERSON_NUM,因为range不包含PERSON_NUM,所以得+1for j in range(1, ONE_PERSON_FACE_NUM + 1):path_ = "./att_faces/s{i}/{j}.pgm".format(i=i,j=j)img_ = cv2.imread(path_)#因为读取的是三通道图像,为了大大减少计算量,转化为灰度图像(因为做图像识别,颜色没有太大价值,所以可转灰度)gray_ = cv2.cvtColor(img_, cv2.COLOR_BGR2GRAY)data_faces[idx, :] = gray_.reshape(IMG_W * IMG_H)label_faces[idx, :] = iidx += 1#处理数据,将数据分离成训练数据和测试数据
#test_size=0.2,测试集是原数据规模的0.2
data_faces_train,data_faces_test,label_faces_train,label_faces_test=train_test_split(data_faces,label_faces,test_size=0.2)
#因为一共400张图,所以输出的test的行是80行,即代表有80个测试数据
print(data_faces_test.shape)#人脸分类算法
#model=face.EigenFaceRecognizer_create()#这个是基于特征脸的算法
model=face.FisherFaceRecognizer_create()#基于fisher判别式的算法
#使用训练数据训练模型
model.train(data_faces_train,label_faces_train)#用测试集第一张图看看模型预测效果
# label,conf=model.predict(data_faces_test[0]) #label是图的类型即标签,conf是执行度,执行度越小越好
# print(label_faces_test[79])
# print(label)
# print(conf)#pre_labels存放所有测试数据的测试标签
pre_labels=[]
for i in range(data_faces_test.shape[0]):val,conf=model.predict(data_faces_test[i])pre_labels.append(val)#用real_labels保存label_faces_test的一维数据形式
real_labels=label_faces_test.reshape(1, -1)
print("pre_labels:",pre_labels)
print("real_labels:",real_labels)
report = classification_report(pre_labels, label_faces_test[:,0])
print(report)
(80, 10304)
pre_labels: [39, 15, 28, 25, 9, 35, 10, 4, 11, 20, 37, 26, 34, 6, 16, 37, 22, 12, 12, 39, 10, 23, 15, 2, 3, 29, 13, 24, 11, 31, 36, 39, 5, 26, 7, 8, 37, 36, 33, 35, 9, 16, 23, 38, 31, 9, 30, 20, 6, 19, 24, 5, 17, 24, 21, 8, 23, 9, 18, 7, 4, 9, 26, 27, 40, 31, 27, 19, 20, 12, 40, 15, 17, 36, 28, 36, 24, 40, 35, 39]
real_labels: [[39 15 28 25  9 35 10  4 11 33 37 26 34  6 16 37 22 12 12 39 10 23 15  23 29 13 24 11 31 36 39  5 26  7 19 37 36 33 35  9 16 23 38 31  9 33 206 19 24  5 17 24 21  8 23  9 18  7  4  9 26 27 40 31 27 19 20 12 35 1517 36 28 36 24 40 35 39]]precision    recall  f1-score   support2       1.00      1.00      1.00         13       1.00      1.00      1.00         14       1.00      1.00      1.00         25       1.00      1.00      1.00         26       1.00      1.00      1.00         27       1.00      1.00      1.00         28       1.00      0.50      0.67         29       1.00      1.00      1.00         510       1.00      1.00      1.00         211       1.00      1.00      1.00         212       1.00      1.00      1.00         313       1.00      1.00      1.00         115       1.00      1.00      1.00         316       1.00      1.00      1.00         217       1.00      1.00      1.00         218       1.00      1.00      1.00         119       0.67      1.00      0.80         220       1.00      0.67      0.80         321       1.00      1.00      1.00         122       1.00      1.00      1.00         123       1.00      1.00      1.00         324       1.00      1.00      1.00         425       1.00      1.00      1.00         126       1.00      1.00      1.00         327       1.00      1.00      1.00         228       1.00      1.00      1.00         229       1.00      1.00      1.00         130       0.00      0.00      0.00         131       1.00      1.00      1.00         333       0.33      1.00      0.50         134       1.00      1.00      1.00         135       0.75      1.00      0.86         336       1.00      1.00      1.00         437       1.00      1.00      1.00         338       1.00      1.00      1.00         139       1.00      1.00      1.00         440       1.00      0.67      0.80         3accuracy                           0.95        80macro avg       0.94      0.94      0.93        80
weighted avg       0.96      0.95      0.95        80