import os
import cv2
import numpy as np
from sklearn.decomposition import PCA
from sklearn import svm
from sklearn.metrics import accuracy_score
from skimage import feature
from tqdm import tqdm
from sklearn.preprocessing import MinMaxScaler,StandardScaler
from sklearn.cluster import KMeans
from sklearn.model_selection import GridSearchCV
from joblib import dump
from sklearn.decomposition import IncrementalPCA
def get_img(path):
img_list=[]
label_list=[]
for filename in os.listdir(path):
label=int(filename.split('_')[1])
id=filename.split('_')[2].split('.')[0]
img=cv2.imread(os.path.join(path, filename))
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_list.append(img)
label_list.append(label)
return np.array(img_list),np.array(label_list)
def apply_gabor_filter(image, kernel):
filtered_image = cv2.filter2D(image, cv2.CV_8UC3, kernel)
return filtered_image
def Gabor(image):
gabor_filters = []
# 读取图像
# image = cv2.cvtColor(rgb_image, cv2.COLOR_BGR2GRAY)
# 定义Gabor滤波器参数
gabor_size = [6,9,12,15,18,21] # 滤波器大小
sigma = 4.0 # 高斯核标准差
lamda = np.pi/1.0 #波长
gamma = 0.5 # 空间纵横比
# 创建Gabor滤波器
# kernel = cv2.getGaborKernel(ksize, sigma, theta, lambd, gamma)
for theta in np.arange(0,np.pi,np.pi / 4): #定义gabor的4个方向
for i in range(6):
kern = cv2.getGaborKernel((gabor_size[i],gabor_size[i]),1.0,theta,lamda,0.5,0,ktype=cv2.CV_32F)
kern /= 1.2*kern.sum()
gabor_filters.append(kern)
# 应用Gabor滤波器
res = [] #滤波结果
for i in range(len(gabor_filters)):
res1 = apply_gabor_filter(image,gabor_filters[i])
res.append(np.asarray(res1))
return np.array(res)
def feature_view(sobelx,sobely,lbp,res):
# 先将各特征进行展平,再进行归一化,然后拼接。
# 创建MinMaxScaler对象
scaler = MinMaxScaler()
r = res.reshape(-1, 1)
r=scaler.fit_transform(r)
r=np.transpose(r,(1,0))
s = np.stack((sobelx, sobely)).reshape(-1, 1)
s=scaler.fit_transform(s)
s=np.transpose(s,(1,0))
l=lbp.reshape(-1, 1)
l=scaler.fit_transform(l)
l=np.transpose(l,(1,0))
# s=scaler.fit_transform(s)
# r=scaler.fit_transform(r)
# l=scaler.fit_transform(l)
#水平拼接
result_feature = np.hstack((r,s,l))
return result_feature
def preprocessing(image):
# 直方图均衡化
image = cv2.equalizeHist(image)
# 应用Sobel边缘检测
sobelx = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)#卷积核大小
sobely = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)
# 应用LBP特征提取
radius = 1 # LBP算法中范围半径的取值
n_points = 8 * radius # 领域像素点数
lbp = feature.local_binary_pattern(image, n_points, radius, method="uniform")
# Gabor滤波器
res=Gabor(image)
result_feature=feature_view(sobelx,sobely,lbp,res)
return result_feature
def get_sift(image):
# 直方图均衡化
image = cv2.equalizeHist(image)
# 创建SIFT对象
sift = cv2.xfeatures2d.SIFT_create()
# 检测关键点和计算描述符
keypoints, descriptors = sift.detectAndCompute(image, None)
# 在图像上绘制关键点
return descriptors
def BoW_sift(X_train,k=100):
descriptors_list=[]
for img in X_train:
descriptors=get_sift(img)
descriptors_list.append(descriptors)
# 将所有图像的SIFT特征放在一起
all_sift_features=np.vstack(descriptors_list)
# 使用K-means聚类创建视觉词典
# k = 100 # 假设我们想要的视觉单词数量是100
kmeans = KMeans(n_clusters=k)
kmeans.fit(all_sift_features)
# 对每张图像,计算每个视觉单词的出现次数
image_features = []
for sift_features in descriptors_list:
labels = kmeans.predict(sift_features)
hist, _ = np.histogram(labels, bins=np.arange(k+1))
image_features.append(hist)
return image_features,kmeans
def test_BoW_sift(X_test,kmeans,k=100):
descriptors_list = []
for img in X_test:
descriptors = get_sift(img)
descriptors_list.append(descriptors)
image_features = []
for sift_features in descriptors_list:
labels = kmeans.predict(sift_features)
hist, _ = np.histogram(labels, bins=np.arange(k + 1))
image_features.append(hist)
return image_features
def first_feature(X_train):
# 初始化一个空的列表来保存所有的特征向量
features = []
# 循环处理每一张图片
for image in tqdm(X_train):
# 对图片进行预处理并获取特征向量
result_feature = preprocessing(image)
# 将特征向量添加到列表中
features.append(result_feature)
# 使用np.concatenate()将所有的特征向量拼接在一起
first_features = np.concatenate(features, axis=0)
return first_features
def temp_feature(X_train):
# 初始化一个空的数组来保存所有的特征向量
first_features = np.array([])
# 循环处理每一张图片
for image in tqdm(X_train):
# 对图片进行预处理并获取特征向量
result_feature = preprocessing(image)
print(result_feature.shape)
# 将特征向量添加到数组中
first_features = np.concatenate((first_features, result_feature), axis=0)
# 保存特征向量到硬盘
np.save('temp_data/first_features.npy', first_features)
def PCA_trainfeature(X_train,n_components=1000):
first_features=first_feature(X_train)
# 拟合PCA模型
# n_components = 1000
pca = PCA(n_components=n_components)
# 对数据进行降维
X_train_pca = pca.fit_transform(first_features)
sift_features,kmeans=BoW_sift(X_train)
# 使用dstack进行第三维度上的拼接
sift_array = np.dstack(sift_features)[0]
scaler = MinMaxScaler()
scaler_sift_array=scaler.fit_transform(sift_array)
scaler_sift_array=np.transpose(scaler_sift_array,(1,0))
trainfeature=np.concatenate((X_train_pca,scaler_sift_array), axis=1)
return trainfeature,pca,kmeans
def get_testfeature(X_test,pca,kmeans):
first_features=first_feature(X_test)
# 使用相同的PCA对象对测试数据进行降维
X_test_pca = pca.transform(first_features)
sift_features=test_BoW_sift(X_test,kmeans)
# 使用dstack进行第三维度上的拼接
sift_array = np.dstack(sift_features)[0]
scaler = MinMaxScaler()
scaler_sift_array=scaler.fit_transform(sift_array)
scaler_sift_array=np.transpose(scaler_sift_array,(1,0))
testfeature=np.concatenate((X_test_pca,scaler_sift_array), axis=1)
return testfeature
def batch_get_feature(first_features,pca,kmeans,X_test):
X_test_pca = pca.transform(first_features)
sift_features=test_BoW_sift(X_test,kmeans)
# 使用dstack进行第三维度上的拼接
sift_array = np.dstack(sift_features)[0]
scaler = MinMaxScaler()
scaler_sift_array=scaler.fit_transform(sift_array)
scaler_sift_array=np.transpose(scaler_sift_array,(1,0))
testfeature=np.concatenate((X_test_pca,scaler_sift_array), axis=1)
return testfeature
def batch_feature(X_train,pca,kmeans,batch):
# 初始化一个空的数组来保存所有的特征向量
# result_features = np.empty((0, 442368))
pre_features = np.empty((0, 500))
# 初始化一个空的列表来保存每一批次的特征向量
batch_features = []
image_list=[]
# 循环处理每一张图片
for i,image in enumerate(tqdm(X_train)):
# 对图片进行预处理并获取特征向量
image_feature = preprocessing(image)
image_list.append(image)
# 将特征向量添加到列表中
batch_features.append(image_feature)
# 每迭代batch次,将特征向量添加到数组中,并清空列表
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
机器学习实现掌纹识别,对数据进行处理,使用PCA拟合数据并进行降维。对图像进行处理,特征提取阶段尝试Gabor滤波器和灰度共生矩阵,使用SVM和KNN分类,增加分批处理,大数据正确率达到0.996。增加多进程匹配,进行时间测试,完善评价指标,ipynb文件使用jupyter打开。
资源推荐
资源详情
资源评论
收起资源包目录
机器学习掌纹识别.zip (18个子文件)
machine-learning-master
大数据集中的特征提取.ipynb 145KB
feature_extraction.py 13KB
滤波器PCA.ipynb 205KB
构建CNN分类掌纹.ipynb 7KB
test.ipynb 21KB
分类器融合.ipynb 53KB
两个任务的对比.ipynb 24KB
多进程.py 10KB
多进程的时间对比.py 8KB
LICENSE 34KB
PCA.py 378B
海明距离.ipynb 106KB
分类与认证.ipynb 245KB
结果评估.ipynb 70KB
预训练模型CNN.ipynb 10KB
.gitignore 2KB
图像预处理.ipynb 7KB
classify.py 745B
共 18 条
- 1
资源评论
python慕遥
- 粉丝: 2358
- 资源: 243
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功