吴恩达DeepLearning第四部分作业week4(1) 人脸识别
这次作业坑也比较多。作业主要完成两部分任务:1.使用图像和名字判断人脸匹配情况 1:1判别2.不使用名字,直接图像判断 1:k首先导包,加载模型。这里有一个坑,他这通道是在图像大小之前的,他提供的模型文件里卷积层没有设置通道在前,导致报错A `Concatenate` layer requires inputs with matching shapes except for the concat
这次作业坑也比较多。作业主要完成两部分任务:
1.使用图像和名字判断人脸匹配情况 1:1判别
2.不使用名字,直接图像判断 1:k
首先导包,加载模型。这里有一个坑,他这通道是在图像大小之前的,他提供的模型文件里卷积层没有设置通道在前,导致报错A `Concatenate` layer requires inputs with matching shapes except for the concat axis. Got inputs shapes: [(None, 128, 12, 192), (None, 32, 12, 192), (None, 32, 12, 102), (None, 64, 12, 192)]。无语的是我开始以为是池化层的问题还把池化层改了,浪费好几个小时。
修改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)
这边练习一下tripletloss的定义:
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
构建图像编码数据库:(这边应该把读取图像弄成一个函数的,代码量+100),这还有个坑image文件夹下有个png图像。。。。你运了会报错,需要去把png改成jpg
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
看下图片验证正确性:



DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)