基于卷積神經(jīng)網(wǎng)絡(luò)人臉識別系統(tǒng)(部署教程&源碼)

1.研究背景與意義

隨著計(jì)算機(jī)視覺技術(shù)的不斷發(fā)展,人臉檢測系統(tǒng)在許多領(lǐng)域中起著重要的作用阵难。人臉檢測是計(jì)算機(jī)視覺中的一個(gè)基本問題鞋喇,它可以用于人臉識別、人臉表情分析卧蜓、人臉姿態(tài)估計(jì)等應(yīng)用帐要。人臉檢測系統(tǒng)的目標(biāo)是在圖像或視頻中準(zhǔn)確地檢測出人臉的位置和邊界框。

傳統(tǒng)的人臉檢測方法主要基于特征工程和機(jī)器學(xué)習(xí)算法弥奸,如Haar特征和AdaBoost算法榨惠。這些方法在一定程度上能夠?qū)崿F(xiàn)人臉檢測的任務(wù),但是存在一些問題盛霎。首先赠橙,傳統(tǒng)方法需要手動設(shè)計(jì)特征,這需要大量的人力和時(shí)間成本愤炸。其次期揪,傳統(tǒng)方法對于光照、尺度變化和姿態(tài)變化等因素的魯棒性較差摇幻。最后横侦,傳統(tǒng)方法的檢測速度較慢,難以滿足實(shí)時(shí)應(yīng)用的需求绰姻。

基于卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network枉侧,CNN)的人臉檢測系統(tǒng)在解決上述問題方面具有很大的優(yōu)勢。CNN是一種深度學(xué)習(xí)模型狂芋,它能夠自動學(xué)習(xí)圖像的特征表示榨馁,避免了手動設(shè)計(jì)特征的過程。此外帜矾,CNN具有較強(qiáng)的非線性建模能力翼虫,能夠更好地處理光照、尺度和姿態(tài)變化等問題屡萤。最重要的是珍剑,CNN可以通過并行計(jì)算來加速人臉檢測的過程,實(shí)現(xiàn)實(shí)時(shí)性能死陆。

基于卷積神經(jīng)網(wǎng)絡(luò)的人臉檢測系統(tǒng)已經(jīng)取得了顯著的成果招拙。一些經(jīng)典的CNN模型,如AlexNet措译、VGGNet和ResNet等别凤,已經(jīng)在人臉檢測任務(wù)上取得了很好的效果。這些模型通過多層卷積和池化操作领虹,逐漸提取圖像的高級特征规哪,并通過全連接層進(jìn)行分類和回歸。此外塌衰,一些改進(jìn)的CNN模型诉稍,如SSD(Single Shot MultiBox Detector)和YOLO(You Only Look Once)等,進(jìn)一步提高了人臉檢測的準(zhǔn)確性和速度猾蒂。

基于卷積神經(jīng)網(wǎng)絡(luò)的人臉檢測系統(tǒng)在實(shí)際應(yīng)用中具有廣泛的應(yīng)用前景均唉。首先,人臉檢測系統(tǒng)可以應(yīng)用于人臉識別技術(shù)肚菠,用于身份驗(yàn)證和安全控制舔箭。其次,人臉檢測系統(tǒng)可以應(yīng)用于人臉表情分析蚊逢,用于情感識別和心理研究层扶。此外,人臉檢測系統(tǒng)還可以應(yīng)用于人臉姿態(tài)估計(jì)烙荷,用于虛擬現(xiàn)實(shí)和增強(qiáng)現(xiàn)實(shí)等領(lǐng)域镜会。

總之,基于卷積神經(jīng)網(wǎng)絡(luò)的人臉檢測系統(tǒng)在計(jì)算機(jī)視覺領(lǐng)域具有重要的研究意義和應(yīng)用價(jià)值终抽。通過深度學(xué)習(xí)模型的自動特征學(xué)習(xí)和并行計(jì)算的加速優(yōu)勢戳表,基于卷積神經(jīng)網(wǎng)絡(luò)的人臉檢測系統(tǒng)能夠?qū)崿F(xiàn)準(zhǔn)確桶至、魯棒和實(shí)時(shí)的人臉檢測任務(wù),為人臉識別匾旭、人臉表情分析和人臉姿態(tài)估計(jì)等應(yīng)用提供了有力的支持镣屹。未來的研究方向包括進(jìn)一步提高人臉檢測系統(tǒng)的準(zhǔn)確性和速度,以及應(yīng)用于更廣泛的領(lǐng)域和場景中价涝。

2.圖片演示

2.jpg
3.jpg

3.視頻演示

基于卷積神經(jīng)網(wǎng)絡(luò)人臉識別系統(tǒng)(部署教程&源碼)_嗶哩嗶哩_bilibili

4.Adam 優(yōu)化

參考該博客提出的算法改進(jìn)方案女蜈,不難看出優(yōu)化算法之間的聯(lián)系。對于神經(jīng)網(wǎng)絡(luò)訓(xùn)練色瘩,最初使用的是固定學(xué)習(xí)率的梯度下降法伪窖。但是梯度下降法的訓(xùn)練速度比較慢,為了加快訓(xùn)練發(fā)展出了隨機(jī)梯度下降法和動量隨機(jī)梯度下降法居兆。SGD 以及其變種在進(jìn)行網(wǎng)絡(luò)訓(xùn)練時(shí)使用同一學(xué)習(xí)率對所有的參數(shù)進(jìn)行更新覆山,但是神經(jīng)網(wǎng)絡(luò)中往往包含了大量的參數(shù),所以學(xué)習(xí)率的設(shè)置需要大量的測試實(shí)驗(yàn)才能找到合適學(xué)習(xí)率泥栖。為了更加貼合深度學(xué)習(xí)的復(fù)雜模型的訓(xùn)練汹买,每個(gè)參數(shù)設(shè)置不同學(xué)習(xí)率的自適應(yīng)學(xué)習(xí)率的優(yōu)化算法被提出,比如說AdaGrad 算法聊倔。為解決AdaGrad 算法累積歷史梯度平方造成的學(xué)習(xí)率過早或者過量的減少晦毙,帶有指數(shù)加權(quán)平均的RMSProp算法被提了出來。隨后進(jìn)一步融合了RMSProp算法和動量思想的Adam也被提了出來耙蔑。
Adam優(yōu)化算法的收斂速度雖然比較快见妒,但是其收斂結(jié)果卻并不一定令人滿意。在Keskar的文獻(xiàn)l53中甸陌,作者在 CIFAR-10數(shù)據(jù)集上進(jìn)行測試须揣,Adam 的收斂速度確實(shí)要比SGD要快,但是最終收斂的結(jié)果并沒有SGD好钱豁。該博客中提到Adam算法可能會錯(cuò)過全局最優(yōu)解耻卡。關(guān)于Adam 優(yōu)化算法的動態(tài)學(xué)習(xí)率的爭議一直存在。所以本文針對Adam優(yōu)化算法的動態(tài)學(xué)習(xí)率進(jìn)行了分析研究并提出了一種改進(jìn)算法牲尺。Adam 的學(xué)習(xí)率受到二階矩的影響卵酪,二階矩是固定時(shí)間窗口內(nèi)的累積,隨著時(shí)間窗口的變化谤碳,遇到的數(shù)據(jù)可能發(fā)生巨變溃卡,造成學(xué)習(xí)率時(shí)大時(shí)小不單調(diào)變化。這就可能在訓(xùn)練后期引起學(xué)習(xí)率的震蕩蜒简,最糟的情況會導(dǎo)致模型無法收斂瘸羡。改進(jìn)算法中針對這一問題修改了修正二階矩的偏差的公式,使得改進(jìn)算法的步長在訓(xùn)練后期相對Adam來說單調(diào)遞減搓茬。此外改進(jìn)算法還引入了Momentum動量的變種Nesterov動量犹赖。接下來我們詳細(xì)闡述本文的改進(jìn)算法队他。


image.png

Momentum動量的主要思想主要來借鑒于物理學(xué)中的動量概念,來源該博客提出的定義峻村,模擬出的是物體運(yùn)動時(shí)的慣性漱挎,深度學(xué)習(xí)中訓(xùn)練的應(yīng)用中就是,在更新參數(shù)就時(shí)候在一定程度上保留之前更新的方向雀哨,同時(shí)利用當(dāng)前mini-batch 的梯度進(jìn)行微調(diào)至最終的更新方向,這樣便可以在一定程度上增加穩(wěn)定性私爷,從而能夠更快的訓(xùn)練網(wǎng)絡(luò)模型雾棺,并且有一定程度上擺脫局部最優(yōu)的能力。
引入動量的目的就是為了加快深度學(xué)習(xí)中模型的學(xué)習(xí)訓(xùn)練過程衬浑,尤其是對于一些曲率高或者噪聲比較大的梯度能夠比較好的提高訓(xùn)練速度捌浩,動量的主要思想是積累了之前梯度指數(shù)加權(quán)平均。關(guān)于Momentum動量我們可以用下圖幫助理解工秩。


image.png

5.實(shí)時(shí)人臉識別流程

整個(gè)實(shí)時(shí)人臉識別系統(tǒng)包含人臉數(shù)據(jù)采集模塊尸饺,人臉圖像處理模塊,網(wǎng)絡(luò)訓(xùn)練模塊以及人臉識別模塊助币。其中人臉采集模塊主要負(fù)責(zé)從視頻中或者圖像中檢測出人臉浪听,人臉檢測使用的是OpenCV庫,同時(shí)可以保存圖像用作下一步人臉圖像處理眉菱。人臉圖像處理模塊主要功能是將圖像中人臉截取出來,然后將圖像灰度直方化,處理成統(tǒng)一的64*64大小的圖像迹栓,將人臉圖像放入深度生成對抗網(wǎng)絡(luò)中進(jìn)行生成圖像,擴(kuò)充數(shù)據(jù)集俭缓。網(wǎng)絡(luò)訓(xùn)練模塊的主要作用是構(gòu)建基于卷積神經(jīng)網(wǎng)絡(luò)人臉識別的模型克伊,將數(shù)據(jù)集輸入進(jìn)而訓(xùn)練能夠進(jìn)行識別的網(wǎng)絡(luò),同時(shí)會將訓(xùn)練好的模型的參數(shù)進(jìn)行保存华坦,以用于進(jìn)行人臉識別時(shí)使用愿吹。人臉識別模塊的主要功能是開啟筆記本攝像頭,進(jìn)行實(shí)時(shí)的識別惜姐,將每一幀圖像都放入人臉數(shù)據(jù)采集模塊犁跪,若識別出人臉則轉(zhuǎn)入人臉圖像處理模塊,將圖像進(jìn)行處理截取出人臉并將其灰度直方化歹袁,然后調(diào)取保存好的網(wǎng)絡(luò)參數(shù)耘拇,將圖像放入卷積神經(jīng)網(wǎng)絡(luò)模型中進(jìn)行識別,若識別出則在實(shí)時(shí)視頻中將識別出的人臉用方框框出宇攻,并標(biāo)記上被識別出人的姓名惫叛。
整個(gè)系統(tǒng)的設(shè)計(jì)流程如下:
(1)圖像預(yù)處理階段,首先通過人臉識別模塊識將圖片或者視頻檢測出人臉逞刷,然后用人臉圖像處理模塊進(jìn)行人臉截取和圖像處理嘉涌,得到統(tǒng)一大小的人臉圖像妻熊。
(2)將數(shù)據(jù)集放入LECNN中進(jìn)行訓(xùn)練,訓(xùn)練優(yōu)化算法采用第四章改進(jìn)算法仑最,訓(xùn)練完成后保存參數(shù)扔役。
(3)對實(shí)時(shí)視頻進(jìn)行人臉識別,通過人臉數(shù)據(jù)采集模塊和人臉圖像處理模塊得到需要識別的人臉圖像警医,調(diào)取網(wǎng)絡(luò)參數(shù)亿胸,將人臉圖像輸入至卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行識別,返回識別結(jié)果预皇。如若識別成功則將識別出的人臉框出并標(biāo)注姓名侈玄。
系統(tǒng)的流程圖如圖所示


image.png

6.核心代碼講解

6.1 config.py

根據(jù)給定的代碼,可以將其封裝為一個(gè)名為EmotionDetection的類吟温,如下所示:

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

這樣序仙,我們可以通過創(chuàng)建EmotionDetection和FaceRecognition的實(shí)例來訪問這些變量。

這個(gè)程序文件名為config.py鲁豪,主要用于配置一些參數(shù)和路徑潘悼。
在face_recognition部分,定義了圖片文件夾的路徑為"images_db"爬橡。

6.2 deep_face.py

以下是封裝為類的代碼:


class FaceAnalyzer:
    def __init__(self, image_path):
        self.image_path = image_path
        self.demography = None

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

這個(gè)類封裝了人臉分析功能治唤,通過analyze方法分析圖像中的人臉,然后可以通過get_age糙申、get_gender肝劲、get_emotionget_race方法獲取分析結(jié)果。

這個(gè)程序文件名為deep_face.py郭宝,它使用了deepface庫辞槐。該程序通過分析人臉圖像來獲取人物的年齡、性別粘室、種族和情緒信息榄檬。在這個(gè)例子中,它分析了名為"juan.jpg"的圖像衔统。程序輸出了分析結(jié)果鹿榜。

6.3 demo.py


class FaceRecognition:
    def __init__(self):
        self.detector = dlib.get_frontal_face_detector()
        self.predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
        self.sess = tf.Session()
        saver = tf.train.import_meta_graph('model.meta')
        saver.restore(self.sess, tf.train.latest_checkpoint('./'))


    def get_face_info(self, frame):
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        faces = self.detector(gray)
        face_info = []
        for face in faces:
            landmarks = self.predictor(gray, face)
            face_info.append(landmarks)
        return face_info

    def bounding_box(self, face_info, frame):
        for face in face_info:
            x1 = face.left()
            y1 = face.top()
            x2 = face.right()
            y2 = face.bottom()
            cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 3)
        return frame

    def recognize_face(self, frame):
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        faces = self.detector(gray)
        for face in faces:
            landmarks = self.predictor(gray, face)
            face_array = np.array(landmarks)
            face_array = np.expand_dims(face_array, axis=0)
            ...

這個(gè)程序文件名為demo.py,主要功能是使用深度學(xué)習(xí)模型進(jìn)行人臉識別锦爵。程序?qū)肓艘恍┍匾膸旌湍K舱殿,包括f_Face_info、cv2险掀、time沪袭、imutils、argparse樟氢、numpy冈绊、PyQt5侠鳄、os、sys死宣、pathlib伟恶、tensorflow、dlib毅该、sklearn等博秫。

程序定義了一些類和函數(shù),包括SPP眶掌、ChannelAttention挡育、SpatialAttention、getPaddingSize畏线、cnnLayer等。這些類和函數(shù)用于構(gòu)建深度學(xué)習(xí)模型和進(jìn)行人臉識別的相關(guān)操作良价。

程序的主要邏輯是讀取一張人臉圖片寝殴,然后使用深度學(xué)習(xí)模型對人臉進(jìn)行識別和預(yù)測。程序中還包含了一些參數(shù)的定義和模型的保存和加載操作明垢。

最后蚣常,程序通過調(diào)用f_Face_info模塊中的函數(shù)對人臉進(jìn)行檢測和繪制邊界框,并輸出人臉信息痊银。

6.4 faces_my.py


class FaceDatasetCollector:
    def __init__(self, faces_my_path='./faces_my', size=64):
        self.faces_my_path = faces_my_path
        self.size = size
        if not os.path.exists(self.faces_my_path):
            os.makedirs(self.faces_my_path)

    def img_change(self, img, light=1, bias=0):
        width = img.shape[1]
        height = img.shape[0]
        for i in range(0, width):
            for j in range(0, height):
                for k in range(3):
                    tmp = int(img[j, i, k]*light + bias)
                    if tmp > 255:
                        tmp = 255
                    elif tmp < 0:
                        tmp = 0
                    img[j,i,k] = tmp
        return img

    def collect_dataset(self):
        detector = dlib.get_frontal_face_detector()
        cap = cv2.VideoCapture(0)

        num = 1
        while True:
            if (num <= 10000):
                print('Being processed picture %s' % num)
                success, img = cap.read()
                gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
                dets = detector(gray_img, 1)
                for i, d in enumerate(dets):
                    x1 = d.top() if d.top() > 0 else 0
                    y1 = d.bottom() if d.bottom() > 0 else 0
                    x2 = d.left() if d.left() > 0 else 0
                    y2 = d.right() if d.right() > 0 else 0

                    face = img[x1:y1,x2:y2]
                    face = self.img_change(face, random.uniform(0.5, 1.5), random.randint(-50, 50))
                    face = cv2.resize(face, (self.size,self.size))
                    cv2.imshow('image', face)
                    cv2.imwrite(self.faces_my_path+'/'+str(num)+'.jpg', face)
                    num += 1
                key = cv2.waitKey(30)
                if key == 27:
                    break
            else:
                print('Finished!')
                break

程序會通過攝像頭實(shí)時(shí)獲取圖像抵蚊,并使用特征提取器進(jìn)行人臉檢測。檢測到人臉后溯革,會對人臉進(jìn)行亮度和對比度的調(diào)整贞绳,并將人臉圖像保存到指定的文件夾中。程序會一直運(yùn)行致稀,直到采集到10000張人臉圖像為止冈闭。

6.5 faces_other.py


class FaceDataCollector:
    def __init__(self, source_path, faces_other_path, size=64):
        self.source_path = source_path
        self.faces_other_path = faces_other_path
        self.size = size
        self.detector = dlib.get_frontal_face_detector()
        self.num = 1

    def collect_face_data(self):
        if not os.path.exists(self.faces_other_path):
            os.makedirs(self.faces_other_path)

        for (path, dirnames, filenames) in os.walk(self.source_path):
            for filename in filenames:
                if filename.endswith('.jpg'):
                    print('Being processed picture %s' % self.num)
                    img_path = os.path.join(path, filename)
                    img = cv2.imread(img_path)
                    gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
                    dets = self.detector(gray_img, 1)

                    for i, d in enumerate(dets):
                        x1 = d.top() if d.top() > 0 else 0
                        y1 = d.bottom() if d.bottom() > 0 else 0
                        x2 = d.left() if d.left() > 0 else 0
                        y2 = d.right() if d.right() > 0 else 0

                        face = img[x1:y1, x2:y2]
                        face = cv2.resize(face, (self.size, self.size))
                        cv2.imshow('image', face)
                        cv2.imwrite(os.path.join(self.faces_other_path, str(self.num) + '.jpg'), face)
                        self.num += 1

                    key = cv2.waitKey(30)
                    if key == 27:
                        sys.exit(0)

這個(gè)程序文件是用來采集其他人臉數(shù)據(jù)集的。它首先下載了一個(gè)人臉數(shù)據(jù)集抖单,并將下載的圖片放在img_source目錄下萎攒。然后使用dlib庫來批量識別圖片中的人臉部分,并將識別到的人臉保存到指定目錄faces_other矛绘。識別到的人臉大小為64*64像素耍休。程序使用了dlib自帶的frontal_face_detector作為特征提取器來進(jìn)行人臉檢測。程序會遍歷img_source目錄下的所有圖片文件货矮,并對每張圖片進(jìn)行人臉檢測和保存羊精。最后,程序會顯示每張檢測到的人臉圖片囚玫,并等待按下ESC鍵退出程序园匹。

6.6 faces_train.py


class CNNModel:
    def __init__(self, faces_my_path, faces_other_path, batch_size, learning_rate, size):
        self.faces_my_path = faces_my_path
        self.faces_other_path = faces_other_path
        self.batch_size = batch_size
        self.learning_rate = learning_rate
        self.size = size
        self.imgs = []
        self.labs = []
        self.train_x = None
        self.test_x = None
        self.train_y = None
        self.test_y = None
        self.num_batch = None
        self.x = None
        self.y_ = None
        self.keep_prob_fifty = None
        self.keep_prob_seventy_five = None
        self.out = None
        self.cross_entropy = None
        self.optimizer = None
        self.accuracy = None
        self.merged_summary_op = None
        self.saver = None

    def readData(self, path, h, w):
        for filename in os.listdir(path):
            if filename.endswith('.jpg'):
                filename = path + '/' + filename
                img = cv2.imread(filename)
                top, bottom, left, right = self.getPaddingSize(img)
                img = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=[0, 0, 0])
                img = cv2.resize(img, (h, w))
                self.imgs.append(img)
                self.labs.append(path)

    def getPaddingSize(self, img):
        height, width, _ = img.shape
        top, bottom, left, right = (0, 0, 0, 0)
        longest = max(height, width)

        if width < longest:
            tmp = longest - width
            left = tmp // 2
            right = tmp - left
        elif height < longest:
            tmp = longest - height
            top = tmp // 2
            bottom = tmp - top
        else:
            pass
        return top, bottom, left, right

    def cnnLayer(self):
        W1 = tf.Variable(tf.random_normal([3, 3, 3, 32]))
        b1 = tf.Variable(tf.random_normal([32]))
        conv1 = tf.nn.relu(tf.nn.conv2d(self.x, W1, strides=[1, 1, 1, 1], padding='SAME')+b1)
        pool1 = tf.nn.max_pool(conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
        drop1 = tf.nn.dropout(pool1, self.keep_prob_fifty)

        W2 = tf.Variable(tf.random_normal([3, 3, 32, 64]))
        b2 = tf.Variable(tf.random_normal([64]))
        conv2 = tf.nn.relu(tf.nn.conv2d(drop1, W2, strides=[1, 1, 1, 1], padding='SAME') + b2)
        pool2 = tf.nn.max_pool(conv2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
        drop2 = tf.nn.dropout(pool2, self.keep_prob_fifty)

        W3 = tf.Variable(tf.random_normal([3, 3, 64, 64]))
        b3 = tf.Variable(tf.random_normal([64]))
        conv3 = tf.nn.relu(tf.nn.conv2d(drop2, W3, strides=[1, 1, 1, 1], padding='SAME') + b3)
        pool3 = tf.nn.max_pool(conv3, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
        drop3 = tf.nn.dropout(pool3, self.keep_prob_fifty)

        Wf = tf.Variable(tf.random_normal([8*8*64,512]))
        bf = tf.Variable(tf.random_normal([512]))
        drop3_flat = tf.reshape(drop3, [-1, 8*8*64])
        dense = tf.nn.relu(tf.matmul(drop3_flat, Wf) + bf)
        dropf = tf.nn.dropout(dense, self.keep_prob_seventy_five)

        Wout = tf.Variable(tf.random_normal([512,2]))
        bout = tf.Variable(tf.random_normal([2]))
        out = tf.add(tf.matmul(dropf, Wout), bout)
        return out

    def train(self):
        self.out = self.cnnLayer()
        self.cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=self.out, labels=self.y_))
        self.optimizer = tf.train.AdamOptimizer(self.learning_rate).minimize(self.cross_entropy)
        self.accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(self.out, 1), tf.argmax(self.y_, 1)), tf.float32))
        tf.summary.scalar('loss', self.cross_entropy)
        tf.summary.scalar('accuracy', self.accuracy)
        self.merged_summary_op = tf.summary.merge_all()
        self.saver = tf.train.Saver()
        with tf.Session() as sess:
            sess.run(tf.global_variables_initializer())
            summary_writer = tf.summary.FileWriter('./tmp', graph=tf.get_default_graph())
            for n in range(10):
                for i in range(self.num_batch):
                    batch_x = self.train_x[i*self.batch_size: (i+1)*self.batch_size]
                    batch_y = self.train_y[i*self.batch_size: (i+1)*self.batch_size]
                    _, loss, summary = sess.run([self.optimizer, self.cross_entropy, self.merged_summary_op],
                                                feed_dict={self.x: batch_x, self.y

該程序文件名為faces_train.py雳刺,主要功能是使用卷積神經(jīng)網(wǎng)絡(luò)(CNN)對人臉進(jìn)行分類訓(xùn)練。

具體功能如下:

  1. 讀取人臉數(shù)據(jù):從指定路徑中讀取人臉圖片裸违,并將其存儲在imgs列表中掖桦,同時(shí)將對應(yīng)的標(biāo)簽存儲在labs列表中。
  2. 隨機(jī)劃分測試集與訓(xùn)練集:將讀取到的人臉數(shù)據(jù)隨機(jī)劃分為訓(xùn)練集和測試集供汛。
  3. 歸一化:將訓(xùn)練集和測試集的圖片數(shù)據(jù)進(jìn)行歸一化處理枪汪。
  4. 定義神經(jīng)網(wǎng)絡(luò)層:定義了一個(gè)包含八層的卷積神經(jīng)網(wǎng)絡(luò)模型,用于特征提取和分類怔昨。
  5. 定義訓(xùn)練函數(shù):定義了訓(xùn)練過程雀久,包括損失函數(shù)、優(yōu)化器和準(zhǔn)確率的計(jì)算趁舀。
  6. 進(jìn)行訓(xùn)練:使用訓(xùn)練函數(shù)進(jìn)行模型訓(xùn)練赖捌,訓(xùn)練過程中會輸出損失和準(zhǔn)確率。

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

整體功能和構(gòu)架概述:
該工程主要是一個(gè)人臉識別項(xiàng)目矮烹,包含了多個(gè)程序文件越庇,用于實(shí)現(xiàn)不同的功能。其中奉狈,config.py用于配置參數(shù)和路徑卤唉,deep_face.py用于人臉識別,demo.py用于演示人臉識別結(jié)果仁期,faces_my.py用于采集自己的人臉數(shù)據(jù)集桑驱,faces_other.py用于采集其他人臉數(shù)據(jù)集,faces_train.py用于訓(xùn)練人臉分類模型跛蛋,f_Face_info.py包含了一些人臉處理的函數(shù)熬的,ui.py是一個(gè)用戶界面文件,age_detection\f_my_age.py用于預(yù)測年齡赊级,my_face_recognition\f_face_recognition.py用于人臉識別悦析,my_face_recognition\f_main.py是主程序文件,my_face_recognition\f_storage.py用于存儲人臉數(shù)據(jù)此衅。

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

文件名 功能
config.py 配置參數(shù)和路徑
deep_face.py 人臉識別
demo.py 演示人臉識別結(jié)果
faces_other.py 人臉數(shù)據(jù)集
faces_train.py 訓(xùn)練人臉分類模型
f_Face_info.py 包含人臉處理的函數(shù)
ui.py 用戶界面文件
my_face_recognition\f_face_recognition.py 人臉識別
my_face_recognition\f_main.py 主程序文件
face_db 存儲人臉數(shù)據(jù)

8.系統(tǒng)整合

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

1.jpg

參考博客《基于卷積神經(jīng)網(wǎng)絡(luò)人臉識別系統(tǒng)(部署教程&源碼)》

9.參考文獻(xiàn)


[1]程俊華,曾國輝,魯敦科,等.基于Dropout的改進(jìn)卷積神經(jīng)網(wǎng)絡(luò)模型平均方法[J].計(jì)算機(jī)應(yīng)用.2019,(6).DOI:10.11772/j.issn.1001-9081.2018122501.

[2]景晨凱,宋濤,莊雷,等.基于深度卷積神經(jīng)網(wǎng)絡(luò)的人臉識別技術(shù)綜述[J].計(jì)算機(jī)應(yīng)用與軟件.2018,(1).DOI:10.3969/j.issn.1000-386x.2018.01.039.

[3]盧官明,何嘉利,閆靜杰,等.一種用于人臉表情識別的卷積神經(jīng)網(wǎng)絡(luò)[J].南京郵電大學(xué)學(xué)報(bào)(自然科學(xué)版).2016,(1).DOI:10.14132/j.cnki.1673-5439.2016.01.003.

[4]張潔玉,趙鴻萍,陳曙.自適應(yīng)閾值及加權(quán)局部二值模式的人臉識別[J].電子與信息學(xué)報(bào).2014,(6).DOI:10.3724/SP.J.1146.2013.01218.

[5]劉中華,史恒亮,張?zhí)m萍,等.基于多尺度局部二值模式的人臉識別[J].計(jì)算機(jī)科學(xué).2009,(11).DOI:10.3969/j.issn.1002-137X.2009.11.074.

[6]劉碧靚.基于深度學(xué)習(xí)的車輛識別系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].蘇州大學(xué).2017.

[7]楊子文.基于深度卷積神經(jīng)網(wǎng)絡(luò)的人臉識別研究[J].廣西師范大學(xué).2017.

[8]萬士寧.基于卷積神經(jīng)網(wǎng)絡(luò)的人臉識別研究與實(shí)現(xiàn)[J].電子科技大學(xué).2016.

[9]吳斯.基于多尺度池化的卷積神經(jīng)網(wǎng)絡(luò)人臉識別方法研究[J].浙江大學(xué).2016.

[10]葉浪.基于卷積神經(jīng)網(wǎng)絡(luò)的人臉識別研究[J].東南大學(xué).2015.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末强戴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子挡鞍,更是在濱河造成了極大的恐慌骑歹,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件墨微,死亡現(xiàn)場離奇詭異道媚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門最域,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谴分,“玉大人,你說我怎么就攤上這事镀脂∥悖” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵薄翅,是天一觀的道長沙兰。 經(jīng)常有香客問我,道長翘魄,這世上最難降的妖魔是什么鼎天? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮暑竟,結(jié)果婚禮上斋射,老公的妹妹穿的比我還像新娘。我一直安慰自己但荤,他們只是感情好罗岖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著纱兑,像睡著了一般呀闻。 火紅的嫁衣襯著肌膚如雪化借。 梳的紋絲不亂的頭發(fā)上潜慎,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機(jī)與錄音蓖康,去河邊找鬼铐炫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蒜焊,可吹牛的內(nèi)容都是我干的倒信。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼泳梆,長吁一口氣:“原來是場噩夢啊……” “哼鳖悠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起优妙,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤乘综,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后套硼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卡辰,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了九妈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片反砌。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖萌朱,靈堂內(nèi)的尸體忽然破棺而出宴树,到底是詐尸還是另有隱情,我是刑警寧澤嚷兔,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布森渐,位于F島的核電站,受9級特大地震影響冒晰,放射性物質(zhì)發(fā)生泄漏同衣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一壶运、第九天 我趴在偏房一處隱蔽的房頂上張望耐齐。 院中可真熱鬧,春花似錦蒋情、人聲如沸埠况。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辕翰。三九已至,卻和暖如春狈谊,著一層夾襖步出監(jiān)牢的瞬間喜命,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工河劝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留壁榕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓赎瞎,卻偏偏與公主長得像牌里,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子务甥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

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