機器學習之掌紋識別
- 一、掌紋特征提取
- 1.1 Gabor濾波器
- 二、掌紋資訊分類
- 2.1 基于PCA+SVM的掌紋資訊分類
- 2.2 基于PCA+KNN的掌紋資訊分類
- 分類結果總結
- 三、掌紋資訊匹配
- 3.1掌紋資訊相似度匹配
一、掌紋特征提取
1.1 Gabor濾波器
Gabor濾波器是一個或一組Gabor函式離散形式,在計算機視覺中常用到Gabor濾波器來提取紋理特征,說白了,就是一個加了高斯窗的傅里葉變換,
Gabor濾波器(專注于紋理特征的一種濾波器)
鏈接: Gabor特征的詳細介紹(博主推薦)
下面時我們專案的代碼部分:
Gabor特征采集部分如下(示例):
1.建立Gabor濾波器
def build_filters():
gabor_filters = []
gabor_size = [6,9,12,15,18,21] #定義gabor尺度,6個
lamda = np.pi/1.0 #波長
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()
filters.append(kern)
print("np.arange(0,np.pi,np.pi / 4)",np.arange(0,np.pi,np.pi / 4))
print("np.pi",np.pi)
print("len",len(gabor_filters))
return gabor_filters
2.Gabor特征提取
def getGabor(img,filters):
print('len(filters)',len(filters))
res = [] #濾波結果
for i in range(len(filters)):
res1 = scan_win(img,filters[i])
res.append(np.asarray(res1))
# pb.figure(2)
for temp in range(len(res)):
pb.subplot(4,6,temp+1)
pb.imshow(res[temp],cmap='gray')
# pb.show()
return res
3.整合特征匯入txt檔案
def make_feature(filters):
pic_list = []
#將所有圖片的特征向量進行堆疊,最后得到(500,16384)大小的特征矩陣
stack_metrix = np.array([[0]])
count=0
for i in range(0, 100):
# 用于存放當前類別標簽(用外層回圈i的值來表示)
pic_list.append(i)
class_matrix = np.array(pic_list, ndmin=2)
for j in range(1, 6):
path = 'ROI/p_{}_{}.bmp'.format(i, j)
x = cv2.imread(path)
data=getGabor(x,filters)
data = np.asarray(data)
data=normalization(data)
data = np.reshape(data, (1, -1))
one_data = np.column_stack((data, class_matrix))
print(one_data)
count=count+1
print('第{}次'.format(count))
# y壓縮標簽串列添加到每張圖片特征矩陣的最后一維即為扁平化處理
# 第一次不堆疊
if i == 0 and j == 1:
stack_metrix = one_data
continue
stack_metrix = np.row_stack((stack_metrix, one_data))
pic_list.pop()
np.savetxt('(new)feature.txt', stack_metrix)
二、掌紋資訊分類
2.1 基于PCA+SVM的掌紋資訊分類
鏈接: SVM(支持向量機)最佳理解.
代碼如下(示例):
def train_model_pca_svm():
"""
1.PCA+SVM進行分類
2.PCA降維至20維
:return:
"""
data, target = load_data()
x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.3, random_state=13)
# 利用PCA將特征降至20維,測驗集上的預測精度為: 0.9487179487179487
# 利用PCA將特征降至50維,測驗集上的預測精度為: 0.9572649572649573
# 利用PCA將特征降至100維,測驗集上的預測精度為: 0.9658119658119658
pca = PCA(n_components=100)
x_train = pca.fit_transform(x_train)
svm_clf = SVC(C=100)
svm_clf.fit(x_train, y_train)
# 利用在訓練集上進行降維的PCA對測驗資料進行降維
# 保證轉換矩陣相同
x_test_process = pca.transform(x_test)
y_predict = svm_clf.predict(x_test_process)
score = svm_clf.score(x_test_process, y_test)
print('測驗集上的預測精度為:{}'.format(score))
print('\n')
print('測驗集前10個樣本的類別為:', y_test[:10].tolist())
print('預測的類別為:', y_predict[:10])
print('\n')
print(classification_report(y_test, y_predict))
2.2 基于PCA+KNN的掌紋資訊分類
鏈接: KNN(K鄰近)最佳理解.
代碼如下(示例):
def train_model_pca_knn(i):
"""
1.PCA+KNN進行分類
2.PCA降維至20維
:return:
"""
data, target = load_data()
x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.3, random_state=13)
# 利用PCA將特征降至100維,測驗集上的預測精度為: 0.9658119658119658
pca = PCA(n_components=20)
x_train = pca.fit_transform(x_train)
my_model=KNeighborsClassifier(algorithm='kd_tree',p=10,n_neighbors=i)
my_model.fit(x_train, y_train)
#k為1,測驗集上的預測精度為:0.9316239316239316
# 利用在訓練集上進行降維的PCA對測驗資料進行降維
# 保證轉換矩陣相同
x_test_process = pca.transform(x_test)
y_predict = my_model.predict(x_test_process)
score = my_model.score(x_test_process, y_test)
print('測驗集上的預測精度為:{}'.format(score))
print('\n')
print('測驗集前10個樣本的類別為:', y_test[:10].tolist())
print('預測的類別為:', y_predict[:10])
print('\n')
print(classification_report(y_test, y_predict))
分類結果總結
對于該類掌紋分類效果上看,分類效果可見SVM優于KNN,由此可得出結論,SVM在該類圖片資料集上的分類效果較好,
三、掌紋資訊匹配
3.1掌紋資訊相似度匹配
原理:獲取特征檔案進行扁平化處理之后對特征集的資料逐一匹配,
def compare_pic(feature1,feature2):
unsim = 0
x1 = np.array(feature1).flatten() #將特征做扁平化處理
x2 = np.array(feature2).flatten()
for pic1,pic1 in zip(x1,x2):
if pic1 != pic1:
unsim += 1
print(unsim)
sim = 1 - unsim/len(x1)
print('相似度',sim)
return sim
之后對圖片特征逐個遍歷檢索即可,
for i in range(0, 100):
path = 'ROI/p_{}_{}.bmp'.format(i,1)
x = cv2.imread(path)
data=Gg.getGabor(x,filters)
simial_score.append(int(compare_pic(data,feature)*1000))
count=count+1
print('第{}次檢索'.format(count))
class_score=simial_score.index(max(simial_score))
又是熬夜寫文章的一晚,
希望可以幫助到有需要的朋友,我們一起學習,一起進步!!!
如果愿意和我交流技術的朋友,您將獲得一下交流方式
QQ:1093279164
(純粹交流技術!謝謝!也可以一起打比賽!!!)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/259518.html
標籤:其他
上一篇:IM的掃碼登錄功能如何實作?
