0
点赞
收藏
分享

微信扫一扫

吴恩达DeepLearning第四部分作业week4 人脸识别

这次作业坑也比较多。作业主要完成两部分任务:

1.使用图像和名字判断人脸匹配情况 1:1判别

2.不使用名字,直接图像判断 1:k

修改inception_blocks_v2.py文件中所有卷积层、padding层参数,改成如下:

# Define the input as a tensor with shape input_shape
    X_input = Input(input_shape)

    # Zero-Padding
    X = ZeroPadding2D((3, 3),data_format='channels_first')(X_input)

    # First Block
    X = Conv2D(64, (7, 7), strides=(2, 2), name='conv1',data_format='channels_first')(X)
    X = BatchNormalization(axis=1, name='bn1')(X)
    X = Activation('relu')(X)

    # Zero-Padding + MAXPOOL
    X = ZeroPadding2D((1, 1),data_format='channels_first')(X)
    X = MaxPooling2D((3, 3), strides=2,data_format='channels_first')(X)

    # Second Block
    X = Conv2D(64, (1, 1), strides=(1, 1), name='conv2',data_format='channels_first')(X)
    X = BatchNormalization(axis=1, epsilon=0.00001, name='bn2')(X)
    X = Activation('relu')(X)

    # Zero-Padding + MAXPOOL
    X = ZeroPadding2D((1, 1),data_format='channels_first')(X)

    # Second Block
    X = Conv2D(192, (3, 3), strides=(1, 1), name='conv3',data_format='channels_first')(X)
    X = BatchNormalization(axis=1, epsilon=0.00001, name='bn3')(X)
    X = Activation('relu')(X)

    # Zero-Padding + MAXPOOL
    X = ZeroPadding2D((1, 1),data_format='channels_first')(X)
    X = MaxPooling2D(pool_size=3, strides=2,data_format='channels_first')(X)

导包 

import os
import cv2
import numpy as np
import tensorflow as tf
import fr_utils
import inception_blocks_v2

# 模型构造详见inception_blocks_v2
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'  # 忽略警告

# nnmodel=ks.models.load_model("./nn4.small2.v7.h5") keras版本不一致无法加载
# nnmodel.summary()
nnmodel = inception_blocks_v2.faceRecoModel(input_shape=(3, 96, 96))
# nnmodel.summary()
fr_utils.load_weights_from_FaceNet(nnmodel)
def cal_tripleloss(x_true, x_positive, x_negative, model, alpha):  # 随机选取n张标准照片,一张同n个人的照片,n张不同的人的照片
    y_true = model.predict_on_batch(x_true)  # n*3*96*96
    y_positive = model.predict_on_batch(x_positive)  # n*3*96*96
    y_negative = model.predict_on_batch(x_negative)  # n*3*96*96
    pos_dis = tf.reduce_sum(tf.square(tf.subtract(y_true, y_positive)), axis=-1)  # n*1
    neg_dis = tf.reduce_sum(tf.square(tf.subtract(y_true, y_negative)), axis=-1)  # n*1
    loss_split = tf.add(tf.subtract(pos_dis, neg_dis), alpha)
    loss = tf.reduce_sum(tf.maximum(loss_split, 0))
    return loss

 

def build_database(model):
    andrew = cv2.imread("./images/andrew.jpg")
    andrew = np.around(np.array([(cv2.cvtColor(andrew, cv2.COLOR_BGR2RGB) / 255).T]))
    andrew = model.predict_on_batch(andrew)
    arnaud = cv2.imread("./images/arnaud.jpg")
    arnaud = np.around(np.array([(cv2.cvtColor(arnaud, cv2.COLOR_BGR2RGB) / 255).T]))
    arnaud = model.predict_on_batch(arnaud)
    benoit = cv2.imread("./images/benoit.jpg")
    benoit = np.around(np.array([(cv2.cvtColor(benoit, cv2.COLOR_BGR2RGB) / 255).T]))
    benoit = model.predict_on_batch(benoit)
    bertrand = cv2.imread("./images/bertrand.jpg")
    bertrand = np.around(np.array([(cv2.cvtColor(bertrand, cv2.COLOR_BGR2RGB) / 255).T]))
    bertrand = model.predict_on_batch(bertrand)
    dan = cv2.imread("./images/dan.jpg")
    dan = np.around(np.array([(cv2.cvtColor(dan, cv2.COLOR_BGR2RGB) / 255).T]))
    dan = model.predict_on_batch(dan)
    danielle = cv2.imread("./images/danielle.jpg")
    danielle = np.around(np.array([(cv2.cvtColor(danielle, cv2.COLOR_BGR2RGB) / 255).T]))
    danielle = model.predict_on_batch(danielle)
    felix = cv2.imread("./images/felix.jpg")
    felix = np.around(np.array([(cv2.cvtColor(felix, cv2.COLOR_BGR2RGB) / 255).T]))
    felix = model.predict_on_batch(felix)
    kevin = cv2.imread("./images/kevin.jpg")
    kevin = np.around(np.array([(cv2.cvtColor(kevin, cv2.COLOR_BGR2RGB) / 255).T]))
    kevin = model.predict_on_batch(kevin)
    kian = cv2.imread("./images/kian.jpg")
    kian = np.around(np.array([(cv2.cvtColor(kian, cv2.COLOR_BGR2RGB) / 255).T]))
    kian = model.predict_on_batch(kian)
    sebastiano = cv2.imread("./images/sebastiano.jpg")
    sebastiano = np.around(np.array([(cv2.cvtColor(sebastiano, cv2.COLOR_BGR2RGB) / 255).T]))
    sebastiano = model.predict_on_batch(sebastiano)
    tian = cv2.imread("./images/tian.jpg")
    tian = np.around(np.array([(cv2.cvtColor(tian, cv2.COLOR_BGR2RGB) / 255).T]))
    tian = model.predict_on_batch(tian)
    younes = cv2.imread("./images/younes.jpg")
    younes = np.around(np.array([(cv2.cvtColor(younes, cv2.COLOR_BGR2RGB) / 255).T]))
    younes = model.predict_on_batch(younes)
    database = {
        "andrew": andrew,
        "arnaud": arnaud,
        "benoit": benoit,
        "bertrand": bertrand,
        "dan": dan,
        "danielle": danielle,
        "felix": felix,
        "kevin": kevin,
        "kian": kian,
        "sebastiano": sebastiano,
        "tian": tian,
        "younes": younes
    }
    return database

database = build_database(nnmodel)
def is_sameperson(database, image, name, model):
    src = cv2.imread(image)
    src = np.around(np.array([(cv2.cvtColor(src, cv2.COLOR_BGR2RGB) / 255).T]))
    src_predict = model.predict_on_batch(src)
    mismatch = np.sum(np.square(database[name] - src_predict))
    if mismatch >= 0.2:
        print("不是本人")
    else:
        print("同一个人")


is_sameperson(database, "./images/andrew.jpg", "andrew", nnmodel)
is_sameperson(database, "./images/andrew.jpg", "arnaud", nnmodel)
同一个人
不是本人
def identify(database, image, model):
    src = cv2.imread(image)
    src = np.around(np.array([(cv2.cvtColor(src, cv2.COLOR_BGR2RGB) / 255).T]))
    src_predict = model.predict_on_batch(src)
    name = []
    mismatch = []
    for i in database:
        name.append(i)
        mismatch.append(np.sum(np.square(database[i] - src_predict)))
    name = np.array(name)
    mismatch = np.array(mismatch)
    print(name[np.argmin(mismatch)])



identify(database, "./images/camera_0.jpg", nnmodel)
identify(database, "./images/camera_1.jpg", nnmodel)
identify(database, "./images/camera_2.jpg", nnmodel)
identify(database, "./images/camera_3.jpg", nnmodel)
identify(database, "./images/camera_4.jpg", nnmodel)
identify(database, "./images/camera_5.jpg", nnmodel)

 输出:

younes
arnaud
sebastiano
bertrand
dan
arnaud

看下图片验证正确性:

camera0

younes

 

举报

相关推荐

0 条评论