Android | 教你如何用三十分鐘在安卓上開發一個微笑抓拍神器

前言

前段時間Richard Yu在發佈會上給你們介紹了華爲HMS Core4.0,回顧發佈會信息請戳:
華爲面向全球發佈HMS Core 4.0意味着什麼?java

其中有一個重點被介紹的服務,機器學習服務(Machine Learning Kit 簡稱 MLKit)。android

那機器學習服務能幹什麼呢?能幫助開發者解決應用開發過程當中的哪些問題?git

今天就拋磚引玉一下,以人臉檢測爲例,給你們出一個實戰小樣例,讓你們感覺下機器學習服務所提供的強大功能以及給開發者提供的便捷性。github


機器學習服務人臉檢測所提供的能力

先給你們看一下華爲機器學習服務人臉檢測能力的展現:
算法

從這個動圖裏面能夠看到,人臉識別能夠支持識別人臉的朝向,支持檢測人臉的表情(高興、厭惡、驚訝、傷心、憤怒、生氣),支持檢測人臉屬性(性別、年齡、穿戴),支持檢測是否睜眼閉眼,支持人臉以及鼻子、眼睛、嘴脣、眉毛等特徵的座標檢測,另外還支持多人臉同時檢測,是否是很強大!app

核心提示:此功能免費,安卓全機型覆蓋!機器學習


機器學習服務人臉檢測所提供的能力

今天就用機器學習服務的多人臉識別+表情檢測能力寫一個微笑抓拍的小demo,作一次實戰演練。demo源碼github下載請戳這裏maven

一、開發準備

華爲HMS的kit開發前準備工做都差很少,無非就是添加maven依賴,引入SDKide

1.1 在項目級gradle裏添加華爲maven倉

增量添加以下maven地址:學習

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

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

把人臉識別的SDK和基礎SDK引入

dependencies{ 
  // 引入基礎SDK 
  implementation 'com.huawei.hms:ml-computer-vision:1.0.2.300' 
  // 引入人臉檢測能力包 
  implementation 'com.huawei.hms:ml-computer-vision-face-recognition-model:1.0.2.300'   
 }

1.3 在AndroidManifest.xml文件裏面增量添加模型自動下載

這個主要是用來模型更新的,後面算法有了優化,能夠自動下載到手機裏面更新

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

1.4 在AndroidManifest.xml文件裏面申請相機和存儲權限

<!--相機權限--><uses-permission android:name="android.permission.CAMERA" /><!--使用存儲權限--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

二、代碼開發

2.1 建立人臉分析器,檢測到微笑後進行拍照

檢測後拍照:

  1. 進行分析器參數配置
  2. 把分析器參數配置傳給分析器
  3. 在analyzer.setTransacto內經過重寫transactResult處理人臉識別後的內容,人臉識別後會返回一個微笑的置信度(簡單能夠理解爲是微笑的機率),只要設置大於必定置信度進行拍照就能夠了。
private MLFaceAnalyzer analyzer;private void createFaceAnalyzer() {
    MLFaceAnalyzerSetting setting =
            new MLFaceAnalyzerSetting.Factory()
                    .setFeatureType(MLFaceAnalyzerSetting.TYPE_FEATURES)
                    .setKeyPointType(MLFaceAnalyzerSetting.TYPE_UNSUPPORT_KEYPOINTS)
                    .setMinFaceProportion(0.1f)
                    .setTracingAllowed(true)
                    .create();                 
    this.analyzer = MLAnalyzerFactory.getInstance().getFaceAnalyzer(setting);
    this.analyzer.setTransactor(new MLAnalyzer.MLTransactor<MLFace>() {
        @Override        public void destroy() {
        }

        @Override        public void transactResult(MLAnalyzer.Result<MLFace> result) {
            SparseArray<MLFace> faceSparseArray = result.getAnalyseList();
            int flag = 0;
            for (int i = 0; i < faceSparseArray.size(); i++) {
                MLFaceEmotion emotion = faceSparseArray.valueAt(i).getEmotions();
                if (emotion.getSmilingProbability() > smilingPossibility) {
                    flag++;
                }
            }
            if (flag > faceSparseArray.size() * smilingRate && safeToTakePicture) {
                safeToTakePicture = false;
                mHandler.sendEmptyMessage(TAKE_PHOTO);
            }
        }
    });}

拍照存儲部分:

private void takePhoto() {
    this.mLensEngine.photograph(null,
            new LensEngine.PhotographListener() {
                @Override                public void takenPhotograph(byte[] bytes) {
                    mHandler.sendEmptyMessage(STOP_PREVIEW);
                    Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
                    saveBitmapToDisk(bitmap);
                }
            });}

2.2 建立視覺引擎,捕捉相機動態視頻流後傳給分析器

private void createLensEngine() {
    Context context = this.getApplicationContext();
    // Create LensEngine
    this.mLensEngine = new LensEngine.Creator(context, this.analyzer).setLensType(this.lensType)
            .applyDisplayDimension(640, 480)
            .applyFps(25.0f)
            .enableAutomaticFocus(true)
            .create();}

2.3 動態權限申請,掛接分析器和視覺引擎建立代碼

@Overridepublic void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.activity_live_face_analyse);
    if (savedInstanceState != null) {
        this.lensType = savedInstanceState.getInt("lensType");
    }
    this.mPreview = this.findViewById(R.id.preview);
    this.createFaceAnalyzer();
    this.findViewById(R.id.facingSwitch).setOnClickListener(this);
    // Checking Camera Permissions
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
        this.createLensEngine();
    } else {
        this.requestCameraPermission();
    }}
    private void requestCameraPermission() {
    final String[] permissions = new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE};

    if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
        ActivityCompat.requestPermissions(this, permissions, LiveFaceAnalyseActivity.CAMERA_PERMISSION_CODE);
        return;
    }}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                       @NonNull int[] grantResults) {
    if (requestCode != LiveFaceAnalyseActivity.CAMERA_PERMISSION_CODE) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        return;
    }
    if (grantResults.length != 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        this.createLensEngine();
        return;
    }}

結束語

怎麼樣,開發過程是否是特別簡單,30分鐘就能夠開發一個新特性出來!讓咱們一塊兒體驗下這個多人臉微笑抓包的效果。

單人笑臉抓拍:

多人笑臉抓拍:

基於人臉檢測能力,還能夠作哪些功能出來,請開放你的腦洞!這裏不妨再給一些提示,好比:

  1. 經過識別耳朵、眼睛、鼻子、嘴巴、眉毛等臉部特徵的位置,添加一些有趣的裝飾特效。
  2. 經過識別面部的輪廓,作一些誇張的變形、拉伸,生成一些有趣好玩的人像圖片,或者針對輪廓區域開發美顏功能。
  3. 經過年齡識別,對兒童沉迷於電子類產品的痛點,開發一些家長管控類功能。
  4. 經過檢測眼睛盯着屏幕的時長,開發護眼提示的特性。
  5. 經過隨機指令(搖頭、眨眼、張嘴等)實現用戶動做配合式活體檢測功能。
  6. 經過綜合運用用戶的年齡、性別等的檢測結果,給用戶作相關商品推薦;

更詳細的開發指南參考華爲開發者聯盟官網
華爲開發者聯盟機器學習服務開發指南


內容來源:https://developer.huawei.com/consumer/cn/forum/topicview?tid=0201198419687680377&fid=18 原做者:AI_talking

相關文章
相關標籤/搜索