代碼如下
from tkinter import *
from tkinter.tix import Tk, Control, ComboBox # 升級的控制元件組包
from tkinter.messagebox import showinfo, showwarning, showerror # 各種型別的提示框
from tkinter import filedialog
from PIL import Image, ImageTk
from tkinter.messagebox import *
import os
import operator
from numpy import *
import cv2
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.externals import joblib
# 演算法部分
# 加載資料集
def loadDataSet(k): # k代表在10張圖片中選擇幾張作為訓練集
dataSetDir = 'E:\matlab\renlian'
# 顯示檔案夾內容
choose = random.permutation(10) + 1 # 隨機排序1-10 (0-9)+1
train_face = zeros((40 * k, 112 * 92))
train_face_number = zeros(40 * k)
test_face = zeros((40 * (10 - k), 112 * 92))
test_face_number = zeros(40 * (10 - k))
for i in range(40): # 40個人
people_num = i + 1
for j in range(10): # 每個人有10個不同的臉
if j < k: # 測驗集
filename = dataSetDir + '/' + str(people_num) + '/0' + str(choose[j]) + '.png'
img = img2vector(filename)
train_face[i * k + j, :] = img
train_face_number[i * k + j] = people_num
else:
filename = dataSetDir + '/' + str(people_num) + '/0' + str(choose[j]) + '.png'
img = img2vector(filename)
test_face[i * (10 - k) + (j - k), :] = img
test_face_number[i * (10 - k) + (j - k)] = people_num
return train_face, train_face_number, test_face, test_face_number
# 將圖片轉換成矩陣
def img2vector(filename):
img = cv2.imread(filename, 0) # 讀入灰度值
rows, cols = img.shape
imgVector = zeros((1, rows * cols))
imgVector = reshape(img, (1, rows * cols)) # 將2維轉成1維
return imgVector
def facefind():
# 獲取訓練集
train_face, train_face_number, test_face, test_face_number = loadDataSet(3)
# PCA訓練訓練集,用pca將資料降到30維
pca = PCA(n_components=30).fit(train_face)
# 回傳測驗集和訓練集降維后的資料集
x_train_pca = pca.transform(train_face)
x_test_pca = pca.transform(test_face)
# 邏輯回歸訓練
classirfier = LogisticRegression()
lr = classirfier.fit(x_train_pca, train_face_number)
# 保存模型
joblib.dump(lr, 'lr.model')
# 計算精確度和召回率
accuray = classirfier.score(x_test_pca, test_face_number)
recall = accuray * 0.7
return accuray, recall, pca
# 界面部分
def choosepic(): # 選擇圖片函式
file_path = filedialog.askopenfilename() # 加載檔案
path.set(file_path)
img_open = Image.open(file.get())
img = ImageTk.PhotoImage(img_open)
pic_label.config(image=img)
pic_label.image = img
string = str(file.get())
# 預測的人
predict = img2vector(string)
# 加載模型
LR = joblib.load('lr.model')
predict_people = LR.predict(pca.transform(predict))
string1 = str("編號:%s 精確度:%f 召回率:%f" % (predict_people, accuray, recall))
showinfo(title='影像分析', message=string1)
# 初始化Tk()
accuray, recall, pca = facefind()
root = Tk() # root便是你布局的根節點了,以后的布局都在它之上
root.geometry('260x140')
root.title("人臉識別系統") # 設定視窗標題
root.resizable(width=False, height=False) # 設定視窗是否可變
root.tk.eval('package require Tix') # 引入升級包,這樣才能使用升級的組合控制元件
path = StringVar() # 跟蹤變數的值的變化
Button(root, text='選擇圖片', command=choosepic, width=1, height=1).grid(row=1, column=1, sticky=W + E + N + S, padx=40,
pady=20) # command指定其回呼函式
file = Entry(root, state='readonly', text=path)
file.grid(row=0, column=1, sticky=W + E + S + N, padx=6, pady=20) # 用作文本輸入用
pic_label = Label(root, text='圖片', padx=30, pady=10)
pic_label.grid(row=0, column=2, rowspan=4, sticky=W + E + N + S)
root.mainloop()
報錯
Traceback (most recent call last):
File "C:/Users/PLAY/PycharmProjects/untitled2/test/__init__.py", line 12, in <module>
from sklearn.decomposition import PCA
File "C:\Users\PLAY\PycharmProjects\untitled2\venv\lib\site-packages\sklearn\__init__.py", line 82, in <module>
from .base import clone
File "C:\Users\PLAY\PycharmProjects\untitled2\venv\lib\site-packages\sklearn\base.py", line 20, in <module>
from .utils import _IS_32BIT
File "C:\Users\PLAY\PycharmProjects\untitled2\venv\lib\site-packages\sklearn\utils\__init__.py", line 20, in <module>
from scipy.sparse import issparse
File "C:\Users\PLAY\PycharmProjects\untitled2\venv\lib\site-packages\scipy\__init__.py", line 156, in <module>
from . import fft
File "C:\Users\PLAY\PycharmProjects\untitled2\venv\lib\site-packages\scipy\fft\__init__.py", line 76, in <module>
from ._basic import (
File "C:\Users\PLAY\PycharmProjects\untitled2\venv\lib\site-packages\scipy\fft\_basic.py", line 1, in <module>
from scipy._lib.uarray import generate_multimethod, Dispatchable
File "C:\Users\PLAY\PycharmProjects\untitled2\venv\lib\site-packages\scipy\_lib\uarray.py", line 27, in <module>
from ._uarray import *
File "C:\Users\PLAY\PycharmProjects\untitled2\venv\lib\site-packages\scipy\_lib\_uarray\__init__.py", line 114, in <module>
from ._backend import *
File "C:\Users\PLAY\PycharmProjects\untitled2\venv\lib\site-packages\scipy\_lib\_uarray\_backend.py", line 1, in <module>
from typing import (
ImportError: cannot import name 'Type'
倒騰半天不知道哪的問題,求大神出手相助
uj5u.com熱心網友回復:
python用3.6以上轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/57329.html
下一篇:word2vec學習總結
