4

我試圖使用Python實現人臉識別算法。我希望能夠接收圖像目錄,並計算它們之間的成對距離,當短距離應該有希望對應於屬於同一個人的圖像。最終目標是對圖像進行聚類並執行一些基本的人臉識別任務(無監督學習)。使用本地描述符實現人臉識別(無監督學習)

由於無監督設置,我對該問題的處理方法是計算「臉部簽名」(R^d中的某個向量,用於某些int d),然後計算出兩個屬於同一個人的距離確實很近。

我有一個人臉檢測算法,它可以檢測人臉,裁剪圖像並執行一些基本的預處理,因此我提供給算法的圖像是灰色和均衡的(見下文)。

對於「臉部簽名」的一部分,我已經試過,我在一些出版物閱讀兩種方法:

  1. 將全部的LBP(局部二元模式)的直方圖(處理)圖片
  2. 計算SIFT描述符在7個臉部界標點(嘴巴,嘴巴左邊等),我使用外部應用程序識別每個圖像。簽名是描述符的平方根的連接(這導致更高的維度,但是現在性能不是問題)。

enter image description here

對於兩個簽名,我使用的OpenCV的compareHist功能(參見here),嘗試了幾種不同的距離度量(智廣場,歐式等)的比較。

我知道人臉識別是一項艱鉅的任務,更不用說沒有任何訓練,所以我並不期待好的結果。但目前爲止,我看起來似乎完全是隨機的例如,計算最右側圖像與圖像其餘部分的距離時,我發現她最接近4個比爾克林頓(...!)。

processed image with chosen facial landmarks

我在this偉大的演示,它的普及開展對測試集,這應該顯著改善結果的「度量學習」程序讀取。然而,它在演示文稿和其他地方也說過,「常規」距離測量也應該可以得到好的結果,所以在我嘗試這個之前,我想明白爲什麼我所做的一切都讓我無所適從。

總之,我的問題,我很想得到任何形式的幫助:

  1. 一個改進我的,雖然是隻對實際執行臉LBP,而不是角落以及可能會將噪音插入簽名的所有內容。在計算LBP之前,如何掩蓋不是臉的部分?我也爲這部分使用OpenCV。

  2. 我對計算機視覺相當陌生;我如何去「調試」我的算法,找出出現問題的地方?這可能嗎?

  3. 在無人監督的設置中,是否有任何其他方法(這不是局部描述符+計算距離)可以工作,以聚類面孔的任務?

  4. OpenCV模塊中還有其他什麼,也許我沒有想到這可能會有所幫助嗎?看來所有的算法都需要訓練,並且對我而言並不有用 - 算法需要處理完全新的圖像。

在此先感謝。

回答

3

你所尋找的是無監督特徵提取 - 拿一把未標記的圖像,並發現描述這些圖像最重要的特徵。

無監督特徵提取的最先進方法都基於(卷積)神經網絡。看看autoencoders(http://ufldl.stanford.edu/wiki/index.php/Autoencoders_and_Sparsity)或受限制的Bolzmann機器(RBMs)。

您還可以採取現有的面部檢測器如DeepFace(https://www.cs.toronto.edu/~ranzato/publications/taigman_cvpr14.pdf),只需要配備層,並使用將類似的面在它們之間的距離一起。

恐怕OpenCV的是不適合這個任務,你可能要檢查來自Caffe,Theano,TensorFlow或Keras。

+0

感謝您的回覆。我實際上有一個我可以使用的Caffe框架。你會建議開發一個大型的預處理人臉訓練集,並通過CNN運行它以獲得每個圖像的更好表示,然後計算圖像之間的距離?你認爲如果代表性足夠好,簡單的歐幾里德距離應該足夠好嗎? – galoosh33

+0

是的,這正是我的想法。如果CNN學習的功能很好,那麼簡單的歐式距離就足夠了。 –