天天看点

40行代码的人脸识别实践【转】 40行代码的人脸识别实践

版权声明:本文为博主原创文章,转载请联系作者取得授权。

<a href="http://blog.csdn.net/xingchenbingbuyu/article/details/68482838?ref=myrecommend#40%E8%A1%8C%E4%BB%A3%E7%A0%81%E7%9A%84%E4%BA%BA%E8%84%B8%E8%AF%86%E5%88%AB%E5%AE%9E%E8%B7%B5" target="_blank">40行代码的人脸识别实践</a>

<a href="http://blog.csdn.net/xingchenbingbuyu/article/details/68482838?ref=myrecommend#%E5%89%8D%E8%A8%80" target="_blank">前言</a>

<a href="http://blog.csdn.net/xingchenbingbuyu/article/details/68482838?ref=myrecommend#%E4%B8%80%E7%82%B9%E5%8C%BA%E5%88%86" target="_blank">一点区分</a>

<a href="http://blog.csdn.net/xingchenbingbuyu/article/details/68482838?ref=myrecommend#%E6%89%80%E7%94%A8%E5%B7%A5%E5%85%B7" target="_blank">所用工具</a>

<a href="http://blog.csdn.net/xingchenbingbuyu/article/details/68482838?ref=myrecommend#dlib" target="_blank">Dlib</a>

<a href="http://blog.csdn.net/xingchenbingbuyu/article/details/68482838?ref=myrecommend#%E4%BA%BA%E8%84%B8%E8%AF%86%E5%88%AB" target="_blank">人脸识别</a>

<a href="http://blog.csdn.net/xingchenbingbuyu/article/details/68482838?ref=myrecommend#1-%E5%89%8D%E6%9C%9F%E5%87%86%E5%A4%87" target="_blank">前期准备</a>

<a href="http://blog.csdn.net/xingchenbingbuyu/article/details/68482838?ref=myrecommend#2%E8%AF%86%E5%88%AB%E6%B5%81%E7%A8%8B" target="_blank">识别流程</a>

<a href="http://blog.csdn.net/xingchenbingbuyu/article/details/68482838?ref=myrecommend#3%E4%BB%A3%E7%A0%81" target="_blank">代码</a>

<a href="http://blog.csdn.net/xingchenbingbuyu/article/details/68482838?ref=myrecommend#4%E8%BF%90%E8%A1%8C%E7%BB%93%E6%9E%9C" target="_blank">运行结果</a>

很多人都认为人脸识别是一项非常难以实现的工作,看到名字就害怕,然后心怀忐忑到网上一搜,看到网上N页的教程立马就放弃了。这些人里包括曾经的我自己。其实如果如果你不是非要深究其中的原理,只是要实现这一工作的话,人脸识别也没那么难。今天我们就来看看如何在40行代码以内简单地实现人脸识别。

对于大部分人来说,区分人脸检测和人脸识别完全不是问题。但是网上有很多教程有无无意地把人脸检测说成是人脸识别,误导群众,造成一些人认为二者是相同的。其实,人脸检测解决的问题是确定一张图上有木有人脸,而人脸识别解决的问题是这个脸是谁的。可以说人脸检测是是人识别的前期工作。今天我们要做的是人脸识别。

<code>Dlib</code>

<code>scikit-image</code>

<code>pip install dlib</code>

上面需要用到的<code>scikit-image</code>同样只是需要这么一句:

<code>pip install scikit-image</code>

注:如果用<code>pip install dlib</code>安装失败的话,那安装起来就比较麻烦了。错误提示很详细,按照错误提示一步步走就行了。

之所以用Dlib来实现人脸识别,是因为它已经替我们做好了绝大部分的工作,我们只需要去调用就行了。Dlib里面有人脸检测器,有训练好的人脸关键点检测器,也有训练好的人脸识别模型。今天我们主要目的是实现,而不是深究原理。感兴趣的同学可以到官网查看源码以及实现的参考文献。今天的例子既然代码不超过40行,其实是没啥难度的。有难度的东西都在源码和论文里。

首先先通过文件树看一下今天需要用到的东西:

40行代码的人脸识别实践【转】 40行代码的人脸识别实践

准备了六个候选人的图片放在<code>candidate-faces</code>文件夹中,然后需要识别的人脸图片<code>test.jpg</code>。我们的工作就是要检测到<code>test.jpg</code>中的人脸,然后判断她到底是候选人中的谁。另外的<code>girl-face-rec.py</code>是我们的python脚本。<code>shape_predictor_68_face_landmarks.dat</code>是已经训练好的人脸关键点检测器。<code>dlib_face_recognition_resnet_model_v1.dat</code>是训练好的ResNet人脸识别模型。ResNet是何凯明在微软的时候提出的深度残差网络,获得了 ImageNet 2015 冠军,通过让网络对残差进行学习,在深度和精度上做到了比

CNN 更加强大。

然后准备几个人的人脸图片作为候选人脸,最好是正脸。放到<code>candidate-faces</code>文件夹中。

本文这里准备的是六张图片,如下:

40行代码的人脸识别实践【转】 40行代码的人脸识别实践

她们分别是

40行代码的人脸识别实践【转】 40行代码的人脸识别实践

然后准备四张需要识别的人脸图像,其实一张就够了,这里只是要看看不同的情况:

40行代码的人脸识别实践【转】 40行代码的人脸识别实践

可以看到前两张和候选文件中的本人看起来还是差别不小的,第三张是候选人中的原图,第四张图片微微侧脸,而且右侧有阴影。

数据准备完毕,接下来就是代码了。识别的大致流程是这样的:

先对候选人进行人脸检测、关键点提取、描述子生成后,把候选人描述子保存起来。

然后对测试人脸进行人脸检测、关键点提取、描述子生成。

最后求测试图像人脸描述子和候选人脸描述子之间的欧氏距离,距离最小者判定为同一个人。

代码不做过多解释,因为已经注释的非常完善了。以下是<code>girl-face-rec.py</code>

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 7482 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 11

我们在<code>.py</code>所在的文件夹下打开命令行,运行如下命令

<code>python girl-face-rec.py 1.dat 2.dat ./candidate-faecs test1.jpg</code>

由于<code>shape_predictor_68_face_landmarks.dat</code>和<code>dlib_face_recognition_resnet_model_v1.dat</code>名字实在太长,所以我把它们重命名为<code>1.dat</code>和<code>2.dat</code>。

运行结果如下:

<code>The person is Bingbing</code>。

这里需要说明的是,前三张图输出结果都是非常理想的。但是第四张测试图片的输出结果是候选人4。对比一下两张图片可以很容易发现混淆的原因。

有兴趣的同学可以继续深入研究如何提升识别的准确率。比如每个人的候选图片用多张,然后对比和每个人距离的平均值之类的。全凭自己了。

40行代码的人脸识别实践【转】 40行代码的人脸识别实践

【新浪微博】 张昺华--sky

【twitter】 @sky2030_

【facebook】 张昺华 zhangbinghua

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

继续阅读