ASM(active shape models)算法介绍
ASM是基于統計學習模型的特征點提取的一種方法。這個方法是95年就提出來的,不過至今仍是我認為比較好的人臉特征點提取的方案。方法的提出人Tim Cootes后來還提出了aam算法,也很有名,但如果簡單是特征點的定位的話,我認為asm的效果可能更好一些。ASM跟大多數統計學習方法一樣,也包括train和test(or fit)兩部分,也就是形狀建模build和形狀匹配fit。這個算法其實很簡單,可以用來做實時性的檢測,但我還是看了很久,而且還有理解有問題的地方,肯定有很多不對的地方,希望大家多多指正。
一、模型的建立(build)
1.選擇合適的特征點
特征點的選取很重要啊,這點不用我多說啦。好的特征點大概應該或多或少滿足如下幾點:邊緣點、曲率大的、T型連接點和以上這些點的連線上的等分點。(如下圖)
記錄好這些特征點的順序,以便于后面確定圖形的邊界和連線等等。這也是asm方法的優點,得到的特征點是有序的。這樣得到一組特征點集X
我們這里把它看做是一個2n維的向量
2.形狀統計模型
剛剛得到的2n維向量維數很高(因為圖像中我們選擇的特征點往往很多),但這2n維彼此是有很強的相關性的,彼此的位置距離是大致不變的。這里作者使用最最常用的PCA來進行降維,提取出主成分,這里作者叫它modes。于是任意一組特征點集可以看做是主成分向量空間的一個坐標點,而這個坐標原點就認為是這些點集的平均,這樣任意點就是坐標原點加上一個向量。即:
這里P是包含了前t個主成分的協方差矩陣,b是一個t維的向量,用來控制特征點形狀的變化,當b為0時,x即坐標原點(平均形狀),其實是很好理解哈。但這里b不要太大,如果太大,會導致整個形狀變化超出人臉的變化范圍,會使人變得異常猙獰,大家懂的。。。所以作者這里做了約束
這步還有個問題,就是PCA中主成分個數t的選取,有兩種方法:1)選擇前s個;2)選擇前k%的分量,這里作者推薦使用第二種方法。
3.把模型和新點集進行匹配
這個過程是asm方法的核心所在了,貫穿始終。說來也簡單,無非就是把剛得到的模型進行旋轉,放縮,平移。
其中T為旋轉放縮平移矩陣
我們的目的就是是模型X和圖像特征點集Y最接近,這里目標函數選擇是其各點歐氏距離和最小
具體的匹配過程就是,先初始化b向量為0,得到模型X,用其他方法找到變換矩陣T,這個很簡單,可以用其他方法(haar人臉檢測器,光流法,kalman濾波等等等等)大致找到目標的位置和大小以及方向。求的Y,再利用Y反求b,并且更新b,直到收斂。這里比較容易陷入局部最小,也是該方法的一個缺點。
二、模型在圖像中的匹配(fit)
說白了,也就是在圖像中找到模型的匹配點,前面已經說過了,可以利用其它方法大致找到模型的位置大小方向(不要小瞧這步,如果預處理的不好,是很容易陷入局部最小的),接下來就是如何改善參數得到好的匹配結果了。模型中可以調整的參數有b、Xt、Yt、s、theta這5個參數。這里作者提到了兩種手段:
1)先驗信息認為特征點主要是圖像的強邊緣點,并且圖像灰度的梯度服從高斯分布,只要找到模型特征點附近梯度最大的值,即認為是特征點所在的位置
示意圖如下:
這種方法很明顯,對圖像的噪聲很敏感,我這里不太推薦
2)對模型特征點周圍的紋理信息進行采樣,對比圖像和模型訓練集的紋理,找到紋理最接近的點即認為是特征點。作者這里比較紋理的工具是馬氏距離。為了提高搜索的效率,作者還提到了多分辨率搜索周圍像素紋理,對于粗糙的尺度,搜索范圍大,對于細致的尺度,進行細致的搜索,提高了匹配的效率。這個方法是我比較推薦的。
至于代碼,找到了很多版本,有基于opencv的,也有matlab的,大家可以到wiki的asm頁面找到對應的鏈接,但我自己實踐下來,總結一下,matlab我不是太熟悉,代碼量太大,我放棄了學習。asmlib-opencv是一個在國外讀書的國人寫的,有源代碼,但效果一般。還有個很牛的國人的作品asmlibrary,但核心部分只提供了lib,他的方法效果很好,代碼風格也非常棒,實時性也很好,這里感謝作品作者對我的指點。還有個牛人猛寫了不基于opencv的stasm,代碼量太大,我果斷放棄了。至于其他的一些作品都是只有demo,沒有code,很讓人遺憾。如果哪位大神有asm效果很好的基于opencv的源代碼,能提供給小弟,不勝感激。
from:?http://blog.csdn.net/yang_xian521/article/details/7468571
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的ASM(active shape models)算法介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 读了几篇boosting文献的收获
- 下一篇: Waffles——机器学习开发包