序言:博客(http://blog.csdn.net/xingchenbingbuyu/article/details/68482838)提到40行代码进行人脸识别,于是按照这篇博客介绍打流程,我尝试进行重现实验结果。
过程1:为了保证实验结果不受客观环境影响,我尽量使我的环境与原博文中的环境一致。一是文件命名、文件放置位置我都与原博文给出的截图一致。如图1。
二是通过博文中给的测试图片,在网上通过以图搜图的功能分别找到相关的原图,并与原博文图片格式保持一致。如图2。图3。
三是代码直接从原博文Copy复制下来,未做任何改动。此处应注意,python对换行有要求,有时复制粘贴会出现格式混乱,代码无法正常运行,需要自行调整格式。
过程2:完成准备工作后,进入.py目录,运行人脸识别程序。完整结果截图如图4。
人脸识别的结果是“The person is: Unknown2”,这与原博文提到的识别结果是
“
The 打person is Bingbing
”不一致。
什么会出现结果不一致?是因为人脸识别错误?原博
主算法存在问题?于是我进一步设置实验进行验证。过程3:从图4截图看出,人脸识别扫描候选人图片顺序是girl6-->girl5--->girl1-->girl2----->girl3--->girl4。而人脸识别程序中候选人名单如下。
对于被测试图片test1,与之对应的候选人图片为girl5,而girl5是第二个扫描的图片,对应程序输出候选人名单数组中第二个元素,也就是“Unknown2”。# 候选人名单 candidate = ['Unknown1','Unknown2','Shishi','Unknown4','Bingbing','Feifei']
也就说原博主的算法并没有错,但是输出结果依赖与候选人图片被扫描顺序。此时我依然是猜测。
为了验证我的猜测,我查看原来的人脸识别程序,发现程序片段
这处在获取候选人图片时可能是依赖于系统。于是我将该程序段换成for f in glob.glob(os.path.join(faces_folder_path, "*.jpg")):
重新运行程序,将候选人图片按照girl1~ggirl6顺序输入,仍对test1进行识别,猜测输出结果应该为Bingbing,因为此时与test1是同一个人的图片girl5是第五个被扫描的图片,对应候选人名单数组元素为Binbing。实际输出结果为#Input file candiates = ['girl1.jpg','girl2.jpg','girl3.jpg','girl4.jpg','girl5.jpg','girl6.jpg']; # 3.描述子提取 #for f in glob.glob(os.path.join(faces_folder_path, "*.jpg")): for f in candiates:
Processing file: ../candidate-faces/girl1.jpg Number of faces detected: 1 Processing file: ../candidate-faces/girl2.jpg Number of faces detected: 1 Processing file: ../candidate-faces/girl3.jpg Number of faces detected: 1 Processing file: ../candidate-faces/girl4.jpg Number of faces detected: 1 Processing file: ../candidate-faces/girl5.jpg Number of faces detected: 1 Processing file: ../candidate-faces/girl6.jpg Number of faces detected: 1 The person is: Bingbing
果然。输出结果和原博主一致,和我猜测的结果一致。为了进一步验证候选人图片扫描顺序会影响输出结果,我将候选人图片输出顺序改为图4扫描顺序(girl6-->girl5--->girl1-->girl2----->girl3--->girl4)。如下。#Input file #candiates = ['girl1.jpg','girl2.jpg','girl3.jpg','girl4.jpg','girl5.jpg','girl6.jpg']; candiates = ['girl6.jpg','girl5.jpg','girl1.jpg','girl2.jpg','girl3.jpg','girl4.jpg']; # 3.描述子提取 #for f in glob.glob(os.path.join(faces_folder_path, "*.jpg")): for f in candiates:
输出结果应为Unkown2。实际输出结果为:
Processing file: ../candidate-faces/girl6.jpg Number of faces detected: 1 Processing file: ../candidate-faces/girl5.jpg Number of faces detected: 1 Processing file: ../candidate-faces/girl1.jpg Number of faces detected: 1 Processing file: ../candidate-faces/girl2.jpg Number of faces detected: 1 Processing file: ../candidate-faces/girl3.jpg Number of faces detected: 1 Processing file: ../candidate-faces/girl4.jpg Number of faces detected: 1 The person is: Unknown2
实际输出结果和我的猜测结果一致。最终结论:原博主的人脸识别算法思路上是没有问题的,但是在算法实现上,输出结果依赖于输入文件打扫描顺序这是不合理的。