facenet 人脸模型训练

人脸检测与特征描述是人脸相关项目应用的基础(包括人脸识别,人脸认证以及人脸聚类等)

本文以mtcnn与facent算法为基础,讲述怎样训练自己的人脸模型。

主题框架采用的是  facenet 源码,依据具体需求,对facnet做了一定的修改,facenet源码见

https://github.com/davidsandberg/facenet

1、数据集收集

由于目前开源的数据集中,大多数都是欧美人士的,直接用这些数据来训练的模型对亚洲人脸的泛化能力有限制。所以需要自己采集人脸数据集,这里主要采用是通过爬虫,爬取尚街拍(https://www.jiepai.net/)上的人物照片。

具体爬虫操作见以下博客的说明

https://blog.csdn.net/reset2021/article/details/119103008

https://blog.csdn.net/reset2021/article/details/119107894

最终爬取的数据形式如下

2、数据集清洗

人脸训练数据,主要是针对人脸来进行的训练,所以对数据集进行简单的清洗,主要要清洗两部分数据:

2.1、从网站上爬取的数据中还有一些脏数据(与目标人物相关的其他人物色数据)

如下图所示的图片

2.2、清洗多人数据

如下图所所示的多人合照

3、数据预处理

数据预处理主要包括两部分操作,一是对数据进行人脸检测(主要采用mtcnn算法);二是拆分训练数据集与测试数据集,并且对测试数据集进行处理,生成pairs.txt文件(用于验证)

3.1、对目标数据进行人脸检测

将经过清洗后的数据集放在facnet源码下的images目录下:

python src/align_dataset_mtcnn.py ./images/ ./images_align/ --image_size=160

然后将在images_align下生成160*160的目标数据。

 

3.2、 对目标数据集进行拆分

将经过特征检测后的数据集进行拆分,本操作按8:2的拆分,拆分训练数据集与测试数据集

3.3、验证文件生成(pairs.txt)

facenet源码中没有提供相应的方法,依据lfw与pairs.txt文件推测编写了一个简单的pairs.txt文件的生成过程,主要是对经过特征检测后的人脸数据集进行同类与非同类的划分,详情见

https://download.csdn.net/download/reset2021/20068196

4、模型训练

模型训练的主要实现过程为facenet中train_tripletloss.py

具体调用方法为:

python src/train_tripletloss.py --logs_base_dir=log/ --models_base_dir=models/ --data_dir=images_align --image_size=160  --lfw_dir=/images_valid/ --lfw_pairs=images_valid_pairs.txt

直接执行是存在一定的问题,本文对facnet做了如下修改:

① 修改加载模型的过程

if args.pretrained_model:
    print('Restoring pretrained model: %s' % args.pretrained_model)
    #saver.restore(sess, os.path.expanduser(args.pretrained_model))
    #saver.restore(sess,os.path.abspath(args.pretrained_model))
    facenet.load_model(args.pretrained_model)

② 修改evaluate函数,在每次迭代后,进行验证,保存验证效果更佳的(以accuracy为判别依据)的模型

def evaluate(model_dir,models_base_dir,sess, image_paths, embeddings, labels_batch, image_paths_placeholder, labels_placeholder, 
        batch_size_placeholder, learning_rate_placeholder, phase_train_placeholder, enqueue_op, actual_issame, batch_size, 
        nrof_folds, log_dir, step, summary_writer, embedding_size):
    start_time = time.time()
    # Run forward pass to calculate embeddings
    print('Running forward pass on LFW images: ', end='')
    global g_accuracy
 
    nrof_images = len(actual_issame)*2
    assert(len(image_paths)==nrof_images)
    labels_array = np.reshape(np.arange(nrof_images),(-1,3))
    image_paths_array = np.reshape(np.expand_dims(np.array(image_paths),1), (-1,3))
    sess.run(enqueue_op, {image_paths_placeholder: image_paths_array, labels_placeholder: labels_array})
    emb_array = np.zeros((nrof_images, embedding_size))
    nrof_batches = int(np.ceil(nrof_images / batch_size))
    label_check_array = np.zeros((nrof_images,))
    for i in xrange(nrof_batches):
        batch_size = min(nrof_images-i*batch_size, batch_size)
        emb, lab = sess.run([embeddings, labels_batch], feed_dict={batch_size_placeholder: batch_size,
            learning_rate_placeholder: 0.0, phase_train_placeholder: False})
        emb_array[lab,:] = emb
        label_check_array[lab] = 1
    print('%.3f' % (time.time()-start_time))
    
    assert(np.all(label_check_array==1))
    
    _, _, accuracy, val, val_std, far = lfw.evaluate(emb_array, actual_issame, nrof_folds=nrof_folds)
    
    if np.mean(accuracy) > g_accuracy:
        g_accuracy = np.mean(accuracy)
        tmpsubdir = datetime.strftime(datetime.now(), '%Y%m%d-%H%M%S')
        tmpsubdir = tmpsubdir +str(np.mean(accuracy))
        model_result_dir = os.path.join(os.path.expanduser(models_base_dir), tmpsubdir)
        if not os.path.isdir(model_result_dir):  # Create the model directory if it doesn't exist
            os.makedirs(model_result_dir)      
        mycopy(model_dir,model_result_dir)
 
    print('Accuracy: %1.3f+-%1.3f' % (np.mean(accuracy), np.std(accuracy)))
    print('Validation rate: %2.5f+-%2.5f @ FAR=%2.5f' % (val, val_std, far))
    lfw_time = time.time() - start_time
    # Add validation loss and accuracy to summary
    summary = tf.Summary()
    #pylint: disable=maybe-no-member
    summary.value.add(tag='lfw/accuracy', simple_value=np.mean(accuracy))
    summary.value.add(tag='lfw/val_rate', simple_value=val)
    summary.value.add(tag='time/lfw', simple_value=lfw_time)
    summary_writer.add_summary(summary, step)
    with open(os.path.join(log_dir,'lfw_result.txt'),'at') as f:
        f.write('%d\t%.5f\t%.5f\n' % (step, np.mean(accuracy), val))

  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: FaceNet是一个用于人脸识别的预训练模型,可以将人脸图像转换为具有128维特征向量的嵌入空间。这个模型可以用于识别人脸的身份,进行人脸验证和人脸聚类等任务。 FaceNet是经过大规模训练的,包含了来自各个种类和地理区域的人脸图像。然而,一开始,FaceNet的训练集主要是来自于欧美地区的人脸图像,导致其在亚洲人脸上的性能相对较弱。 为了解决这个问题,研究人员进行了一些调整和改进,针对亚洲人脸设计了专门的预训练模型。这些亚洲人脸训练模型通过在大规模亚洲人脸图像上进行训练,从而提高了FaceNet在亚洲人脸上的性能。 亚洲人脸训练模型考虑了亚洲人脸的特点,例如肤色、眼睛形状和鼻子形状等。这样的调整让模型更好地适应亚洲人脸的差异,提高了亚洲人脸的识别效果。 使用亚洲人脸训练模型可以较准确地识别亚洲人脸的身份,并且在人脸验证和人脸聚类等任务上的性能也有所提高。这对于亚洲地区的人脸识别应用来说是非常有益的。 总之,亚洲人脸训练模型是针对亚洲人脸的特点而设计的FaceNet变种。它通过在大规模亚洲人脸图像上进行训练来提高在亚洲人脸上的性能,使得人脸识别在亚洲地区的应用更加准确和可靠。 ### 回答2: Facenet是一种先进的人脸识别技术,它通过深度神经网络对人脸进行特征提取和比对。但是由于人脸特征在不同种族中的差异,传统的Facenet模型在处理亚洲人脸时可能存在一些问题。为了解决这个问题,许多研究者提出了针对亚洲人脸的预训练模型。 亚洲人脸训练模型主要针对亚洲人脸的特点进行了优化。亚洲人脸与其他族群相比,通常有着较浅的眼窝、较平的鼻梁和较小的眼睛等特点。这些特征在传统的Facenet模型中可能被误判为无关特征,导致识别准确性降低。而亚洲人脸训练模型通过对亚洲人脸数据集的特征学习,可以更好地捕捉到亚洲人脸的区别性特征。 此外,亚洲人脸训练模型还可以在处理亚洲人脸时提供更高的识别准确性和稳定性。这是因为该模型训练过程中已经通过大量的亚洲人脸数据进行了优化,能够更准确地识别和比对亚洲人脸。 总的来说,亚洲人脸训练模型是一种针对亚洲人脸特点进行优化的Facenet模型。它通过对亚洲人脸数据集的学习,可以提高在处理亚洲人脸时的识别准确性和稳定性。这为亚洲地区的人脸识别应用提供了更好的解决方案。 ### 回答3: FaceNet是一种人脸识别模型,它采用深度学习技术,能够将人脸图像转化为一个128维的向量表示,通过计算不同人脸间的距离来判断它们是否来自同一个人。 FaceNet已经预训练了许多不同种族的人脸图像,包括亚洲人。亚洲人的脸部特征与其他种族略有不同,因此这个亚洲人脸训练模型对于在亚洲地区进行人脸识别非常有用。 使用这个预训练模型,我们可以将亚洲人的人脸图像输入进去,通过计算得到对应的128维向量表示。然后,我们可以将这些向量与已知的亚洲人脸向量进行比对,以确定是否匹配。 预训练模型的好处是,它通过在大规模数据集上进行训练,已经学习到了丰富的人脸特征,可以更准确地识别和比对亚洲人脸。因此,使用这个模型可以大大提高亚洲人脸识别的准确性和效率。 但需要注意的是,预训练模型并不是万能的,它的准确性也受到人脸图像质量、光照条件等因素的影响。因此,在使用这个模型时,还需要结合其他人脸识别算法和技术,以确保识别结果的准确性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

reset2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值