前一段时间总结:预推免结束后,给自己找了一点事情做,前几天完成了基于AlphaGoZero的亚马逊棋程序,把自己的博弈思维从六子棋转变到了亚马逊棋这个更坑的棋种(状态空间复杂度也很大,而且动作空间很复杂),在自己第n+1次读AFZ论文后终于自己动手去做了一点东西,在自己实践了pureMCTS后也深刻感觉到MCTS和网络结合起来的方式的巧妙之处,虽然最后成绩不好,但是整个过程中的体验还是很印象深刻的。
最近借着休整的理由,和完成学校某门课结课作业的幌子,稍微学习了一点Pytorch并找了一个竞赛,学习了一下别的大佬分享的baseline,准备拿他当作自己的结课作业(ε=ε=ε=┏(゜ロ゜;)┛。
首先po出原作者的github:https://github.com/LcenArthas/CCF-BDCI2019-Multi-person-Face-Recognition-Competition-Baseline
首先开门见山说一说自己的感悟,随着最近Pytorch1.3的发布,Pytorch和Tensorflow的争斗似乎进入白热化阶段,自己潜意识中Tensorflow的优势好像是十分巨大的,但是最近才发现如今pytorch已经在学界超过了Tensorflow,而Tensorflow在产业界仍然有着不可撼动的地位,但是从个人的直观体验来讲,原来tf1.0阶段Session执行方式的确对新手十分不友好,而tf2.0的eagerexecution模式貌似也是为了解决这个问题。
由于是第一次接触Pytorch这个框架,所以一用起来就给自己一种耳目一新的感觉,真的是从未有过的全新体验。
下面就是自己的作业内容了
实验目的:
人脸识别已经在生活中快速的普及开来, 但是人脸识别技术在实际应用中遇到的一个广为人知的问题是它在不同人种的性能有差异。 如何快速的提升人脸识别系统在不同人种的性能, 是一个实用的人脸识别算法应该考虑的问题。
本次作业目标是提高人脸识别模型在不同人种上面的性能。以人脸1:1 比对为场景, 参赛队需要同时优化人脸识别模型在不同人种上的性能,提高在低误识率情况下不同人种的通过率。
总体目标:给两张图片,可以给出两张图片(这两张图片属于同一人种)上人脸的相似度,最终给出的相似度应在0~1
采用的模型:
ResNet idea:神经网络固有的特性,并不是层数越多,效果越好,所以为了减少模型的复杂度,采取一种shortcut的思想
这里我尝试了ResNet18,ResNet24,ResNet50,ResNet101,ResNet152。MobileNet六种网络。
ResNet18 | IRblock |
ResNet24 | IRblock |
ResNet50 | IRblock |
ResNet101 | IRblock |
ResNet152 | IRblock |
实验环境
硬件环境 :Tesla K80,
软件环境 :matplotlib,scipy,tqdm,opencv-python,pillow,torch,torchvision,numpy,scikit-image,torchsummary,tensorboardX,imgaug
实验过程
数据
-
训练集:
a.含有目标人种的数据,总共有四个目标人种。
b.每个目标人种含有若干文件夹, 每个文件夹是一个人。
c.每个文件夹内有若干对齐好的同一个人的人脸图片。 -
测试集
含有目标人种的测试数据, 即已经对齐好的人脸。
-
-
模型
应用的总体模型是insightface paper 。
InsightFace 是一个 2D/3D 人脸分析项目。InsightFace的代码是在MIT许可下发布的。 对于acadmic和商业用途没有限制。包含注释的训练数据(以及使用这些数据训练的模型)仅可用于非商业研究目的。在此存储库中,我们提供用于深度识别的训练数据,网络设置和损失设计。 训练数据包括标准化的MS1M,VGG2和CASIA-Webface数据集,这些数据集已经以MXNet二进制格式打包。 网络主干包括ResNet,MobilefaceNet,MobileNet,InceptionResNet_v2,DenseNet,DPN。 损失函数包括Softmax,SphereFace,CosineFace,ArcFace和Triplet(Euclidean / Angular)Loss。
ArcFace最初在arXiv技术报告中描述。 通过使用此存储库,您可以通过单个模型简单地实现LFW 99.80%+和Megaface 98%+。 该存储库可以帮助研究人员/工程师通过两个步骤快速开发深度识别算法:下载二进制数据集并运行训练脚本。
网络结构
网络主要分为ResNet和MobileNet,MobileNet是一种轻量级网络
ResNet |
MobileNet |
损失函数
- Softmax
损失函数是另一个提升识别精度的关键工作,在大家极力压榨网络骨干结构换取性能提升的时候,回头再来看损失函数这个网络训练的指挥棒,会有更多的发现。做为最常见的分类损失 Softmax,其定义如下:
Softmax 是最常见的人脸识别损失函数,然而,Softmax 不会显式的优化类间和类内距离的,所以通常不会有太好的性能。 - Triplet Loss
Triplet Loss 作为一种 Metric Learning,也在人脸识别中广泛使用。相比 Softmax,其特点是可以方便训练大规模 ID(百万,千万)的数据集,不受显存的限制。但是相应的,因为它的关注点过于局部,使得性能无法达到最佳且训练需要的周期非常长。 - SphereFace[2]
由于 Tripelet Loss 训练困难,人们逐渐寻求结合 Metric Learning思想来改进 Softmax 的思路,其中 SphereFace[2] 是其中的佼佼者,作为 17 年提出的一种方法,在当时达到了 state-of-the-art。在具体实现中,为了避免加入的 margin(即 m) 过大,引入了新的超参 λ,和 Softmax 一起联合训练。 - Additive Cosine Margin[3]
最近,在 [3],[4] 中,作者提出了一种在 Cosine 值上加入 Margin 的策略,加m而不是乘m的目的是为了方便求导。
模型获得了比 [2] 更好的性能,同时实现很方便,也摆脱了和 Softmax 联合训练的困扰,在训练起始阶段不再有收敛方面的问题。 - Additive Angular Margin[4]
我们提出了在角度上增加固定值的 Margin,在 Cosine Margin 的基础上,更具有几何 (角度) 解释性并且获得了更好的性能,这里我们同时 normalize 了 weight(到 1) 和 feature(到 s,默认 64),则 (Cosine Margin 也同理),这种改进相对于Cosine margin的好处在于角度距离比余弦距离对于角度的影响更加猛烈: