来凑个热闹,我是一名本科生,我的理想是发一篇cvpr。
在人脸方向学习有一段时间了,谈谈我的看法。
首先回答你的问题,“大学生写人脸识别算法的可能性”。
答案是可以,完全可能。(你说的大学生,我理解为本科生)暂时先抛开人脸识别算法的准确性来说,目前开源的人脸识别的项目代码就有很多,数不胜数。目前用的比较多的有seetaFace,dlib库,还有opencv自带的基于模板匹配的识别,这些都是基于传统的特征提取然后进行距离度量的方法。目前比较火的基于深度学习的人脸识别也有很多,类似于centerFace,normFace,sphereFace,都是最近关注度比较高的一些深度学习的人脸识别,还有kaipengZhang在本科阶段就搞出了MTCNN这样牛逼的人脸检测算法。所以你说的问题完全是有可能的,很多在校本科生在这方面已经玩的很熟了。(后面我把这些开源项目地址放出来)
然后,我觉得你是不是加入了一个自称技术极客的所谓技术群
为什么这么说呢,现在有一群人很瞧不起他们眼中的大学生。他们这群人就是自己没读过大学,但是收入比普通大学生要高。举个例子,我一个初中同学,高中没读完,就去读了个技校,然后工作,然后在07年前后参加了IT培训班,当时的IT浪潮刚刚起来。现在在帝都的互联网公司,年收入20~30W。这收入当然是秒杀我这种渣渣了。所以每次见面他都是有一种隐约的现在的大学生都学些啥东西,浪费青春,云云。因为现在互联网行业的待遇确实要比其他行业的高很多。并且是随便一个培训班培训出来学生就比普通本科文科或者工科学生工资要高。
现在瞧不起大学生的人群有很多,一方面是因为他身边的大学生确实不怎么样导致他管中窥豹,认为所有的大学生都不怎么样。另一方面是他确实比大多数大学生某一方面强(一般他们会看经济收入)
最后,放一点资料,写一点人脸方面的东西
人脸分为两个部分:人脸检测,人脸识别
人脸识别又分为两个部分:face verification(人脸验证)和 face identification(人脸辨识)。
解释下这两个概念。face verification是1对1,判断两个人脸是否是同一人,验证现在待检测的你是不是你自己,例如现在武汉火车站实现了刷人脸自助进站,刷身份证就验明信息,这里就是对比身份证上的图片和你进站时摄像头拍的图片进行对比,验证是否是同一人。face identification是1对n,从人脸库中找到给定的人脸的对应身份信息。或者理解成检测你是不是某个黑名单中的要管制的对象,例如公安系统的黑名单对比,或者人脸识别考勤,就是确认你是不是数据库中的某个对象。
人脸检测
人脸检测从刚开始的分类器(adaboost之类)到现在神经网络,发展很快,效果也很好。
1,opencv2中就自带了人脸检测的代码,也是利用分类器的原理进行检测,OpenCV\samples\facedetect.cpp,实现起来特别简单。
2,seetaFace 是中科院山世光组开源的一个项目,除了opencv以外不依赖其他的第三方库。效果和速度都还不错,是当时2016年的开源的一股清流,当时评价很不错。唯一遗憾是没有开源训练方法。
seetaface/SeetaFaceEngine
3,MTCNN 这个是基于深度学习做的一个人脸检测,它是一个级联的cnn结构。其检测效果很不错,也是现在用的最多的一个开源的人脸检测算法。
论文链接:
[1604.02878v1] Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks
代码链接:
https://github.com/kpzhang93/MTCNN_face_detection_alignment
4,MTCNN-light 上面3中的MTCNN是基于深度学习框架下实现的人脸检测,在GPU上的表现很不错,但是在CPU上面时间消耗或许成了一个问题,后来有人仿照mtcnn的思想,用c++代码没有依赖框架实现了mtcnn-light。虽然精度有一点损失但是在cpu上表现不错。
代码链接:
AlphaQi/MTCNN-light
人脸识别
人脸识别的目的就是将人脸检测到的人脸进一步确认其身份,严格地来讲,在进行识别之前还有一个步骤,叫做人脸对齐(face alignment),有时候检测到的人脸是歪的,斜的,需要将人脸进行对齐,对齐之后再识别。
人脸对齐就需要准确的标注出人脸上的特征点位置,例如眼睛,鼻子,嘴巴,或者轮廓,这样才能知道人脸的角度,再进行对齐操作。seetaface,mtcnn中都带有特征点输出,当然还有dlib和3000fps这样的库进行人脸对齐。
dlib链接:
dlib C++ Library
人脸识别中最重要的一部分就是将人脸上的特征如何提取出来这一部分,根据提取特征这一部分的方法的不同可以分为传统特征提取和深度学习特征提取。传统的提取人脸特征一般是haar或者lbp特征,深度学习提取的特征是不为人知的某种特征。将提取出来的特征(n维的特征向量)用距离度量的某种方法来判断两个人脸的相似度。
现在深度学习常用的人脸识别的算法有
caffeFace:
https://github.com/ydwen/caffe-face
normFace:
https://github.com/happynear/NormFace
mobile ID:
liuziwei7/mobile-id
sphereFace:
wy1iu/sphereface
sphereFace是截止到目前开源的效果最好的一个算法。
特征提取完成之后,需要用一种度量的方法来判断两个特征向量的距离,从而判断两个图片是否是同一个人。
在face verification中常用的方法就是 联合贝叶斯
在face identification中常用的方法是 余弦相似度
在度量方法中其实有很多种可选的方法,上面说的只是比较常见的。
目前想到这么多就写这么多吧,以后有时间再更新。
-----------2018年4月6日
又过了好几个月的时间了,新的人脸识别算法层出不穷。
AM-softmax
[1801.05599] Additive Margin Softmax for Face Verification
cosface
Large Margin Cosine Loss for Deep Face Recognition
上面这两个算法其实是一样的,撞车了。其根本的思想都是基于sphere face的大尺度边界设计的损失函数上做文章的。
目前效果最好的人脸识别开源算法应该是 洞见实验室的arcface(因为arcface与虹软的arcface相同,所以将其名字改为了insightface)代码链接:
insightface。
之前基于度量学习的人脸识别算法都面临一个很严重的问题,难以训练。例如sphereface中,其loss的核心思想:
最小类间距离大于最大类内距离,所以在自己组织样本训练的时候会非常的难以收敛,但是arcface在训练方面会好一点。
----------------2018年7月25日
我想换一份工作,去面试了一家做人脸的公司。真正地诠释了什么“自取其辱”,其实我现在也开始怀疑了本科生适不适合做图像算法了。
一个本科生去面试算法工程师自取其辱的故事 - CSDN博客