Android API教程:人臉檢測(Face Detect)

2020-12-05 CSDN技術社區

通過兩個主要的API,Android提供了一個直接在位圖上進行臉部檢測的方法,這兩個API分別是    android.media.FaceDetector和android.media.FaceDetector.Face,已經包含在Android官方API中。本教程來自Developer網站,向大家介紹了這些API,同時提供教程中實例代碼下載。

圖片來源:Wikipedia

所謂人臉檢測就是指從一副圖片或者一幀視頻中標定出所有人臉的位置和尺寸。人臉檢測是人臉識別系統中的一個重要環節,也可以獨立應用於視頻監控。在數字媒體日益普及的今天,利用人臉檢測技術還可以幫助我們從海量圖片數據中快速篩選出包含人臉的圖片。 在目前的數位相機中,人臉檢測可以用來完成自動對焦,即「臉部對焦」。「臉部對焦」是在自動曝光和自動對焦發明後,二十年來最重要的一次攝影技術革新。家用數位相機,佔絕大多數的照片是以人為拍攝主體的,這就要求相機的自動曝光和對焦以人物為基準。
via cdstm.cn

構建一個人臉檢測的Android Activity

你可以構建一個通用的Android Activity,我們擴展了基類ImageView,成為MyImageView,而我們需要進行檢測的包含人臉的位圖文件必須是565格式,API才能正常工作。被檢測出來的人臉需要一個置信測度(confidence measure),這個措施定義在android.media.FaceDetector.Face.CONFIDENCE_THRESHOLD。

最重要的方法實現在setFace(),它將FaceDetector對象實例化,同時調用findFaces,結果存放在faces裡,人臉的中點轉移到MyImageView。代碼如下:

  1. public class TutorialOnFaceDetect1 extends Activity { 
  2.  private MyImageView mIV; 
  3.  private Bitmap mFaceBitmap; 
  4.  private int mFaceWidth = 200
  5.  private int mFaceHeight = 200
  6.  private static final int MAX_FACES = 1
  7.  private static String TAG = "TutorialOnFaceDetect"
  8.  
  9. @Override 
  10. public void onCreate(Bundle savedInstanceState) { 
  11. super.onCreate(savedInstanceState); 
  12.  
  13. mIV = new MyImageView(this); 
  14. setContentView(mIV, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
  15.  
  16.  
  17. Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.face3); 
  18. mFaceBitmap = b.copy(Bitmap.Config.RGB_565, true); 
  19. b.recycle(); 
  20.  
  21. mFaceWidth = mFaceBitmap.getWidth(); 
  22. mFaceHeight = mFaceBitmap.getHeight(); 
  23. mIV.setImageBitmap(mFaceBitmap); 
  24.  
  25.  
  26.  
  27. mIV.invalidate(); 
  28.  
  29. public void setFace() { 
  30. FaceDetector fd; 
  31. FaceDetector.Face [] faces = new FaceDetector.Face[MAX_FACES]; 
  32. PointF midpoint = new PointF(); 
  33. int [] fpx = null
  34. int [] fpy = null
  35. int count = 0
  36.  
  37. try { 
  38. fd = new FaceDetector(mFaceWidth, mFaceHeight, MAX_FACES); 
  39. count = fd.findFaces(mFaceBitmap, faces); 
  40. catch (Exception e) { 
  41. Log.e(TAG, "setFace(): " + e.toString()); 
  42. return
  43.  
  44.  
  45. if (count > 0) { 
  46. fpx = new int[count]; 
  47. fpy = new int[count]; 
  48.  
  49. for (int i = 0; i < count; i++) { 
  50. try { 
  51. faces[i].getMidPoint(midpoint); 
  52.  
  53. fpx[i] = (int)midpoint.x; 
  54. fpy[i] = (int)midpoint.y; 
  55. catch (Exception e) { 
  56. Log.e(TAG, "setFace(): face " + i + ": " + e.toString()); 
  57.  
  58. mIV.setDisplayPoints(fpx, fpy, count, 0); 

接下來的代碼中,我們在MyImageView中添加setDisplayPoints() ,用來在被檢測出的人臉上標記渲染。圖1展示了一個標記在被檢測處的人臉上處於中心位置。

  1.  
  2. public void setDisplayPoints(int [] xx, int [] yy, int total, int style) { 
  3.  mDisplayStyle = style; 
  4.  mPX = null
  5.  mPY = null
  6.  
  7. if (xx != null && yy != null && total > 0) { 
  8. mPX = new int[total]; 
  9. mPY = new int[total]; 
  10.  
  11. for (int i = 0; i < total; i++) { 
  12. mPX[i] = xx[i]; 
  13. mPY[i] = yy[i]; 

圖1:單一人臉檢測

多人臉檢測

通過FaceDetector可以設定檢測到人臉數目的上限。比如設置最多只檢測10張臉:

  1. private static final int MAX_FACES = 10

圖2展示檢測到多張人臉的情況。

圖2:多人人臉檢測

定位眼睛中心位置

Android人臉檢測返回其他有用的信息,例同時會返回如eyesDistance,pose,以及confidence。我們可以通過eyesDistance來定位眼睛的中心位置。

下面的代碼中,我們將setFace()放在doLengthyCalc()中。同時圖3展示了定位眼睛中心位置的效果。

  1. public class TutorialOnFaceDetect extends Activity { 
  2.  private MyImageView mIV; 
  3.  private Bitmap mFaceBitmap; 
  4.  private int mFaceWidth = 200
  5.  private int mFaceHeight = 200
  6.  private static final int MAX_FACES = 10
  7.  private static String TAG = "TutorialOnFaceDetect"
  8. private static boolean DEBUG = false
  9.  
  10. protected static final int GUIUPDATE_SETFACE = 999
  11. protected Handler mHandler = new Handler(){ 
  12.  
  13. public void handleMessage(Message msg) { 
  14. mIV.invalidate(); 
  15.  
  16. super.handleMessage(msg); 
  17. }; 
  18.  
  19. @Override 
  20. public void onCreate(Bundle savedInstanceState) { 
  21. super.onCreate(savedInstanceState); 
  22.  
  23. mIV = new MyImageView(this); 
  24. setContentView(mIV, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
  25.  
  26.  
  27. Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.face3); 
  28. mFaceBitmap = b.copy(Bitmap.Config.RGB_565, true); 
  29. b.recycle(); 
  30.  
  31. mFaceWidth = mFaceBitmap.getWidth(); 
  32. mFaceHeight = mFaceBitmap.getHeight(); 
  33. mIV.setImageBitmap(mFaceBitmap); 
  34. mIV.invalidate(); 
  35.  
  36.  
  37. doLengthyCalc(); 
  38.  
  39. public void setFace() { 
  40. FaceDetector fd; 
  41. FaceDetector.Face [] faces = new FaceDetector.Face[MAX_FACES]; 
  42. PointF eyescenter = new PointF(); 
  43. float eyesdist = 0.0f; 
  44. int [] fpx = null
  45. int [] fpy = null
  46. int count = 0
  47.  
  48. try { 
  49. fd = new FaceDetector(mFaceWidth, mFaceHeight, MAX_FACES); 
  50. count = fd.findFaces(mFaceBitmap, faces); 
  51. catch (Exception e) { 
  52. Log.e(TAG, "setFace(): " + e.toString()); 
  53. return
  54.  
  55.  
  56. if (count > 0) { 
  57. fpx = new int[count * 2]; 
  58. fpy = new int[count * 2]; 
  59.  
  60. for (int i = 0; i < count; i++) { 
  61. try { 
  62. faces[i].getMidPoint(eyescenter); 
  63. eyesdist = faces[i].eyesDistance(); 
  64.  
  65.  
  66. fpx[2 * i] = (int)(eyescenter.x - eyesdist / 2); 
  67. fpy[2 * i] = (int)eyescenter.y; 
  68.  
  69.  
  70. fpx[2 * i + 1] = (int)(eyescenter.x + eyesdist / 2); 
  71. fpy[2 * i + 1] = (int)eyescenter.y; 
  72.  
  73. if (DEBUG) { 
  74. Log.e(TAG, "setFace(): face " + i + ": confidence = " + faces[i].confidence() 
  75. ", eyes distance = " + faces[i].eyesDistance() 
  76. ", pose = ("+ faces[i].pose(FaceDetector.Face.EULER_X) + "," 
  77. + faces[i].pose(FaceDetector.Face.EULER_Y) + "," 
  78. + faces[i].pose(FaceDetector.Face.EULER_Z) + ")" 
  79. ", eyes midpoint = (" + eyescenter.x + "," + eyescenter.y +")"); 
  80. catch (Exception e) { 
  81. Log.e(TAG, "setFace(): face " + i + ": " + e.toString()); 
  82.  
  83. mIV.setDisplayPoints(fpx, fpy, count * 21); 
  84.  
  85. private void doLengthyCalc() { 
  86. Thread t = new Thread() { 
  87. Message m = new Message(); 
  88.  
  89. public void run() { 
  90. try { 
  91. setFace(); 
  92. m.what = TutorialOnFaceDetect.GUIUPDATE_SETFACE; 
  93. TutorialOnFaceDetect.this.mHandler.sendMessage(m); 
  94. catch (Exception e) { 
  95. Log.e(TAG, "doLengthyCalc(): " + e.toString()); 
  96. }; 
  97.  
  98. t.start(); 

圖3:定位眼睛中心位置

色彩 vs. 灰度

通常來講,人臉檢測成功取決於搜索人臉高對比度區域,實際效果來看色彩和灰度的差距不會太遠。不過很多學者仍在致力於證明色彩比灰度更靠譜。經過在對示例圖片的驗證,發現Android APIs返回的結果非常接近,似乎APIs意圖忽略掉不同顏色通道的因素。請看圖4(BTW,獨自一人在陰暗環境下請謹慎觀看):

圖4:灰度人臉檢測看起來會稍微有點恐怖

總結

通過本次教程,我們介紹了簡單的Android人臉檢測APIs,並通過實例進行了演示。以上的軟體包均可在官網上下載,方便大家將其import到Eclipse中。最後提供一些有益的忠告:

  1. 很多應用對人臉檢測其實都有著潛在的重要需求,例如去紅眼、計算人頭數、自動對焦人臉、添加人臉特效等等。
  2. 這個世界上存在有非常多的人臉資料庫,有意者請點擊此處。
  3. 在實時的人臉檢測過程中,Android的表現的會有一點點差強人意。

文章及圖片來源:developer

相關焦點

  • 從人臉識別到文本分析,50+超實用的 API 推薦清單
    Animetrics Face Recognitionhttp://api.animetrics.com/該 API 可用於檢測圖片中的人臉,並將其與一組已知的人臉數據集進行匹配。 API 還可以添加或刪除可搜索圖庫中的對象,並添加或刪除某一分類中的人臉。
  • 資源 從人臉識別到機器翻譯:52個有用的機器學習和預測API
    連結:http://api.animetrics.com2.Betaface:一個面部識別和檢測的網頁服務。提供了包括多面部識別、面部遮蔽、123 個面部點(22 個基本,101 個高級)檢測、面部驗證、鑑定、大數據集中相似度搜索等功能。
  • 史上最全 OpenCV 活體檢測教程!
    在本文中,Adrian 將就「如何鑑別圖像/視頻中的真實人臉和偽造人臉」這一問題進行深入的分析,並介紹使用基於 OpenCV 的模型進行活體檢測的具體方法。雷鋒網 AI 科技評論編譯如下。雷鋒網(公眾號:雷鋒網)本教程將教授你如何使用 OpenCV 進行活性檢測。
  • 「玩轉華為雲」手把手教你利用ModelArts實現人臉年齡預測
    33.1mtcnn庫快速檢測人臉運行下面代碼,安裝mtcnn庫:!pip install mtcnn==0.0.8運行結果如下:使用mtcnn庫檢測人臉,這種使用方式比較簡單,但是無法對mtcnn庫自帶的人臉檢測模型進行調優。在此,可體驗一下這個庫的用法。
  • Python中的簡單人臉檢測(建議收藏)
    如何使用OpenCV庫檢測圖像中的人臉在本文中,將展示如何使用Python構建簡單的面部檢測器。建立一個可以檢測人臉的程序是一個很好的項目,可以開始使用計算機視覺。從名稱可以理解,我們將編寫一個程序來檢測圖像中的面部。當我說「程序」時,您可以將其理解為教機器做什麼。我喜歡使用教學而不是編程,因為這實際上是我們正在做的事情。
  • 人臉檢測之Retina FaceNet
    retinaface 人臉檢測算法甜點最近一直了解人臉檢測的算法,所以也嘗試學多人臉檢測框架。所以這裡將拿出來和大家分享一下Retinaface 與普通的目標檢測算法類似,在圖片上預先設定好一些先驗框,這些先驗框會分布在整個圖片上,網絡內部結構會對這些先驗框進行判斷看是否包含人臉,同時也會調整位置進行調整並且給每一個先驗框的一個置信度。
  • 【實驗】OpenCV/Python/dlib眨眼檢測
    2.用面部標誌和OpenCV檢測眨眼(代碼篇)請打開一個新文件並將其命名為detect_blinks.py。插入以下代碼:例外的是dlib庫,如果您的系統上沒有安裝dlib,請按照我的dlib安裝教程配置您的機器。
  • 百度開源業內首個口罩人臉檢測及分類模型
    2月13日,百度宣布免費開源業內首個口罩人臉檢測及分類模型。該模型可以有效檢測在密集人流區域中攜帶和未攜戴口罩的所有人臉,同時判斷該者是否佩戴口罩。目前已通過飛槳PaddleHub開源出來,廣大開發者用幾行代碼即可快速上手,免費調用。
  • Face Recognition:謹慎人臉識別背後的隱私洩露|OPINION
    人臉識別是一種生物特徵識別技術,包括人臉圖像採集、人臉定位、人臉識別預處理、身份識別和身份搜索等。As a new technology, face recognition rises with the construction of "smart city".
  • 首款登陸iOS的人臉識別應用FaceVault
    騰訊科技訊(琴島)北京時間4月28日消息,據國外媒體報導,最近iOS商店中推出了一款人臉識別應用FaceVault。人臉識別應用FaceVault此前蘋果並不支持這種面部識別應用,而FaceVault算是首款將人臉識別帶到 iOS 的應用,讓智慧型手機成為一個個人照片保險箱。
  • 難住庫克的 Face ID 到底與 Android 的人臉識別有什麼不同?
    幾年之後,3.15 晚會上對「人臉支付」安全性的懷疑和 iPhone X 發布會上對人臉識別的重點介紹都讓我們可以感覺到「人臉識別」正變得越來越嚴肅。這篇文章我將會帶大家來玩玩谷歌的人臉識別解鎖功能(以下簡稱谷歌人臉識別或 Facelock),再聊聊目前人臉識別的優缺點。
  • Linkface人臉識別技術攜手神州信息打造智慧樓宇解決方案
    北京2018年1月9日電 /美通社/ -- 近日,Linkface與神州信息達成合作,在辦公樓宇門禁、考勤及訪客管理等方面使用人臉識別技術,實現樓宇的智能監控和管理。通過神州信息IT團隊認真的評估,Linkface的方案具有先進的人臉識別算法並且可以很靈活地部署。 Linkface近來一直在「修煉內功」,技術上得到持續完善。在金融領域,Linkface的人臉識別技術已廣泛的服務於金融領域的多家知名企業。在不斷探索人工智慧在金融領域創新落地應用的同時,人臉識別核心算法也接受了安全等級要求很高的金融行業用戶的考驗和洗禮,得到了不斷的打磨和優化。
  • Android利用SurfaceView顯示Camera圖像爬坑記(四)
    最近幾天沒啥事研究了下,android自定義相機的實現,主要實現了通過surfaceview跟camera實現拍照,預覽,圖片的保存。能夠進行前後攝像頭的切換,自動和手動聚焦,設置閃光燈模式 ,人臉識別等。
  • Linkface亮相CVPR 2017
    Linkface首席研究員孫禕在14』、15』CVPR上發表了DeepID系列人臉識別算法,將實驗室裡的計算機視覺研究推向商業應用,尋找落地場景。目前,Linkface的願景是希望通過優質的技術服務幫助金融客戶提升自動化水平。」  在黃碩看來,人工智慧如今很火很熱,已經具備了引領技術革命的基礎,但尚處於應用早期階段,未來應用會是一片藍海,世界正迎來AI發展的黃金時代。
  • 使用C#的後端Web API:循序漸進教程
    本教程介紹如何使用C#(ASP.NET)構建自己的Web伺服器(Web API)。重要的是要注意,要託管您的伺服器,您將需要基於Windows的託管。先決條件我想我們可以開始了。注意routeTemplate: "api/{controller}/{id}",它解釋了API路由。現在,讓我們做一個基本的例子。在本教程中,我們將為用戶準備一個API,這是每個系統的一個非常通用的實體/對象。
  • 使用Keras和OpenCV創建人臉驗證系統
    什麼是人臉驗證?這可以認為是分類問題,使用匹配分數來驗證人的身份。如果兩個圖像屬於同一個人,則它們應具有較高的匹配度;如果兩個圖像屬於兩個不同的人,則匹配度應較低。您可能想到的第一件事是,為什麼不將捕獲的圖像與另一個像素逐個匹配呢?
  • 從歐巴馬假視頻到ZAO,換臉和人臉檢測技術發生了什麼?
    本文對人臉圖像操縱技術進行了全面的綜述,包括 DeepFake 方法以及檢測此類操縱技術的方法。具體而言,本文綜述了四種人臉操縱類型:整張人臉的合成、換臉(DeepFake)、人臉屬性操縱和人臉表情操縱。對於每種人臉操縱類型,本文詳細介紹了其相關的人臉操縱技術、現有的公共資料庫,以及用於評估人臉操縱檢測方法的重要基準,包括對這些評估結果的總結。
  • OpenCV4.1 Python 最新中文版官方教程手冊開源發布(附PDF下載)
    開源文檔發布在 Github:github.com/fendouai/OpenCVTutorials教程目錄特徵檢測與描述在本節中,您將學習有關特徵檢測和描述符的信息視頻分析在本部分中,您將學習與對象跟蹤等視頻配合使用的不同技術。
  • 圖靈測試「臉盲版」:比人臉更像人臉的超真實面具 | Cognitive...
  • 人臉識別哪家強?蘋果Face ID與微軟Hello比拼
    在9月的新品發布會上,蘋果公司重點介紹了其最新產品iPhone X,尤其是使用了最新的生物識別技術——人臉識別。不過,尷尬的是,現場第一次嘗試人臉識別時,居然沒有成功,這也讓許多人擔心蘋果人臉識別的效果。除了個人隱私,一些人擔心FaceID(人臉識別)不可靠或者不夠快。實際上,這些擔心太多餘。