2016-07-18 44 views
3

我正在開發應用程序,我需要在鏡像凸輪或化妝凸輪等凸輪上獲取臉部地標點。我希望它也適用於iOS。請爲我提供一個可靠的解決方案。 我已經使用Dlib和Luxand。在android中檢測臉部地標點

DLIB:https://github.com/tzutalin/dlib-android-app

Luxand:http://www.luxand.com/facesdk/download/

DLIB是緩慢的,有2秒左右的延遲(請看git的頁面上的演示視頻)和luxand是確定的,但它支付。我的首要任務是使用開源解決方案。 我也使用Google的願景,但他們沒有提供很多面部標誌點。 所以,請給我一個解決方案,使dlib快速工作或任何其他選項保持優先跨平臺。 在此先感謝。

+0

你需要什麼地標?我的項目使用Android Vision獲得了相當大的成功(還沒有看iOS!)。我之前看過OpenCV,它比Android Vision慢很多 - 但值得一試。 – Ewald

回答

0

除了OpenCV和Google Vision之外,還有廣泛可用的Web服務,例如Microsoft Cognitive Services。優點是它將完全獨立於平臺,您已將其列爲主要設計目標。我還沒有親自將它們用於實現,但基於一段時間玩他們的演示他們似乎很強大;他們非常準確,可以根據你想知道的內容提供不少細節。 (其他供應商也有類似的解決方案)。

這樣的兩大潛在缺點是可能會增加網絡流量和API定價(取決於您將使用它們的程度)。價格方面,微軟目前每月可免費提供多達5,000筆交易,並且交易額外的交易超過了一分錢(取決於交通量,實際上您可以獲得大批量的折扣),但如果您的交易量較高,舉例來說,例如,每月數百萬筆交易的費用可以快速增加。這實際上是一個相當典型的定價模式;在您選擇供應商或實施此類解決方案之前,請確保您瞭解他們將如何向您收費,以及您可能最終付費多少,以及如果擴大用戶羣,您可以支付多少費用。根據您的流量和商業模式,它可能非常合理或成本過高。

添加的網絡流量可能會也可能不會成爲問題,具體取決於您的應用程序的寫入方式以及您要發送的數據量。如果你可以異步進行處理,並保證合理快速的Wi-Fi訪問,這顯然不會是一個問題,但不幸的是,你可能有或沒有這種奢侈。

+1

謝謝@EJoshuaS 但我希望它是在設備中,所以請給我任何選項,將檢查設備不在network.Thanks再次爲您的有用信息。 – DCS

0

我目前正在使用Google Vision API,它似乎能夠檢測開箱即用的地標。這裏退房FaceTracker:

google face tracker

這個解決方案應該能夠檢測到的臉,幸福,和左,右眼爲是。對於其他地標,您可以調用Face上的getLandmarks,它應該根據他們的文檔返回所需的一切(以爲我沒有嘗試過):Face reference

+0

我已經嘗試過演示,但無法精確地在相機預覽上繪製人臉地標點。 讓我知道,如果你已經成功地繪製了精確的臉點,並分享代碼塊PLZ。 非常感謝。 – DCS

5

Dlib對於大多數情況下足夠快。大部分處理時間用於檢測圖像上的人臉區域,因爲現代智能手機正在生成高分辨率圖像(10MP +),所以處理時間較慢

是的,人臉檢測可以在3-5MP圖像上花費2秒鐘,但它會嘗試找到80x80像素大小的非常小的面孔。我確信,你不需要在高分辨率圖像上使用這樣的小臉部,這裏的主要優化是在找到臉部之前減小圖像的大小。

找到人臉區域後,下一步 - 人臉標誌檢測速度非常快,對於一個人臉需要3ms,這個時間不取決於分辨率。

dlib-android port目前沒有正確使用dlib的檢測器。下面是如何使dlib-android端口工作更快的建議列表: https://github.com/tzutalin/dlib-android/issues/15

它非常簡單,您可以自己實施。我預計性能提升約爲2x-20x

+0

該鏈接似乎很有幫助。讓我試試這些並回復你。 感謝您的幫助。 – DCS

13

如果您使用幾個快捷方式,則可以使Dlib在Android(20-30 fps)上實時檢測人臉地標。這是一個很棒的圖書館。

初始化

首先,你應該遵循葉夫根的答案的所有建議,特別是確保你只初始化frontal_face_detectorshape_predictor對象,而不是一次的每一幀。如果您從文件反序列化它,而不是使用get_serialized_frontal_faces()函數,則frontal_face_detector將初始化得更快。 shape_predictor需要從100Mb文件初始化,並需要幾秒鐘。序列化和反序列化函數被編寫爲跨平臺並對數據進行驗證,這是健壯的,但使其非常緩慢。如果您準備對字節序列做出假設,您可以編寫自己的反序列化函數,該函數的速度會更快。該文件主要由136個浮點值的矩陣組成(約120000個,共16320000個浮點數)。如果將這些浮點數量化爲8或16位,則可以節省大量空間(例如,可以將最小值和(max-min)/ 255存儲爲每個矩陣的浮點數並分別量化)。這將文件大小減小到大約18Mb,並且它在幾百毫秒而不是幾秒鐘內加載。使用量化值的質量下降似乎可以忽略不計,但YMMV。

人臉檢測

您可以縮放攝像機架到一些小的,如240x160(或什麼的,保持寬高比是否正確),更快的人臉檢測。這意味着您無法檢測到較小的臉部,但根據您的應用,這可能不成問題。另一個更復雜的方法是自適應地裁剪和調整用於臉部檢測的區域:首先檢查較高分辨率圖像中的所有臉部(例如480x320),然後裁剪區域+/-先前位置周圍的一個臉部寬度,如果需要的話。如果您未能檢測到一張臉部的臉部,則會恢復爲檢測下一張臉部的整個區域。

臉部追蹤

爲了更快臉跟蹤,則可以在一個線程中連續運行臉部檢測,然後在另一個線程,跟蹤檢測到的面部(多個),並執行使用所跟蹤的矩形面部特徵檢測。在我的測試中,我發現根據我使用的手機(大約240x160),臉部檢測花費了100 - 400毫秒,在那段時間我可以對中間幀進行7或8個臉部特徵檢測。如果臉部移動很多,這會變得有點棘手,因爲當你得到新的臉部檢測(將從400ms前)時,你必須決定是否繼續跟蹤新的檢測位置或跟蹤的位置先前的檢測。 Dlib包含了一個correlation_tracker,但不幸的是我無法讓這個運行速度超過每幀250ms左右,並且縮小分辨率(甚至是大幅度縮減)並沒有多大區別。修補內部參數會增加速度,但跟蹤效果較差。我最終使用基於預覽幀的色度UV平面的CAMShift跟蹤器,根據檢測到的臉部矩形生成顏色直方圖。在OpenCV中有一個CAMShift的實現,但它也很容易推出自己的。

希望這會有所幫助,它主要是先挑選優先級最低的水果,然後繼續前進直到你快樂足夠快。 Galaxy Note 5 Dlib在大約100ms時確實會面對+特徵檢測,即使沒有這些額外的複雜性,這也可能足以滿足您的需求。

+0

我對通過量化浮點數來重新使用.dat文件大小非常感興趣。你可以請我引導一些示例代碼或類似的東西?我真的很感激 – s1ddok

+1

@ s1ddok當然,下面是一些代碼,用於打包格式序列化shape_predictor:http://pastebin.com/UqNq5qDV,以下代碼以相同的格式反序列化:http://pastebin.com/ UT3w8CmS我將序列化代碼添加到face_landmark_detection_ex.cpp以生成打包文件。這不是測試與最新版本的dlib btw – samgak

+0

非常感謝,我試圖編譯,但我得到一堆'是'dlib :: shape_predictor''的私人成員錯誤:(你認爲這是可能的解決這個問題, – s1ddok