赛题描述

最近参加了一个面部识别方面的比赛:《平安产险2019数字科技冠军赛》,简单叙述一下这个比赛吧,大赛分为两个篇章,分别为数字化创意篇章和科技算法篇章。这里,我参加的是科技算法篇章。

该赛题需要解决这样一个任务:根据赛方提供的人脸图片数据,为每张人脸生成一个特征向量(一张图片的特征向量维度D限制为[1,1024])。所以,对于N张测试图片,我们需要提交[N,D]的结果。

评估函数

其中θ为阈值,样本对距离小于等于θ认定预测为同一人,大于认定预测为不同人,TP、FP、TN、FP分别为真正例、假正例、真负例、假负例的个数,系统将根据上传数据遍历所有可能的θ值。

实际上,就是将人脸测试集映射到N为空间,并计算它们的欧式距离,使得同一个人间的距离相比于不同人间的距离要近。

赛题分析

在赛题分析之前,简单介绍下与人脸相关的任务:人脸跟踪:在视频中,动态的追踪人脸位置的变化;

人脸检测:定位人脸或者人脸中关键点(如鼻子、眼睛、嘴唇等)的位置;

人脸识别:将一张人脸图片输入,判断该人脸属于人脸数据库记录中的哪一个人;

人脸验证:输入两张人脸图片,判断是否为同一人;

人脸聚类:输入一批脸,将属于相似的人脸归为一类。

乍一看,该赛题其实并不属于以上任何任务。但是详细分析后,其实有一个简单的思路就是:假设训练图片中有50个人,这50个人每个人有m多张图片,我们仅需要训练能够识别这50个人的多分类模型即可。我们知道,在神经网络中,分类任务的最后一层大多由softmax层来承担。而softmax层中的k个神经元可作为概率输出,即为k维向量(输入图片=>k维向量)。这样,即可完成图片的嵌入。

本赛题只是提供了测试数据,并未提供训练数据,训练数据需要我们自己搜集并训练出图像嵌入模型。通过初步观察测试集,可以看出该测试集均来自于

所以,这个赛题的目的只有一个:过拟合,过拟合,过拟合……。

即便是过拟合,我还是没能使facenet模型完全过拟合这个数据集,真是惭愧TT,不知道是facenet的问题还是我的问题,终究还是我的实力不够啊。既然参加了,还是得总结一下的,不然以后又忘了,哈哈。接下来步入正题,总结一下我所使用的facenet模型。

facenet介绍和使用

使用facenet训练模型主要有两种方式:train_softmax.py:使用中心损失来训练模型,而中心损失要用Softmax损失配合训练,所以使用了train_softmax这样的名称;softmax+center loss的损失函数:

m——批的样本数,n——类别数

实际上,相当于给softmax loss上增加了约束。这样的约束使得同一类样本之间的距离缩短。

该方法的缺陷:1. 并不能扩大类与类之间的距离;2. 当需要识别的人很多时(>500,经验值),softmax层的神经元很多,facenet很难收敛。train_tripletloss.py:使用三元损失函数Triplet-loss。这个理解起来其实很简单:选择一个样本(名叫Anchor),使得它到Positive的距离要比到Negative的距离要短(Positive为与Anchor同类的样本,Negative为与Anchor不同类的样本)。模型的目标就是通过学习使得类别内部的样本距离大于不同类别样本的距离即可。三元损失函数:

表示正负样本之间的边距,和SVM中的边距一个意思。N表示特征数。该公式一个感性的认识就是:anchor与positive近,anchor与negative远。

在三元组选择的时候,存在这样的问题:1. easy triplets:当我们确定一个Anchor后,接下来又选择了与Anchor很相似的Positive以及与Anchor十分不同的Negative,facenet大多数情况下能够识判断出Positive和Negative的类别。因此,反向传播的误差很小,facenet参数基本上不更新;2. hard triplets:选择了很容易分错的positive和negative,导致误差过大,facenet收敛不稳定,容易过拟合。所以,为了加快facenet收敛,作者提出了一种三元组选择的方法:即选择一个hard-positive(positive中与anchor欧式距离最远的)和hard-negative(negative中与anchor欧式距离最近的)。所以,在训练过程中,应尽量选择semi-hard triplets。使用公式描述即为:

(anchor到positive的欧式距离

下图很好的描述了使用tripltloss损失的facenet模型:

好了,回到比赛中来。

对于任意的人脸识别竞赛,我们都可以将其分为一下几步:通过MTCNN人脸检测模型,从照片中提取人脸图像(人脸对齐);

把人脸图像输入到人脸识别模型中;

根据模型得出的结果完成不同的任务。

由于本场竞赛比较特殊,需要过拟合训练图片,所以就train_softmax.py来说明:观察测试集

每张图片已经裁剪出人脸,但是图片的size大小不一,所以我将其resize到160x160。

2. 观察训练集

训练集与测试集存在同样的问题,resize到160x160。

3. 训练

为了过拟合训练集,需要修改train_softmax.py中的几个参数:--random_crop=store_false:不进行图像裁剪;

--random_flip=store_false:不对训练图像执行随机水平翻转

--random_rotate=store_false:不对训练图像进行随机旋转

--weight_decay=0.0:不进行正则化

--keep_probability=0.9:保留全连接层的90%参数

设置完成后,开始训练即可。

大概训练了150个epoch后,损失基本为0,榜上分数为0.95左右。这竞赛榜上准确率太多的人为1了,大家真的也太强了。如果有大佬愿意教教我--,欢迎私信交流交流。

记录一下使用train_tripletloss.py训练而出现的错误,因为这个错误,我没有使用这种方式进行训练,但是我总感觉该方法准确率应该会比train_softmax.py高,不知道是不是错觉--。

InvalidArgumentError (see above for traceback): Input to reshape is a tensor with 25600 values, but the requested shape requires a multiple of 1536

[[node Reshape (defined at H:/xxx/code/models/facenet_master/src/train_tripletloss.py:138) ]]

[[node Adagrad/update (defined at H:\xxx\code\models\facenet_master\src\facenet.py:191) ]]

以后解决了再进行补充说明。

赠几个本人觉得不错的传送门:

如何使用facenet详解_facenet在比赛中的应用相关推荐

  1. 详解关于ROBOCON比赛中有刷电机设计

    之前在电机驱动那里说过,电机学是一门单独的学科.记得当时学习的时候,只觉得太笼统,太抽象.囫囵吞枣的学了一番,也应付过了考试.但是就算学习过了之后,在具体的比赛应用中,也是无法真正运用上去的,好处也只 ...

  2. python英语字典程序修改_详解如何修改python中字典的键和值

    我们知道python中字典是无序的,它们都是通过hash去对应的.一般的如果我们需要修改字典的值,只需要直接覆盖即可,而修改字典的键,则需要使用字典自带的pop函数,示例如下: t = {} t['a ...

  3. 详解Linux2.6内核中基于platform机制的驱动模型

    原文地址:详解Linux2.6内核中基于platform机制的驱动模型 作者:nacichan [摘要]本文以Linux 2.6.25 内核为例,分析了基于platform总线的驱动模型.首先介绍了P ...

  4. 详解Java多线程编程中LockSupport类的线程阻塞用法

    转载自  详解Java多线程编程中LockSupport类的线程阻塞用法 LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport实际 ...

  5. 详解在Visual Studio中使用git版本系统 [转]

    详解在Visual Studio中使用git版本系统    作者:掷鸡蛋者 , 发布于2012-6-21   这篇教程的预期,是希望没有任何版本使用基础的新手也可以掌握,所以细节较多,不当之处,欢迎指 ...

  6. php 内存池,内存详解: 详解PHP内存池中的存储层_php

    php的内存管理器是分层(hierarchical)的.这个管理器共有三层:存储层(storage).堆(heap)层和 emalloc/efree 层.存储层通过 malloc().mmap() 等 ...

  7. python字典修改键所对应值_详解如何修改python中字典的键和值

    我们知道python中字典是无序的,它们都是通过hash去对应的.一般的如果我们需要修改字典的值,只需要直接覆盖即可,而修改字典的键,则需要使用字典自带的pop函数,示例如下: t = {} t['a ...

  8. Android Studio 安装详解及安装过程中出现的问题解决方案

    Android Studio 安装详解及安装过程中出现的问题解决方案 一,Android Studio安装包下载, 首先到官网下载,就是去Android Studio中文社区官网下载你的平台需要的安装 ...

  9. 二叉树层次遍历算法 python_二叉树的遍历详解:前、中、后、层次遍历(Python实现)...

    二叉树的遍历详解:前.中.后.层次遍历(Python实现) 二叉树是一种常见的数据结构,而它的常见遍历方法有前序遍历.中序遍历.后续遍历.层次遍历--掌握这几种遍历方法是很有必要的. 假设我们二叉树节 ...

最新文章

  1. 何恺明最新一作论文:无监督胜有监督,迁移学习无压力,刷新7项检测分割任务...
  2. python123动物重量排序_python基本常识
  3. VSTS Code Analysis 错误 CA1014 CLSCompliantAttribute 及Suppress Message (镇压Code Ananlysis)...
  4. 有赞订单管理的三生三世与“十面埋伏”
  5. U-Boot 之一 零基础编译 U-Boot 过程详解 及 编译后的使用说明
  6. html 怎么在画布上绘制一个圆,javascript – 如何在画布上画一个圆圈?
  7. 如何给基于 SAP Cloud SDK 的应用增添缓存支持 Cache support
  8. 深度学习(5)TensorFlow基础操作一: TensorFlow数据类型
  9. ansi编码_Java 字符编码
  10. 洛谷P3628 [APIO2010]特别行动队(斜率优化)
  11. 建房子 最安全图纸_妄想山海初期该怎么办?砍树狩猎建房子,还能拆别人的房子...
  12. 硬盘安装Windows7--笔记
  13. Dxperience 7.3.4 简体中文本地化
  14. 实战Linux Bluetooth编程 (八) Class of Device
  15. 关于计算机实验的英语作文,关于实验的英语作文
  16. 算法学习--Day9
  17. 本周AI热点回顾:RTX3080被黄牛炒上天;百度资本助力AI 制药,已有十几位博士加入;百度联手打造AI沉浸互动展中国首秀
  18. java 判断客户端是手机端还是PC端(SSH框架)
  19. iptables failed: iptables --wait -t nat -A DOCKER
  20. AtCoder ABC237题解

热门文章

  1. 9.01-常用网址归纳
  2. oracle数据迁移及全库迁移方案
  3. Flutter ios 微信支付
  4. 「转发」乡村振兴项目最全实施流程,堪称教科书
  5. opporeno5k微信视频美颜教程分享
  6. mysql 时间 截取 查询_mysql截取日期年月日部分查询某天用户列表信息
  7. python归一化 增大差异_练习赛1:Titanic
  8. 某互联网金融公司的技术栈
  9. 根据卫星电文计算GPS卫星位置
  10. vue整合uniapp_基于vue+uniapp直播项目|uni-app仿抖音/陌陌直播室