搭載Google MLKit,Android應(yīng)用快速實現(xiàn)人臉檢測功能
ML Kit
ML Kit是Google提供的機(jī)器學(xué)習(xí)SDK,包含了一系列預(yù)訓(xùn)練模型,可以在Android和iOS應(yīng)用中快速添加機(jī)器學(xué)習(xí)功能。ML Kit工具包將谷歌在機(jī)器學(xué)習(xí)方面的專業(yè)知識帶給了普通的移動應(yīng)用開發(fā)者,可以借助ML Kit在幾行代碼中實現(xiàn)所需的功能。
ML Kit的功能非常全面且易于使用,提供了基于API的現(xiàn)有解決方案,如文字識別、條碼識別、圖像標(biāo)簽、人臉檢測、對象檢測等。同時,還提供了便利的API,允許在移動應(yīng)用中使用自定義的TensorFlow Lite模型。
ML Kit針對移動設(shè)備進(jìn)行了優(yōu)化,使得機(jī)器學(xué)習(xí)套件的處理過程可以在設(shè)備上進(jìn)行,保證了快速性,并解鎖了處理相機(jī)輸入等實時用例的能力。即使在離線狀態(tài)下,也可以使用這項功能來處理需要保留在設(shè)備上的圖片和文本。
MLKit人臉檢測
人臉檢測API可以檢測圖片中的人臉、識別主要的面部特征,并獲取檢測到的人臉的輪廓。只能用于檢測人臉,不識別人臉。
借助人臉檢測,可以用于(如美化自拍照和肖像,或根據(jù)用戶的照片生成頭像)等場景。同時支持實時執(zhí)行人臉檢測,可以用在視頻聊天或響應(yīng)玩家表情的游戲等應(yīng)用場景。
mlkit:face-detection主要功能
- 「識別和定位面部特征」 獲取檢測到的每個人臉的眼睛、耳朵、臉頰、鼻子和嘴巴的坐標(biāo)。
- 「獲取面部特征的輪廓」 獲取檢測到的面部的輪廓及其眼睛、眉毛、嘴唇和鼻子。
- 「識別面部表情」 確定人物是在微笑還是閉著眼睛。
- 「跨視頻幀跟蹤人臉」 獲取每個檢測到的唯一身份人臉的標(biāo)識符。標(biāo)識符在不同調(diào)用中保持一致,因此您可以對視頻流中的特定人員執(zhí)行圖片處理。
- 「實時處理視頻幀」:人臉檢測在設(shè)備上執(zhí)行,其速度足以在視頻處理等實時應(yīng)用中使用。
- 添加依賴
dependencies {
// ...
// Use this dependency to bundle the model with your app
implementation 'com.google.mlkit:face-detection:16.1.6'
//在 Google Play 服務(wù)中使用該模型
implementation 'com.google.android.gms:play-services-mlkit-face-detection:17.1.0'
}
- 配置人臉檢測器 使用的圖片尺寸至少為 480x360 像素。為了機(jī)器學(xué)習(xí)套件準(zhǔn)確檢測人臉,輸入圖片必須包含由足夠像素數(shù)據(jù)表示的人臉。在圖片中檢測的每張人臉應(yīng)至少為 100x100 像素。如果想檢測人臉的輪廓,機(jī)器學(xué)習(xí)套件需要更高的分辨率輸入:每張人臉應(yīng)至少為 200x200 像素。
圖片
// 1、配置人臉檢測器
FaceDetectorOptions faceDetectorOptions = new FaceDetectorOptions.Builder().setPerformanceMode(PERFORMANCE_MODE_FAST).build();
//2、獲取人臉檢測器
FaceDetector detector = FaceDetection.getClient(faceDetectorOptions);
- 加載圖片資源 檢測圖片中的人臉,創(chuàng)建InputImage對象:Bitmap、media.Image、ByteBuffer、字節(jié)數(shù)組或文件。將InputImage對象傳遞給FaceDetector的process方法。
// 3、從資源中加載圖片
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test3);
imgView.setImageBitmap(bitmap);
InputImage image = InputImage.fromBitmap(bitmap, 0);
- 調(diào)用人臉檢測器
// 4、處理圖片
detector.process(image).addOnSuccessListener(new OnSuccessListener<List<Face>>() {
@Override
public void onSuccess(List<Face> faces) {
Log.e("TAG", "onSuccess: " + 1);
imgView.setImageBitmap(drawWithRectangle(faces));
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(this, "識別失敗", Toast.LENGTH_SHORT).show();
}
});
- 繪制矩形邊框
private Bitmap drawWithRectangle(List<Face> faces) {
//復(fù)制一個新的Bitmap
Bitmap copiedBitmap = bitmap.copy(bitmap.getConfig(), true);;
for (Face face : faces) {
//獲取邊界狀態(tài)
Rect bounds = face.getBoundingBox();
// 初始化Paint
Paint paint = new Paint();
// 設(shè)置矩形顏色
paint.setColor(Color.BLUE);
// 設(shè)置繪制樣式為輪廓繪制
paint.setStyle(Paint.Style.STROKE);
// 設(shè)置為你需要的寬度
paint.setStrokeWidth(10);
Canvas canvas = new Canvas(copiedBitmap);
canvas.drawRect(bounds, paint);
}
return copiedBitmap;
}
圖片
完整示例代碼:https://github.com/Reathin/Sample-Android (module_mlkit)