这次作业坑也比较多。作业主要完成两部分任务:
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
看下图片验证正确性: