一、需求

        Android端实现离线人脸识别功能,即对比两张人脸是否是同一个人。

二、解决方案

        选用虹软人脸识别SDK来实现人脸特征数据比对。

三、步骤

        1. 打开虹软开发者中心 开发者中心

        2. 新建应用

        3. 获取APP_ID,SDK_KEY,ACTIVE_KEY

        4. 编写代码

        4.1 填写SDK激活需要的APP_ID,SDK_KEY,ACTIVE_KEY

    public static final String APP_ID = "官网获取的APP_ID";
    public static final String SDK_KEY = "官网获取的SDK_KEY ";
    public static final String ACTIVE_KEY = "官网获取的ACTIVE_KEY,如果是试用,就填写试用码";

        4.2 布局文件的编写,这里对比两张人脸来判断是否是同一个人。用两个ImageView显示人脸照片吧。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:orientation="horizontal"
        android:layout_height="wrap_content">

        <ImageView
            android:id="@+id/iv_register_image"
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:layout_weight="1"
            android:maxHeight="200dp"
            android:minHeight="100dp" />

        <ImageView
            android:id="@+id/iv_recognize_image"
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:layout_weight="1"
            android:maxHeight="200dp"
            android:minHeight="100dp" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:orientation="horizontal">

        <Button
            android:layout_width="150dp"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:layout_marginLeft="30dp"
            android:layout_marginRight="10dp"
            android:background="@drawable/angle_button"
            android:onClick="addRegisterImage"
            android:text="添加注册照"
            android:textColor="@android:color/white"
            android:textSize="20sp" />

        <Button
            android:layout_width="150dp"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="30dp"
            android:background="@drawable/angle_button"
            android:onClick="addRecognizeImage"
            android:text="添加识别照"
            android:textColor="@android:color/white"
            android:textSize="20sp" />

    </LinearLayout>

    <TextView
        android:id="@+id/tv_similar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:text="相似度:--"
        android:textColor="@android:color/black"
        android:textSize="26sp" />


    <Button
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_marginTop="200dp"
        android:layout_marginLeft="80dp"
        android:layout_marginRight="80dp"
        android:background="@drawable/angle_button"
        android:onClick="faceCompare"
        android:text="人脸比对"
        android:textColor="@android:color/white"
        android:textSize="20sp" />


</LinearLayout>

        4.3 代码编写

        4.3.1 激活人脸识别引擎,第一次使用需要联网激活SDK,激活成功后无需联网。

        if (!isActivated(this)) {
            runOnSubThread(() -> FaceEngine.activeOnline(this,
                    Constants.ACTIVE_KEY,
                    Constants.APP_ID,
                    Constants.SDK_KEY));
        }

        4.3.2 初始化人脸识别SDK

    // 初始化人脸识别SDK
    private void initEngine() {
        faceEngine = new FaceEngine();
        faceEngineCode = faceEngine.init(this, DetectMode.ASF_DETECT_MODE_IMAGE, DetectFaceOrientPriority.ASF_OP_ALL_OUT,
                6, INIT_MASK);
        if (faceEngineCode != ErrorInfo.MOK) {
            showToast(getString(R.string.init_failed, faceEngineCode, ErrorCodeUtil.arcFaceErrorCodeToFieldName(faceEngineCode)));
        }
    }

        4.3.3 人脸检测

    // 人脸检测
    private List<FaceInfo> detectFace(byte[] bgr24, int width, int height)
    {
        // 人脸信息集合(人脸框、人脸角度)
        List<FaceInfo> faceInfoList = new ArrayList<>();
        // 人脸检测
        int detectCode = faceEngine.detectFaces(bgr24, width, height, FaceEngine.CP_PAF_BGR24, faceInfoList);
        if (detectCode != 0 || faceInfoList.isEmpty()) {
            showToast("face detection finished, code is " + detectCode + ", face num is " + faceInfoList.size());
            return null;
        }

        return faceInfoList;
    }

        4.3.4 人脸特征提取

    // 提取人脸特征数据
    private FaceFeature extractFaceFeatureData(byte[] bgr24, int width, int height, List<FaceInfo> faceInfoList)
    {
        // 口罩信息结果
        List<MaskInfo> maskInfoList = new ArrayList<>();

        faceEngine.getMask(maskInfoList);

        int isMask = MaskInfo.UNKNOWN;
        if (!maskInfoList.isEmpty()) {
            isMask = maskInfoList.get(0).getMask();
        }

        // 人脸特征
        FaceFeature faceFeature = new FaceFeature();

        faceEngine.extractFaceFeature(bgr24, width, height,
                FaceEngine.CP_PAF_BGR24,
                faceInfoList.get(0),
                ExtractType.RECOGNIZE, isMask, faceFeature);

        return faceFeature;
    }

        4.3.5 人脸特征比对

    // 比较两个人脸的相似度
    private float faceCompare(FaceFeature previewFaceFeature, FaceFeature idCardFaceFeature)
    {
        FaceSimilar faceSimilar = new FaceSimilar();
        int compareCode = faceEngine.compareFaceFeature(previewFaceFeature, idCardFaceFeature, CompareModel.ID_CARD, faceSimilar);
        if (compareCode == ErrorInfo.MOK){
            // 两个人脸的相似度
            float score = faceSimilar.getScore();
            return score;
        } else {
            Log.i(TAG, "compare failed, code is : " + compareCode);
            return 0;
        }
    }

        4.3.6 实际效果

 四、源码

需要完整源码的伙伴可以到这里下载

Android基于虹软SDK实现离线人脸识别https://www.lilihewo.com/article/235.html

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐