基于tensorflow人脸识别

参考代码: facenet, amsoftmax

个人实现: luameows/face_recongnition_tensorflow

tensorflow基本概念

官方解释如下

TensorFlow使用Graph来描述计算任务,图中的节点被称之为op.一个op可以接受0或多个tensor作为输入,也可产生0或多个tensor作为输出.任何一个Graph要想运行,都必须借助上下文Session.通过Session启动Graph,并将Graph中的op分发到CPU或GPU上,借助Session提供执行这些op.op被执行后,将产生的tensor返回.借助Session提供的feed和fetch操作,我们可以为op赋值或者获取数据.计算过程中,通过变量(Variable)来维护计算状态.

数据写入与读取

tf.dataAPI支持多种文件格式,TFRecord文件格式是一种面向记录的简单二进制格式文件,可以用于存储数据,通过tf.dataTFRecordDataset进行操作。

参考文献:读取, 写入

数据读取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 用tf.placeholder(tf.string)区分train与val数据集
filenames = tf.placeholder(tf.string, shape=[None]) #用于指向train与val各自tfrecord文件
phase_train = tf.placeholder(tf.bool, name=='phase_train') #用于判断train还是val
dataset = tf.data.TFRecordDataset(filenames)
#调用train数据集预处理及解析函数
dataset_train = dataset.map(parse_function_train)
dataset_train = dataset_train.shuffle(buffer_size=30000)
dataset_train = dataset_train.batch(32)
iterator_train = dataset_train.make_initializable_iterator()
next_element_train = iterator_train.get_next()
#调用val数据集预处理及解析函数
dataset_val = dataset.map(parse_function_val)
dataset_val = dataset_val.shuffle(buffer_size=30000)
dataset_val = dataset_val.batch(32)
iterator_val = dataset_val.make_initializable_iterator()
next_element_val = iterator_val.get_next()
# 获取train数据集
training_filenames = ["/var/data/file1.tfrecord"]
sess.run(iterator_train.initializer, feed_dict={filenames: training_filenames})
images_train, labels_train = sess.run(next_element_train)
# 获取val数据集
validation_filenames = ["/var/data/validation1.tfrecord"]
sess.run(iterator_val.initializer, feed_dict={filenames: validation_filenames})
images_val, labels_val = sess.run(next_element_val)

数据存储

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
output_path_train = os.path.join(args.tfrecords_file_path, 'train.tfrecords')
output_path_val = os.path.join(args.tfrecords_file_path, 'valid.tfrecords')
writer_train = tf.python_io.TFRecordWriter(output_path_train)
writer_val = tf.python_io.TFRecordWriter(output_path_val)
label = 0
for filename in os.listdir(args.total_train_set_path):
train_i = 0
person_list = os.path.join(args.total_train_set_path, filename)
for imgname in os.listdir(person_list):
img = cv2.imread(os.path.join(person_list,imgname)) # 读取图片格式HWC, BGR
img_raw = img.tobytes()
example = tf.train.Example(features=tf.train.Features(feature={
'image_raw': tf.train.Feature(bytes_list=tf.train.BytesList(value=[img_raw])),
"label": tf.train.Feature(int64_list=tf.train.Int64List(value=[label]))
}))
if train_i > len(os.path.join(args.total_train_set_path, filename) * (1-args.validation_rate):
writer_val.write(example.SerializeToString())
else:
writer_train.write(example.SerializeToString())
train_i += 1
label += 1
print('%s's image processed' % filename)
writer_train.close()
writer_val.close()

fine-tune

通过saver.restore(sess,ckptpath)加载预训练模型,可能会出现Key <variable_name> not found in checkpoint错误,即checkpoint保存的模型变量与当前网络模型变量不一致,解决办法,建立一个存储ckpt变量的字典,剔除不一致变量。

1
2
3
4
5
variables = slim.get_variables_to_restore()
variables_to_restore = [v for v in variables if 'arcface' not in v.name.split('/')[0]]

saver = tf.train.Saver(variables_to_restore)
saver.restore(sess, ckptpath)

本文标题:基于tensorflow人脸识别

文章作者:Lumo Wang

发布时间:2018年12月09日 - 16:12

最后更新:2019年02月14日 - 19:02

原始链接:https://luameows.github.io/2018/12/09/程序开发-基于tensorflow人脸识别/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

请我喝杯咖啡,我会继续熬夜的~