上标含义:a代表某一个样本;p代表a的正样本;n代表a的负样本,$alpha代表两个类别的最小距离,是一个自定义的阈值。+号代表是取正数,小于0则取。其实整个损失函数就是合页损失函数。triplet loss的创新点还有三元子的筛选方式:选取一个batch中距离最远的正样本和距离最近的负样本进行训练。其实这个就是构造困难负样本的方法。 2⃣️ CenterFace: ECCV2016 repo:损失函数 https://github.com/KaiyangZhou/pytorch-center-loss|基于centerloss的人脸模型: https://github.com/wujiyang/Face_Pytorch 参考博文: https://blog.csdn.net/u014380165/article/details/76946339 主要思想是:softmax-cross-entropy训练的结果是使不同类别的特征拉开,但是忽视相同类别的特征之间的距离。意思就是只关注不同类别的特征。center loss的目的就是将相同类别的特征的距离拉近,使相同、不相同类别的特征都具有更好的辨别性。 softmax-cross-entropy-loss的训练结果(将特征映射到其中的某两维进行可视化): center loss+cross-entropy-loss的训练结果: center loss 表达式: 难点在于如何决定一个类别的中心,解决方法是每个batch取计算一次中心,计算方法为:(c为中心点)
最后center loss结合cross-entropy loss共同进行训练。这个center loss和实验室LNN学姐的center loss是类似的,但是不同之处在于类别中心的决定方法。其实center loss也就是普通discriminative loss的改进版本。如果涉及特征工程,不妨尝试一下这个损失函数,在一定程度可以弥补交叉熵损失函数的缺点。 discriminative loss表达式: 从表达式中可以看出,discriminative loss、center loss、triplet loss是具有很大的关联的。 3⃣️ Sphere face | Arc face | Cos face:(增加特征之间的角度) 这三篇思想都是非常类似,算是同一个时期的论文 repo(同时实现了这三篇论文): https://github.com/wujiyang/Face_Pytorch cosFace(基于Pytorch实现的cosFace): https://github.com/MuggleWang/CosFace_pytorch cosFace的论文: https://arxiv.org/pdf/1801.09414.pdf 参考博文: https://www.cnblogs.com/xiaosongshine/p/11059762.html 主要思想: 不同于交叉熵函数、center loss和triplet loss,这三个face的损失函数将特征映射到一个球上,并且设定特征之间的cos角度之间的margin,从而增大特征之间的差异。注意这三个损失函数都是基于余弦相似度来做度量,所以在1v1或者1vN的应用中,也需要基于余弦相似度。不同之处是这三者添加margin的方法。如图所示: 首先将全连接层的权重W和提取的特征x进行l2归一化,使得softmax-cross-entropy loss变成以角度度量分类的形式。如图所示: s是将特征x归一化后scale到s的长度,cos(i,j)是指特征x_i和权重W_j之间的角度差的余弦值。具体的推倒步骤,cosFace的论文中有详细的解释。SphereFace是乘性的余弦margin,cosFace和ArcFace是加性的余弦magin,加性的margin会比较容易实现和优化,其中arcFace直接将margin加在角度上,具有更好的集合解释方式,效果会更加明显。其中arcFace现在在人脸识别或者人脸验证的benchmark上,都排名第一,cosFace紧随其后,这大大说明了损失函数的主要性,基于损失函数进行小小的改进,也许会收获大大的性能提升。得到的效果如图所示:
三、一些应用:
1⃣️ dlib库应用: 参考repo: https://github.com/corberan/video_clipper/blob/master/face_clustering.py 要实现人脸识别的功能,要分为四个步骤:人脸检测、人脸对齐、人脸模型提取特征、分类器 人脸检测 定义cnn人脸检测器: face_detector = api.dlib_cnn_face_detector(models.cnn_face_detector_model_location()) 进行人脸检测: face_detections = face_detector(frames, 0) 人脸对齐 定义人脸关键点检测器: sp = dlib.shape_predictor(models.pose_predictor_model_location()) detection_sp = sp(frame, face_detection.rect) 人脸模型提取人脸描述子(128D) 定义人脸描述子模型: face_rec = dlib.face_recognition_model_v1(models.face_recognition_model_location()) face_detections = face_rec.compute_face_descriptor(frame, sp(frame, face_detection.rect)) 人脸识别: 人脸识别就是对描述子进行分类,分类的模型可以是:决策树、SVM、KNN、神经网络等等。神经网络的方法比较直接,但是随着识别的人脸数量增加,需要的参数量和计算量需要大大增加;这里采用SVM和KNN的方法来实现。这两个实现的模型,都是用sklearn的库来实现。 SVM参考: https://github.com/corberan/video_clipper/blob/master/face_classifier.py | https://github.com/corberan/video_clipper/blob/master/face_recognition.py SVM文档: https://www.jianshu.com/p/a9f9954355b3?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation KNN参考: https://github.com/shanren7/real_time_face_recognition/blob/master/train your classifier.ipynb KNN文档: https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html#sklearn.neighbors.KNeighborsClassifier.score More: dlib不只是实现这四个功能,其中也是一个机器学习的算法库,更多可以参考文档 2⃣️ face_recognition:一个基于dlib库的更抽象的人脸检测+识别库 repo: https://github.com/ageitgey/face_recognition 基于几句代码即可实现功能,repo里面有许多example,但是不推荐使用这个库,因为这个库也是基于dlib实现的,完全可以用dlib来实现。 3⃣️ video_cut: repo: https://github.com/corberan/video_clipper 博文: https://zhuanlan.zhihu.com/p/51210714 顾名思义就是找出各个明星出现的时间段,这个应用是基于dlib来实现的。 4⃣️ 人脸跟踪 MTCNN人脸检测+Sort多目标跟踪实现,是一个很简单直接的实现 repo: https://github.com/Linzaer/Face-Track-Detect-Extract 5⃣️ 实时人脸检测与识别: repo: https://github.com/zj19941113/Face_Recognition_dlib 技术路线:MTCNN+faceNet+KNN
总结:
面对公司的实际应用,只拘泥于自己的领域是远远不够的。我的感悟是,在阅读资料和文献时,也该多了解其他领域的做法和改进。最后希望能成功转正吧!拜托?。
转载于:https://www.cnblogs.com/bupt213/p/11372987.html