超簡單整合 HMS ML Kit 實現最大臉微笑抓拍

華為開發者論壇發表於2022-02-25

前言

如果大家對 HMS ML Kit 人臉檢測功能有所瞭解,相信已經動手呼叫我們提供的介面編寫自己的 APP 啦。目前就有小夥伴在呼叫介面的過程中反饋,不太清楚 HMS ML Kit 文件中的 MLMaxSizeFaceTransactor 這個介面的使用方法。為了讓大家更加深刻的瞭解我們的介面,方便在場景中使用,在這篇文章中小編準備拋磚引玉,大家可以開啟思路,多多嘗試。如果有小夥伴想要深入的瞭解更加全面具體的功能,請大家移步https://developer.huawei.com/consumer/cn/hms/huawei-mlkit

場景

相信大家都有在五一、十一出去遊玩的經歷,是不是都是這樣的 people mountain people sea.

超簡單整合 HMS ML Kit 實現最大臉微笑抓拍

好不容易找個人少的地方,結果拍出來的照片是這樣的

超簡單整合 HMS ML Kit 實現最大臉微笑抓拍

這樣的

超簡單整合 HMS ML Kit 實現最大臉微笑抓拍

還有這樣的

超簡單整合 HMS ML Kit 實現最大臉微笑抓拍

不看不知道,原來我的面部表情這麼豐富。。是不是很心累?每次想要發個出去浪的朋友圈,都要在白天拍的成百上千張類似款的照片裡,花上一小時才能找到一張能看的照片。。。

為了解決類似問題,HMS ML Kit 提供了追蹤識別畫面中最大臉的介面,能夠識別影像中的最大臉,方便對跟蹤影像中的”重點目標“做相關操作和處理。本文中就簡單的呼叫 MLMaxSizeFaceTransactor 這個介面,實現最大臉微笑抓拍的功能。

開發前準備

android studio 安裝

很簡單,下載安裝即可。具體下載連結:

Android studio 官網下載連結:https://developer.android.com/studio 

Android studio安裝流程參考連結:https://www.cnblogs.com/xiadewang/p/7820377.html 

在專案級 gradle 裡新增華為 maven 倉

開啟 AndroidStudio 專案級 build.gradle 檔案

超簡單整合 HMS ML Kit 實現最大臉微笑抓拍

增量新增如下 maven 地址:

buildscript {
     {        
        maven {url 'http://developer.huawei.com/repo/'}
    }    
}
allprojects {
    repositories {       
        maven { url 'http://developer.huawei.com/repo/'}
    }
}

在應用級的 build.gradle 裡面加上 SDK 依賴

超簡單整合 HMS ML Kit 實現最大臉微笑抓拍

dependencies {
    implementation 'com.huawei.hms:ml-computer-vision-face-recognition-model:1.0.3.300'
    implementation 'com.huawei.hms:ml-computer-vision-face:1.0.3.300'
}

在 AndroidManifest.xml 檔案裡面增量新增模型自動下載

要使應用程式能夠在使用者從華為應用市場安裝您的應用程式後,自動將最新的機器學習模型更新到使用者裝置,請將以下語句新增到該應用程式的 AndroidManifest.xml 檔案中:

<manifest> 
    ...    
    <meta-data                     
        android:name="com.huawei.hms.ml.DEPENDENCY"          
        android:value= " face"/> 
...    
</manifest>

在 AndroidManifest.xml 檔案裡面申請相機、訪問網路和儲存許可權

<!--相機許可權--> 
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.CAMERA" />
<!--寫許可權--> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

程式碼開發關鍵步驟

動態許可權申請

@Override 
public void onCreate(Bundle savedInstanceState) { 
	……
    if (!allPermissionsGranted()) {
        getRuntimePermissions();
    }    
}

建立人臉識別檢測器

可以通過人臉識別檢測配置器“MLFaceAnalyzerSetting”建立人臉識別檢測器。

MLFaceAnalyzerSetting setting =
                new MLFaceAnalyzerSetting.Factory()
                        .setFeatureType(MLFaceAnalyzerSetting.TYPE_FEATURES)
                        .setKeyPointType(MLFaceAnalyzerSetting.TYPE_UNSUPPORT_KEYPOINTS)
                        .setMinFaceProportion(0.1f)
                        .setTracingAllowed(true)
                        .create();

通過 MLMaxSizeFaceTransactor.Creator 建立“MLMaxSizeFaceTransactor”物件用於處理檢測到的最大臉,其中 objectCreateCallback() 方法是在檢測到物件的時候呼叫的,objectUpdateCallback() 方法是在物件更新了的時候呼叫的,在方法裡通過 Overlay 在識別到的最大人臉上標記了一個方塊,並通過檢測結果獲取 MLFaceEmotion 來識別微笑表情觸發拍照。

MLMaxSizeFaceTransactor transactor = new MLMaxSizeFaceTransactor.Creator(analyzer, new MLResultTrailer<MLFace>() {
    @Override
    public void objectCreateCallback(int itemId, MLFace obj) {
        LiveFaceAnalyseActivity.this.overlay.clear();
        if (obj == null) {
            return;
        }
        LocalFaceGraphic faceGraphic =
                new LocalFaceGraphic(LiveFaceAnalyseActivity.this.overlay, obj, LiveFaceAnalyseActivity.this);
        LiveFaceAnalyseActivity.this.overlay.addGraphic(faceGraphic);
        MLFaceEmotion emotion = obj.getEmotions();
        if (emotion.getSmilingProbability() > smilingPossibility) {
            safeToTakePicture = false;
            mHandler.sendEmptyMessage(TAKE_PHOTO);
        }
    }

    @Override
    public void objectUpdateCallback(MLAnalyzer.Result<MLFace> var1, MLFace obj) {
        LiveFaceAnalyseActivity.this.overlay.clear();
        if (obj == null) {
            return;
         }
         LocalFaceGraphic faceGraphic =
                 new LocalFaceGraphic(LiveFaceAnalyseActivity.this.overlay, obj, LiveFaceAnalyseActivity.this);
         LiveFaceAnalyseActivity.this.overlay.addGraphic(faceGraphic);
         MLFaceEmotion emotion = obj.getEmotions();
         if (emotion.getSmilingProbability() > smilingPossibility && safeToTakePicture) {
             safeToTakePicture = false;
             mHandler.sendEmptyMessage(TAKE_PHOTO);
         }
    }

    @Override
    public void lostCallback(MLAnalyzer.Result<MLFace> result) {
        LiveFaceAnalyseActivity.this.overlay.clear();
    }

    @Override
    public void completeCallback() {
        LiveFaceAnalyseActivity.this.overlay.clear();

    }
}).create();
this.analyzer.setTransactor(transactor);

通過 LensEngine.Creator 建立 LensEngine 例項進行視訊流的人臉檢測檢測

this.mLensEngine = new LensEngine.Creator(context, this.analyzer).setLensType(this.lensType)
                .applyDisplayDimension(640, 480)
                .applyFps(25.0f)
                .enableAutomaticFocus(true)
                .create();

啟動相機預覽進行人臉檢測

this.mPreview.start(this.mLensEngine, this.overlay);

Demo 效果

demo 中顯示當檢測到畫面中最大臉微笑時,即啟動自動抓拍。

超簡單整合 HMS ML Kit 實現最大臉微笑抓拍

往期連結:

第一期:用華為 HMS MLKit SDK 三十分鐘在安卓上開發一個微笑抓拍神器

https://developer.huawei.com/consumer/cn/forum/topicview?tid=0201198419687680377&fid=18

第二期:安卓開發實戰,用華為 HMS MLKit 影像分割 SDK 開發一個證件照 DIY 小程式

https://developer.huawei.com/consumer/cn/forum/topicview?tid=0201203408959360433&fid=18

第三期:安卓開發實戰,用 HMS MLKit 華為機器學習服務開發一個拍照翻譯小程式

https://developer.huawei.com/consumer/cn/forum/topicview?tid=0201209905778120045&fid=18

第四期:超簡單整合華為 HMS MLKit 機器學習服務 銀行卡識別 SDK,一鍵實現銀行卡繫結

https://developer.huawei.com/consumer/cn/forum/topicview?tid=0201217390745110144&fid=18

第五期:超簡單整合華為 HMS Core MLKit 通用卡證識別SDK,一鍵實現各種卡繫結

https://developer.huawei.com/consumer/cn/forum/topicview?tid=0201226181206630022&fid=18

第六期:超簡單整合 HMS ML Kit 二代身份證識別,一鍵實名認證

https://developer.huawei.com/consumer/cn/forum/topicview?tid=0201226149614940020&fid=18

第七期:一文搞懂華為 HMS ML Kit 文字識別、銀行卡識別、通用卡證識別、身份證識別

https://developer.huawei.com/consumer/cn/forum/topicview?tid=0201242744680220246&fid=18

第八期:Zxing 與華為 HMS Scan Kit 對比分析

https://developer.huawei.com/consumer/cn/forum/topicview?tid=0201246151427920285&fid=18

下期預告:

基於華為機器學習服務,後面還會有一系列的實戰經驗分享,大家可以持續關注~

相關文章