照片里面的人物怎么可以机械硬盘识别不出来出来

内容字号:
段落设置:
字体设置:
精准搜索请尝试:
无处可逃:Facebook能从4亿张面孔中找到你
来源:作者:佚名责编:远洋
也许你并没有意识到,你在社交网络上的每一张照片,都可能暴露自己的信息。像Facebook这样的社交巨头,已经强大到可以从每天用户上传的约4亿张照片中找到你。一直以来,Facebook都在尝试让计算机赶上人的能力,为此还组建了一个人工智能实验室(AI&Lab),希望通过“深度学习”(&Deep&Learning)算法调查用户在社交网络上的行为和习惯,进而精准推送信息。其命名为DeepFace的人脸识别技术正是这个实验室的重点项目之一。为了研究DeepFace,Facebook建立了一个来自于4030个人的440万张标签化的人脸池,公司称这是迄今为止规模最大的人脸池。实验室从这些照片中分析各项组合模块,如眉毛、眼镜、鼻子、脸型等,并在它们上面找到关键的定位点,进而凭借定位点来识别人脸。一旦计算机完成这个过程,被分析的照片将形成类似指纹一样的信息文件。具体到对每一个脸部图像的处理,Facebook有两个步骤:首先纠正面部的角度,用三维模型来使照片中的人脸朝前;然后采取深度学习的方法,以一个模拟神经网络推算出调整后面部的数字描述。如果DeepFace从两张不同的照片得到了足够相似的描述,它就会认定照片展示的是同一张脸。目前,在辨别两张陌生照片中的面孔是否是同一个人时,DeepFace的识别率已经达到了97.25%,而人在进行相同测试时的成绩为97.5%。项目组的成员Yaniv&Taigman非常自豪地说:“我们的新软件已经非常接近人脑的识别能力,比起早些时候执行同样任务的软件,它的错误率已经减少了超过四分之一。”如果DeepFace能不断提高辨识率,未来,Facebook借助这一技术将可以围绕身份验证衍生出很大的想象空间,例如“刷脸”支付等等。不过,除了技术难题,Facebook还得面临一件麻烦事:它如何让用户相信,人脸识别不会侵犯到隐私?对此,Facebook强调,DeepFace项目的研究目的是为了加强保护隐私,而不是暴露用户信息。一旦系统从每天上传到Facebook的上亿张新照片中发现了一张你的脸部照片,用户将会收到警告,可以选择模糊脸部以保护隐私。该程序同样适用于来自朋友圈中陌生人的照片,但用户只能看到他们认识的人的面孔。事实上,过去几年,Facebook一直在隐私问题上饱受指责。早在2010年底,Facebook就曾经希望利用人脸识别技术做一些事情,并发布了一款名为Tag&Suggestions的软件。这是一个基于人脸识别技术的新功能,可以在用户把照片上传到Facebook时将新照片与已经标识过的照片进行对比,并把相似的照片分在一组,在需要时,Facebook还会向用户提供照片中好友的姓名,有助于简化标识照片的过程。起初,Tag&Suggestions只是在北美上线,当2011年6月它开始在全球推广时,其他地区的用户突然发现,在事先没有收到任何通知的情况下,该功能已经被自动激活了。这就意味着你的Facebook好友上传照片时,Facebook会自动识别照片中是否有你,甚至会建议你的好友将你标记出来。虽然标记仍然由好友完成,但Facebook在这个过程中明显在鼓励大家标注图片。并不是所有用户都能容忍系统在未经允许情况下自动开启人脸识别功能的行为,所以Tag&Suggestions的推出遭到了欧洲隐私保护机构的强烈反对。先是德国官员威胁,将会对Facebook的人脸识别功能发起诉讼;接着,爱尔兰的相关部门针对此事进行调查,随后,Facebook被迫在欧洲地区关闭了人脸识别功能,并删除了针对欧洲用户建立的人脸数据库。因此,这一次DeepFace亮相后,用户的第一反应也是隐私问题。Facebook要使用户相信人脸识别技术能给他们带来安全的数字体验并不容易,毕竟过去它曾经引发不小争议。
软媒旗下软件:
IT之家,软媒旗下科技门户网站 - 爱科技,爱这里。
Copyright (C) , All Rights Reserved.有那个开源库可以做到从一张图片里识别出人脸并且把人脸抠图出来?
19:49:00 +08:00 · 4231 次点击
9 回复 &| &直到
00:42:59 +08:00
& & 19:59:13 +08:00 via iPhone
& & 23:30:54 +08:00
QQ 空间有,从一张照片里框出一个人问你“这个人是某某某吗?”
& & 14:40:06 +08:00 via Android
@ Facebook 有。。
& & 22:33:35 +08:00
QQ 空間和 FB 這種只實現了第一種功能,能實現識別人臉的有很多,能實現第二種功能的我還沒見過...
& & 16:45:17 +08:00
& & 20:00:56 +08:00 via iPhone
& & 21:45:01 +08:00
opencv 可以的,加上一些 haarcascade 文件,其实就是别人通过机器学习做好的一些脸部特征文件。
之前我写了个把照片上的人带上圣诞帽的小程序,可以看下
这个里面的 facedet 函数就是检测照片里的人脸,返回位置值
& & 14:46:51 +08:00
感谢各位的建议~
& & 00:42:59 +08:00 via iPhone
opencv ,只要能定位脸在哪,抠出来并不算难事
& · & 1717 人在线 & 最高记录 3541 & · &
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.1 · 17ms · UTC 08:22 · PVG 16:22 · LAX 01:22 · JFK 04:22? Do have faith in what you're doing.人脸识别中是怎么抓取一张图片中人脸的_百度知道
人脸识别中是怎么抓取一张图片中人脸的
最近想学点人脸识别的知识,可是为什么大部分算法都是针对人脸库,就是已经处理过的图片进行的
我有更好的答案
人脸识别系统可使用的特征通常分为视觉特征、像素统计特征、人脸图像变换系数特征、人脸图像代数特征等。人脸特征提取就是针对人脸的某些特征进行的。人脸特征提取,也称人脸表征,它是对人脸进行特征建模的过程。人脸特征提取的方法归纳起来分为两大类:一种是基于知识的表征方法;另外一种是基于代数特征或统计学习的表征方法(来源于百科)。同时欢迎关注瑞为了解更多有关人脸识别的技术。
opencv是不是可以实现呢
采纳率:55%
通过颜色,人脸的颜色范围是很小的
谢谢,能具体点吗
为您推荐:
其他类似问题
您可能关注的内容
人脸识别的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。现在的位置:
-> -> ->教你从手面相中识别出小人
教你从手面相中识别出小人
来 源:非常运势相术网 关键字:
  生活是很现实的,虽然说我们身边有家人也有朋友,但是小人难防,我们难免会被小人给陷害。那么我们平时要如何识别出小人呢?从来看,小人从手便可以看出来,今天小编就教你从手面相中识别出小人,感兴趣的小伙伴们一起来了解一下吧!
  第一:印堂狭窄,同时人中短
  两眉之间的印堂若过于狭窄,人中又很短,这种人心胸狭窄,见不得别人好。若有人在他面前夸赞某某人很卖力,他可能会当场说一些不是很好听的话。像这样的人,他会比较劳碌,因为他怕事情交代出去,功劳会被抢走,所以就样样自己来。如果你的主管是这样的面向,千万不要跟他抢功劳,就算功劳是你的,你也要把所有的功劳都给他,便可以避免他在你后面扯后腿了。
  第二、,同时食指下方有井字纹
  这种导致的小心眼较着重在钱财方面,这个人对钱财会非常地斤斤计较,他也许会捐100万给孤儿院,但是若跟他做生意,5块钱也一定要算清楚,也因为这样分明的态度,有这种手相的人通常也小有钱财,他会将所有该支出的项目都算得清清楚楚,即便是捐款,也可能是因为这项捐款可以赢得好名声,而这样的好名声则可以为他再赚得更多的,所以想从他身上捞到好处,根本就是不可能的。
  第三、鼻梁骨突起,同时有三白眼
  有这种面相的人不只见不得别人好,而且会有很强的报复心态。若有一个很漂亮的女生和他一起做室友,他可能会在这位美丽室友的化妆品里动一点手脚,让这位室友不再美丽。在这种人面前,也千万不要过度称赞别人,因为他很会记狠,这时候你就要多多称赞他。虽然你称赞有这种面相的人并不能得到什么好处,但至少他不会拿你开刀,在他面前说话更要小心,若可以的话,最好离这种人远一点。
(责任编辑:)
来再看几篇相关的文章
还没有相关文章
来再玩几个相关的测算
命宫:两眉之间
兄弟宫:眉毛的位置
财帛宫:鼻头准头部位
田宅宫:眉毛与眼之间
子女宫:眼肚部位
奴仆宫:面颊下
妻妾宫:眼尾
疾厄宫:鼻梁中间
迁移宫:额头两侧
官禄宫:额头中央
福德宫:眉尾上部
父母宫:整个脸部
十二宫图解
倒三角型脸
连眉/连心眉
两眉有竖纹
半睡眼招桃花
男人桃花眼
女人桃花眼
男人三角眼
丹凤眼的女人
女人卧蚕眼
桃花眼会犯桃花吗
眼睛看出好男人
眼睛看最花心的男人
眼睛看最不忠心的女人
眼睛看桃花运
眼睛看财运
眼睛看婚姻运
眼形预知感情运
眼睛预知未来运势
眼睛看你是否好色
左眼跳财右眼跳灾
眼睛看异性缘
眼睛看有没有富贵命
能发财的眼睛面相
男人眼角下垂
开眼角会增强孤独运
眼距宽的女人
眼周有黑气的女人
眼距过窄的女人
眼皮跳是吉是凶
三弯三曲鼻
女人克夫鼻
易漏财的鼻子
鼻子上长痣
鼻子歪的人
鼻子小的人
耳鼻看烂桃花
鼻子看挣钱运
男人鼻子看情欲
八种能发财的鼻子
百年难得一遇的好鼻相
鼻子分析你何时有桃花
鼻子看富贵发财命
鼻子看你一生命运好坏
鼻子看30岁后运势
嘴型看富贵指数
嘴型看财运
嘴巴看事业运
嘴唇看何时走好运
嘴唇看是否会离婚
嘴巴大小看你财
嘴形看有没有贵人
嘴唇厚薄看运势
嘴唇厚的男人
嘴唇厚的女人
嘴唇薄的人
嘴唇薄的女人
嘴唇薄的男人
女人嘴唇有痣
嘴巴小的人
嘴巴小的女人
嘴巴小的男人
尖嘴的女人
女人嘴大旺夫吗
嘴歪的人面相
笑起来嘴向左歪面相
女人嘴歪面相
男人嘴歪面相
有福气的耳朵
耳朵大小看你命运吉凶
耳垂与命运的关系
耳朵看桃花运
戴耳环会破坏运势吗
耳垂大有福吗
耳朵看寿命长短
耳朵看爱情运
招风耳面相
一生富贵的耳朵
最有福气的耳朵面相
人中看事业
人中看健康
剑尖形人中
人中上窄下宽
人中上宽下窄
人中没胡须
人中有十字纹
人中有直纹
人中有横纹
人中看寿命
人中深浅面相详解
人中有痣面相详解
人中深长面相详解
女人人中长痣
男人人中有痣
人中看生男生女
人中看你的性格
人中看你是否富贵
人中窄并且弯而细
下巴小而尖
下巴突又弯
下巴既狭且圆
下巴长胡须
下巴饱满丰隆
美人沟下巴
下巴有刀伤
男人下巴有痣
女人下巴长痣
双下巴是富贵面相吗
女人双下巴
男人双下巴
女人双下巴旺夫吗
尖下巴锥子脸
下巴宽的人
尖下巴的女人旺夫吗
女人下巴尖
下巴测试你的魅力指数
下巴形状预测下半生福气
下巴形状预测命运吉凶
下巴形状看性格
额头有美人尖
额头有黑线
额头有疤痕
额头有青筋
最有福的额头
颧骨上长痣
男人颧骨高
女人颧骨高
颧骨高的面相
颧骨上长痣
颧骨看命运
颧骨高的男人
颧骨低的女人
颧骨低的人
颧骨突出的男人
最克夫的颧骨面相
女人颧骨高克夫吗
颧骨位置看你是否富贵
女人额头窄颧骨高
女人长虎牙
男人长虎牙
龅牙的男人
牙齿的颜色
牙齿有缝的人
牙齿看一生命运好坏
牙齿看寿命和财运
牙齿看一生能否富贵
牙齿个数与富贵命
鼻孔大小预测财富
鼻孔大小与命运
鼻孔大小看财运
鼻尖看一生财运和事业运
女人鼻尖上有痣好不好
男人鼻尖上长痣好不好
鼻尖翘的女人面相好吗
鼻梁看健康好坏
鼻梁上有痣
鼻梁看事业运
鼻梁看命运
塌鼻梁的女人
矮鼻梁女人命运
鼻子看富贵命
鼻子看事业成就
鼻子大小看财运
鼻子大的女人
鼻子高挺的女人
鼻子大的女人会克夫吗
鼻子看你能否发大财
不旺夫的鼻子
女人旺夫鼻是什么样
免费在线速算
生辰八字爱情配对
男方生日:
出生时辰:
早子(00:00~00:59)
丑(01:00~02:59)
寅(03:00~04:59)
卯(05:00~06:59)
辰(07:00~08:59)
巳(09:00~10:59)
午(11:00~12:59)
未(13:00~14:59)
申(15:00~16:59)
酉(17:00~18:59)
戌(19:00~20:59)
亥(21:00~22:59)
晚子(23:00~23:59)
时辰不清楚
女方生日:
出生时辰:
早子(00:00~00:59)
丑(01:00~02:59)
寅(03:00~04:59)
卯(05:00~06:59)
辰(07:00~08:59)
巳(09:00~10:59)
午(11:00~12:59)
未(13:00~14:59)
申(15:00~16:59)
酉(17:00~18:59)
戌(19:00~20:59)
亥(21:00~22:59)
晚子(23:00~23:59)
时辰不清楚
2018年运程测试
早子(00:00~00:59)
丑(01:00~02:59)
寅(03:00~04:59)
卯(05:00~06:59)
辰(07:00~08:59)
巳(09:00~10:59)
午(11:00~12:59)
未(13:00~14:59)
申(15:00~16:59)
酉(17:00~18:59)
戌(19:00~20:59)
亥(21:00~22:59)
晚子(23:00~23:59)
您当前阅读的文章是:教你从手面相中识别出小人
客服电话:400-800-1113(免长途费) 本站所有分析资料仅供参考 2018年版权所有 posts - 7,&
comments - 21,&
trackbacks - 0
不断维护的地址:
怎样使用OpenCV进行人脸识别
&&&&&&&& 本文大部分来自OpenCV官网上的Face Reconition with OpenCV这节内容(),小弟我尝试翻译一些重要内容。这部分内容是Philipp Wagner写的,他的github:,他的网站,应该是个德国人。下面应该是他的照片。
&&&&&&&& 友情提示,要看懂代码前,你得先知道OpenCV的安装和配置,会用C++,用过一些OpenCV函数。基本的图像处理和矩阵知识也是需要的。[gm:我是箫鸣的注释]由于我仅仅是翻译,对于六级才过的我,肯定有一些翻译错的或者不当的地方,所以请大家纠错。
从OpenCV2.4开始,加入了新的类FaceRecognizer,我们可以使用它便捷地进行人脸识别实验。本文既介绍代码使用,又介绍算法原理。(他写的源代码,我们可以在OpenCV的opencv\modules\contrib\doc\facerec\src下找到,当然也可以在他的github中找到,如果你想研究源码,自然可以去看看,不复杂)
目前支持的算法有
&&&&&&& Eigenfaces特征脸
&&&&&&&& Fisherfaces &
&&&&&&&& LocalBinary Patterns Histograms局部二值直方图&
下面所有的例子中的代码在OpenCV安装目录下的samples/cpp下面都能找到,所有的代码商用或者学习都是免费的。
1.2.人脸识别
对人类来说,人脸识别很容易。文献告诉我们,仅仅是才三天的婴儿已经可以区分周围熟悉的人脸了。那么对于计算机来说,到底有多难?其实,迄今为止,我们对于人类自己为何可以区分不同的人所知甚少。是人脸内部特征(眼睛、鼻子、嘴巴)还是外部特征(头型、发际线)对于人类识别更有效?我们怎么分析一张图像,大脑是如何对它编码的?和向我们展示,我们的大脑针对不同的场景,如线、边、角或者运动这些局部特征有专门的神经细胞作出反应。显然我们没有把世界看成零散的块块,我们的视觉皮层必须以某种方式把不同的信息来源转化成有用的模式。自动人脸识别就是如何从一幅图像中提取有意义的特征,把它们放入一种有用的表示方式,然后对他们进行一些分类。基于几何特征的人脸的人脸识别可能是最直观的方法来识别人脸。第一个自动人脸识别系统在中又描述:标记点(眼睛、耳朵、鼻子等的位置)用来构造一个特征向量(点与点之间的距离、角度等)。通过计算测试和训练图像的特征向量的欧氏距离来进行识别。这样的方法对于光照变化很稳健,但也有巨大的缺点:标记点的确定是很复杂的,即使是使用最先进的算法。一些几何特征人脸识别近期工作在文献中有描述。一个22维的特征向量被用在一个大数据库上,单靠几何特征不能提供足够的信息用于人脸识别。
特征脸方法在文献中有描述,他描述了一个全面的方法来识别人脸:面部图像是一个点,这个点是从高维图像空间找到它在低维空间的表示,这样分类变得很简单。低维子空间低维是使用主元分析(Principal Component Analysis,PCA)找到的,它可以找拥有最大方差的那个轴。虽然这样的转换是从最佳重建角度考虑的,但是他没有把标签问题考虑进去。[gm:读懂这段需要一些机器学习知识]。想象一个情况,如果变化是基于外部来源,比如光照。轴的最大方差不一定包含任何有鉴别性的信息,因此此时的分类是不可能的。因此,一个使用线性鉴别(Linear Discriminant Analysis,LDA)的特定类投影方法被提出来解决人脸识别问题。其中一个基本的想法就是,使类内方差最小的同时,使类外方差最大。
近年来,各种局部特征提取方法出现。为了避免输入的图像的高维数据,仅仅使用的局部特征描述图像的方法被提出,提取的特征(很有希望的)对于局部遮挡、光照变化、小样本等情况更强健。有关局部特征提取的方法有盖伯小波(Gabor Waelets)(),离散傅立叶变换(DiscreteCosinus Transform,DCT)(),局部二值模式(LocalBinary Patterns,LBP)()。使用什么方法来提取时域空间的局部特征依旧是一个开放性的研究问题,因为空间信息是潜在有用的信息。
1.3.人脸库
我们先获取一些数据来进行实验吧。我不想在这里做一个幼稚的例子。我们在研究人脸识别,所以我们需要一个真的人脸图像!你可以自己创建自己的数据集,也可以从这里()下载一个。
又称ORL人脸数据库,40个人,每人10张照片。照片在不同时间、不同光照、不同表情(睁眼闭眼、笑或者不笑)、不同人脸细节(戴眼镜或者不戴眼镜)下采集。所有的图像都在一个黑暗均匀的背景下采集的,正面竖直人脸(有些有有轻微旋转)。
&ORL数据库对于初始化测试比较适合,但它是一个简单的数据库,特征脸已经可以达到97%的识别率,所以你使用其他方法很难得到更好的提升。Yale人脸数据库是一个对于初始实验更好的数据库,因为识别问题更复杂。这个数据库包括15个人(14个男人,1个女人),每一个都有11个灰度图像,大小是320*243像素。数据库中有光照变化(中心光照、左侧光照、右侧光照)、表情变化(开心、正常、悲伤、瞌睡、惊讶、眨眼)、眼镜(戴眼镜或者没戴)。
&&&&&&&& 坏消息是它不可以公开下载,可能因为原来的服务器坏了。但我们可以找到一些镜像(比如)但我不能保证它的完整性。如果你需要自己剪裁和校准图像,可以阅读我的笔记()。
&此数据库包含38个人的2414张图片,并且是剪裁好的。这个数据库重点是测试特征提取是否对光照变化强健,因为图像的表情、遮挡等都没变化。我认为这个数据库太大,不适合这篇文章的实验,我建议使用ORL数据库。
我们从网上下了数据,下了我们需要在程序中读取它,我决定使用CSV文件读取它。一个CSV文件包含文件名,紧跟一个标签。
/path/to/image.0
&&&&&&&& 假设/path/to/image.ext是图像,就像你在windows下的c:/faces/person0/image0.jpg。最后我们给它一个标签0。这个标签类似代表这个人的名字,所以同一个人的照片的标签都一样。我们对下载的ORL数据库进行标识,可以获取到如下结果:
./at/s1/1.0
./at/s1/2.0
./at/s2/1.1
./at/s2/2.1
./at/s40/1.39
./at/s40/2.39
想象我已经把图像解压缩在D:/data/at下面,而CSV文件在D:/data/at.txt。下面你根据自己的情况修改替换即可。一旦你成功建立CSV文件,就可以像这样运行示例程序:
facerec_demo.exe D:/data/at.txt
1.3.2&Creating the CSV File
你不需要手工来创建一个CSV文件,我已经写了一个Python程序来做这事。
[gm:说一个我实现的方法
如果你会cmd命令,或者称DOS命令,那么你打开命令控制台。假设我们的图片放在J:下的Faces文件夹下,可以输入如下语句:
J:\Faces\ORL&dir /b/s *.bmp & at.txt
然后你打开at.txt文件可能看到如下内容(后面的0,1..标签是自己加的):
J:\Faces\ORL\s1\1.0
J:\Faces\ORL\s1\10.0
J:\Faces\ORL\s1\2.0
J:\Faces\ORL\s1\3.0
J:\Faces\ORL\s1\4.0
J:\Faces\ORL\s1\5.0
J:\Faces\ORL\s1\6.0
J:\Faces\ORL\s1\7.0
J:\Faces\ORL\s1\8.0
J:\Faces\ORL\s1\9.0
J:\Faces\ORL\s10\1.1
J:\Faces\ORL\s10\10.1
J:\Faces\ORL\s10\2.1
J:\Faces\ORL\s10\3.1
J:\Faces\ORL\s10\4.1
J:\Faces\ORL\s10\5.1
J:\Faces\ORL\s10\6.1
自然还有c++编程等方法可以做得更好,看这篇文章反响,如果很多人需要,我就把这部分的代码写出来。(遍历多个文件夹,标上标签)
Eigenfaces
&&&&&&&& 我们讲过,图像表示的问题是他的高维问题。二维灰度图像p*q大小,是一个m=qp维的向量空间,所以一个100*100像素大小的图像就是10,000维的图像空间。问题是,是不是所有的维数空间对我们来说都有用?我们可以做一个决定,如果数据有任何差异,我们可以通过寻找主元来知道主要信息。主成分分析(Principal Component Analysis,PCA)是&(1901)独立发表的,而&&(1933)把一些可能相关的变量转换成一个更小的不相关的子集。想法是,一个高维数据集经常被相关变量表示,因此只有一些的维上数据才是有意义的,包含最多的信息。PCA方法寻找数据中拥有最大方差的方向,被称为主成分。
令&&&表示一个随机特征,其中&&.
计算均值向量&
& & & & & & & & & & & & & & &
计算协方差矩阵&S
& & & & & & & & & & & & & & & &&
计算 的特征值&&&&和对应的特征向量&&&& & & & & && &
对特征值进行递减排序,特征向量和它顺序一致. K个主成分也就是k个最大的特征值对应的特征向量。
x的K个主成份:
PCA基的重构:
& & & & & & & & &&
然后特征脸通过下面的方式进行人脸识别:
A.& 把所有的训练数据投影到PCA子空间
B.& 把待识别图像投影到PCA子空间
C.& 找到训练数据投影后的向量和待识别图像投影后的向量最近的那个。
还有一个问题有待解决。比如我们有400张图片,每张100*100像素大小,那么PCA需要解决协方差矩阵&的求解,而X的大小是,那么我们会得到大小的矩阵,这需要大概0.8GB的内存。解决这个问题不容易,所以我们需要另一个计策。就是转置一下再求,特征向量不变化。文献&中有描述。
[gm:这个PCA还是自己搜着看吧,这里的讲的不清楚,不适合初学者看]
OpenCV中使用特征脸
给出示例程序源代码
#include "opencv2/core/core.hpp"
#include "opencv2/contrib/contrib.hpp"
#include "opencv2/highgui/highgui.hpp"
#include &iostream&
#include &fstream&
#include &sstream&
static Mat norm_0_255(InputArray _src) {
&&& Mat src = _src.getMat();
&&& // 创建和返回一个归一化后的图像矩阵:
&&& switch(src.channels()) {
&&& case1:
&&&&&&& cv::normalize(_src, dst, 0,255, NORM_MINMAX, CV_8UC1);
&&& case3:
&&&&&&& cv::normalize(_src, dst, 0,255, NORM_MINMAX, CV_8UC3);
&&& default:
&&&&&&& src.copyTo(dst);
//使用CSV文件去读图像和标签,主要使用stringstream和getline方法
staticvoid read_csv(const string& filename, vector&Mat&& images, vector&int&& labels, char separator =';') {
&&& std::ifstream file(filename.c_str(), ifstream::in);
&&& if (!file) {
&&&&&&& string error_message ="No valid input file was given, please check the given filename.";
&&&&&&& CV_Error(CV_StsBadArg, error_message);
&&& string line, path,
&&& while (getline(file, line)) {
&&&&&&& stringstream liness(line);
&&&&&&& getline(liness, path, separator);
&&&&&&& getline(liness, classlabel);
&&&&&&& if(!path.empty()&&!classlabel.empty()) {
&&&&&&&&&&& images.push_back(imread(path, 0));
&&&&&&&&&&& labels.push_back(atoi(classlabel.c_str()));
int main(int argc, constchar*argv[]) {
&&& // 检测合法的命令,显示用法
&&& // 如果没有参数输入则退出!.
&&& if (argc &2) {
&&&&&&& cout &&"usage: "&& argv[0]&&" &csv.ext& &output_folder& "&&
&&&&&&& exit(1);
&&& string output_
&&& if (argc ==3) {
&&&&&&& output_folder = string(argv[2]);
&&& //读取你的CSV文件路径.
&&& string fn_csv = string(argv[1]);
&&& // 2个容器来存放图像数据和对应的标签
&&& vector&Mat&
&&& vector&int&
&&& // 读取数据. 如果文件不合法就会出错
&&& // 输入的文件名已经有了.
&&&&&&& read_csv(fn_csv, images, labels);
&&& } catch (cv::Exception& e) {
&&&&&&& cerr &&"Error opening file \""&& fn_csv &&"\". Reason: "&& e.msg &&
&&&&&&& // 文件有问题,我们啥也做不了了,退出了
&&&&&&& exit(1);
&&& // 如果没有读取到足够图片,我们也得退出.
&&& if(images.size()&=1) {
&&&&&&& string error_message ="This demo needs at least 2 images to work. Please add more images to your data set!";
&&&&&&& CV_Error(CV_StsError, error_message);
&&& // 得到第一张照片的高度. 在下面对图像
&&& // 变形到他们原始大小时需要
&&& int height = images[0].
&&& // 下面的几行代码仅仅是从你的数据集中移除最后一张图片
&&& //[gm:自然这里需要根据自己的需要修改,他这里简化了很多问题]
&&& Mat testSample = images[images.size() -1];
&&& int testLabel = labels[labels.size() -1];
&&& images.pop_back();
&&& labels.pop_back();
&&& // 下面几行创建了一个特征脸模型用于人脸识别,
&&& // 通过CSV文件读取的图像和标签训练它。
&&& // T这里是一个完整的PCA变换
&&& //如果你只想保留10个主成分,使用如下代码
&&& //&&&&& cv::createEigenFaceRecognizer(10);
&&& // 如果你还希望使用置信度阈值来初始化,使用以下语句:
&&& //&&&&& cv::createEigenFaceRecognizer(10, 123.0);
&&& // 如果你使用所有特征并且使用一个阈值,使用以下语句:
&&& //&&&&& cv::createEigenFaceRecognizer(0, 123.0);
&&& Ptr&FaceRecognizer& model = createEigenFaceRecognizer();
&&& model-&train(images, labels);
&&& // 下面对测试图像进行预测,predictedLabel是预测标签结果
&&& int predictedLabel = model-&predict(testSample);
&&& // 还有一种调用方式,可以获取结果同时得到阈值:
&&& //&&&&& int predictedLabel = -1;
&&& //&&&&& double confidence = 0.0;
&&& //&&&&& model-&predict(testSample, predictedLabel, confidence);
&&& string result_message = format("Predicted class = %d / Actual class = %d.", predictedLabel, testLabel);
&&& cout && result_message &&
&&& // 这里是如何获取特征脸模型的特征值的例子,使用了getMat方法:
&&& Mat eigenvalues = model-&getMat("eigenvalues");
&&& // 同样可以获取特征向量:
&&& Mat W = model-&getMat("eigenvectors");
&&& // 得到训练图像的均值向量
&&& Mat mean = model-&getMat("mean");
&&& // 现实还是保存:
&&& if(argc==2) {
&&&&&&& imshow("mean", norm_0_255(mean.reshape(1, images[0].rows)));
&&& } else {
&&&&&&& imwrite(format("%s/mean.png", output_folder.c_str()), norm_0_255(mean.reshape(1, images[0].rows)));
&&& // 现实还是保存特征脸:
&&& for (int i =0; i & min(10, W.cols); i++) {
&&&&&&& string msg = format("Eigenvalue #%d = %.5f", i, eigenvalues.at&double&(i));
&&&&&&& cout && msg &&
&&&&&&& // 得到第 #i个特征
&&&&&&& Mat ev = W.col(i).clone();
&&&&&&& //把它变成原始大小,为了把数据显示归一化到0~255.
&&&&&&& Mat grayscale = norm_0_255(ev.reshape(1, height));
&&&&&&& // 使用伪彩色来显示结果,为了更好的感受.
&&&&&&& applyColorMap(grayscale, cgrayscale, COLORMAP_JET);
&&&&&&& // 显示或者保存:
&&&&&&& if(argc==2) {
&&&&&&&&&&& imshow(format("eigenface_%d", i), cgrayscale);
&&&&&&& } else {
&&&&&&&&&&& imwrite(format("%s/eigenface_%d.png", output_folder.c_str(), i), norm_0_255(cgrayscale));
&&& // 在一些预测过程中,显示还是保存重建后的图像:
&&& for(int num_components =10; num_components &300; num_components+=15) {
&&&&&&& // 从模型中的特征向量截取一部分
&&&&&&& Mat evs = Mat(W, Range::all(), Range(0, num_components));
&&&&&&& Mat projection = subspaceProject(evs, mean, images[0].reshape(1,1));
&&&&&&& Mat reconstruction = subspaceReconstruct(evs, mean, projection);
&&&&&&& // 归一化结果,为了显示:
&&&&&&& reconstruction = norm_0_255(reconstruction.reshape(1, images[0].rows));
&&&&&&& // 显示或者保存:
&&&&&&& if(argc==2) {
&&&&&&&&&&& imshow(format("eigenface_reconstruction_%d", num_components), reconstruction);
&&&&&&& } else {
&&&&&&&&&&& imwrite(format("%s/eigenface_reconstruction_%d.png", output_folder.c_str(), num_components), reconstruction);
&&& // 如果我们不是存放到文件中,就显示他,这里使用了暂定等待键盘输入:
&&& if(argc==2) {
&&&&&&& waitKey(0);
&&& return0;
&&&&&&&& 我使用了伪彩色图像,所以你可以看到在特征脸中灰度值是如何分布的。你可以看到特征脸不但对人脸特征进行编码,还对这些图像中的光照进行编码。(看第四张图像是左侧的光照,而第五张是右侧的光照)[gm:PCA对光照变化图像识别效果很差,自然有一些改进方法,有后再谈]
我们已经看到了,我们可以利用低维近似来重构人脸,我们看看对于一个好的重构,需要多少特征脸。我将依次画出10,30,。。310张特征脸时的效果。
for(int num_components =10; num_components &300; num_components+=15) {
&&& Mat evs = Mat(W, Range::all(), Range(0, num_components));
&&& Mat projection = subspaceProject(evs, mean, images[0].reshape(1,1));
&&& Mat reconstruction = subspaceReconstruct(evs, mean, projection);
&&& reconstruction = norm_0_255(reconstruction.reshape(1, images[0].rows));
&&& if(argc==2) {
&&&&&&& imshow(format("eigenface_reconstruction_%d", num_components), reconstruction);
&&& } else {
&&&&&&& imwrite(format("%s/eigenface_reconstruction_%d.png", output_folder.c_str(), num_components), reconstruction);
显然10个特征向量[gm:1个特征向量可以变形成一个特征脸,这里特征向量和特征脸概念有些近似]是不够的,50个特征向量可以有效的编码出重要的人脸特征。在ORL数据库中,当使用300个特征向量时,你将获取一个比较好的和重构结果。有定理指出重构需要选择多少特征脸才合适,但它严重依赖于人脸数据库。[gm:也就是没啥讨论意义,针对现实情况做出考虑吧]。文献是一个好的开始研究起点。
&&&&&&&& 主成分分析是一种基于特征脸的方法,找到使数据中最大方差的特征线性组合。这是一个表现数据的强大方法,但它没有考虑类别信息,并且在扔掉主元时,同时许多有鉴别的信息都被扔掉。假设你数据库中的变化主要是光照变化,那么PCA此时几乎失效了。[gm:把光照情况类似的照片认为一样,而不管人脸其他细节]可以看去&看下例子。
&&&&&&&& 线性鉴别分析在降维的同时考虑类别信息,由统计学家&发明。在他1936年的文献中,他成功对花进行了分类:The useof multiple measurements in taxonomic problems&。为了找到一种特征组合方式,达到最大的类间离散度和最小的类内离散度。这个想法很简单:在低维表示下,相同的类应该紧紧的聚在一起,而不同的类别尽量距离越远。&这也被,&&和&所认同,所以他们把鉴别分析引入到人脸识别问题中。
令x是一个来自c个类中的随机向量,
& & & & & & & & & &&
散度矩阵&&&和S_{W}如下计算:
& & & & & & & & & &
, 其中&&&是全部数据的均值 & &&:
& & & & & & & &
而&&是某个类的均值& :
& & & & & & & & & & & & & & &&
Fisher的分类算法可以看出一个投影矩阵& , 使得类的可分性最大:
& & & & & & & & & &
接下来&, 一个解决这个普通特征值优化问题的方法被提出:
& & & & & & &&& & &&
&&&&&&&& 还有一个问题未解决,&Sw的排列最多只有&(N-c), &N&个样本和c个类别。在模式识别中,样本数据个数N的大小一般小于输入数据的维数。&[gm:比如说之前的图片,N=400,而10000就是数据维数]那么,散度矩阵Sw就是奇异的(可以看文献)。在文献中,使用PCA把数据投影到(N-c)维的子空间,然后再使用线性鉴别分析,因为Sw不是奇异矩阵了(可逆矩阵)。
然后优化问题可以写成:
& & & & &&
投影矩阵W,可以把样本投影到(c-1)维的空间上,可以表示为
& & & & & & & & &
#include "opencv2/core/core.hpp"
#include "opencv2/contrib/contrib.hpp"
#include "opencv2/highgui/highgui.hpp"
#include &iostream&
#include &fstream&
#include &sstream&
static Mat norm_0_255(InputArray _src) {
&&& Mat src = _src.getMat();
&&& // 创建和返回归一化的图像:
&&& switch(src.channels()) {
&&& case1:
&&&&&&& cv::normalize(_src, dst, 0,255, NORM_MINMAX, CV_8UC1);
&&& case3:
&&&&&&& cv::normalize(_src, dst, 0,255, NORM_MINMAX, CV_8UC3);
&&& default:
&&&&&&& src.copyTo(dst);
staticvoid read_csv(const string& filename, vector&Mat&& images, vector&int&& labels, char separator =';') {
&&& std::ifstream file(filename.c_str(), ifstream::in);
&&& if (!file) {
&&&&&&& string error_message ="No valid input file was given, please check the given filename.";
&&&&&&& CV_Error(CV_StsBadArg, error_message);
&&& string line, path,
&&& while (getline(file, line)) {
&&&&&&& stringstream liness(line);
&&&&&&& getline(liness, path, separator);
&&&&&&& getline(liness, classlabel);
&&&&&&& if(!path.empty()&&!classlabel.empty()) {
&&&&&&&&&&& images.push_back(imread(path, 0));
&&&&&&&&&&& labels.push_back(atoi(classlabel.c_str()));
int main(int argc, constchar*argv[]) {
&&& // 判断输入命令是否有效,输出用法
&&& // 如果没有输入参数.
&&& if (argc &2) {
&&&&&&& cout &&"usage: "&& argv[0]&&" &csv.ext& &output_folder& "&&
&&&&&&& exit(1);
&&& string output_
&&& if (argc ==3) {
&&&&&&& output_folder = string(argv[2]);
&&& // 获取CSV文件的路径.
&&& string fn_csv = string(argv[1]);
&&& // 这些容器存放图片和标签.
&&& vector&Mat&
&&& vector&int&
&&& // 载入数据.如果不合理,会出错
&&& // 输入文件名fn_csv已经有了.
&&&&&&& read_csv(fn_csv, images, labels);
&&& } catch (cv::Exception& e) {
&&&&&&& cerr &&"Error opening file \""&& fn_csv &&"\". Reason: "&& e.msg &&
&&&&&&& // 什么也不能做了
&&&&&&& exit(1);
&&& // 如果没有足够图像就退出掉.
&&& if(images.size()&=1) {
&&&&&&& string error_message ="This demo needs at least 2 images to work. Please add more images to your data set!";
&&&&&&& CV_Error(CV_StsError, error_message);
&&& int height = images[0].
&&& Mat testSample = images[images.size() -1];
&&& int testLabel = labels[labels.size() -1];
&&& images.pop_back();
&&& labels.pop_back();
&&& // 如果想保存10个fisherfaces
&&& //&&&&& cv::createFisherFaceRecognizer(10);
&&& // 如果要以123.0作为置信阈值
&&& //&&&&& cv::createFisherFaceRecognizer(0, 123.0);
&&& Ptr&FaceRecognizer& model = createFisherFaceRecognizer();
&&& model-&train(images, labels);
&&& int predictedLabel = model-&predict(testSample);
&&& //&&&&& model-&predict(testSample, predictedLabel, confidence);
&&& string result_message = format("Predicted class = %d / Actual class = %d.", predictedLabel, testLabel);
&&& cout && result_message &&
&&& Mat eigenvalues = model-&getMat("eigenvalues");
&&& Mat W = model-&getMat("eigenvectors");
&&& Mat mean = model-&getMat("mean");
&&& if(argc==2) {
&&&&&&& imshow("mean", norm_0_255(mean.reshape(1, images[0].rows)));
&&& } else {
&&&&&&& imwrite(format("%s/mean.png", output_folder.c_str()), norm_0_255(mean.reshape(1, images[0].rows)));
&&& //显示还是保存, 最多16 Fisherfaces:
&&& for (int i =0; i & min(16, W.cols); i++) {
&&&&&&& string msg = format("Eigenvalue #%d = %.5f", i, eigenvalues.at&double&(i));
&&&&&&& cout && msg &&
&&&&&&& Mat ev = W.col(i).clone();
&&&&&&& Mat grayscale = norm_0_255(ev.reshape(1, height));
&&&&&&& // 使用Bone伪彩色图像来显示.
&&&&&&& applyColorMap(grayscale, cgrayscale, COLORMAP_BONE);
&&&&&&& if(argc==2) {
&&&&&&&&&&& imshow(format("fisherface_%d", i), cgrayscale);
&&&&&&& } else {
&&&&&&&&&&& imwrite(format("%s/fisherface_%d.png", output_folder.c_str(), i), norm_0_255(cgrayscale));
&&& for(int num_component =0; num_component & min(16, W.cols); num_component++) {
&&&&&&& Mat ev = W.col(num_component);
&&&&&&& Mat projection = subspaceProject(ev, mean, images[0].reshape(1,1));
&&&&&&& Mat reconstruction = subspaceReconstruct(ev, mean, projection);
&&&&&&& reconstruction = norm_0_255(reconstruction.reshape(1, images[0].rows));
&&&&&&& if(argc==2) {
&&&&&&&&&&& imshow(format("fisherface_reconstruction_%d", num_component), reconstruction);
&&&&&&& } else {
&&&&&&&&&&& imwrite(format("%s/fisherface_reconstruction_%d.png", output_folder.c_str(), num_component), reconstruction);
&&& if(argc==2) {
&&&&&&& waitKey(0);
&&& return0;
在这个例子中,我使用YaleA人脸数据库,仅仅因为显示更好些。每一个Fisherface都和原始图像有同样长度,因此它可以被显示成图像。下面显示了16张Fisherfaces图像。
&&&&&&&& Fisherfaces方法学习一个正对标签的转换矩阵,所依它不会如特征脸那样那么注重光照。鉴别分析是寻找可以区分人的面部特征。需要说明的是,Fisherfaces的性能也很依赖于输入数据。实际上,如果你对光照好的图片上学习Fisherfaces,而想对不好的光照图片进行识别,那么他可能会找到错误的主元,因为在不好光照图片上,这些特征不优越。这似乎是符合逻辑的,因为这个方法没有机会去学习光照。[gm:那么采集图像时就要考虑光照变化,训练时考虑所有光照情况,数据库multi-pie就考虑很多种光照]
&&&&&&&& Fisherfaces允许对投影图像进行重建,就行特征脸一样。但是由于我们仅仅使用这些特征来区分不同的类别,因此你无法期待对原图像有一个好的重建效果。[gm:也就是特征脸把每个图片看成一个个体,重建时效果也有保证,而Fisherfaces把一个人的照片看成一个整体,那么重建时重建的效果则不是很好]。对于Fisherfaces方法我们将把样本图像逐个投影到Fisherfaces上。因此你可以获得一个好的可视效果,每个Fisherfaces特征可以被描述为
for(int num_component =0; num_component & min(16, W.cols); num_component++) {
&&& Mat ev = W.col(num_component);
&&& Mat projection = subspaceProject(ev, mean, images[0].reshape(1,1));
&&& Mat reconstruction = subspaceReconstruct(ev, mean, projection);
&&& reconstruction = norm_0_255(reconstruction.reshape(1, images[0].rows));
&&& if(argc==2) {
&&&&&&& imshow(format("fisherface_reconstruction_%d", num_component), reconstruction);
&&& } else {
&&&&&&& imwrite(format("%s/fisherface_reconstruction_%d.png", output_folder.c_str(), num_component), reconstruction);
对于人类眼睛来说,差异比较微妙,但你还是可以看到一些差异的。
局部二值模式直方图
&&&&&&&& Eigenfaces和Fisherfaces使用整体方法来进行人脸识别[gm:直接使用所有的像素]。你把你的数据当作图像空间的高维向量。我们都知道高维数据是糟糕的,所以一个低维子空间被确定,对于信息保存可能很好。Eigenfaces是最大化总的散度,这样可能导致,当方差由外部条件产生时,最大方差的主成分不适合用来分类。所以为使用一些鉴别分析,我们使用了LDA方法来优化。Fisherfaces方法可以很好的运作,至少在我们假设的模型的有限情况下。
&&&&&&&& 现实生活是不完美的。你无法保证在你的图像中光照条件是完美的,或者说1个人的10张照片。所以,如果每人仅仅只有一张照片呢?我们的子空间的协方差估计方法可能完全错误,所以识别也可能错误。是否记得Eigenfaces在AT&T数据库上达到了96%的识别率?对于这样有效的估计,我们需要多少张训练图像呢?下图是Eigenfaces和Fisherfaces方法在AT&T数据库上的首选识别率,这是一个简单的数据库:
&&&&&&&& 因此,若你想得到好的识别率,你大约需要每个人有8(7~9)张图像,而Fisherfaces在这里并没有好的帮助。以上的实验是10个图像的交叉验证结果,使用了facerec框架:&。这不是一个刊物,所以我不会用高深的数学分析来证明这个图像。&当遇到小的训练数据集时,可以看一下文献,了解二种方法的细节分析。
&&&&&&&& 一些研究专注于图像局部特征的提取。主意是我们不把整个图像看成一个高维向量,仅仅用局部特征来描述一个物体。通过这种方式提取特征,你将获得一个低维隐式。一个好主意!但是你很快发现这种图像表示方法不仅仅遭受光照变化。你想想图像中的尺度变化、形变、旋转&我们的局部表示方式起码对这些情况比较稳健。正如,LBP方法在2D纹理分析中举足轻重。LBP的基本思想是对图像的像素和它局部周围像素进行对比后的结果进行求和。把这个像素作为中心,对相邻像素进行阈值比较。如果中心像素的亮度大于等于他的相邻像素,把他标记为1,否则标记为0。你会用二进制数字来表示每个像素,比如。因此,由于周围相邻8个像素,你最终可能获取2^8个可能组合,被称为局部二值模式,有时被称为LBP码。第一个在文献中描述的LBP算子实际使用的是3*3的邻域。
&&&&&&&& 一个更加正式的LBP操作可以被定义为
& & & & & & & & & & &
其中&是中心像素,亮度是&;而&则是相邻像素的亮度。s是一个符号函数:
这种描述方法使得你可以很好的捕捉到图像中的细节。实际上,研究者们可以用它在纹理分类上得到最先进的水平。正如刚才描述的方法被提出后,固定的近邻区域对于尺度变化的编码失效。所以,使用一个变量的扩展方法,在文献中有描述。主意是使用可变半径的圆对近邻像素进行编码,这样可以捕捉到如下的近邻:
& & & & & &&
对一个给定的点& &,他的近邻点&&可以由如下计算:
其中,R是圆的半径,而P是样本点的个数。
这个操作是对原始LBP算子的扩展,所以有时被称为扩展LBP(又称为圆形LBP)。如果一个在圆上的点不在图像坐标上,我们使用他的内插点。计算机科学有一堆聪明的插值方法,而OpenCV使用双线性插值。
LBP算子,对于灰度的单调变化很稳健。我们可以看到手工改变后的图像的LBP图像(你可以看到LBP图像是什么样子的!)
& & & & & &&
&&&&&&&& 那么剩下来的就是如何合并空间信息用于人脸识别模型。Ahonenet. Al在文献&中提出表示方法,对LBP图像成m个块,每个块提取直方图。通过连接局部特直方图(而不是合并)然后就能得到空间增强的特征向量。这些直方图被称为局部二值模式直方图。
OpenCV中的局部二值模式直方图
#include "opencv2/core/core.hpp"
#include "opencv2/contrib/contrib.hpp"
#include "opencv2/highgui/highgui.hpp"
#include &iostream&
#include &fstream&
#include &sstream&
staticvoid read_csv(const string& filename, vector&Mat&& images, vector&int&& labels, char separator =';') {
&&& std::ifstream file(filename.c_str(), ifstream::in);
&&& if (!file) {
&&&&&&& string error_message ="No valid input file was given, please check the given filename.";
&&&&&&& CV_Error(CV_StsBadArg, error_message);
&&& string line, path,
&&& while (getline(file, line)) {
&&&&&&& stringstream liness(line);
&&&&&&& getline(liness, path, separator);
&&&&&&& getline(liness, classlabel);
&&&&&&& if(!path.empty()&&!classlabel.empty()) {
&&&&&&&&&&& images.push_back(imread(path, 0));
&&&&&&&&&&& labels.push_back(atoi(classlabel.c_str()));
int main(int argc, constchar*argv[]) {
&&& if (argc !=2) {
&&&&&&& cout &&"usage: "&& argv[0]&&" &csv.ext&"&&
&&&&&&& exit(1);
&&& string fn_csv = string(argv[1]);
&&& vector&Mat&
&&& vector&int&
&&&&&&& read_csv(fn_csv, images, labels);
&&& } catch (cv::Exception& e) {
&&&&&&& cerr &&"Error opening file \""&& fn_csv &&"\". Reason: "&& e.msg &&
&&&&&&& // nothing more we can do
&&&&&&& exit(1);
&&& if(images.size()&=1) {
&&&&&&& string error_message ="This demo needs at least 2 images to work. Please add more images to your data set!";
&&&&&&& CV_Error(CV_StsError, error_message);
&&& int height = images[0].
&&& Mat testSample = images[images.size() -1];
&&& int testLabel = labels[labels.size() -1];
&&& images.pop_back();
&&& labels.pop_back();
&&& // TLBPHFaceRecognizer 使用了扩展的LBP
&&& // 在其他的算子中他可能很容易被扩展
&&& // 下面是默认参数
&&& //&&&&& radius = 1
&&& //&&&&& neighbors = 8
&&& //&&&&& grid_x = 8
&&& //&&&& &grid_y = 8
&&& // 如果你要创建 LBPH FaceRecognizer 半径是2,16个邻域
&&& //&&&&& cv::createLBPHFaceRecognizer(2, 16);
&&& // 如果你需要一个阈值,并且使用默认参数:
&&& //&&&&& cv::createLBPHFaceRecognizer(1,8,8,8,123.0)
&&& Ptr&FaceRecognizer& model = createLBPHFaceRecognizer();
&&& model-&train(images, labels);
&&& int predictedLabel = model-&predict(testSample);
&&& //&&&&& int predictedLabel = -1;
&&& //&&&&& double confidence = 0.0;
&&& //&&&&& model-&predict(testSample, predictedLabel, confidence);
&&& string result_message = format("Predicted class = %d / Actual class = %d.", predictedLabel, testLabel);
&&& cout && result_message &&
&&& // 有时你需要设置或者获取内部数据模型,
&&& // 他不能被暴露在 cv::FaceRecognizer类中.
&&& // 首先我们对FaceRecognizer的阈值设置到0.0,而不是重写训练模型
&&& // 当你重新估计模型时很重要
&&& model-&set("threshold",0.0);
&&& predictedLabel = model-&predict(testSample);
&&& cout &&"Predicted class = "&& predictedLabel &&
&&& // 由于确保高效率,LBP图没有被存储在模型里面。D
&&& cout &&"Model Information:"&&
&&& string model_info = format("\tLBPH(radius=%i, neighbors=%i, grid_x=%i, grid_y=%i, threshold=%.2f)",
&&&&&&&&&&& model-&getInt("radius"),
&&&&&&&&&&& model-&getInt("neighbors"),
&&&&&&&&&&& model-&getInt("grid_x"),
&&&&&&&&&&& model-&getInt("grid_y"),
&&&&&&&&&&& model-&getDouble("threshold"));
&&& cout && model_info &&
&&& // 我们可以获取样本的直方图:
&&& vector&Mat& histograms = model-&getMatVector("histograms");
&&& // 我需要现实它吗? 或许它的长度才是我们感兴趣的:
&&& cout &&"Size of the histograms: "&& histograms[0].total()&&
&&& return0;
你已经学会如何在真实应用下,使用新的类。读完算法,可能到你进行实验的时候了,使用它们,改进它们,让OpenCV社区参与其中!
(,&,&)&Ahonen, T., Hadid, A., and Pietikainen, M.&Face Recognition with Local Binary Patterns.&Computer Vision - ECCV ), 469&481.
(,&,&,&,&)&Belhumeur, P. N., Hespanha, J., and Kriegman, D.&Eigenfaces vs. Fisherfaces: Recognition Using Class Specific Linear Projection.&IEEE Transactions on Pattern Analysis and Machine Intelligence 19, 7 (1997), 711&720.
Brunelli, R., Poggio, T.&Face Recognition through Geometrical Features.&European Conference on Computer Vision (ECCV) 1992, S. 792&800.
Duda, Richard O. and Hart, Peter E. and Stork, David G.,&Pattern Classification&(2nd Edition) 2001.
Fisher, R. A.&The use of multiple measurements in taxonomic problems.&Annals Eugen. 7 (1936), 179&188.
Georghiades, A.S. and Belhumeur, P.N. and Kriegman, D.J.,&From Few to Many: Illumination Cone Models for Face Recognition under Variable Lighting and Pose&IEEE Transactions on Pattern Analysis and Machine Intelligence 23, 6 (2001), 643-660.
Kanade, T.&Picture processing system by computer complex and recognition of human faces.&PhD thesis, Kyoto University, November 1973
Martinez, A and Kak, A.&PCA versus LDA&IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 23, No.2, pp. 228-233, 2001.
Lee, K., Ho, J., Kriegman, D.&Acquiring Linear Subspaces for Face Recognition under Variable Lighting.&In: IEEE Transactions on Pattern Analysis and Machine Intelligence (PAMI) 27 (2005), Nr. 5
Messer, K. et al.&Performance Characterisation of Face Recognition Algorithms and Their Sensitivity to Severe Illumination Changes.&In: In: ICB, 2006, S. 1&11.
Raudys and A.K. Jain.&Small sample size effects in statistical pattern recognition: Recommendations for practitioneers.&- IEEE Transactions on Pattern Analysis and Machine Intelligence 13, 3 (1991), 252-264.
Tan, X., and Triggs, B.&Enhanced local texture feature sets for face recognition under difficult lighting conditions.&IEEE Transactions on Image Processing 19 (2010), .
Turk, M., and Pentland, A.&Eigenfaces for recognition.&Journal of Cognitive Neuroscience 3 (1991), 71&86.
Chiara Turati, Viola Macchi Cassia, F. S., and Leo, I.&Newborns face recognition: Role of inner and outer facial features. Child Development&77, 2 (2006), 297&311.
Wiskott, L., Fellous, J., Kr&ger, N., Malsburg, C.&Face Recognition By Elastic Bunch Graph Matching.IEEE Transactions on Pattern Analysis and Machine Intelligence 19 (1997), S. 775&779
Zhao, W., Chellappa, R., Phillips, P., and Rosenfeld, A. Face recognition: A literature survey. ACM Computing Surveys (CSUR) 35, 4 (2003), 399&458.
&&&&&&&& 对于图像数据的对其很重要,特别遇到情感检测这类任务,你需要越多的细节越好。相信我,你不会要自己动手做吧。我给你提供了一个Python代码。
# &CropFace(image, eye_left, eye_right, offset_pct, dest_sz)
# eye_left&is the position of the left eye
# eye_right&is the position of the right eye
# offset_pct&is the percent of the image you want to keep next to the eyes (horizontal, vertical direction)
# dest_sz&is the size of the output image
importsys,math,Image
defDistance(p1,p2):
& dx = p2[0]- p1[0]
& dy = p2[1]- p1[1]
& return math.sqrt(dx*dx+dy*dy)
defScaleRotateTranslate(image, angle, center =None, new_center =None, scale =None, resample=Image.BICUBIC):
& if (scale isNone)and (center isNone):
&&& return image.rotate(angle=angle, resample=resample)
& nx,ny = x,y = center
& sx=sy=1.0
& if new_center:
&&& (nx,ny) = new_center
& if scale:
&&& (sx,sy) = (scale, scale)
& cosine = math.cos(angle)
& sine = math.sin(angle)
& a = cosine/sx
& b = sine/sx
& c = x-nx*a-ny*b
& d =-sine/sy
& e = cosine/sy
& f = y-nx*d-ny*e
& return image.transform(image.size, Image.AFFINE, (a,b,c,d,e,f), resample=resample)
defCropFace(image, eye_left=(0,0), eye_right=(0,0), offset_pct=(0.2,0.2), dest_sz = (70,70)):
& # calculate offsets in original image
& offset_h = math.floor(float(offset_pct[0])*dest_sz[0])
& offset_v = math.floor(float(offset_pct[1])*dest_sz[1])
& # get the direction
& eye_direction = (eye_right[0]- eye_left[0], eye_right[1]- eye_left[1])
& # calc rotation angle in radians
& rotation =-math.atan2(float(eye_direction[1]),float(eye_direction[0]))
& # distance between them
& dist = Distance(eye_left, eye_right)
& # calculate the reference eye-width
& reference = dest_sz[0]-2.0*offset_h
& # scale factor
& scale =float(dist)/float(reference)
& # rotate original around the left eye
& image = ScaleRotateTranslate(image, center=eye_left, angle=rotation)
& # crop the rotated image
& crop_xy = (eye_left[0]- scale*offset_h, eye_left[1]- scale*offset_v)
& crop_size = (dest_sz[0]*scale, dest_sz[1]*scale)
& image = image.crop((int(crop_xy[0]),int(crop_xy[1]),int(crop_xy[0]+crop_size[0]),int(crop_xy[1]+crop_size[1])))
& # resize it
& image = image.resize(dest_sz, Image.ANTIALIAS)
& return image
if __name__ =="__main__":
& image =& Image.open("arnie.jpg")
& CropFace(image, eye_left=(252,364), eye_right=(420,366), offset_pct=(0.1,0.1), dest_sz=(200,200)).save("arnie_10_10_200_200.jpg")
& CropFace(image, eye_left=(252,364), eye_right=(420,366), offset_pct=(0.2,0.2), dest_sz=(200,200)).save("arnie_20_20_200_200.jpg")
& CropFace(image, eye_left=(252,364), eye_right=(420,366), offset_pct=(0.3,0.3), dest_sz=(200,200)).save("arnie_30_30_200_200.jpg")
& CropFace(image, eye_left=(252,364), eye_right=(420,366), offset_pct=(0.2,0.2)).save("arnie_20_20_70_70.jpg")
设想我们有一张施瓦辛格的照片&,人眼坐标是(252,364)和(420,366)。参数是水平偏移、垂直偏移和你缩放后的图像大小。[gm:我建议使用最小的那张图片]
Configuration
Cropped, Scaled, Rotated Face
0.1 (10%), 0.1 (10%), (200,200)
0.2 (20%), 0.2 (20%), (200,200)
0.3 (30%), 0.3 (30%), (200,200)
0.2 (20%), 0.2 (20%), (70,70)
/home/philipp/facerec/data/at/s13/2.12
/home/philipp/facerec/data/at/s13/7.12
/home/philipp/facerec/data/at/s13/6.12
/home/philipp/facerec/data/at/s13/9.12
/home/philipp/facerec/data/at/s13/5.12
/home/philipp/facerec/data/at/s13/3.12
/home/philipp/facerec/data/at/s13/4.12
/home/philipp/facerec/data/at/s13/10.12
/home/philipp/facerec/data/at/s13/8.12
/home/philipp/facerec/data/at/s13/1.12
/home/philipp/facerec/data/at/s17/2.16
/home/philipp/facerec/data/at/s17/7.16
/home/philipp/facerec/data/at/s17/6.16
/home/philipp/facerec/data/at/s17/9.16
/home/philipp/facerec/data/at/s17/5.16
/home/philipp/facerec/data/at/s17/3.16
/home/philipp/facerec/data/at/s17/4.16
/home/philipp/facerec/data/at/s17/10.16
/home/philipp/facerec/data/at/s17/8.16
/home/philipp/facerec/data/at/s17/1.16
/home/philipp/facerec/data/at/s32/2.31
/home/philipp/facerec/data/at/s32/7.31
/home/philipp/facerec/data/at/s32/6.31
/home/philipp/facerec/data/at/s32/9.31
/home/philipp/facerec/data/at/s32/5.31
/home/philipp/facerec/data/at/s32/3.31
/home/philipp/facerec/data/at/s32/4.31
/home/philipp/facerec/data/at/s32/10.31
/home/philipp/facerec/data/at/s32/8.31
/home/philipp/facerec/data/at/s32/1.31
/home/philipp/facerec/data/at/s10/2.9
/home/philipp/facerec/data/at/s10/7.9
/home/philipp/facerec/data/at/s10/6.9
/home/philipp/facerec/data/at/s10/9.9
/home/philipp/facerec/data/at/s10/5.9
/home/philipp/facerec/data/at/s10/3.9
/home/philipp/facerec/data/at/s10/4.9
/home/philipp/facerec/data/at/s10/10.9
/home/philipp/facerec/data/at/s10/8.9
/home/philipp/facerec/data/at/s10/1.9
/home/philipp/facerec/data/at/s27/2.26
/home/philipp/facerec/data/at/s27/7.26
/home/philipp/facerec/data/at/s27/6.26
/home/philipp/facerec/data/at/s27/9.26
/home/philipp/facerec/data/at/s27/5.26
/home/philipp/facerec/data/at/s27/3.26
/home/philipp/facerec/data/at/s27/4.26
/home/philipp/facerec/data/at/s27/10.26
/home/philipp/facerec/data/at/s27/8.26
/home/philipp/facerec/data/at/s27/1.26
/home/philipp/facerec/data/at/s5/2.4
/home/philipp/facerec/data/at/s5/7.4
/home/philipp/facerec/data/at/s5/6.4
/home/philipp/facerec/data/at/s5/9.4
/home/philipp/facerec/data/at/s5/5.4
/home/philipp/facerec/data/at/s5/3.4
/home/philipp/facerec/data/at/s5/4.4
/home/philipp/facerec/data/at/s5/10.4
/home/philipp/facerec/data/at/s5/8.4
/home/philipp/facerec/data/at/s5/1.4
/home/philipp/facerec/data/at/s20/2.19
/home/philipp/facerec/data/at/s20/7.19
/home/philipp/facerec/data/at/s20/6.19
/home/philipp/facerec/data/at/s20/9.19
/home/philipp/facerec/data/at/s20/5.19
/home/philipp/facerec/data/at/s20/3.19
/home/philipp/facerec/data/at/s20/4.19
/home/philipp/facerec/data/at/s20/10.19
/home/philipp/facerec/data/at/s20/8.19
/home/philipp/facerec/data/at/s20/1.19
/home/philipp/facerec/data/at/s30/2.29
/home/philipp/facerec/data/at/s30/7.29
/home/philipp/facerec/data/at/s30/6.29
/home/philipp/facerec/data/at/s30/9.29
/home/philipp/facerec/data/at/s30/5.29
/home/philipp/facerec/data/at/s30/3.29
/home/philipp/facerec/data/at/s30/4.29
/home/philipp/facerec/data/at/s30/10.29
/home/philipp/facerec/data/at/s30/8.29
/home/philipp/facerec/data/at/s30/1.29
/home/philipp/facerec/data/at/s39/2.38
/home/philipp/facerec/data/at/s39/7.38
/home/philipp/facerec/data/at/s39/6.38
/home/philipp/facerec/data/at/s39/9.38
/home/philipp/facerec/data/at/s39/5.38
/home/philipp/facerec/data/at/s39/3.38
/home/philipp/facerec/data/at/s39/4.38
/home/philipp/facerec/data/at/s39/10.38
/home/philipp/facerec/data/at/s39/8.38
/home/philipp/facerec/data/at/s39/1.38
/home/philipp/facerec/data/at/s35/2.34
/home/philipp/facerec/data/at/s35/7.34
/home/philipp/facerec/data/at/s35/6.34
/home/philipp/facerec/data/at/s35/9.34
/home/philipp/facerec/data/at/s35/5.34
/home/philipp/facerec/data/at/s35/3.34
/home/philipp/facerec/data/at/s35/4.34
/home/philipp/facerec/data/at/s35/10.34
/home/philipp/facerec/data/at/s35/8.34
/home/philipp/facerec/data/at/s35/1.34
/home/philipp/facerec/data/at/s23/2.22
/home/philipp/facerec/data/at/s23/7.22
/home/philipp/facerec/data/at/s23/6.22
/home/philipp/facerec/data/at/s23/9.22
/home/philipp/facerec/data/at/s23/5.22
/home/philipp/facerec/data/at/s23/3.22
/home/philipp/facerec/data/at/s23/4.22
/home/philipp/facerec/data/at/s23/10.22
/home/philipp/facerec/data/at/s23/8.22
/home/philipp/facerec/data/at/s23/1.22
/home/philipp/facerec/data/at/s4/2.3
/home/philipp/facerec/data/at/s4/7.3
/home/philipp/facerec/data/at/s4/6.3
/home/philipp/facerec/data/at/s4/9.3
/home/philipp/facerec/data/at/s4/5.3
/home/philipp/facerec/data/at/s4/3.3
/home/philipp/facerec/data/at/s4/4.3
/home/philipp/facerec/data/at/s4/10.3
/home/philipp/facerec/data/at/s4/8.3
/home/philipp/facerec/data/at/s4/1.3
/home/philipp/facerec/data/at/s9/2.8
/home/philipp/facerec/data/at/s9/7.8
/home/philipp/facerec/data/at/s9/6.8
/home/philipp/facerec/data/at/s9/9.8
/home/philipp/facerec/data/at/s9/5.8
/home/philipp/facerec/data/at/s9/3.8
/home/philipp/facerec/data/at/s9/4.8
/home/philipp/facerec/data/at/s9/10.8
/home/philipp/facerec/data/at/s9/8.8
/home/philipp/facerec/data/at/s9/1.8
/home/philipp/facerec/data/at/s37/2.36
/home/philipp/facerec/data/at/s37/7.36
/home/philipp/facerec/data/at/s37/6.36
/home/philipp/facerec/data/at/s37/9.36
/home/philipp/facerec/data/at/s37/5.36
/home/philipp/facerec/data/at/s37/3.36
/home/philipp/facerec/data/at/s37/4.36
/home/philipp/facerec/data/at/s37/10.36
/home/philipp/facerec/data/at/s37/8.36
/home/philipp/facerec/data/at/s37/1.36
/home/philipp/facerec/data/at/s24/2.23
/home/philipp/facerec/data/at/s24/7.23
/home/philipp/facerec/data/at/s24/6.23
/home/philipp/facerec/data/at/s24/9.23
/home/philipp/facerec/data/at/s24/5.23
/home/philipp/facerec/data/at/s24/3.23
/home/philipp/facerec/data/at/s24/4.23
/home/philipp/facerec/data/at/s24/10.23
/home/philipp/facerec/data/at/s24/8.23
/home/philipp/facerec/data/at/s24/1.23
/home/philipp/facerec/data/at/s19/2.18
/home/philipp/facerec/data/at/s19/7.18
/home/philipp/facerec/data/at/s19/6.18
/home/philipp/facerec/data/at/s19/9.18
/home/philipp/facerec/data/at/s19/5.18
/home/philipp/facerec/data/at/s19/3.18
/home/philipp/facerec/data/at/s19/4.18
/home/philipp/facerec/data/at/s19/10.18
/home/philipp/facerec/data/at/s19/8.18
/home/philipp/facerec/data/at/s19/1.18
/home/philipp/facerec/data/at/s8/2.7
/home/philipp/facerec/data/at/s8/7.7
/home/philipp/facerec/data/at/s8/6.7
/home/philipp/facerec/data/at/s8/9.7
/home/philipp/facerec/data/at/s8/5.7
/home/philipp/facerec/data/at/s8/3.7
/home/philipp/facerec/data/at/s8/4.7
/home/philipp/facerec/data/at/s8/10.7
/home/philipp/facerec/data/at/s8/8.7
/home/philipp/facerec/data/at/s8/1.7
/home/philipp/facerec/data/at/s21/2.20
/home/philipp/facerec/data/at/s21/7.20
/home/philipp/facerec/data/at/s21/6.20
/home/philipp/facerec/data/at/s21/9.20
/home/philipp/facerec/data/at/s21/5.20
/home/philipp/facerec/data/at/s21/3.20
/home/philipp/facerec/data/at/s21/4.20
/home/philipp/facerec/data/at/s21/10.20
/home/philipp/facerec/data/at/s21/8.20
/home/philipp/facerec/data/at/s21/1.20
/home/philipp/facerec/data/at/s1/2.0
/home/philipp/facerec/data/at/s1/7.0
/home/philipp/facerec/data/at/s1/6.0
/home/philipp/facerec/data/at/s1/9.0
/home/philipp/facerec/data/at/s1/5.0
/home/philipp/facerec/data/at/s1/3.0
/home/philipp/facerec/data/at/s1/4.0
/home/philipp/facerec/data/at/s1/10.0
/home/philipp/facerec/data/at/s1/8.0
/home/philipp/facerec/data/at/s1/1.0
/home/philipp/facerec/data/at/s7/2.6
/home/philipp/facerec/data/at/s7/7.6
/home/philipp/facerec/data/at/s7/6.6
/home/philipp/facerec/data/at/s7/9.6
/home/philipp/facerec/data/at/s7/5.6
/home/philipp/facerec/data/at/s7/3.6
/home/philipp/facerec/data/at/s7/4.6
/home/philipp/facerec/data/at/s7/10.6
/home/philipp/facerec/data/at/s7/8.6
/home/philipp/facerec/data/at/s7/1.6
/home/philipp/facerec/data/at/s16/2.15
/home/philipp/facerec/data/at/s16/7.15
/home/philipp/facerec/data/at/s16/6.15
/home/philipp/facerec/data/at/s16/9.15
/home/philipp/facerec/data/at/s16/5.15
/home/philipp/facerec/data/at/s16/3.15
/home/philipp/facerec/data/at/s16/4.15
/home/philipp/facerec/data/at/s16/10.15
/home/philipp/facerec/data/at/s16/8.15
/home/philipp/facerec/data/at/s16/1.15
/home/philipp/facerec/data/at/s36/2.35
/home/philipp/facerec/data/at/s36/7.35
/home/philipp/facerec/data/at/s36/6.35
/home/philipp/facerec/data/at/s36/9.35
/home/philipp/facerec/data/at/s36/5.35
/home/philipp/facerec/data/at/s36/3.35
/home/philipp/facerec/data/at/s36/4.35
/home/philipp/facerec/data/at/s36/10.35
/home/philipp/facerec/data/at/s36/8.35
/home/philipp/facerec/data/at/s36/1.35
/home/philipp/facerec/data/at/s25/2.24
/home/philipp/facerec/data/at/s25/7.24
/home/philipp/facerec/data/at/s25/6.24
/home/philipp/facerec/data/at/s25/9.24
/home/philipp/facerec/data/at/s25/5.24
/home/philipp/facerec/data/at/s25/3.24
/home/philipp/facerec/data/at/s25/4.24
/home/philipp/facerec/data/at/s25/10.24
/home/philipp/facerec/data/at/s25/8.24
/home/philipp/facerec/data/at/s25/1.24
/home/philipp/facerec/data/at/s14/2.13
/home/philipp/facerec/data/at/s14/7.13
/home/philipp/facerec/data/at/s14/6.13
/home/philipp/facerec/data/at/s14/9.13
/home/philipp/facerec/data/at/s14/5.13
/home/philipp/facerec/data/at/s14/3.13
/home/philipp/facerec/data/at/s14/4.13
/home/philipp/facerec/data/at/s14/10.13
/home/philipp/facerec/data/at/s14/8.13
/home/philipp/facerec/data/at/s14/1.13
/home/philipp/facerec/data/at/s34/2.33
/home/philipp/facerec/data/at/s34/7.33
/home/philipp/facerec/data/at/s34/6.33
/home/philipp/facerec/data/at/s34/9.33
/home/philipp/facerec/data/at/s34/5.33
/home/philipp/facerec/data/at/s34/3.33
/home/philipp/facerec/data/at/s34/4.33
/home/philipp/facerec/data/at/s34/10.33
/home/philipp/facerec/data/at/s34/8.33
/home/philipp/facerec/data/at/s34/1.33
/home/philipp/facerec/data/at/s11/2.10
/home/philipp/facerec/data/at/s11/7.10
/home/philipp/facerec/data/at/s11/6.10
/home/philipp/facerec/data/at/s11/9.10
/home/philipp/facerec/data/at/s11/5.10
/home/philipp/facerec/data/at/s11/3.10
/home/philipp/facerec/data/at/s11/4.10
/home/philipp/facerec/data/at/s11/10.10
/home/philipp/facerec/data/at/s11/8.10
/home/philipp/facerec/data/at/s11/1.10
/home/philipp/facerec/data/at/s26/2.25
/home/philipp/facerec/data/at/s26/7.25
/home/philipp/facerec/data/at/s26/6.25
/home/philipp/facerec/data/at/s26/9.25
/home/philipp/facerec/data/at/s26/5.25
/home/philipp/facerec/data/at/s26/3.25
/home/philipp/facerec/data/at/s26/4.25
/home/philipp/facerec/data/at/s26/10.25
/home/philipp/facerec/data/at/s26/8.25
/home/philipp/facerec/data/at/s26/1.25
/home/philipp/facerec/data/at/s18/2.17
/home/philipp/facerec/data/at/s18/7.17
/home/philipp/facerec/data/at/s18/6.17
/home/philipp/facerec/data/at/s18/9.17
/home/philipp/facerec/data/at/s18/5.17
/home/philipp/facerec/data/at/s18/3.17
/home/philipp/facerec/data/at/s18/4.17
/home/philipp/facerec/data/at/s18/10.17
/home/philipp/facerec/data/at/s18/8.17
/home/philipp/facerec/data/at/s18/1.17
/home/philipp/facerec/data/at/s29/2.28
/home/philipp/facerec/data/at/s29/7.28
/home/philipp/facerec/data/at/s29/6.28
/home/philipp/facerec/data/at/s29/9.28
/home/philipp/facerec/data/at/s29/5.28
/home/philipp/facerec/data/at/s29/3.28
/home/philipp/facerec/data/at/s29/4.28
/home/philipp/facerec/data/at/s29/10.28
/home/philipp/facerec/data/at/s29/8.28
/home/philipp/facerec/data/at/s29/1.28
/home/philipp/facerec/data/at/s33/2.32
/home/philipp/facerec/data/at/s33/7.32
/home/philipp/facerec/data/at/s33/6.32
/home/philipp/facerec/data/at/s33/9.32
/home/philipp/facerec/data/at/s33/5.32
/home/philipp/facerec/data/at/s33/3.32
/home/philipp/facerec/data/at/s33/4.32
/home/philipp/facerec/data/at/s33/10.32
/home/philipp/facerec/data/at/s33/8.32
/home/philipp/facerec/data/at/s33/1.32
/home/philipp/facerec/data/at/s12/2.11
/home/philipp/facerec/data/at/s12/7.11
/home/philipp/facerec/data/at/s12/6.11
/home/philipp/facerec/data/at/s12/9.11
/home/philipp/facerec/data/at/s12/5.11
/home/philipp/facerec/data/at/s12/3.11
/home/philipp/facerec/data/at/s12/4.11
/home/philipp/facerec/data/at/s12/10.11
/home/philipp/facerec/data/at/s12/8.11
/home/philipp/facerec/data/at/s12/1.11
/home/philipp/facerec/data/at/s6/2.5
/home/philipp/facerec/data/at/s6/7.5
/home/philipp/facerec/data/at/s6/6.5
/home/philipp/facerec/data/at/s6/9.5
/home/philipp/facerec/data/at/s6/5.5
/home/philipp/facerec/data/at/s6/3.5
/home/philipp/facerec/data/at/s6/4.5
/home/philipp/facerec/data/at/s6/10.5
/home/philipp/facerec/data/at/s6/8.5
/home/philipp/facerec/data/at/s6/1.5
/home/philipp/facerec/data/at/s22/2.21
/home/philipp/facerec/data/at/s22/7.21
/home/philipp/facerec/data/at/s22/6.21
/home/philipp/facerec/data/at/s22/9.21
/home/philipp/facerec/data/at/s22/5.21
/home/philipp/facerec/data/at/s22/3.21
/home/philipp/facerec/data/at/s22/4.21
/home/philipp/facerec/data/at/s22/10.21
/home/philipp/facerec/data/at/s22/8.21
/home/philipp/facerec/data/at/s22/1.21
/home/philipp/facerec/data/at/s15/2.14
/home/philipp/facerec/data/at/s15/7.14
/home/philipp/facerec/data/at/s15/6.14
/home/philipp/facerec/data/at/s15/9.14
/home/philipp/facerec/data/at/s15/5.14
/home/philipp/facerec/data/at/s15/3.14
/home/philipp/facerec/data/at/s15/4.14
/home/philipp/facerec/data/at/s15/10.14
/home/philipp/facerec/data/at/s15/8.14
/home/philipp/facerec/data/at/s15/1.14
/home/philipp/facerec/data/at/s2/2.1
/home/philipp/facerec/data/at/s2/7.1
/home/philipp/facerec/data/at/s2/6.1
/home/philipp/facerec/data/at/s2/9.1
/home/philipp/facerec/data/at/s2/5.1
/home/philipp/facerec/data/at/s2/3.1
/home/philipp/facerec/data/at/s2/4.1
/home/philipp/facerec/data/at/s2/10.1
/home/philipp/facerec/data/at/s2/8.1
/home/philipp/facerec/data/at/s2/1.1
/home/philipp/facerec/data/at/s31/2.30
/home/philipp/facerec/data/at/s31/7.30
/home/philipp/facerec/data/at/s31/6.30
/home/philipp/facerec/data/at/s31/9.30
/home/philipp/facerec/data/at/s31/5.30
/home/philipp/facerec/data/at/s31/3.30
/home/philipp/facerec/data/at/s31/4.30
/home/philipp/facerec/data/at/s31/10.30
/home/philipp/facerec/data/at/s31/8.30
/home/philipp/facerec/data/at/s31/1.30
/home/philipp/facerec/data/at/s28/2.27
/home/philipp/facerec/data/at/s28/7.27
/home/philipp/facerec/data/at/s28/6.27
/home/philipp/facerec/data/at/s28/9.27
/home/philipp/facerec/data/at/s28/5.27
/home/philipp/facerec/data/at/s28/3.27
/home/philipp/facerec/data/at/s28/4.27
/home/philipp/facerec/data/at/s28/10.27
/home/philipp/facerec/data/at/s28/8.27
/home/philipp/facerec/data/at/s28/1.27
/home/philipp/facerec/data/at/s40/2.39
/home/philipp/facerec/data/at/s40/7.39
/home/philipp/facerec/data/at/s40/6.39
/home/philipp/facerec/data/at/s40/9.39
/home/philipp/facerec/data/at/s40/5.39
/home/philipp/facerec/data/at/s40/3.39
/home/philipp/facerec/data/at/s40/4.39
/home/philipp/facerec/data/at/s40/10.39
/home/philipp/facerec/data/at/s40/8.39
/home/philipp/facerec/data/at/s40/1.39
/home/philipp/facerec/data/at/s3/2.2
/home/philipp/facerec/data/at/s3/7.2
/home/philipp/facerec/data/at/s3/6.2
/home/philipp/facerec/data/at/s3/9.2
/home/philipp/facerec/data/at/s3/5.2
/home/philipp/facerec/data/at/s3/3.2
/home/philipp/facerec/data/at/s3/4.2
/home/philipp/facerec/data/at/s3/10.2
/home/philipp/facerec/data/at/s3/8.2
/home/philipp/facerec/data/at/s3/1.2
/home/philipp/facerec/data/at/s38/2.37
/home/philipp/facerec/data/at/s38/7.37
/home/philipp/facerec/data/at/s38/6.37
/home/philipp/facerec/data/at/s38/9.37
/home/philipp/facerec/data/at/s38/5.37
/home/philipp/facerec/data/at/s38/3.37
/home/philipp/facerec/data/at/s38/4.37
/home/philipp/facerec/data/at/s38/10.37
/home/philipp/facerec/data/at/s38/8.37
/home/philipp/facerec/data/at/s38/1.37
C#版的人脸识别(只实现了特征脸)EMGU Multiple Face Recognition using PCA and Parallel Optimisatioin:
阅读(...) 评论()}

我要回帖

更多关于 固态硬盘识别不出来了 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信