版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/zergskj/article/details/43374003
寫這篇文章,并不是要挑戰學術泰鬥,更不是要在這裡炫耀和說教知識。隻是前不久有個朋友問我能不能搞人臉識别,我說回來試試。想不到這裡頭的東西還挺多,不是三兩天就能做完的。就在這裡把我的實作思路寫出來,以表心迹。
圖像識别,一直是計算機領域研究的熱門,随着大資料的興起,更是讓圖像識别中的特殊分支人臉識别如魚得水,使得運算和樣本資料不再成為系統的掣肘。那麼具體來說,一個現代人臉識别系統(例如face++)是如何實作的呢?
這裡我不敢妄自猜測,我僅提供我自己的實作方法,拿出來與大家一起學習和探讨:
1.首先建立目标模型,分析出目标模型的特征值,也就是在檢索中所需要的KPI,我這裡隻是簡單的列了一下,結果發現太多了,而我又太懶,寫了一半沒動力寫下去了,人臉特征清單:
特征 | KPI名額 | 特征描述 | 能否提取 | 特征值 |
整體 | 頭發密度 | 濃密、稀疏 | 是 | 0-100 |
頭發粗糙度 | 順滑、卷毛、散亂 | 否 | ||
頭發顔色 | 黑色、白色、棕色 | 0-255 | ||
皮膚材質 | 粗糙、細膩 | |||
皮膚顔色 | 棕褐色、嫩白色 | |||
人臉輪廓 | 圓臉、瓜子臉 | 0-10 | ||
額頭 | 額頭形狀 | 扁平、秃頭 | ||
額頭大小 | 寬闊、窄小 | |||
額頭材質 | 同整體 | |||
額頭顔色 | ||||
眼睛 | 眉毛形狀 | 彎眉、劍眉、畫眉 | ||
眉毛顔色 | 黑、褐 | |||
眼睛大小 | ||||
眼睛形狀 | ||||
眼睛顔色 | ||||
瞳孔大小 | ||||
瞳孔顔色 | ||||
眼袋大小 | ||||
眼袋形狀 | ||||
耳朵 | 耳朵形狀 | |||
耳朵大小 | ||||
耳廓比例 | ||||
耳垂比例 | ||||
耳朵顔色 | ||||
鼻子 | 鼻梁長度 | |||
鼻翼寬度 | ||||
鼻子高度 | ||||
鼻子紋理 | ||||
鼻孔大小 | ||||
鼻孔角度 | ||||
鼻毛長度 | ||||
嘴巴 | 嘴巴大小 | |||
嘴巴形狀 | ||||
嘴巴顔色 | ||||
上下嘴唇比例 | ||||
嘴唇紋理 | ||||
嘴唇高度 | ||||
臉頰 | 臉頰大小 | |||
臉頰形狀 | ||||
臉頰材質 | ||||
臉頰顔色 | ||||
下巴 | 下巴大小 | |||
下巴形狀 | ||||
下巴材質 | ||||
下巴顔色 |
呵呵,确實不少,光整理KPI名額就得花1-2天吧,如果KPI列的越細,通過KPI值比對到的人臉自然越精确。
看到這裡,大家是不是已經隐約感到,人臉識别其實也不難了吧?

,錯了,道理其實不難,難的就在後繼的實作上。
2.提取圖像的KPI名額:
提取圖像中的特征區域,關鍵在于計算出準确的Harris角點,多年以來,不少科學家和技術人員為了使得提取更精确,提出了很多計算角點的算法,而我們不得不對這些先驅心存感激之情,正是他們的不懈努力,才使得我們今天的工作變得輕而易舉。這裡就可以直接使用JavaCV裡提供的角點提取API,通過FaceExactor抽取類庫,很友善的找到圖像中的人臉。
不會這麼簡單吧?
3.提取人臉中的特征區域:
的确沒這麼簡單,真正困難的地方才剛剛開始,如果要找到人臉區域内的上述KPI,又該采用什麼政策呢?在這裡據我所知,業内是沒有很好的解決方案的,通常他們都是使用算法自動分類的手段。
什麼意思呢?也就是将圖像矩陣的二維資料,通過機器學習,從海量的樣本資料中找到規律,并自動将資料包分類。
這裡就有必要提一下時下比較流行的“支援向量機模型”,“支援向量機”就是将低維資料轉換為高維資料,發現資料的規律,并分類。
請注意:以上的這種手段是從純數學的角度找到的解決方案,并不符合人類識别物體的思維習慣,也就是說程式自動劃分的圖像的特征資料包,對人類來說,是沒有任何意義的!
好了,問題來了:
怎樣讓取得的圖像碎片資料包既能準确表述圖像的特征規律,又有文法上的意義?
這裡,我的解決方案就是人工幹預:将圖像碎片資料包以清單的形式在背景呈現出來,在Lucene的檢索字段中預先建立好了可以容納KPI的字段,比如:眼睛大小、鼻梁長度等。
每次樣本資料被“支援向量機”分類後,便讓管理者手工在背景進行标注,也就是給資料包打标簽
那麼,緊接着,大家會問:
這樣現實嗎?這麼海量的資料,人工操作到什麼時候?
幸運的是,我們并不需要重複标注,對于有意義的圖像碎片包,我們僅僅隻需标注一次即可,下次相似的圖像碎片就會自動配置設定到此标簽下,而管理者僅需剔除完全錯誤的碎片包即可,也就是說,系統運作後期,管理者隻是在做“内容檢查”
4.建立人臉識别的金字塔模型
好了,一切看似ok了,為什麼還要做第四步,這不是有點多餘嗎?
呵呵,還是那句話,沒這麼簡單。人臉識别系統最重要的也是系統運作的速度,通常資料都是TB為機關的,再通過CBIR将圖像分解為特征詞包, 那資料量會成倍增長,如果沒有科學的架構,再好的算法也是望洋興歎!
我們這裡先暫時設定金字塔的層次為3層,第一層隻有三個特征值,第二層有6特征值,第三層包含了所有特征值
如下表所示:
頭發材質 | |||||||||||
頭發 密度 | 粗糙 度 | ... | 大小 | 形狀 |
選擇KPI名額時需要比較小心,上一層的KPI必須能涵蓋下一層的KPI,否則查找特征就容易丢失。
每次系統發起查找,實際隻用第一層的KPI進行比對,再從比對的結果集裡用第二層KPI進行比對,依次類推,直到找到最比對的結果。
5.性能及結果準确度測試
這裡的性能結果和準确度,隻能在系統真正實作了以後提供給大家了,在這裡就不寫了。
但是有一點是可以肯定的:系統的KPI設定的越合理,則系統查詢越快速越準确!
在這樣的體系結構下,打造一個可靠的人臉識别系統是完全有可能的!