1. 程式人生 > >人臉識別——基於CNN的模型實現

人臉識別——基於CNN的模型實現

本文是基於吳恩達《深度學習》卷積神經網路第四周習題而做。通常人臉識別問題分為兩類:人臉驗證和人臉識別,人臉驗證可以作為人臉識別的前提,具體的講解可以觀看達叔《深度學習》教程,在此預設大家對人臉識別問題已有了解。

所需的第三方庫如下,其中所用的資料集和輔助程式可點選此處下載。

from keras.models import Sequential
from keras.layers import Conv2D, ZeroPadding2D, Activation, Input, concatenate
from keras.models import Model
from keras.layers.normalization import BatchNormalization
from keras.layers.pooling import MaxPooling2D, AveragePooling2D
from keras.layers.merge import Concatenate
from keras.layers.core import Lambda, Flatten, Dense
from keras.initializers import glorot_uniform
from keras.engine.topology import Layer
from keras import backend as K
K.set_image_data_format('channels_first')
import cv2
import os
import numpy as np
from numpy import genfromtxt
import pandas as pd
import tensorflow as tf
from fr_utils import *
from inception_blocks_v2 import *

np.set_printoptions(threshold=np.nan)

1.人臉影象編碼

1.1 使用卷積計算編碼值 

想要對比兩張人臉影象是否為同一人,最直接的思路是按照畫素點逐一求距離,如果總和小於某個閾值則認為是同一人的不同影象,但這種方法很容易受到光照、背景等因素的影響,因此我們需要對輸入影象img進行一定程度的編碼,對編碼後的f(img)進行比較。

為了節省訓練模型的時間,我們採用已經訓練過的FaceNet模型的權重引數,此處達叔為我們提供了inception模型,通過該模型我們可以將輸入影象轉化為128維的向量,即影象編碼後得到一個128維的編碼值。inception模型在文首連結中可下載,名為inception_blocks.py.

網路使用96x96x3大小的影象作為輸入,假設batch_size = m, 則輸入張量的shape為(m, n_C, n_H, n_W) = (m, 3, 96,96)。輸出的shape為(m,128),因為將影象編碼成128維。

呼叫inception_blocks.py中的模型faceRecoModel

FRmodel = faceRecoModel(input_shape=(3,96,96))

faceRecoModel的完整程式碼如下

import tensorflow as tf
import numpy as np
import os
from numpy import genfromtxt
from keras import backend as K
from keras.layers import Conv2D, ZeroPadding2D, Activation, Input, concatenate
from keras.models import Model
from keras.layers.normalization import BatchNormalization
from keras.layers.pooling import MaxPooling2D, AveragePooling2D
import fr_utils
from keras.layers.core import Lambda, Flatten, Dense

def inception_block_1a(X):
    """
    Implementation of an inception block
    """
    
    X_3x3 = Conv2D(96, (1, 1), data_format='channels_first', name ='inception_3a_3x3_conv1')(X)
    X_3x3 = BatchNormalization(axis=1, epsilon=0.00001, name = 'inception_3a_3x3_bn1')(X_3x3)
    X_3x3 = Activation('relu')(X_3x3)
    X_3x3 = ZeroPadding2D(padding=(1, 1), data_format='channels_first')(X_3x3)
    X_3x3 = Conv2D(128, (3, 3), data_format='channels_first', name='inception_3a_3x3_conv2')(X_3x3)
    X_3x3 = BatchNormalization(axis=1, epsilon=0.00001, name='inception_3a_3x3_bn2')(X_3x3)
    X_3x3 = Activation('relu')(X_3x3)
    
    X_5x5 = Conv2D(16, (1, 1), data_format='channels_first', name='inception_3a_5x5_conv1')(X)
    X_5x5 = BatchNormalization(axis=1, epsilon=0.00001, name='inception_3a_5x5_bn1')(X_5x5)
    X_5x5 = Activation('relu')(X_5x5)
    X_5x5 = ZeroPadding2D(padding=(2, 2), data_format='channels_first')(X_5x5)
    X_5x5 = Conv2D(32, (5, 5), data_format='channels_first', name='inception_3a_5x5_conv2')(X_5x5)
    X_5x5 = BatchNormalization(axis=1, epsilon=0.00001, name='inception_3a_5x5_bn2')(X_5x5)
    X_5x5 = Activation('relu')(X_5x5)

    X_pool = MaxPooling2D(pool_size=3, strides=2, data_format='channels_first')(X)
    X_pool = Conv2D(32, (1, 1), data_format='channels_first', name='inception_3a_pool_conv')(X_pool)
    X_pool = BatchNormalization(axis=1, epsilon=0.00001, name='inception_3a_pool_bn')(X_pool)
    X_pool = Activation('relu')(X_pool)
    X_pool = ZeroPadding2D(padding=((3, 4), (3, 4)), data_format='channels_first')(X_pool)

    X_1x1 = Conv2D(64, (1, 1), data_format='channels_first', name='inception_3a_1x1_conv')(X)
    X_1x1 = BatchNormalization(axis=1, epsilon=0.00001, name='inception_3a_1x1_bn')(X_1x1)
    X_1x1 = Activation('relu')(X_1x1)
        
    # CONCAT
    inception = concatenate([X_3x3, X_5x5, X_pool, X_1x1], axis=1)

    return inception

def inception_block_1b(X):
    X_3x3 = Conv2D(96, (1, 1), data_format='channels_first', name='inception_3b_3x3_conv1')(X)
    X_3x3 = BatchNormalization(axis=1, epsilon=0.00001, name='inception_3b_3x3_bn1')(X_3x3)
    X_3x3 = Activation('relu')(X_3x3)
    X_3x3 = ZeroPadding2D(padding=(1, 1), data_format='channels_first')(X_3x3)
    X_3x3 = Conv2D(128, (3, 3), data_format='channels_first', name='inception_3b_3x3_conv2')(X_3x3)
    X_3x3 = BatchNormalization(axis=1, epsilon=0.00001, name='inception_3b_3x3_bn2')(X_3x3)
    X_3x3 = Activation('relu')(X_3x3)

    X_5x5 = Conv2D(32, (1, 1), data_format='channels_first', name='inception_3b_5x5_conv1')(X)
    X_5x5 = BatchNormalization(axis=1, epsilon=0.00001, name='inception_3b_5x5_bn1')(X_5x5)
    X_5x5 = Activation('relu')(X_5x5)
    X_5x5 = ZeroPadding2D(padding=(2, 2), data_format='channels_first')(X_5x5)
    X_5x5 = Conv2D(64, (5, 5), data_format='channels_first', name='inception_3b_5x5_conv2')(X_5x5)
    X_5x5 = BatchNormalization(axis=1, epsilon=0.00001, name='inception_3b_5x5_bn2')(X_5x5)
    X_5x5 = Activation('relu')(X_5x5)

    X_pool = AveragePooling2D(pool_size=(3, 3), strides=(3, 3), data_format='channels_first')(X)
    X_pool = Conv2D(64, (1, 1), data_format='channels_first', name='inception_3b_pool_conv')(X_pool)
    X_pool = BatchNormalization(axis=1, epsilon=0.00001, name='inception_3b_pool_bn')(X_pool)
    X_pool = Activation('relu')(X_pool)
    X_pool = ZeroPadding2D(padding=(4, 4), data_format='channels_first')(X_pool)

    X_1x1 = Conv2D(64, (1, 1), data_format='channels_first', name='inception_3b_1x1_conv')(X)
    X_1x1 = BatchNormalization(axis=1, epsilon=0.00001, name='inception_3b_1x1_bn')(X_1x1)
    X_1x1 = Activation('relu')(X_1x1)

    inception = concatenate([X_3x3, X_5x5, X_pool, X_1x1], axis=1)

    return inception

def inception_block_1c(X):
    X_3x3 = fr_utils.conv2d_bn(X,
                           layer='inception_3c_3x3',
                           cv1_out=128,
                           cv1_filter=(1, 1),
                           cv2_out=256,
                           cv2_filter=(3, 3),
                           cv2_strides=(2, 2),
                           padding=(1, 1))

    X_5x5 = fr_utils.conv2d_bn(X,
                           layer='inception_3c_5x5',
                           cv1_out=32,
                           cv1_filter=(1, 1),
                           cv2_out=64,
                           cv2_filter=(5, 5),
                           cv2_strides=(2, 2),
                           padding=(2, 2))

    X_pool = MaxPooling2D(pool_size=3, strides=2, data_format='channels_first')(X)
    X_pool = ZeroPadding2D(padding=((0, 1), (0, 1)), data_format='channels_first')(X_pool)

    inception = concatenate([X_3x3, X_5x5, X_pool], axis=1)

    return inception

def inception_block_2a(X):
    X_3x3 = fr_utils.conv2d_bn(X,
                           layer='inception_4a_3x3',
                           cv1_out=96,
                           cv1_filter=(1, 1),
                           cv2_out=192,
                           cv2_filter=(3, 3),
                           cv2_strides=(1, 1),
                           padding=(1, 1))
    X_5x5 = fr_utils.conv2d_bn(X,
                           layer='inception_4a_5x5',
                           cv1_out=32,
                           cv1_filter=(1, 1),
                           cv2_out=64,
                           cv2_filter=(5, 5),
                           cv2_strides=(1, 1),
                           padding=(2, 2))

    X_pool = AveragePooling2D(pool_size=(3, 3), strides=(3, 3), data_format='channels_first')(X)
    X_pool = fr_utils.conv2d_bn(X_pool,
                           layer='inception_4a_pool',
                           cv1_out=128,
                           cv1_filter=(1, 1),
                           padding=(2, 2))
    X_1x1 = fr_utils.conv2d_bn(X,
                           layer='inception_4a_1x1',
                           cv1_out=256,
                           cv1_filter=(1, 1))
    inception = concatenate([X_3x3, X_5x5, X_pool, X_1x1], axis=1)

    return inception

def inception_block_2b(X):
    #inception4e
    X_3x3 = fr_utils.conv2d_bn(X,
                           layer='inception_4e_3x3',
                           cv1_out=160,
                           cv1_filter=(1, 1),
                           cv2_out=256,
                           cv2_filter=(3, 3),
                           cv2_strides=(2, 2),
                           padding=(1, 1))
    X_5x5 = fr_utils.conv2d_bn(X,
                           layer='inception_4e_5x5',
                           cv1_out=64,
                           cv1_filter=(1, 1),
                           cv2_out=128,
                           cv2_filter=(5, 5),
                           cv2_strides=(2, 2),
                           padding=(2, 2))
    
    X_pool = MaxPooling2D(pool_size=3, strides=2, data_format='channels_first')(X)
    X_pool = ZeroPadding2D(padding=((0, 1), (0, 1)), data_format='channels_first')(X_pool)

    inception = concatenate([X_3x3, X_5x5, X_pool], axis=1)

    return inception

def inception_block_3a(X):
    X_3x3 = fr_utils.conv2d_bn(X,
                           layer='inception_5a_3x3',
                           cv1_out=96,
                           cv1_filter=(1, 1),
                           cv2_out=384,
                           cv2_filter=(3, 3),
                           cv2_strides=(1, 1),
                           padding=(1, 1))
    X_pool = AveragePooling2D(pool_size=(3, 3), strides=(3, 3), data_format='channels_first')(X)
    X_pool = fr_utils.conv2d_bn(X_pool,
                           layer='inception_5a_pool',
                           cv1_out=96,
                           cv1_filter=(1, 1),
                           padding=(1, 1))
    X_1x1 = fr_utils.conv2d_bn(X,
                           layer='inception_5a_1x1',
                           cv1_out=256,
                           cv1_filter=(1, 1))

    inception = concatenate([X_3x3, X_pool, X_1x1], axis=1)

    return inception

def inception_block_3b(X):
    X_3x3 = fr_utils.conv2d_bn(X,
                           layer='inception_5b_3x3',
                           cv1_out=96,
                           cv1_filter=(1, 1),
                           cv2_out=384,
                           cv2_filter=(3, 3),
                           cv2_strides=(1, 1),
                           padding=(1, 1))
    X_pool = MaxPooling2D(pool_size=3, strides=2, data_format='channels_first')(X)
    X_pool = fr_utils.conv2d_bn(X_pool,
                           layer='inception_5b_pool',
                           cv1_out=96,
                           cv1_filter=(1, 1))
    X_pool = ZeroPadding2D(padding=(1, 1), data_format='channels_first')(X_pool)

    X_1x1 = fr_utils.conv2d_bn(X,
                           layer='inception_5b_1x1',
                           cv1_out=256,
                           cv1_filter=(1, 1))
    inception = concatenate([X_3x3, X_pool, X_1x1], axis=1)

    return inception

def faceRecoModel(input_shape):
    """
    Implementation of the Inception model used for FaceNet
    
    Arguments:
    input_shape -- shape of the images of the dataset

    Returns:
    model -- a Model() instance in Keras
    """
        
    # Define the input as a tensor with shape input_shape
    X_input = Input(input_shape)

    # Zero-Padding
    X = ZeroPadding2D((3, 3))(X_input)
    
    # First Block
    X = Conv2D(64, (7, 7), strides = (2, 2), name = 'conv1')(X)
    X = BatchNormalization(axis = 1, name = 'bn1')(X)
    X = Activation('relu')(X)
    
    # Zero-Padding + MAXPOOL
    X = ZeroPadding2D((1, 1))(X)
    X = MaxPooling2D((3, 3), strides = 2)(X)
    
    # Second Block
    X = Conv2D(64, (1, 1), strides = (1, 1), name = 'conv2')(X)
    X = BatchNormalization(axis = 1, epsilon=0.00001, name = 'bn2')(X)
    X = Activation('relu')(X)
    
    # Zero-Padding + MAXPOOL
    X = ZeroPadding2D((1, 1))(X)

    # Second Block
    X = Conv2D(192, (3, 3), strides = (1, 1), name = 'conv3')(X)
    X = BatchNormalization(axis = 1, epsilon=0.00001, name = 'bn3')(X)
    X = Activation('relu')(X)
    
    # Zero-Padding + MAXPOOL
    X = ZeroPadding2D((1, 1))(X)
    X = MaxPooling2D(pool_size = 3, strides = 2)(X)
    
    # Inception 1: a/b/c
    X = inception_block_1a(X)
    X = inception_block_1b(X)
    X = inception_block_1c(X)
    
    # Inception 2: a/b
    X = inception_block_2a(X)
    X = inception_block_2b(X)
    
    # Inception 3: a/b
    X = inception_block_3a(X)
    X = inception_block_3b(X)
    
    # Top layer
    X = AveragePooling2D(pool_size=(3, 3), strides=(1, 1), data_format='channels_first')(X)
    X = Flatten()(X)
    X = Dense(128, name='dense_layer')(X)
    
    # L2 normalization
    X = Lambda(lambda  x: K.l2_normalize(x,axis=1))(X)

    # Create model instance
    model = Model(inputs = X_input, outputs = X, name='FaceRecoModel')
        
    return model

網路的最後一層是全連線層設定128個神經元,保證了輸出的向量是128維的, 然後就可以使用這輸入的128維向量比對兩幅面部影象。

那麼如何判斷一個編碼方式是適用的呢?有如下兩個原則

  • 同一人的不同照片的編碼非常相似
  • 不同人的照片的編碼差距很大

上述的兩個原則在三元組損失函式中的體現就是:推近同一人的兩張影象的距離,拉遠兩張不同人的影象的距離。

1.2 Triplet損失函式

對於輸入影象x,我們將其編碼表示為f(x),f是神經網路計算得出的。

在訓練中使用的三元組為(A,P,N)

A:Anchor,某人臉影象

P:Positive,與A為同一人的影象

N:Negative,與A為不同人的影象

這些三元組是從訓練集中選取的,我們使用(A(i),P(i),N(i))作為第i個樣本的標註。在triplet損失函式中我們要確保A(i)到P(i)的距離與A(iN(i)到N(i)的距離相差alpha,通常取0.2.

triplet損失函式J為:

 注意公式右下角的+號,表示取max(z,0),程式碼如下:

def triplet_loss(y_true, y_pred, alpha = 0.2):
    '''
    Arguments:
    y_true -- true lables
    y_pred -- python list containing three objects:
            anchor -- shape(None, 128)
            positive -- shape(None, 128)
            negative -- shape(None, 128)
    returns:
    loss -- value of the loss
    '''
    anchor, positive, negative = y_pred[0], y_pred[1], y_pred[2]

    pos_dist = tf.reduce_sum(tf.square(tf.subtract(anchor, positive)))
    neg_dist = tf.reduce_sum(tf.square(tf.subtract(anchor, negative)))
    basic_loss = tf.add(tf.subtract(pos_dist, neg_dist), alpha)
    loss = tf.reduce_sum(tf.maximum(basic_loss, 0.))

    return loss
with tf.Session() as test:
    tf.set_random_seed(1)
    y_true = (None, None, None)
    y_pred = (tf.random_normal([3, 128], mean = 6, stddev = 0.1, seed = 1),
              tf.random_normal([3, 128], mean = 1, stddev = 1, seed = 1),
              tf.random_normal([3, 128], mean = 3, stddev = 4, seed = 1))
    loss = triplet_loss(y_true, y_pred)

    print("loss = " + st(loss.eval()))
loss = 350.026

2.下載訓練模型

由於訓練模型需要大量的資料和計算,我們就不重新訓練了。繼而採用一個事先訓練好的模型,這樣可以節省大量的時間。

FRmodel.compile(optimizer = 'adam', loss = triplet_loss, metrics = ['accuracy'])
load_weights_from_FaceNet(FRmodel)

如下是三個不同個體之間的編碼距離

3.應用模型 

現在我們可以使用這個模型進行人臉驗證和識別了,在這裡我們將Happy House問題進行優化,不僅要識別出Happy的表情,而且要識別出住客人臉。

3.1人臉驗證

首先我們要建立一個數據庫,包含每一個允許進入房間者的編碼向量,我們使用img_to_encoding(image_path, model) 函式來進行編碼,該函式是對每個特定的影象執行模型的前向傳播運算。

def img_to_encoding(image_path, model):
    img1 = cv2.imread(image_path, 1)
    img = img1[...,::-1]
    img = np.around(np.transpose(img, (2,0,1))/255.0, decimals=12)
    x_train = np.array([img])
    embedding = model.predict_on_batch(x_train)
    return embedding

執行下列程式碼生成資料庫,這個資料庫將每個人名對映為臉部的128維的向量

database = {}
database["danielle"] = img_to_encoding("images/danielle.png", FRmodel)
database["younes"] = img_to_encoding("images/younes.jpg", FRmodel)
database["tian"] = img_to_encoding("images/tian.jpg", FRmodel)
database["andrew"] = img_to_encoding("images/andrew.jpg", FRmodel)
database["kian"] = img_to_encoding("images/kian.jpg", FRmodel)
database["dan"] = img_to_encoding("images/dan.jpg", FRmodel)
database["sebastiano"] = img_to_encoding("images/sebastiano.jpg", FRmodel)
database["bertrand"] = img_to_encoding("images/bertrand.jpg", FRmodel)
database["kevin"] = img_to_encoding("images/kevin.jpg", FRmodel)
database["felix"] = img_to_encoding("images/felix.jpg", FRmodel)
database["benoit"] = img_to_encoding("images/benoit.jpg", FRmodel)
database["arnaud"] = img_to_encoding("images/arnaud.jpg", FRmodel)

我們編寫verify()函式來驗證門前攝像頭拍攝到的圖片來識別入門者是否具有資格,這個函式實現起來一共分三步:

(1)計算攝像頭拍攝圖片的編碼;

(2)與資料庫中的資格人員進行比對,計算編碼之間的距離;

(3)如果編碼的距離小於0.7則開門。

def verify(image_path, identity, database, model):

    encoding = img_to_encoding(image_path, model)
    dist = np.linalg.norm(encoding - database[identity])
    if dist < 0.7:
        print("It's " + str(identity) + "welcome home!")
        door_open = True
    else:
        print("It's not" + str(identity) + "please go away")
        door_open = False

    return dist, door_open
verify("images/camera_0.jpg", "younes", database, FRmodel)

假設younes想進入happy house並且攝像頭捕捉到了他的頭像(儲存為“images/camera_0.jpg”),我們試用verify函式來比對看看會得到怎樣的結果。.

It's younes welcome home!

假設benoit借用了kian的ID卡試圖進入happy house,攝像頭捕捉到了他的頭像(儲存為“images/camera_2.jpg”),我們來執行verify函式看看是否會讓他進入。

It's not kian please go away

3.2 人臉識別

我們已經成功的訓練好了人臉驗證系統,但是該系統有一個棘手的問題,就是如果某人的ID卡丟失那麼他將無法回家,我們可以將人臉驗證系統升級為人臉識別系統,人們將不再需要攜帶ID卡,系統會比對攝像頭拍攝到的照片和資料庫中的資訊,如果一致則會讓此人通過。 

下面我們編寫who_is_it()函式來驗證門前攝像頭拍攝到的圖片來識別入門者是否具有資格,這個函式實現起來一共分兩步:

(1)計算目標影象的編碼矩陣;

(2)從資料庫中找出與目標影象編碼矩陣有最小距離的編碼。

def who_is_it(image_path, database, model):
    encoding = img_to_encoding(image_path, model)
    min_dist = 100
    for (name, db_enc) in database.items():
        dist = np.linalg.norm(encoding - db_enc)
        if dist < min_dist:
            min_dist = dist
            identity = name

    if min_dist > 0.7:
        print("Not in the database.")

    else:
        print("It's " + str(identity) + ", the distance is " + str(min_dist))

    return min_dist, identity

假設younes 想進入happy house並且攝像頭捕捉到了他的頭像(儲存為“images/camera_0.jpg”)

who_is_it("images/camera_0.jpg", database, FRmodel)

結果為:

It's younes, the distance is 0.6710074

現在我們的人臉識別系統已經運轉正常了。

4.參考文獻

相關推薦

人臉識別——基於CNN模型實現

本文是基於吳恩達《深度學習》卷積神經網路第四周習題而做。通常人臉識別問題分為兩類:人臉驗證和人臉識別,人臉驗證可以作為人臉識別的前提,具體的講解可以觀看達叔《深度學習》教程,在此預設大家對人臉識別問題已有了解。 所需的第三方庫如下,其中所用的資料集和輔助程式可點選此處下載。

基於PCA和SVM人臉識別之二.MATLAB實現

此文章中MATLAB實現均根據《數字影象處理與機器視覺----Visual c++ 與MATLAB實現》一書,我所獲得的基礎知識也大多源於此書,感謝!                          下面將我根據教程建立的工程以及敲擊的程式碼塊一一奉上,供日後參閱。建立以專

OpenCV實踐之路——人臉識別之二模型訓練

本文由@星沉閣冰不語出品,轉載請註明作者和出處。在之前的部落格人臉識別之一資料收集和預處理之中,已經下載了ORL人臉資料庫,並且為了識別自己的人臉寫了一個拍照程式自拍。之後對拍的照片進行人臉識別和提取,最後我們得到了一個包含自己的人臉照片的資料夾s41。在部落格的最後我們提到

openCV人臉識別三種演算法實現(官網翻譯)

 怎樣使用OpenCV進行人臉識別 友情提示,要看懂程式碼前,你得先知道OpenCV的安裝和配置,會用C++,用過一些OpenCV函式。基本的影象處理和矩陣知識也是需要的。[gm:我是簫鳴的註釋]由於我僅僅是翻譯,對於六級才過的我,肯定有一些翻譯錯的或

呼叫騰訊優圖開放平臺進行人臉識別-Java呼叫API實現

http://open.youtu.qq.com官網 直接234. 第一步:鑑權服務技術方案 Java程式碼實現如下 import java.util.Date; import com.baidu.aip.util.Base64Util; /** * 獲取Autho

人臉識別之DeepFace模型

之前瞭解過了DeepID和FaceNet網路結構,但根據一些部落格的說法DeepFace是深度學習用在人臉識別領域的奠基之做,所以也看了一下DeepFace的理論,現在主要將自己的理解梳理一下,如理解有誤希望能及時指出。 首先還是給出文章的地址,想看文章的朋友可以點選連結下

端到端的OCR:基於CNN實現

OCR是一個古老的問題。這裡我們考慮一類特殊的OCR問題,就是驗證碼的識別。傳統做驗證碼的識別,需要經過如下步驟: 1. 二值化 2. 字元分割 3. 字元識別 這裡最難的就是分割。如果字元之間有粘連,那分割起來就無比痛苦了。 最近研究深度學習,發現有人做端到端的O

想將演算法進一步開發嗎?手把手教你搭建基於CNN模型的Flask Web應用

對於機器學習和人工智慧研究人員而言,好多人都只是構建好模型後就沒有進一步處理了,停留在一個比較粗糙的模型上面,沒有將其變成一個產品,其實好多創業型人工智慧公司都是設計好模型後,將其轉化成產品,之後再推向市場。每一個深度學習研究者心中或多或少都想成為一名創業者,但不知道超哪個方

人臉識別自己訓練模型

1資料準備。Python程式碼。圖片要記得同一尺寸,放到sample_positive資料夾裡。負樣本資料要Python趴圖片。主要生出二進位制的vector檔案,執行bat時候系統報錯少了D:\opencv\opencv3-3\opencv\build\x64\vc14\bin 裡面opencv_world

LVS基於DR模型實現簡單負載均衡叢集和持久連線

本文實現在RS1上安裝DISCUZ論壇,通過資料同步將RS1上資料目錄下的內容推送到RS2,兩臺伺服器提供同一個論壇服務,並實現資料同步,同時RS1與RS2都可同時提供http和https服務,Director上設定規則實現持久連線 基於LVS-DR模型部署d

人臉識別基於Android

前言 人工智慧時代快速來臨,其中人臉識別是當前比較熱門的技術,在國內也越來越多的運用,例如刷臉打卡、刷臉App,身份識別,人臉門禁

略講基於cnn人臉識別模型的網路結構和度量設計

前言 人臉識別系統基本流程如下: 比如Openface,SeetaFace的系統都是可以學習一下的。強調一下這篇文章主要是講的是特徵提取和分類器分類。 1 模型提升的方法 Nature IDea:boost(提升樹的思想)。從這個角度來說明闡述人臉識

C#實現基於ffmpeg加虹軟的人臉識別

ffmpeg 開源 基於 進行 space 包裝 php c# 同時 基於ffmpeg和虹軟人臉識別庫的C#開源實現,對虹軟人臉識別庫進行了包裝,便於在C#中快速、安全的調用識別函數。同時,開源代碼中,包含完整的實現示例 http://pic.cnhubei.com

深度學習(一)——deepNN模型實現攝像頭實時識別人臉表情(C++和python3.6混合程式設計)

一、背景介紹 最近需要做人臉識別方向的東西,就被分配了新的任務,利用攝像頭實時檢測人臉表情,並製作成一個小軟體,這裡當然要用C++實現,並用C++做成一個介面。 由於博主之前用python做過類似的小程式,因此這裡的模型實現主要採用了python,為了用C++實現介面,這裡採用C++呼叫py

基於Python3.7和opencv的人臉識別(含資料收集,模型訓練)

前言 第一次寫部落格,有點緊張和興奮。廢話不多說,直接進入正題。如果你渴望使你的電腦能夠進行人臉識別;如果你不想了解什麼c++、底層演算法;如果你也不想買什麼樹莓派,安裝什麼幾個G的opencv;如果你和我一樣是個還沒入門的小白,但是想體驗一下人臉識別的魅力。那麼恭喜你,這篇文章就是為你準備的。讓我們開始吧

python實現人臉檢測及識別(2)---- 利用keras庫訓練人臉識別模型

前面已經採集好資料集boss資料夾存放需要識別的物件照片,other存放其他人的訓練集照片,現在,我們終於可以嘗試訓練我們自己的卷積神經網路模型了。CNN擅長影象處理,keras庫的tensorflow版亦支援此種網路模型,萬事俱備,就放開手做吧。前面說過,我們需要通過大量的訓練資料訓練我們的模型,

基於python3,百度AI實現人臉檢測,人臉識別

我感覺百度是BAT三家裡面AI能力最強的了,在影象和語音的處理上面是很強的,很全面。百度AI裡面功能齊全,提供的語言也是很多。唯一不太好的是目前對python3不是很支援,還是支援python2。但也不表示python3做不了。 一下是程式碼 import urllib3,base64 fr

基於python、虹軟實現人臉檢測,人臉識別

虹軟的人臉識別技術也是很強的,重要的是他免費提供了離線的sdk,還提供了例項,這個是目前幾家研究人臉識別的大公司裡面少有的。識別能力正常用還是可以的。我這個程式碼是呼叫的離線sdk實現的  from arcsoft import CLibrary, ASVL_COLOR_FORMAT,

基於python、face++實現人臉檢測、人臉識別

face++做的人臉識別應該是我目前接觸到的效果最好的了。這家公司也是個獨角獸,專門做人臉識別這塊的,返回的照片的資訊很全,也好呼叫。不過只提供線上的,不提供離線sdk沒法做一些實時性的東西。 import requests from json import JSONDecoder import

SelectSearch+CNN人工智慧實現人臉檢測和識別圖文教程(附完整專案程式碼python語言)

未完待續。。。 本文只說明原理,提供參考,實際應用需考慮其他因素。 環境 win7 python3.6.3 keras2.1.4 注意:各軟體之間版本之間存在適配問題。 目標 通過人工智慧技術實現目標(人臉)檢測和識別 步驟 1.selectsearc