如何使用HUAWEI ML Kit在半小时内设置自动微笑捕捉

ML Kit机器学习服务是Huawei HMS Core 4.0演示中最受关注的服务之一。



ML Kit服务有什么用?在开发过程中可以解决什么问题?



今天,我向您介绍ML Kit最重要的功能之一-人脸识别。



人脸识别概述





此功能可以识别面部表情,面部表情(喜悦,厌恶,惊奇,悲伤和愤怒),标志(性别,年龄,衣服和配件),并确定眼睛是睁着还是闭着。它还可以确定鼻子,眼睛,嘴唇和眉毛的坐标,甚至可以同时识别面部组。



最重要的是,人脸识别功能是完全免费的,并且可以在任何Android手机上使用。



为一群人开发自动笑脸拍摄功能



我将引导您逐步了解如何使用上述功能创建自动微笑捕捉功能的演示。您可以在github.com/HMS-Core/hms-ml-demo下载演示源代码



1.准备



集成任何HMS Core开发工具时,准备过程几乎相同。您只需要添加Maven存储库并导入SDK。



1.1将华为提供的Maven仓库添加到项目级别的build.gradle文件中



添加Maven存储库地址:



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


1.2在应用程序级别将SDK依赖项添加到build.gradle文件



导入人脸识别SDK和核心SDK:



dependencies{ 
  // import the basic SDK 
  implementation 'com.huawei.hms:ml-computer-vision:1.0.2.300' 
  // Import the face detection SDK
  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文件中提交访问相机和内存的请求



<!--Camera permission--><uses-permission android:name="android.permission.CAMERA" /><!--Storage permission--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


2.代码开发



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创建一个LensEngine实例以捕获动态相机流并将流传递到分析仪



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提出对访问动态流的权利的要求,并附加用于创建分析器和LensEngine的代码



@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;
    }}


进一步行动



很简单,不是吗?即使您不熟悉开发过程,仍然可以在半小时内创建有用的新功能!现在,让我们看看该功能可以做什么。



在微笑的同时给一个人拍照:







面带微笑时拍张几人的照片:







您还能如何使用面部识别?这里有一些选择:

1.美化您的面部特征。

2.通过夸大或更改脸部轮廓和特征来创建有趣的效果。

3.创建年龄确定功能,以防止儿童访问不适当的内容。

4.通过确定用户注视屏幕的时间来设计护眼功能。

5.使用随机命令(例如,摇头,眨眼,张开嘴)确定一个人是否还活在镜头前。

6.根据用户的年龄和性别向他们推荐产品。



有关更多详细信息,请访问我们的网站:developer.huawei.com/consumer/en/doc/development/HMS-Guides/ml-introduction-4



我们将分享使用HUAWEI ML Kit的其他方式。敬请关注!



All Articles