国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【深度學(xué)習(xí)】基于卷積神經(jīng)網(wǎng)絡(luò)(tensorflow)的人臉識(shí)別項(xiàng)目(四)

這篇具有很好參考價(jià)值的文章主要介紹了【深度學(xué)習(xí)】基于卷積神經(jīng)網(wǎng)絡(luò)(tensorflow)的人臉識(shí)別項(xiàng)目(四)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

經(jīng)過(guò)前段時(shí)間研究,從LeNet-5手寫(xiě)數(shù)字入門到最近研究的一篇天氣識(shí)別。我想干一票大的,因?yàn)槲冶旧韽氖碌木褪荂++/Qt開(kāi)發(fā),對(duì)Qt還是比較熟悉,所以我想實(shí)現(xiàn)一個(gè)界面化的一個(gè)人臉識(shí)別。

對(duì)卷積神經(jīng)網(wǎng)絡(luò)的概念比較陌生的可以看一看這篇文章:卷積實(shí)際上是干了什么
想了解神經(jīng)網(wǎng)絡(luò)的訓(xùn)練流程、或者環(huán)境搭建的可以看這篇文章:環(huán)境搭建與訓(xùn)練流程

如果想學(xué)習(xí)本項(xiàng)目請(qǐng)先去看
第一篇
:基于卷積神經(jīng)網(wǎng)絡(luò)(tensorflow)的人臉識(shí)別項(xiàng)目(一)
第二篇:基于卷積神經(jīng)網(wǎng)絡(luò)(tensorflow)的人臉識(shí)別項(xiàng)目(二)
第三篇:基于卷積神經(jīng)網(wǎng)絡(luò)(tensorflow)的人臉識(shí)別項(xiàng)目(三)

基本思路

具體步驟如下:

  1. 首先需要收集數(shù)據(jù),我的想法是通過(guò)OpenCV調(diào)用攝像頭進(jìn)行收集人臉照片。
  2. 然后進(jìn)行預(yù)處理,主要是對(duì)數(shù)據(jù)集分類,訓(xùn)練集、驗(yàn)證集、測(cè)試集。
  3. 開(kāi)始訓(xùn)練模型,提前創(chuàng)建好標(biāo)簽鍵值對(duì)。
  4. 測(cè)試人臉識(shí)別效果,通過(guò)OpenCV捕獲人臉照片然后對(duì)圖片進(jìn)行預(yù)處理最后傳入模型中,然后將識(shí)別的結(jié)果通過(guò)文字的形式打印在屏幕上,以此循環(huán),直到輸入q退出。

本篇主要是對(duì)上述步驟中的第四步進(jìn)行實(shí)現(xiàn)。最后分享整個(gè)全流程的完整項(xiàng)目代碼。

測(cè)試人臉識(shí)別效果

設(shè)計(jì)思路

通過(guò)OpenCV打開(kāi)攝像頭捕捉人臉區(qū)域,然后對(duì)圖片進(jìn)行預(yù)處理(如灰度化、歸一化等等),然后加載模型,把處理后的圖片放入模型中進(jìn)行預(yù)測(cè),然后對(duì)預(yù)測(cè)的結(jié)果進(jìn)行一個(gè)精度過(guò)濾就是對(duì)識(shí)別率低于90%的結(jié)果認(rèn)為識(shí)別不準(zhǔn)確,就會(huì)輸出other表示不能高度識(shí)別。正常情況下輸出每個(gè)文件所對(duì)應(yīng)的label。

詳細(xì)代碼

加載模型

將我們之前訓(xùn)練好的模型通過(guò)load_model方法進(jìn)行加載。

	MODEL_PATH = './me.face.model.h5'
    def load_model(self, file_path=MODEL_PATH):
        self.model = load_model(file_path)

人臉預(yù)測(cè)

這里對(duì)圖片進(jìn)行了歸一化處理,并對(duì)預(yù)測(cè)結(jié)果進(jìn)行了精度過(guò)濾。
注意K.image_dim_ordering() =\= 'th': 如果報(bào)錯(cuò)的話請(qǐng)?zhí)鎿Q為K.image_data_format() == 'channels_first'channels_last”對(duì)應(yīng)原本的“tf”,“channels_first”對(duì)應(yīng)原本的“th”。

    def face_predict(self, image):
        if K.image_data_format() == 'channels_first' and image.shape != (1, 3, IMAGE_SIZE, IMAGE_SIZE):
            image = resize_image(image)  # 尺寸必須與訓(xùn)練集一致都應(yīng)該是IMAGE_SIZE x IMAGE_SIZE
            image = image.reshape((1, 3, IMAGE_SIZE, IMAGE_SIZE))  # 與模型訓(xùn)練不同,這次只是針對(duì)1張圖片進(jìn)行預(yù)測(cè)
        elif K.image_data_format() == 'channels_last' and image.shape != (1, IMAGE_SIZE, IMAGE_SIZE, 3):
            image = resize_image(image)
            image = image.reshape((1, IMAGE_SIZE, IMAGE_SIZE, 3))

        # 浮點(diǎn)并歸一化
        image = image.astype('float32')
        image /= 255

        # 給出輸入屬于各個(gè)類別的概率
        result = self.model.predict_proba(image)
        print('result:', result)
        my_result = list(result[0]).index(max(result[0]))
        max_result = max(result[0])
        print("result最大值下標(biāo):", my_result)
        if max_result > 0.90:
            return my_result
        else:
            return -1

主要邏輯

主要分為以下幾步驟:

  1. 加載模型
  2. 預(yù)處理(設(shè)置攝像頭、人臉區(qū)域的邊框顏色、haar分類器的路徑、label數(shù)組等)
  3. 捕獲一幀圖片
  4. 對(duì)圖片灰度化
  5. 計(jì)算出人臉區(qū)域并框出
  6. 將人臉區(qū)域交給識(shí)別模型進(jìn)行識(shí)別
  7. 將識(shí)別結(jié)果進(jìn)行屏幕打印
  8. 然后3-7步驟循環(huán)。
  9. 輸入q退出識(shí)別,然后釋放所占用的資源

這個(gè)邏輯不是很復(fù)雜,下面直接進(jìn)行代碼展示,在代碼中也有詳細(xì)的注釋說(shuō)明:

import cv2
from keras_train import Model

if __name__ == '__main__':
    model = Model()# 加載模型
    model.load_model(file_path='./model/me.face.model.h5')
    
    color = (0, 255, 0)# 框住人臉的矩形邊框顏色
    
    cap = cv2.VideoCapture(0)# 捕獲指定攝像頭的實(shí)時(shí)視頻流
    
    cascade_path = "./model/haarcascade_frontalface_alt2.xml"# 人臉識(shí)別分類器本地存儲(chǔ)路徑

    # 循環(huán)檢測(cè)識(shí)別人臉
    while True:
        _, frame = cap.read()  # 讀取一幀視頻

        # 圖像灰化,降低計(jì)算復(fù)雜度
        frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        # 使用人臉識(shí)別分類器,讀入分類器
        cascade = cv2.CascadeClassifier(cascade_path)

        # 利用分類器識(shí)別出哪個(gè)區(qū)域?yàn)槿四?/span>
        faceRects = cascade.detectMultiScale(frame_gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
        if len(faceRects) > 0:
            for faceRect in faceRects:
                x, y, w, h = faceRect

                # 截取臉部圖像提交給模型識(shí)別這是誰(shuí)
                image = frame[y - 10: y + h + 10, x - 10: x + w + 10]
                faceID = model.face_predict(image)

                # 
                human = {0: 'use2', 1: 'use3', 2: 'use4', -1: 'others', 3: 'use5', 4: 'LinXi07',
                         5: 'use7', 6: 'use8', 7: 'use1', 8: 'use9'}

                cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, thickness=2)

                # 文字提示是誰(shuí)
                cv2.putText(frame, human[faceID],
                            (x + 30, y + 30),  # 坐標(biāo)
                            cv2.FONT_HERSHEY_SIMPLEX,  # 字體
                            1,  # 字號(hào)
                            (255, 0, 255),  # 顏色
                            2)  # 字的線寬

        cv2.imshow("Face Identification System", frame)

        # 等待10毫秒看是否有按鍵輸入
        k = cv2.waitKey(10)
        # 如果輸入q則退出循環(huán)
        if k & 0xFF == ord('q'):
            break

    # 釋放攝像頭并銷毀所有窗口
    cap.release()
    cv2.destroyAllWindows()

測(cè)試效果

這里對(duì)模型進(jìn)行測(cè)試,并支持多個(gè)人臉同時(shí)識(shí)別,且識(shí)別率較高。(忽略掉人臉
基于卷積神經(jīng)網(wǎng)絡(luò)的人臉識(shí)別,深度學(xué)習(xí),深度學(xué)習(xí),cnn,tensorflow,人工智能,神經(jīng)網(wǎng)絡(luò)

總結(jié)

從最開(kāi)始的收集數(shù)據(jù)到中間的預(yù)處理再到后來(lái)的模型建立到最后的測(cè)試效果,這一路非常坎坷,不是數(shù)據(jù)格式不匹配導(dǎo)致報(bào)錯(cuò),就是版本不匹配來(lái)回重裝環(huán)境再就是模型識(shí)別率上不去。總算把這個(gè)完整的做出來(lái)了,路途坎坷但收獲不菲。讓我們一起加油吧!?。。?/p>

所有代碼

這里我以文件進(jìn)行分類,總共四個(gè)文件。

文件名 說(shuō)明
frame_capture.py 制作數(shù)據(jù)集
keras_train.py 訓(xùn)練模型 評(píng)估模型
load_data.py 加載數(shù)據(jù),預(yù)處理
face_predict_use_keras.py 預(yù)測(cè)模型

然后deep_learning用來(lái)存放每個(gè)人的照片。model用來(lái)存放模型好的模型以及harr分類器。
基于卷積神經(jīng)網(wǎng)絡(luò)的人臉識(shí)別,深度學(xué)習(xí),深度學(xué)習(xí),cnn,tensorflow,人工智能,神經(jīng)網(wǎng)絡(luò)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-796797.html

face_predict_use_keras.py

import cv2
import sys

def catch_usb_video(window_name, camera_idx):
    '''使用cv2.imshow()的時(shí)候,如果圖片太大,會(huì)顯示不全并且無(wú)法調(diào)整。
    因此在cv2.imshow()的前面加上這樣的一個(gè)語(yǔ)句:cv2.namedWindow('image', 0),
    得到的圖像框就可以自行調(diào)整大小,可以拉伸進(jìn)行自由調(diào)整。'''
    cv2.namedWindow(window_name, 0)

    # 視頻來(lái)源,可以來(lái)自一段已存好的視頻,也可以直接來(lái)自USB攝像頭
    cap = cv2.VideoCapture(camera_idx)

    # 告訴OpenCV使用人臉識(shí)別分類器  級(jí)聯(lián)分類器
    '''
    Haar特征是一種反映圖像的灰度變化的,像素分模塊求差值的一種特征。它分為三類:邊緣特征、線性特征、中心特征和對(duì)角線特征。
    '''
    classfier = cv2.CascadeClassifier("./model/haarcascade_frontalface_alt2.xml")
    # 識(shí)別出人臉后要畫(huà)的邊框的顏色,RGB格式
    color = (0, 0, 255)
    num = 0
    while cap.isOpened():
        ok, frame = cap.read()  # 讀取一幀數(shù)據(jù)
        if not ok:
            break
            # 將當(dāng)前幀轉(zhuǎn)換成灰度圖像
        grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # 人臉檢測(cè),1.2和2分別為圖片縮放比例和需要檢測(cè)的有效點(diǎn)數(shù)
        faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
        #  faceRects = [405 237 222 222]
        if len(faceRects) > 0:  # 大于0則檢測(cè)到人臉
            for faceRect in faceRects:  # 單獨(dú)框出每一張人臉
                # 在原圖上框出需要保存的圖
                x, y, w, h = faceRect
                cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2)
                # 將當(dāng)前幀保存為圖片
                # frame 是原圖,(x - 10, y - 10) 是圖片的左上角的那個(gè)點(diǎn),(x + w + 10, y + h + 10)是圖片右下角的點(diǎn)
                # color, 2 顏色和線的寬度
                img_name = '%s/%d.jpg' % ('./deep_learning/zm', num)
                image = frame[y - 10: y + h + 10, x - 10: x + w + 10]
                cv2.imwrite(img_name, image)
                num += 1
                if num > (500):  # 如果超過(guò)指定最大保存數(shù)量退出循環(huán)
                    break
            # 畫(huà)出矩形框
            cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2)
            # 顯示當(dāng)前捕捉到了多少人臉圖片了,這樣站在那里被拍攝時(shí)心里有個(gè)數(shù),不用兩眼一抹黑傻等著
            font = cv2.FONT_HERSHEY_SIMPLEX
            cv2.putText(frame, 'num:%d' % (num), (x + 30, y + 30), font, 1, (255, 0, 255), 4)
            # 超過(guò)指定最大保存數(shù)量結(jié)束程序
        if num > (500):
            break
        # 顯示圖像
        cv2.imshow(window_name, frame)
        c = cv2.waitKey(1)
        if c & 0xFF == ord('q'):
            break
    # 釋放攝像頭并銷毀所有窗口
    cap.release()
    cv2.destroyAllWindows()


if __name__ == '__main__':
    catch_usb_video("face", 0)

keras_train.py

import random
from sklearn.model_selection import train_test_split
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, MaxPooling2D
from keras.optimizers import SGD
from keras.utils import np_utils
from keras.models import load_model
from keras import backend as K
from load_data import load_dataset, resize_image, IMAGE_SIZE

class Dataset:
    def __init__(self, path_name):
        # 訓(xùn)練集
        self.train_images = None
        self.train_labels = None

        # 驗(yàn)證集
        self.valid_images = None
        self.valid_labels = None

        # 測(cè)試集
        self.test_images = None
        self.test_labels = None

        # 數(shù)據(jù)集加載路徑
        self.path_name = path_name

        # 當(dāng)前庫(kù)采用的維度順序
        self.input_shape = None

    # 加載數(shù)據(jù)集并按照交叉驗(yàn)證的原則劃分?jǐn)?shù)據(jù)集并進(jìn)行相關(guān)預(yù)處理工作
    def load(self, img_rows=IMAGE_SIZE, img_cols=IMAGE_SIZE,
             img_channels=3, nb_classes=3):
        # 加載數(shù)據(jù)集到內(nèi)存
        images, labels = load_dataset(self.path_name)

        train_images, valid_images, train_labels, valid_labels = train_test_split(images, labels, test_size=0.2,
                                                                                  random_state=random.randint(0, 100))
        _, test_images, _, test_labels = train_test_split(images, labels, test_size=0.5,
                                                          random_state=random.randint(0, 100))

        # 當(dāng)前的維度順序如果為'th',則輸入圖片數(shù)據(jù)時(shí)的順序?yàn)椋篶hannels,rows,cols,否則:rows,cols,channels
        # 這部分代碼就是根據(jù)keras庫(kù)要求的維度順序重組訓(xùn)練數(shù)據(jù)集
       # if K.image_dim_ordering() == 'th':  “channels_last”對(duì)應(yīng)原本的“tf”,“channels_first”對(duì)應(yīng)原本的“th”。
        if K.image_data_format() == 'channels_first':
            train_images = train_images.reshape(train_images.shape[0], img_channels, img_rows, img_cols)
            valid_images = valid_images.reshape(valid_images.shape[0], img_channels, img_rows, img_cols)
            test_images = test_images.reshape(test_images.shape[0], img_channels, img_rows, img_cols)
            self.input_shape = (img_channels, img_rows, img_cols)
        else:
            train_images = train_images.reshape(train_images.shape[0], img_rows, img_cols, img_channels)
            valid_images = valid_images.reshape(valid_images.shape[0], img_rows, img_cols, img_channels)
            test_images = test_images.reshape(test_images.shape[0], img_rows, img_cols, img_channels)
            self.input_shape = (img_rows, img_cols, img_channels)

            # 輸出訓(xùn)練集、驗(yàn)證集、測(cè)試集的數(shù)量
            print(train_images.shape[0], 'train samples')
            print(valid_images.shape[0], 'valid samples')
            print(test_images.shape[0], 'test samples')

            # 我們的模型使用categorical_crossentropy作為損失函數(shù),因此需要根據(jù)類別數(shù)量nb_classes將
            # 類別標(biāo)簽進(jìn)行one-hot編碼使其向量化,在這里我們的類別只有兩種,經(jīng)過(guò)轉(zhuǎn)化后標(biāo)簽數(shù)據(jù)變?yōu)槎S
            train_labels = np_utils.to_categorical(train_labels, nb_classes)
            valid_labels = np_utils.to_categorical(valid_labels, nb_classes)
            test_labels = np_utils.to_categorical(test_labels, nb_classes)

            # 像素?cái)?shù)據(jù)浮點(diǎn)化以便歸一化
            train_images = train_images.astype('float32')
            valid_images = valid_images.astype('float32')
            test_images = test_images.astype('float32')

            # 將其歸一化,圖像的各像素值歸一化到0~1區(qū)間
            train_images /= 255
            valid_images /= 255
            test_images /= 255

            self.train_images = train_images
            self.valid_images = valid_images
            self.test_images = test_images
            self.train_labels = train_labels
            self.valid_labels = valid_labels
            self.test_labels = test_labels


# CNN網(wǎng)絡(luò)模型類
class Model:
    def __init__(self):
        self.model = None

        # 建立模型

    def build_model(self, dataset, nb_classes=3):
        # 構(gòu)建一個(gè)空的網(wǎng)絡(luò)模型,它是一個(gè)線性堆疊模型,各神經(jīng)網(wǎng)絡(luò)層會(huì)被順序添加,專業(yè)名稱為序貫?zāi)P突蚓€性堆疊模型
        self.model = Sequential()

        # 以下代碼將順序添加CNN網(wǎng)絡(luò)需要的各層,一個(gè)add就是一個(gè)網(wǎng)絡(luò)層
        self.model.add(Convolution2D(32, 3, 3, border_mode='same',
                                     input_shape=dataset.input_shape))  # 1 2維卷積層
        self.model.add(Activation('relu'))  # 2 激活函數(shù)層

        self.model.add(Convolution2D(32, 3, 3))  # 3 2維卷積層
        self.model.add(Activation('relu'))  # 4 激活函數(shù)層

        self.model.add(MaxPooling2D(pool_size=(2, 2)))  # 5 池化層
        self.model.add(Dropout(0.25))  # 6 Dropout層

        self.model.add(Convolution2D(64, 3, 3, border_mode='same'))  # 7  2維卷積層
        self.model.add(Activation('relu'))  # 8  激活函數(shù)層

        self.model.add(Convolution2D(64, 3, 3))  # 9  2維卷積層
        self.model.add(Activation('relu'))  # 10 激活函數(shù)層

        self.model.add(MaxPooling2D(pool_size=(2, 2)))  # 11 池化層
        self.model.add(Dropout(0.25))  # 12 Dropout層

        self.model.add(Flatten())  # 13 Flatten層
        self.model.add(Dense(512))  # 14 Dense層,又被稱作全連接層
        self.model.add(Activation('relu'))  # 15 激活函數(shù)層
        self.model.add(Dropout(0.5))  # 16 Dropout層
        self.model.add(Dense(nb_classes))  # 17 Dense層
        self.model.add(Activation('softmax'))  # 18 分類層,輸出最終結(jié)果

        # 輸出模型概況
        self.model.summary()

        # 訓(xùn)練模型

    def train(self, dataset, batch_size=20, nb_epoch=10, data_augmentation=True):
        # 參數(shù)batch_size的作用即在于此,其指定每次迭代訓(xùn)練樣本的數(shù)量
        # nb_epoch 訓(xùn)練輪換次數(shù)
        sgd = SGD(lr=0.01, decay=1e-6,
                  momentum=0.9, nesterov=True)  # 采用SGD+momentum的優(yōu)化器進(jìn)行訓(xùn)練,首先生成一個(gè)優(yōu)化器對(duì)象
        self.model.compile(loss='categorical_crossentropy',
                           optimizer=sgd,
                           metrics=['accuracy'])  # 完成實(shí)際的模型配置工作

        # 不使用數(shù)據(jù)提升,所謂的提升就是從我們提供的訓(xùn)練數(shù)據(jù)中利用旋轉(zhuǎn)、翻轉(zhuǎn)、加噪聲等方法創(chuàng)造新的
        # 訓(xùn)練數(shù)據(jù),有意識(shí)的提升訓(xùn)練數(shù)據(jù)規(guī)模,增加模型訓(xùn)練量
        if not data_augmentation:
            self.model.fit(dataset.train_images,
                           dataset.train_labels,
                           batch_size=batch_size,
                           nb_epoch=nb_epoch,
                           validation_data=(dataset.valid_images, dataset.valid_labels),
                           shuffle=True)
        # 使用實(shí)時(shí)數(shù)據(jù)提升
        else:
            # 定義數(shù)據(jù)生成器用于數(shù)據(jù)提升,其返回一個(gè)生成器對(duì)象datagen,datagen每被調(diào)用一
            # 次其生成一組數(shù)據(jù)(順序生成),節(jié)省內(nèi)存,其實(shí)就是python的數(shù)據(jù)生成器
            datagen = ImageDataGenerator(
                featurewise_center=False,  # 是否使輸入數(shù)據(jù)去中心化(均值為0),
                samplewise_center=False,  # 是否使輸入數(shù)據(jù)的每個(gè)樣本均值為0
                featurewise_std_normalization=False,  # 是否數(shù)據(jù)標(biāo)準(zhǔn)化(輸入數(shù)據(jù)除以數(shù)據(jù)集的標(biāo)準(zhǔn)差)
                samplewise_std_normalization=False,  # 是否將每個(gè)樣本數(shù)據(jù)除以自身的標(biāo)準(zhǔn)差
                zca_whitening=False,  # 是否對(duì)輸入數(shù)據(jù)施以ZCA白化
                rotation_range=20,  # 數(shù)據(jù)提升時(shí)圖片隨機(jī)轉(zhuǎn)動(dòng)的角度(范圍為0~180)
                width_shift_range=0.2,  # 數(shù)據(jù)提升時(shí)圖片水平偏移的幅度(單位為圖片寬度的占比,0~1之間的浮點(diǎn)數(shù))
                height_shift_range=0.2,  # 同上,只不過(guò)這里是垂直
                horizontal_flip=True,  # 是否進(jìn)行隨機(jī)水平翻轉(zhuǎn)
                vertical_flip=False)  # 是否進(jìn)行隨機(jī)垂直翻轉(zhuǎn)

            # 計(jì)算整個(gè)訓(xùn)練樣本集的數(shù)量以用于特征值歸一化、ZCA白化等處理
            datagen.fit(dataset.train_images)

            # 利用生成器開(kāi)始訓(xùn)練模型
            self.model.fit_generator(datagen.flow(dataset.train_images, dataset.train_labels,
                                                  batch_size=batch_size),
                                     samples_per_epoch=dataset.train_images.shape[0],
                                     nb_epoch=nb_epoch,
                                     validation_data=(dataset.valid_images, dataset.valid_labels))

    MODEL_PATH = './me.face.model.h5'

    def save_model(self, file_path=MODEL_PATH):
        self.model.save(file_path)

    def load_model(self, file_path=MODEL_PATH):
        self.model = load_model(file_path)

    def evaluate(self, dataset):
        score = self.model.evaluate(dataset.test_images, dataset.test_labels, verbose=1)
        print("%s: %.2f%%" % (self.model.metrics_names[1], score[1] * 100))

    def face_predict(self, image):
        # if K.image_dim_ordering() == 'th':  “channels_last”對(duì)應(yīng)原本的“tf”,“channels_first”對(duì)應(yīng)原本的“th”。
        if K.image_data_format() == 'channels_first' and image.shape != (1, 3, IMAGE_SIZE, IMAGE_SIZE):
            image = resize_image(image)  # 尺寸必須與訓(xùn)練集一致都應(yīng)該是IMAGE_SIZE x IMAGE_SIZE
            image = image.reshape((1, 3, IMAGE_SIZE, IMAGE_SIZE))  # 與模型訓(xùn)練不同,這次只是針對(duì)1張圖片進(jìn)行預(yù)測(cè)
        elif K.image_data_format() == 'channels_last' and image.shape != (1, IMAGE_SIZE, IMAGE_SIZE, 3):
            image = resize_image(image)
            image = image.reshape((1, IMAGE_SIZE, IMAGE_SIZE, 3))

        # 浮點(diǎn)并歸一化
        image = image.astype('float32')
        image /= 255

        # 給出輸入屬于各個(gè)類別的概率
        result = self.model.predict_proba(image)
        print('result:', result)
        my_result = list(result[0]).index(max(result[0]))
        max_result = max(result[0])
        print("result最大值下標(biāo):", my_result)
        if max_result > 0.90:
            return my_result
        else:
            return -1



if __name__ == '__main__':
    dataset = Dataset('.\\deep_learning')
    dataset.load(nb_classes=9)

    # 訓(xùn)練模型
    model = Model()
    model.build_model(dataset, nb_classes=9)
    model.train(dataset)
    model.save_model(file_path='./model/me.face.model.h5')

    # 評(píng)估模型,確認(rèn)模型的精度是否能達(dá)到要求
    model = Model()
    model.load_model(file_path='./model/me.face.model.h5')
    model.evaluate(dataset)

load_data.py

import os
import numpy as np
import cv2

IMAGE_SIZE = 64


# 按照指定圖像大小調(diào)整尺寸
def resize_image(image, height=IMAGE_SIZE, width=IMAGE_SIZE):
    top, bottom, left, right = (0, 0, 0, 0)

    # 獲取圖像尺寸
    h, w, _ = image.shape

    # 對(duì)于長(zhǎng)寬不相等的圖片,找到最長(zhǎng)的一邊
    longest_edge = max(h, w)

    # 計(jì)算短邊需要增加多上像素寬度使其與長(zhǎng)邊等長(zhǎng)
    if h < longest_edge:
        dh = longest_edge - h
        top = dh // 2
        bottom = dh - top
    elif w < longest_edge:
        dw = longest_edge - w
        left = dw // 2
        right = dw - left
    else:
        pass

        # RGB顏色
    BLACK = [0, 0, 0]

    # 給圖像增加邊界,是圖片長(zhǎng)、寬等長(zhǎng),cv2.BORDER_CONSTANT指定邊界顏色由value指定
    constant = cv2.copyMakeBorder(image, top, bottom, left, right, cv2.BORDER_CONSTANT, value=BLACK)

    # 調(diào)整圖像大小并返回
    return cv2.resize(constant, (height, width))


# 讀取訓(xùn)練數(shù)據(jù)
images = []
labels = []


def read_path(path_name):
    for dir_item in os.listdir(path_name):
        # 從初始路徑開(kāi)始疊加,合并成可識(shí)別的操作路徑
        full_path = os.path.abspath(os.path.join(path_name, dir_item))
        #
        if os.path.isdir(full_path):  # 如果是文件夾,繼續(xù)遞歸調(diào)用
            read_path(full_path)
        else:  # 文件
            if dir_item.endswith('.jpg'):
                image = cv2.imread(full_path)
                
                image = resize_image(image, IMAGE_SIZE, IMAGE_SIZE)

                images.append(image)
                labels.append(path_name)

    return images, labels

# 給文件夾后綴,加標(biāo)注,使其向量化,如果添加新的人,就可以對(duì)應(yīng)文件夾和下標(biāo) 
# 這里我隨便寫(xiě)的label  因?yàn)樯婕暗诫[私。
def indentify(label):
    if label.endswith('use'):
        return 0
    elif label.endswith('use'):
        return 1
    elif label.endswith('use'):
        return 2
    elif label.endswith('use'):
        return 3
    elif label.endswith('use'):
        return 4
    elif label.endswith('use'):
        return 5
    elif label.endswith('use'):
        return 6
    elif label.endswith('use'):
        return 7
    elif label.endswith('use'):
        return 8



# 從指定路徑讀取訓(xùn)練數(shù)據(jù)
def load_dataset(path_name):
    images, labels = read_path(path_name)

    # 將輸入的所有圖片轉(zhuǎn)成四維數(shù)組,尺寸為(圖片數(shù)量*IMAGE_SIZE*IMAGE_SIZE*3)
    # 圖片為64 * 64像素,一個(gè)像素3個(gè)顏色值(RGB)
    images = np.array(images)
    print(images.shape)

    labels = np.array([indentify(label) for label in labels])

    print(images,labels)
    return images, labels


if __name__ == '__main__':
    images, labels = load_dataset('./deep_learning')

face_predict_use_keras.py

import cv2
from keras_train import Model

if __name__ == '__main__':
    # 加載模型
    model = Model()
    model.load_model(file_path='./model/me.face.model.h5')

    # 框住人臉的矩形邊框顏色
    color = (0, 255, 0)

    # 捕獲指定攝像頭的實(shí)時(shí)視頻流
    cap = cv2.VideoCapture(0)

    # 人臉識(shí)別分類器本地存儲(chǔ)路徑
    cascade_path = "./model/haarcascade_frontalface_alt2.xml"

    # 循環(huán)檢測(cè)識(shí)別人臉
    while True:
        _, frame = cap.read()  # 讀取一幀視頻

        # 圖像灰化,降低計(jì)算復(fù)雜度
        frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        # 使用人臉識(shí)別分類器,讀入分類器
        cascade = cv2.CascadeClassifier(cascade_path)

        # 利用分類器識(shí)別出哪個(gè)區(qū)域?yàn)槿四?/span>
        faceRects = cascade.detectMultiScale(frame_gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
        if len(faceRects) > 0:
            for faceRect in faceRects:
                x, y, w, h = faceRect

                # 截取臉部圖像提交給模型識(shí)別這是誰(shuí)
                image = frame[y - 10: y + h + 10, x - 10: x + w + 10]
                faceID = model.face_predict(image)

                # 這里我隨便寫(xiě)的,因?yàn)樯婕暗诫[私。
                human = {0: 'use3', 1: 'use4', 2: 'use8', -1: 'others', 3: 'use88', 4: 'LinXi07',
                         5: 'use2', 6: 'use', 7: 'use1', 8: 'use7'}

                cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, thickness=2)

                # 文字提示是誰(shuí)
                cv2.putText(frame, human[faceID],
                            (x + 30, y + 30),  # 坐標(biāo)
                            cv2.FONT_HERSHEY_SIMPLEX,  # 字體
                            1,  # 字號(hào)
                            (255, 0, 255),  # 顏色
                            2)  # 字的線寬

        cv2.imshow("Face Identification System", frame)

        # 等待10毫秒看是否有按鍵輸入
        k = cv2.waitKey(10)
        # 如果輸入q則退出循環(huán)
        if k & 0xFF == ord('q'):
            break

    # 釋放攝像頭并銷毀所有窗口
    cap.release()
    cv2.destroyAllWindows()

以上就是全部代碼啦。有啥疑問(wèn)就評(píng)論區(qū)討論奧。

到了這里,關(guān)于【深度學(xué)習(xí)】基于卷積神經(jīng)網(wǎng)絡(luò)(tensorflow)的人臉識(shí)別項(xiàng)目(四)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包