﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-我的编程乐园-随笔分类-图像识别算法及原理</title><link>http://www.cppblog.com/deercoder/category/13982.html</link><description>&lt;P&gt;&lt;FONT style="FONT-SIZE: 20px" color=#ff0000&gt;积累，坚持！&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="FONT-SIZE: 20px" color=#ff0000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ---------我是一只IT小小鸟&lt;/FONT&gt;&lt;/P&gt;</description><language>zh-cn</language><lastBuildDate>Sun, 06 Jun 2010 07:46:23 GMT</lastBuildDate><pubDate>Sun, 06 Jun 2010 07:46:23 GMT</pubDate><ttl>60</ttl><item><title>AGES算法---learning from Facial Aging Pattern for Automatic Age Estimation</title><link>http://www.cppblog.com/deercoder/archive/2010/06/06/117269.html</link><dc:creator>刘畅</dc:creator><author>刘畅</author><pubDate>Sun, 06 Jun 2010 07:30:00 GMT</pubDate><guid>http://www.cppblog.com/deercoder/archive/2010/06/06/117269.html</guid><wfw:comment>http://www.cppblog.com/deercoder/comments/117269.html</wfw:comment><comments>http://www.cppblog.com/deercoder/archive/2010/06/06/117269.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/deercoder/comments/commentRss/117269.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/deercoder/services/trackbacks/117269.html</trackback:ping><description><![CDATA[<span style="font-size: 12pt;">&nbsp;&nbsp; 最近开始读了几篇paper，然后做了下笔记。暑假是实习内容就是实现这个算法，所以先了解了下，发现需要掌握的知识还是很多啊！<br><br>《learning from Facial Aging Pattern for Automatic Age Estimation》<br>《<a href="http://portal.acm.org/citation.cfm?id=1313282" class="l" onmousedown="return clk(0,'','','','1','','0CCEQFjAA')">Automatic
<em> Age</em>  Estimation Based on <em> Facial Aging Patterns</em></a>》<br><br>笔记如下：<br>基于年龄格局自动年龄估计<br>1． 自动年龄估计面临的主要难题就是年龄相对于其他面部因素的特殊性：<br>1. 老化的过程不可控。导致样本数据收集很费力<br>2. 独特的年龄格局。每一个人的的基因，健康情况，生活方式都不同，造成年龄格局不同。<br>3. 年龄格局是时间的函数。老化的过程必须按照时间顺序，某时刻的脸部状态能够影响到后面的年龄的面部表情，但是不能影响到年轻时刻的。<br>2.试验中，数据的采集使用FG-NET Aging Database。该数据库的有个缺点就是绝大多数图像只是表示很少的年龄，造成数据不完整。所以年龄算法必须要能够适用于处理不完整数据。<br>3.每个人独有的特征也需要考虑进去，还有，每个分级都需要排列成次序，因为是按照时间顺序来的。<br>4.AGES算法。（AGing pattErn Subspace）取代传统的使用使用独立的每一张人脸图片来采样，把每一个年龄格局作为一个样本（这样的好处是将个人的特征和实践概念结合起来，让学习的任务从image-class编程了从image序列-class序列，从而基于了不完整数据）。为了解决这个问题，一个迭代学习算法被发明。<br>5.最早的一个年龄估计算法是Lanitis提出，在他们的工作中，年龄格局是有一个二次函数（称作年龄函数）来决定的。<br>Age = f(b);<br>其中b是那个脸部图像的特征向量。而这个函数是根据不同的人来训练得到合适的（这其中有4种方式来决定这个函数，而WPS算法是最好的。但是WPS算法包含了很多其他因素，包括健康情况，天气&#8230;&#8230;而这些情况很难得到），所以，后来使用WAS算法被拿来使用（因为它不需要涉及到这些因素）。<br>WAS：年龄函数是由带权的已知年龄函数来求得的，而权值是由Mahalanobis距离决定（Mahalanobis距离是从测试图像到训练图像）<br>其后，有很多算法对WAS算法进行改进，其中最优的方法是AAS。<br>上面的这些基于年龄函数的年龄估计方法有缺陷，造成估计的精度不能进一步提高。主要问题是：1。年龄函数的公式固定（而事实上是没有这种关系的，二次函数关系）2。时间特征不能很好的反应（任何的变化都会反映到其它图像上）3。某个人年龄格局的学习单纯的由这个人的面部表情（而实际上不同的人之间有某种共同的特性）4。新年龄函数仅仅是由原函数线性组合，而不是有一个确定的模型阐述<br>6．年龄格局。<br>年龄格局定义：它是一串按照时间排序的个人图像序列。<br>假设灰度图像时由二维矩阵I表示（I表示像素（x,y）处的光强），那么年龄格局就可以由三位矩阵表示p(x,y,t)（其中t表示时间）<br>在年龄格局被进一步处理前，所包含的图像要先被转化成特征向量（论文【7】中有办法，采用Apperance Model）。<br>1 &nbsp; 2&nbsp;&nbsp; 3&nbsp;&nbsp; 4&nbsp;&nbsp; 5&nbsp;&nbsp; 6 &nbsp; 7<br>m&nbsp;&nbsp; m&nbsp; B1&nbsp;&nbsp; m&nbsp; B2&nbsp;&nbsp; m&nbsp;&nbsp; m<br><br>特征向量（AM抽取）b有n维（因为图像转换之后的特征向量假设是n维的），而p表示的是年龄的个数，就是上面的编号1,2&#8230;&#8230;7。那么每一年龄模式可以表示成n * p维表示。为何？因为实际上可以看成时一个向量（xxxxxxx | xxxxxx），前面的一部分就是那个向量b，它有n维，也就是n位，而后面的部分就是p，对应的用p位表示，比如0就表示未000&#8230;&#8230;00，1就表示000&#8230;&#8230;01，&#8230;&#8230;&#8230;&#8230;<br>经过这个之后就可以表示对应的向量x（年龄格局）。<br>这个就得到了采样样本！<br>7.剩下的问题就是，1。从image-class变成了从image序列-class序列，2。处理不完整数据样本。<br>8．AGES算法<br>1．前面已经采样得到Aging Pattern，现在就是要建模（Modelling），采用办法就是PCA方法来构建子空间（资料【10】中有介绍）。<br>具体办法就是：<br>1． 计算子空间投影（Projection）：<br>Y = WT(x&#8722;u)<br>u:u是x的平均向量<br>W：x的协方差矩阵的特征向量 WT是W的转置矩阵<br>算法具体步骤：<br>1．输入一个向量组D = {x1,x2,x3&#8230;&#8230;xn}，有n个，然后每一个xi都可以表示为{xia，xim}，前面一个表示有用数据，后面那个表示丢失的特性。一旦确定了变换矩阵W确定了，那么xk的重构x&#8242;k就可以求出来<br>x&#8242;k = u + W * yk<br>然后对应的重构差异值：<br>&#949;= 1n&#931;(xk&#8722;x&#8242;k)Tn1(xk&#8722;x&#8242;k)<br>现在的问题是：要找到最好的一个W使得&#949;是最小的。<br>那么接下来的任务是如何实现呢？首先，置初值（xim由平均的uim决定），每一次迭代中，都可以计算出来Wi来，但是，由于x中含有很多丢失信息，所以不能直接用公式Y = WT(x&#8722;u)来求出投影y。使用变形公式：<br>Wi􁉀ak􁉁&#8727;yk =xia &#8722; ui􁉀ak􁉁<br>那么现在的算法是：首先初始化，设置每一个然xim为uim，循环次数 i设置为0，然后，使用上面表格的算法，得到W0，再在给定的次数&#933;和精度要求&#952;条件下多次循环迭代，先利用<br>Wi􁉀ak􁉁&#8727;yk =xia &#8722; ui􁉀ak􁉁<br>计算yk，然后利用x&#8242;k = u + W * yk 得到重构的x&#8242;k，然后将得到的重构值赋值给xk，在利用PCA更新D，重新计算Wi，然后得到ui+1，在继续下次循环。<br>上述的结果能得到W，u<br>下面就是测试程序（如何得到年龄）：<br>得到了所需要的参数之后，就可以输入一个参数，得到年龄。<br>具体方法是：<br>1． 由于一个给定的图样不知道年龄，所以在每一个pattern的有效字段中都放入该图像（也就是假设这个图像的年龄分别是1,2，&#8230;&#8230;&#8230;&#8230;n），然后分别计算yk，然后计算出&#949;最后比较得到最小的&#949;，对应的那个位置就是age。<br>2．<br>上图中就是将这个test image放入每一个的位置0,1，&#8230;&#8230;&#8230;&#8230;p-1，然后都经过投影，然后重构后得到&#949;，找到最小的，就是得到年龄。<br>年龄段估计的方法和上面的那个基本原理一样，只不过是在计算出来一个年龄之后，由于我们要的是年龄段，所以就除以段的间距，然后取整加1就是所需要的。<br>比如：年龄段的分类：0~4，4~8 &#8230;&#8230;&#8230;&#8230;<br><br>我的疑问：<br>通过阅读几次这个论文，对于这个算法我大概了它的基本流程。但是还是有一些疑问：<br>1． 每一个xi都可以表示为{xia，xim}，但是这个里面的有用信息部分和无用信息部分到底是哪些部分呢？因为前面的采样过程中已<br>经知道， xi是两部分组成，前面是图像信息，后面是position，就是年龄。那么这里我们说的有用信息是指前面的那个图像信息，丢失信息是那个年龄吗？（我觉得很多地方都是需要这个有用信息和丢失信息的，特别是估算部分）<br>2． 形成xi的时候，需要把一个图像转换成特征向量(feature vector)，这个在文献【7】有介绍，就是Apperance Model，这个目前还没有搞懂，刚刚下了篇论文：<br>《Statistical Models of Face Images &#8211; Improving Specificity》<br>好像是这个参考资料，准备下一步继续看下去。<br>3．还有很多细节没有弄清楚。<br>
<br>   </span><img src ="http://www.cppblog.com/deercoder/aggbug/117269.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/deercoder/" target="_blank">刘畅</a> 2010-06-06 15:30 <a href="http://www.cppblog.com/deercoder/archive/2010/06/06/117269.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>