基于Mysql和OpenCV的人臉識(shí)別系統(tǒng)(源碼和部署教程)

1.研究背景與意義

隨著計(jì)算機(jī)科學(xué)和人工智能的快速發(fā)展跨新,人臉識(shí)別技術(shù)成為了一個(gè)備受關(guān)注的研究領(lǐng)域十性。人臉識(shí)別系統(tǒng)是一種通過(guò)計(jì)算機(jī)視覺和模式識(shí)別技術(shù)來(lái)識(shí)別和驗(yàn)證人臉的系統(tǒng)慧库。它在安全監(jiān)控旺芽、人機(jī)交互季稳、身份認(rèn)證等領(lǐng)域具有廣泛的應(yīng)用前景擅这。

在過(guò)去的幾十年里,人臉識(shí)別技術(shù)取得了長(zhǎng)足的進(jìn)步景鼠。早期的人臉識(shí)別系統(tǒng)主要基于傳統(tǒng)的圖像處理算法仲翎,如特征提取、模式匹配等铛漓。然而溯香,這些方法在復(fù)雜的環(huán)境下往往表現(xiàn)不佳,容易受到光照浓恶、姿態(tài)玫坛、表情等因素的干擾。近年來(lái)包晰,隨著深度學(xué)習(xí)的興起湿镀,基于深度神經(jīng)網(wǎng)絡(luò)的人臉識(shí)別方法取得了顯著的突破炕吸,成為當(dāng)前最先進(jìn)的技術(shù)。

OpenCV是一個(gè)開源的計(jì)算機(jī)視覺庫(kù)勉痴,提供了豐富的圖像處理和機(jī)器學(xué)習(xí)算法赫模。它支持多種編程語(yǔ)言,如C++蒸矛、Python等嘴瓤,具有廣泛的應(yīng)用領(lǐng)域±蚋疲基于OpenCV的人臉識(shí)別系統(tǒng)可以利用其強(qiáng)大的圖像處理和模式識(shí)別功能廓脆,實(shí)現(xiàn)高效準(zhǔn)確的人臉檢測(cè)、特征提取和匹配磁玉。

基于OpenCV的人臉識(shí)別系統(tǒng)具有許多重要的應(yīng)用停忿。首先,它可以應(yīng)用于安全監(jiān)控領(lǐng)域蚊伞。通過(guò)將人臉識(shí)別技術(shù)與監(jiān)控?cái)z像頭相結(jié)合席赂,可以實(shí)現(xiàn)對(duì)特定人員的實(shí)時(shí)監(jiān)測(cè)和識(shí)別,從而提高安全性和防范能力时迫。其次颅停,人臉識(shí)別系統(tǒng)可以應(yīng)用于人機(jī)交互領(lǐng)域。通過(guò)識(shí)別用戶的面部表情和動(dòng)作掠拳,系統(tǒng)可以實(shí)現(xiàn)更加智能化的交互方式癞揉,提供更好的用戶體驗(yàn)。此外溺欧,人臉識(shí)別系統(tǒng)還可以應(yīng)用于身份認(rèn)證和訪問控制領(lǐng)域喊熟。通過(guò)對(duì)人臉進(jìn)行識(shí)別和驗(yàn)證,可以實(shí)現(xiàn)更加安全可靠的身份認(rèn)證方式姐刁,避免了傳統(tǒng)的密碼和卡片等易被盜用的問題芥牌。

然而,基于OpenCV的人臉識(shí)別系統(tǒng)仍然面臨一些挑戰(zhàn)和問題聂使。首先壁拉,人臉識(shí)別技術(shù)在復(fù)雜的環(huán)境下仍然存在一定的誤識(shí)別率和漏識(shí)別率。光照柏靶、姿態(tài)弃理、表情等因素對(duì)人臉識(shí)別的準(zhǔn)確性和穩(wěn)定性有著重要影響。其次宿礁,大規(guī)模人臉數(shù)據(jù)庫(kù)的管理和搜索也是一個(gè)具有挑戰(zhàn)性的問題案铺。隨著人臉識(shí)別技術(shù)的發(fā)展,人臉數(shù)據(jù)庫(kù)的規(guī)模不斷增大,如何高效地管理和搜索這些數(shù)據(jù)成為了一個(gè)重要的研究方向控汉。

因此笔诵,基于OpenCV的人臉識(shí)別系統(tǒng)的研究具有重要的意義。通過(guò)深入研究和改進(jìn)人臉識(shí)別算法姑子,可以提高系統(tǒng)的準(zhǔn)確性和穩(wěn)定性乎婿,拓展其應(yīng)用領(lǐng)域。同時(shí)街佑,研究人臉數(shù)據(jù)庫(kù)的管理和搜索方法谢翎,可以提高系統(tǒng)的效率和可擴(kuò)展性°逯迹基于OpenCV的人臉識(shí)別系統(tǒng)的發(fā)展將為安全監(jiān)控森逮、人機(jī)交互、身份認(rèn)證等領(lǐng)域帶來(lái)更加智能化和便捷化的解決方案磁携,推動(dòng)社會(huì)的進(jìn)步和發(fā)展褒侧。

2.圖片演示

4.png

3.png

2.png

3.視頻演示

基于Mysql和OpenCV的人臉識(shí)別系統(tǒng)(源碼和部署教程)_嗶哩嗶哩_bilibili

4. Qt 和 OpenCV 簡(jiǎn)介

Q是在1991年奇趣科技開發(fā)的基于C++的面向?qū)ο蟮囊环N編寫界面的框架[9.3]。雖然它比微軟的 MFC晚出來(lái)很久并且沒有大型公司提供支持谊迄,但是其開源性使得一大批程序員自發(fā)地對(duì)其進(jìn)行設(shè)計(jì)和優(yōu)化闷供,經(jīng)過(guò)多年的發(fā)展變的十分強(qiáng)大,而且也越來(lái)越得到企業(yè)的認(rèn)可统诺。Qt還是一款可以跨平臺(tái)的界面設(shè)計(jì)軟件歪脏,在其下支持多種操作系統(tǒng),具有很強(qiáng)的可移植性粮呢。Qt的體積相對(duì)比較輕巧婿失,可以根據(jù)自己的需求添加一些庫(kù)資源來(lái)使用,十分方便鬼贱。Qt Creator是一款更為輕巧的Qt平臺(tái)開發(fā)環(huán)境移怯,具有集成的IDE使得程序員可以快速的上手,它可以通過(guò)編程實(shí)現(xiàn)界面的設(shè)計(jì)这难,也可以通過(guò)拖拉控件的形式實(shí)現(xiàn)界面的設(shè)計(jì),十分人性化葡秒,可滿足個(gè)人的喜好要求姻乓。它還提供了很多高效的工具,例如編輯器眯牧、調(diào)試器蹋岩、項(xiàng)目管理和上下文感知系統(tǒng)等。
OpenCV是一些處理圖像的庫(kù)的結(jié)合體[1]学少,它擁有全部的源碼和各類平臺(tái)編譯器從而支持多種平臺(tái)操作系統(tǒng)剪个,例如普通個(gè)人計(jì)算機(jī) (Windows,Linux版确,Mac)扣囊、手機(jī)(Andriod乎折,IOS)以及可以兼容Java等多種語(yǔ)言。它由高效的C和C++構(gòu)成了一系列開源的通用算法和實(shí)用API函數(shù)接口侵歇,而且?guī)椭臋n強(qiáng)大并對(duì)一些基本功能提供了示例程序供開發(fā)人員參考骂澄,方便二次開發(fā)等。
OpenCV的內(nèi)部結(jié)構(gòu)主要是一些庫(kù)和接口惕虑,包含一些單一的圖像處理功能和復(fù)雜的目標(biāo)檢測(cè)等坟冲。我們可以整合這些模塊來(lái)實(shí)現(xiàn)自定義的功能,也可以讀計(jì)算法進(jìn)行修改重新編譯再使用溃蔫,非常靈活[2]健提,其模塊化的結(jié)構(gòu)如圖所示。


image.png

image.png

5.核心代碼講解

5.1 config.py

根據(jù)給定的代碼伟叛,可以將其封裝為一個(gè)名為"EmotionDetection"的類私痹,包含以下核心部分:

class EmotionDetection:
    def __init__(self):
        self.path_model = 'emotion_detection/Modelos/model_dropout.hdf5'
        self.w, self.h = 48, 48
        self.rgb = False
        self.labels = ['angry', 'disgust', 'fear', 'happy', 'neutral', 'sad', 'surprise']

    def detect_emotion(self, image):
        # 實(shí)現(xiàn)情感檢測(cè)的代碼
        pass

class FaceRecognition:
    def __init__(self):
        self.path_images = "images_db"

    def recognize_face(self, image):
        # 實(shí)現(xiàn)人臉識(shí)別的代碼
        pass

這樣,我們可以使用EmotionDetection類來(lái)進(jìn)行情感檢測(cè)痪伦,使用FaceRecognition類來(lái)進(jìn)行人臉識(shí)別侄榴。

這個(gè)config.py文件主要用于配置兩個(gè)模塊:emotion_detection(情緒檢測(cè))和face_recognition(人臉識(shí)別)。

在emotion_detection模塊中网沾,配置了以下參數(shù):

  • path_model:情緒檢測(cè)模型的路徑癞蚕,這里設(shè)置為'emotion_detection/Modelos/model_dropout.hdf5'。
  • w,h:模型輸入圖片的寬度和高度辉哥,這里設(shè)置為48桦山。
  • rgb:是否將圖片轉(zhuǎn)換為RGB格式,這里設(shè)置為False醋旦,即將圖片轉(zhuǎn)換為灰度圖恒水。
  • labels:情緒類別的標(biāo)簽,包括'angry'(憤怒)饲齐、'disgust'(厭惡)钉凌、'fear'(恐懼)、'happy'(快樂)捂人、'neutral'(中性)御雕、'sad'(悲傷)和'surprise'(驚訝)。

在face_recognition模塊中滥搭,配置了以下參數(shù):

  • path_images:存放人臉圖像的文件夾路徑酸纲,這里設(shè)置為"images_db"。

5.2 deep_face.py

from deepface import DeepFace

class FaceAnalyzer:
    def __init__(self, image_path):
        self.image_path = image_path
    
    def analyze_face(self):
        demography = DeepFace.analyze(self.image_path, actions=['age', 'gender', 'race', 'emotion'])
        return demography

image_path = "juan.jpg"
analyzer = FaceAnalyzer(image_path)
demography = analyzer.analyze_face()

print("Age: ", demography["age"])
print("Gender: ", demography["gender"])
print("Emotion: ", demography["dominant_emotion"])
print("Race: ", demography["dominant_race"])

這個(gè)程序文件名為deep_face.py瑟匆,它使用了deepface庫(kù)來(lái)進(jìn)行人臉分析闽坡。程序首先導(dǎo)入DeepFace類,然后使用analyze方法對(duì)指定的圖片進(jìn)行分析,包括年齡疾嗅、性別外厂、種族和情緒等方面的分析姓言。接著打印出分析結(jié)果中的年齡浙值、性別、主要情緒和主要種族信息肯适。

5.3 Face_info.py

以下是將代碼封裝為類的核心部分:



class FaceInfo:
    def __init__(self, input_type, image_path):
        self.input_type = input_type
        self.image_path = image_path

    def process_image(self):
        frame = cv2.imread(self.image_path)
        out = f_Face_info.get_face_info(frame)
        res_img = f_Face_info.bounding_box(out, frame)
        cv2.imshow('Face info', res_img)
        cv2.waitKey(0)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description="Face Info")
    parser.add_argument('--input', type=str, default='webcam', help="webcam or image")
    parser.add_argument('--path_im', type=str, help="path of image")
    args = vars(parser.parse_args())

    face_info = FaceInfo(args['input'], args['path_im'])
    face_info.process_image()

這個(gè)類接受兩個(gè)參數(shù):input_typeimage_path次泽,用于指定輸入類型和圖像路徑穿仪。process_image方法加載圖像,獲取人臉信息意荤,并繪制邊界框啊片。最后,通過(guò)FaceInfo類的實(shí)例來(lái)調(diào)用process_image方法玖像。

這個(gè)程序文件名為Face_info.py紫谷,它的功能是使用OpenCV和imutils庫(kù)來(lái)檢測(cè)人臉并顯示人臉信息。程序首先導(dǎo)入了f_Face_info模塊捐寥,然后導(dǎo)入了cv2笤昨、time、imutils和argparse庫(kù)握恳。

接下來(lái)瞒窒,程序使用argparse庫(kù)創(chuàng)建了一個(gè)命令行參數(shù)解析器,用于指定輸入類型和圖像路徑乡洼。默認(rèn)情況下崇裁,輸入類型為webcam,即使用攝像頭作為輸入束昵。如果指定了--input參數(shù)為image拔稳,則需要提供--path_im參數(shù)來(lái)指定圖像路徑。

然后锹雏,程序讀取了一張圖像文件巴比,路徑為'./images/1 (2).jpg'。接著礁遵,調(diào)用f_Face_info模塊的get_face_info函數(shù)來(lái)獲取圖像中的人臉信息匿辩。然后,調(diào)用f_Face_info模塊的bounding_box函數(shù)來(lái)在圖像上繪制人臉邊界框榛丢。最后,使用cv2.imshow函數(shù)顯示處理后的圖像挺庞,并使用cv2.waitKey函數(shù)等待用戶按下鍵盤任意鍵關(guān)閉窗口晰赞。

5.4 f_Face_info.py


class FaceRecognition:
    def __init__(self):
        self.rec_face = f_main.rec()

    def get_face_info(self, im):
        boxes_face = face_recognition.face_locations(im)
        out = []
        if len(boxes_face) != 0:
            for box_face in boxes_face:
                box_face_fc = box_face
                x0, y1, x1, y0 = box_face
                box_face = np.array([y0, x0, y1, x1])
                face_features = {
                    "name": [],
                    "bbx_frontal_face": box_face
                }

                face_image = im[x0:x1, y0:y1]

                face_features["name"] = self.rec_face.recognize_face2(im, [box_face_fc])[0]
                out.append(face_features)
        else:
            face_features = {
                "name": [],
                "bbx_frontal_face": []
            }
            out.append(face_features)
        return out

    def bounding_box(self, out, img):
        for data_face in out:
            box = data_face["bbx_frontal_face"]
            if len(box) == 0:
                continue
            else:
                x0, y0, x1, y1 = box
                img = cv2.rectangle(img,
                                    (x0, y0),
                                    (x1, y1),
                                    (0, 0, 255), 2)
                thickness = 2
                fontSize = 0.6
                step = 13
                try:
                    cv2.putText(img, "name: " + data_face["name"], (x0, y0 - step - 7), cv2.FONT_HERSHEY_SIMPLEX,
                                fontSize, (0, 255, 0), thickness)
                except:
                    pass
        return img

這個(gè)程序文件名為f_Face_info.py,它包含了一些函數(shù)和庫(kù)的導(dǎo)入。主要功能是通過(guò)人臉識(shí)別來(lái)獲取人臉信息并在圖像上繪制邊界框和標(biāo)簽掖鱼。

程序首先導(dǎo)入了cv2然走、numpy和face_recognition等庫(kù),并從my_face_recognition模塊中導(dǎo)入了f_main.rec()函數(shù)戏挡。

接下來(lái)定義了一個(gè)名為get_face_info的函數(shù)芍瑞,它接受一個(gè)圖像作為輸入,并使用face_recognition庫(kù)的face_locations函數(shù)來(lái)檢測(cè)人臉位置褐墅。如果檢測(cè)到人臉拆檬,則對(duì)每個(gè)人臉進(jìn)行處理,提取人臉圖像并使用rec_face.recognize_face2函數(shù)識(shí)別人臉妥凳。最后將人臉信息存儲(chǔ)在一個(gè)列表中并返回竟贯。

然后定義了一個(gè)名為bounding_box的函數(shù),它接受一個(gè)包含人臉信息的列表和一個(gè)圖像作為輸入逝钥。該函數(shù)遍歷人臉信息列表屑那,對(duì)每個(gè)人臉繪制邊界框和標(biāo)簽,并返回繪制完成的圖像艘款。

整個(gè)程序的功能是通過(guò)人臉識(shí)別來(lái)獲取人臉信息持际,并在圖像上繪制邊界框和標(biāo)簽。

5.5 f_Face_info2.py


class FaceRecognition:
    def __init__(self):
        self.rec_face = self.rec()

    def rec(self):
        # 實(shí)例化人臉檢測(cè)器
        pass

    def get_face_info(self, im):
        # 人臉檢測(cè)
        pass

    def bounding_box(self, out, img):
        # 繪制邊界框和標(biāo)簽
        pass

這個(gè)程序文件名為f_Face_info2.py哗咆,它的功能是通過(guò)人臉識(shí)別獲取人臉信息并在圖像上標(biāo)注人臉邊界框和人臉姓名蜘欲。程序中導(dǎo)入了cv2、numpy和face_recognition等庫(kù)岳枷,并從my_face_recognition模塊中導(dǎo)入了f_main.rec()函數(shù)芒填。

程序定義了一個(gè)名為get_face_info的函數(shù),該函數(shù)接受一個(gè)圖像作為輸入空繁,并使用face_recognition庫(kù)進(jìn)行人臉檢測(cè)殿衰。如果檢測(cè)到人臉,則將人臉的位置信息和姓名信息存儲(chǔ)在一個(gè)字典中盛泡,并將該字典添加到一個(gè)列表中闷祥。最后,將列表作為輸出返回傲诵。

程序還定義了一個(gè)名為bounding_box的函數(shù)凯砍,該函數(shù)接受一個(gè)包含人臉信息的列表和一個(gè)圖像作為輸入。函數(shù)遍歷人臉信息列表拴竹,根據(jù)人臉邊界框的位置在圖像上繪制矩形框悟衩,并在框上方顯示人臉姓名。

整個(gè)程序的目的是通過(guò)人臉識(shí)別獲取人臉信息栓拜,并在圖像上標(biāo)注人臉邊界框和姓名座泳。

5.6 info.py

# -*- coding: utf-8 -*-

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Dialog_info(object):
    def setupUi(self, Dialog_info):
        Dialog_info.setStyleSheet("background-color: rgb(189,215,238)")
        Dialog_info.setObjectName("Dialog_info")
        Dialog_info.resize(394, 500)
        self.button_confirm = QtWidgets.QPushButton(Dialog_info)
        self.button_confirm.setGeometry(QtCore.QRect(260, 452, 112, 34))
        self.button_confirm.setObjectName("button_confirm")
        self.formLayoutWidget = QtWidgets.QWidget(Dialog_info)
        self.formLayoutWidget.setGeometry(QtCore.QRect(40, 50, 331, 400))
        self.formLayoutWidget.setObjectName("formLayoutWidget")
        self.formLayout = QtWidgets.QFormLayout(self.formLayoutWidget)
        self.formLayout.setContentsMargins(0, 0, 0, 0)
        self.formLayout.setObjectName("formLayout")
        self.label = QtWidgets.QLabel(self.formLayoutWidget)
        self.label.setObjectName("label")
        self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label)
        self.label_2 = QtWidgets.QLabel(self.formLayoutWidget)
        self.label_2.setObjectName("label_2")
        self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_2)
        self.label_3 = QtWidgets.QLabel(self.formLayoutWidget)
        self.label_3.setObjectName("label_3")
        self.formLayout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.label_3)
        self.label_4 = QtWidgets.QLabel(self.formLayoutWidget)
        self.label_4.setObjectName("label_4")
        self.formLayout.setWidget(6, QtWidgets.QFormLayout.LabelRole, self.label_4)

        self.label_5 = QtWidgets.QLabel(self.formLayoutWidget)
        self.label_5.setObjectName("label_5")
        self.formLayout.setWidget(7, QtWidgets.QFormLayout.LabelRole, self.label_5)
        self.label_6 = QtWidgets.QLabel(self.formLayoutWidget)
        self.label_6.setObjectName("label_6")
        self.formLayout.setWidget(8, QtWidgets.QFormLayout.LabelRole, self.label_6)
        self.label_7 = QtWidgets.QLabel(self.formLayoutWidget)
        self.label_7.setObjectName("label_7")
        self.formLayout.setWidget(9, QtWidgets.QFormLayout.LabelRole, self.label_7)
        self.label_8 = QtWidgets.QLabel(self.formLayoutWidget)
        self.label_8.setObjectName("label_8")
        self.formLayout.setWidget(10, QtWidgets.QFormLayout.LabelRole, self.label_8)
        self.label_9 = QtWidgets.QLabel(self.formLayoutWidget)
        self.label_9.setObjectName("label_9")
        self.formLayout.setWidget(11, QtWidgets.QFormLayout.LabelRole, self.label_9)

        self.line_id = QtWidgets.QLineEdit(self.formLayoutWidget)
        self.line_id.setObjectName("line_id")
        self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.line_id)
        self.line_name = QtWidgets.QLineEdit(self.formLayoutWidget)
        self.line_name.setObjectName("line_name")
        self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.line_name)
        self.line_sex = QtWidgets.QLineEdit(self.formLayoutWidget)
        self.line_sex.setObjectName("line_sex")
        self.formLayout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.line_sex)
        self.line_address = QtWidgets.QLineEdit(self.formLayoutWidget)
        self.line_address.setObjectName("line_address")
        self.formLayout.setWidget(6, QtWidgets.QFormLayout.FieldRole, self.line_address)

        self.line_passwords = QtWidgets.QLineEdit(self.formLayoutWidget)
        self.line_passwords.setObjectName("line_passwords")
        self.formLayout.setWidget(7, QtWidgets.QFormLayout.FieldRole, self.line_passwords)
        self.line_age = QtWidgets.QLineEdit(self.formLayoutWidget)
        self.line_age.setObjectName("line_name")
        self.formLayout.setWidget(8, QtWidgets.QFormLayout.FieldRole, self.line_age)
        self.line_race = QtWidgets.QLineEdit(self.formLayoutWidget)
        self.line_race.setObjectName("line_race")
        self.formLayout.setWidget(9, QtWidgets.QFormLayout.FieldRole, self.line_race)
        self.line_emotion = QtWidgets.QLineEdit(self.formLayoutWidget)
        self.line_emotion.setObjectName("line_emotion")
        self.formLayout.setWidget(10, QtWidgets.QFormLayout.FieldRole, self.line_emotion)
        self.line_check = QtWidgets.QLineEdit(self.formLayoutWidget)
        self.line_check.setObjectName("line_check")
        self.formLayout.setWidget(11, QtWidgets.QFormLayout.FieldRole, self.line_check)

        self.retranslateUi(Dialog_info)
        QtCore.QMetaObject.connectSlotsByName(Dialog_info)

        Dialog_info.setTabOrder(self.line_id, self.line_name)
        Dialog_info.setTabOrder(self.line_name, self.line_sex)
        Dialog_info.setTabOrder(self.line_sex, self.line_address)

        Dialog_info.setTabOrder(self.line_address, self.line_passwords)
        Dialog_info.setTabOrder(self.line_passwords, self.line_age)
        Dialog_info.setTabOrder(self.line_age, self.line_race)
        Dialog_info.setTabOrder(self.line_race, self.line_emotion)
        Dialog_info.setTabOrder(self.line_emotion, self.line_check)

    def retranslateUi(self, Dialog_info):
        _translate = QtCore.QCoreApplication.translate
        Dialog_info.setWindowTitle(_translate("Dialog_info", "Information Details"))
        self.button_confirm.setText(_translate("Dialog_info", "Determine"))
        self.label.setText(_translate("Dialog_input", "Name:"))
        self.label_2.setText(_translate("Dialog_input", "Student ID*:"))
        self.label_3.setText(_translate("Dialog_input", "Gender:"))
        self.label_4.setText(_translate("Dialog_input", "Native place:"))
        self.label_5.setText(_translate("Dialog_input", "Password:"))
        self.label_6.setText(_translate("Dialog_input", "Age:"))
        self.label_7.setText(_translate("Dialog_input", "Race:"))
        self.label_8.setText(_translate("Dialog_input", "Time:"))
        self.label_9.setText(_translate("Dialog_input", "Sign status:"))

這是一個(gè)名為info.py的程序文件惠昔,它是一個(gè)使用PyQt5生成的用戶界面文件。該文件定義了一個(gè)名為Ui_Dialog_info的類挑势,該類用于設(shè)置和顯示一個(gè)信息對(duì)話框镇防。

該對(duì)話框的背景顏色為rgb(189,215,238),大小為394x500像素潮饱。對(duì)話框中包含一個(gè)確認(rèn)按鈕和一個(gè)表單布局来氧,表單布局中包含了一些標(biāo)簽和文本框。

標(biāo)簽包括姓名香拉、學(xué)生ID啦扬、性別、籍貫缕溉、密碼考传、年齡、種族证鸥、時(shí)間僚楞。對(duì)應(yīng)的文本框用于輸入相應(yīng)的信息。

除了設(shè)置界面布局和文本內(nèi)容外枉层,該文件還定義了一些與界面交互的方法和信號(hào)槽連接泉褐。

該文件的目的是為了創(chuàng)建一個(gè)信息對(duì)話框,用于輸入和顯示一些個(gè)人信息鸟蜡。

6.系統(tǒng)整體結(jié)構(gòu)

整體功能和構(gòu)架概述:

該工程涉及人臉識(shí)別和信息管理的功能膜赃。主要包括以下模塊:

  1. 人臉識(shí)別模塊:使用深度學(xué)習(xí)模型進(jìn)行人臉分析,包括年齡揉忘、性別跳座、種族和情緒等方面的分析。
  2. 人臉信息獲取模塊:通過(guò)人臉識(shí)別獲取人臉信息泣矛,并在圖像上標(biāo)注人臉邊界框和姓名疲眷。
  3. 信息管理模塊:提供一個(gè)用戶界面,用于輸入和顯示個(gè)人信息您朽。

下面是每個(gè)文件的功能整理:

文件名 功能
config.py 配置情緒檢測(cè)和人臉識(shí)別模塊的參數(shù)
deep_face.py 使用deepface庫(kù)進(jìn)行人臉分析狂丝,包括年齡、性別哗总、種族和情緒等方面的分析
Face_info.py 使用OpenCV和imutils庫(kù)檢測(cè)人臉并顯示人臉信息
f_Face_info.py 通過(guò)人臉識(shí)別獲取人臉信息并在圖像上繪制邊界框和標(biāo)簽
f_Face_info2.py 通過(guò)人臉識(shí)別獲取人臉信息并在圖像上標(biāo)注人臉邊界框和姓名
info.py 創(chuàng)建一個(gè)信息對(duì)話框几颜,用于輸入和顯示個(gè)人信息
input_dialog.py 創(chuàng)建一個(gè)輸入對(duì)話框,用于輸入用戶名和密碼
login2.py 創(chuàng)建一個(gè)登錄界面讯屈,用于用戶登錄
ui.py 創(chuàng)建一個(gè)用戶界面蛋哭,用于顯示和管理個(gè)人信息
my_face_recognition\f_face_recognition.py 人臉識(shí)別模塊,包括人臉檢測(cè)和人臉特征提取
my_face_recognition\f_main.py 人臉識(shí)別模塊的主要功能涮母,包括人臉識(shí)別和人臉信息存儲(chǔ)
my_face_recognition\f_storage.py 人臉信息存儲(chǔ)模塊具壮,用于存儲(chǔ)和管理人臉信息

以上是對(duì)每個(gè)文件功能的簡(jiǎn)要概括准颓,具體的實(shí)現(xiàn)細(xì)節(jié)可能需要查看每個(gè)文件的代碼來(lái)進(jìn)一步了解。

7.人臉識(shí)別模塊設(shè)計(jì)

人臉識(shí)別技術(shù)的研究最早是由 Bledsoe在一篇技術(shù)報(bào)告中提出的棺妓,該報(bào)告以人臉特征點(diǎn)的距離、比率等參數(shù)作為人臉特征炮赦,搭建了一個(gè)半自動(dòng)的人臉識(shí)別系統(tǒng)怜跑。之后在各國(guó)學(xué)者的共同努力下,人臉識(shí)別技術(shù)得到了不停的優(yōu)化和改進(jìn)吠勘,逐漸發(fā)展和成熟性芬,從而在社會(huì)生活中得到廣泛的應(yīng)用。
目前國(guó)內(nèi)外研究較為廣泛的人臉識(shí)別方法有:(1)基于臉部幾何特征的人臉識(shí)別方法;(2)基于特征臉的人臉識(shí)別方法;(3)基于神經(jīng)網(wǎng)絡(luò)的人臉識(shí)別方法;(4)基于局部特征的人臉識(shí)別方法;(5)基于彈性匹配的人臉識(shí)別方法等剧防。本文采用基于特征臉的人臉識(shí)別方法植锉。
一、基于PCA的人臉識(shí)別算法
PCA是一種常用的數(shù)據(jù)分析方法[6-8]峭拘,它的原理是將原始數(shù)據(jù)轉(zhuǎn)化成線性無(wú)關(guān)的維度表示俊庇,提取主要的特征分量并進(jìn)行降維從而達(dá)到模型簡(jiǎn)化的效果,其廣泛應(yīng)用在一些數(shù)學(xué)計(jì)算領(lǐng)域鸡挠。
該方法的中心思想就是找出人臉圖像重要部分來(lái)進(jìn)行一個(gè)轉(zhuǎn)化投影辉饱,獲得直觀易計(jì)算的量,把不相干內(nèi)容去掉拣展。識(shí)別也是先進(jìn)行轉(zhuǎn)化再與前者對(duì)比來(lái)判斷系數(shù)的大小看是否是同一個(gè)人彭沼。具體的實(shí)現(xiàn)是以K-L變換為主將要訓(xùn)練的人臉庫(kù)轉(zhuǎn)化成特征臉空間并投影,將高維向量轉(zhuǎn)化為低維向量备埃。識(shí)別過(guò)程是將人臉區(qū)域投影到前面的特征臉空間來(lái)獲得每個(gè)測(cè)試樣本的特征系數(shù)姓惑,再將該值與訓(xùn)練樣本的投影值進(jìn)行比較獲得可信度來(lái)判斷其身份。該方法從人臉庫(kù)訓(xùn)練和識(shí)別都不是很復(fù)雜且速度和識(shí)別率較高按脚。
K-L變換的存在就是為了將龐大的數(shù)據(jù)簡(jiǎn)單化,即在這些數(shù)據(jù)中舍棄不必要的數(shù)據(jù)而篩選出重要的數(shù)據(jù)于毙。主要是找到一個(gè)矩陣,讓原來(lái)樣本矩陣乘以這個(gè)找到的矩陣以獲得一個(gè)新的矩陣乘寒,這個(gè)新的矩陣就比原來(lái)樣本的矩陣少了許多維度望众,即完成了數(shù)據(jù)的篩選和達(dá)到降維的目的。在實(shí)際應(yīng)用中伞辛,在進(jìn)行K-L變換時(shí)所做的一些工作計(jì)算量還是比較大的烂翰,所以需要再引入奇異值分解的方法來(lái)輔助和簡(jiǎn)化協(xié)方差矩陣的特征向量,具體原理和過(guò)程如下:


image.png

8.MySQL 數(shù)據(jù)庫(kù)設(shè)計(jì)

在上面己經(jīng)設(shè)計(jì)好了監(jiān)控界凹蚤氏、管理甘耿,所以為了視頻監(jiān)控后續(xù)更方健的直看以但是還沒有對(duì)這些功能進(jìn)行統(tǒng)一的歸納管理,所以為了視頻監(jiān)及管理竿滨,本系統(tǒng)引入了MySQL數(shù)據(jù)庫(kù)佳恬,具體結(jié)構(gòu)如下圖所示捏境。


image.png

9.系統(tǒng)整合

下圖完整源碼&環(huán)境部署視頻教程&自定義UI界面

1.png

參考博客《基于Mysql和OpenCV的人臉識(shí)別系統(tǒng)(源碼和部署教程)》

10.參考文獻(xiàn)


[1]廖文軍.基于連續(xù)Adaboost算法的多角度人臉檢測(cè)技術(shù)研究與實(shí)現(xiàn)[J].南京郵電大學(xué).2012.DOI:10.7666/d.d209228.

[2]李友坤.BP神經(jīng)網(wǎng)絡(luò)的研究分析及改進(jìn)應(yīng)用[D].2012.

[3]趙曉輝.基于改進(jìn)的分塊LBP人臉識(shí)別算法研究[D].2012.

[4]張惠發(fā).人臉識(shí)別的關(guān)鍵問題研究[D].2012.

[5]褚勤.基于小波分析和支持向量機(jī)的人臉識(shí)別方法研究[D].2012.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市毁葱,隨后出現(xiàn)的幾起案子垫言,更是在濱河造成了極大的恐慌,老刑警劉巖倾剿,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筷频,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡前痘,警方通過(guò)查閱死者的電腦和手機(jī)凛捏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)芹缔,“玉大人坯癣,你說(shuō)我怎么就攤上這事∽钋罚” “怎么了示罗?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)窒所。 經(jīng)常有香客問我鹉勒,道長(zhǎng),這世上最難降的妖魔是什么吵取? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任禽额,我火速辦了婚禮,結(jié)果婚禮上皮官,老公的妹妹穿的比我還像新娘脯倒。我一直安慰自己,他們只是感情好捺氢,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布藻丢。 她就那樣靜靜地躺著,像睡著了一般摄乒。 火紅的嫁衣襯著肌膚如雪悠反。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天馍佑,我揣著相機(jī)與錄音斋否,去河邊找鬼。 笑死拭荤,一個(gè)胖子當(dāng)著我的面吹牛茵臭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播舅世,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼旦委,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼奇徒!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起缨硝,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤摩钙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后追葡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腺律,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年宜肉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翎碑。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谬返,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出日杈,到底是詐尸還是另有隱情遣铝,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布莉擒,位于F島的核電站酿炸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏涨冀。R本人自食惡果不足惜填硕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鹿鳖。 院中可真熱鬧扁眯,春花似錦、人聲如沸翅帜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)涝滴。三九已至绣版,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間歼疮,已是汗流浹背杂抽。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腋妙,地道東北人默怨。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像骤素,于是被迫代替她去往敵國(guó)和親匙睹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子愚屁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容