如果您使用幾個快捷方式,則可以使Dlib在Android(20-30 fps)上實時檢測人臉地標。這是一個很棒的圖書館。
初始化
首先,你應該遵循葉夫根的答案的所有建議,特別是確保你只初始化frontal_face_detector
和shape_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時確實會面對+特徵檢測,即使沒有這些額外的複雜性,這也可能足以滿足您的需求。
你需要什麼地標?我的項目使用Android Vision獲得了相當大的成功(還沒有看iOS!)。我之前看過OpenCV,它比Android Vision慢很多 - 但值得一試。 – Ewald