讯飞AIUI智能机器人6-----人脸识别技术

简介: 讯飞AIUI智能机器人6-----人脸识别技术

一、实验目的

想要给你的项目加上人脸识别的亮点吗,那就来看看这篇文章吧。本次实验通过使用讯飞开放平台上MSC人脸识别能力,介绍了人脸验证与人脸检索的使用,结合服务机器人的相机能力,开发一个简单的人脸识别应用程序,了解人脸识别技术如何在机器人上使用,同时对人脸识别技术的使用途径和步骤进行详细讲解,具体包括下面三个部分:

💖1、了解讯飞开放平台MSC的人脸识别技术;

💖2、 掌握机器人开发套件相机的使用;

💖3、 掌握人脸识别功能在机器人上的应用开发。


二、实验内容

人脸识别作为一项热门的计算机技术研究领域,是利用分析比较的计算机技术识别人脸,其中包括人脸追踪侦测,自动调整影像放大,夜间红外侦测,自动调整曝光强度等技术。人脸识别技术属于生物特征识别技术,是对生物体(一般特指人)本身的生物特征来区分生物体个体。本次实验就是通过一个智能人脸识别应用的开发,来向大家展示人脸识别技术在智能AI应用中的具体实现方法和呈现的效果体验。本次实验通过开发一个实际的简单智能人脸识别应用,通过机器人完成人脸的注册与识别,并对具体的技术与流程做详细的讲解。


三、实验步骤

步骤 1:开放平台账号申请及能力注册

由于本次实验开发的人脸识别功能应用使用的是科大讯飞开放平台提供的 人脸识别能力,我们需要先到讯飞的开放平台申请账号,并完成平台上相关能力 注册,具体流程如下: 1)首先,我们要在讯飞开放平台进行账号注册,地址:https://www.xfyun.cn/image.png

完成注册后,登陆开放平台,进入控制台。点击“创建应用”,完成应用相关信息的输入后,点击“提交”按钮image.png

此时,进入“我的应用”界面,可以看到添加的应用信息,包括 appid 等,点 击“其他”,在弹出的界面中选择“人脸验证与检索”的管理服务,可以选择对 应的服务完成 SDK 的下载

image.png

在其他中找到人脸识别,下载对应的SDK。

步骤 2:项目工程搭建及能力包导入image.png

步骤3:项目MSC能力导入

完成了工程项目的搭建后,我们需要在项目工程中集成开放平台的MSC能力,具体步骤如下:

首先,将MSC能力包文件mscability-release.aar文件拷贝到项目工程的/app/libs目录下;

然后,解压从讯飞开放平台下载的人脸识别SDK能力包,在libs目录下找到Msc.jar文件,拷贝到项目工程目录/app/libs目录下;接着,将SDK能力包libs目录下的所有armeabi目录拷贝到工程目录/app/src/main/jniLibs下(若没有这个目录,自己创建)。整体目录结构如下:

image.png

完成SDK的集成后,我们需要再编译配置文件中进行能力包的导入配置,打开app目录下的build.gradle文件,添加下图中红框位置中代码

image.pngimage.png

完整的build.gradle文件如下所示:

apply plugin: 'com.android.application'
android {
    compileSdkVersion 29
    buildToolsVersion "29.0.3"
    defaultConfig {
        applicationId "com.starway.starrobot"
        minSdkVersion 18
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        ndk {
            //只需要兼容armeabi-v7a
            abiFilters "armeabi-v7a"
        }
    }
    signingConfigs {
        debug {
            storeFile file("platform.jks")
            storePassword 'android'
            keyAlias 'androiddebugkey'
            keyPassword 'android'
        }
        release {
            storeFile file("platform.jks")
            storePassword 'android'
            keyAlias 'androiddebugkey'
            keyPassword 'android'
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

步骤4:功能代码开发

首先,在我们的应用工程新建我们自定义的Application(MyApp.java),在MyApp.java文件的onCreate中进行开放平台MSC能力的注册,只有完成了能力的注册后,才能使用人脸识别的能力接口。

private void init() {
    StarMscAbility.getInstance().initWithAppid(getApplicationContext(), APPID);
    //日志初始化
    StarLogAbility.getInstance().initAbility(this);
    //基础能力初始化
    StarCommonAbility.getInstance().initAbility(this,
            RobotType.TYPE_TEACHING, new StarCommonAbility.onResultCallback() {
                @Override
                public void onResult(boolean isSuccess, String hardCode) {
                    if (isSuccess) {
                        //硬件和业务状态初始化
                        switch (hardCode) {
                            case PartCode.HARDWARE_PARTCODE.CODE_EMOJI:
                                //设置初始表情
                                EmojiHelper.doEmojiBase();
                                break;
                            case PartCode.HARDWARE_PARTCODE.CODE_GPIO:
                                //默认加载的时候,将拾音方向设置为默认正前方的0度。
                                GPIOHelper.getInstance().setMainMic(0);
                                break;
                            case PartCode.HARDWARE_PARTCODE.CODE_CENTER_LIGHT:
                                //关闭腹部灯带
                                CenterLightHelper.takeCenterLightOff();
                                break;
                            default:
                                break;
                        }
                    }
                }
            });
}

界面控件初始化(部分)

private void initView() {
        //组ID显示text
        mTxtGroupid = findViewById(R.id.groupid);
        //人脸标识显示text
        mEdtAuthid = findViewById(R.id.online_authid);
        //界面按钮点击处理
        findViewById(R.id.group_create).setOnClickListener(this);
        findViewById(R.id.group_delete).setOnClickListener(this);
        findViewById(R.id.online_register).setOnClickListener(this);
        findViewById(R.id.take_pic).setOnClickListener(this);
        findViewById(R.id.recognition_face).setOnClickListener(this);
      //提前创建一个组进行组的设置
        mTxtGroupid.setText("******");
    }
    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.group_create: //创建组
                createGroup();
                break;
            case R.id.group_delete: //删除组
                deleteGroup(mGroupId);
                break;
            case R.id.online_register: //在线注册人脸信息
                registerFace();
                break;
            case R.id.take_pic: //拍摄照片
                Intent mIntent = new Intent(MainActivity.this, CameraActivity.class);
                startActivityForResult(mIntent, 1000);
                break;
            case R.id.recognition_face: //识别照片中的人脸信息
                recognitionFace();
                break;
        }
    }
    /**
     * 创建组
     */
    private void createGroup() {
        // 创建人脸组
        faceGroupHelper.createGroup(new StarMscAbility.onResultCallback() {
            @Override
            public void onResult(boolean flag, String result) {
                Log.d("MainActivity", "result = " + flag + " groupId = " + result);
                if (flag) {
                    mGroupId = result;
                    mTxtGroupid.setText(result);
                    showToast("创建组成功:" + result + "-请牢记你的GroupId!!!");
                } else {
                    showToast("创建组失败:" + result);
                }
            }
        });
    }
    /**
     * 删除组
     */
    private void deleteGroup(String groupid) {
        if (mGroupId.equals("")) {
            showToast("Please Create GroupId Frist");
            return;
        }
        faceGroupHelper.deleteGroup(groupid, new StarMscAbility.onResultCallback() {
            @Override
            public void onResult(boolean flag, String result) {
                if (flag) {
                    mTxtGroupid.setText("");
                    showToast("删除组成功");
                } else {
                    showToast("删除组失败" + result);
                }
            }
        });
    }
    /**
     * 人脸注册
     */
    private void registerFace() {
        if (mGroupId.equals("")) {
            showToast("Please Create GroupId Frist");
            return;
        }
        if (mImage == null) {
            showToast("请拍照");
        }
        if (null == mEdtAuthid.getText() || mEdtAuthid.getText().toString().equals("")) {
            showToast("请输入userId");
        }
        userId = mEdtAuthid.getText().toString();
        faceRegisterHelper = new FaceRegisterHelper(this);
        faceRegisterHelper.startRegister(userId, mImage,
                new StarMscAbility.onResultCallback() {
                    @Override
                    public void onResult(boolean flag, String result) {
                        if (flag) {
                            showToast("人脸模型注册成功:" + mEdtAuthid.getText());
                            //注册成功后加组
                            faceGroupHelper.addFace(userId, mGroupId, new StarMscAbility.onResultCallback() {
                                @Override
                                public void onResult(boolean flag, String result) {
                                    Log.d("MainActivity", "result = " + result);
                                    if (flag) {
                                        showToast("人脸注册加组成功:" + result);
                                    } else {
                                        showToast("人脸注册加组失败:" + result);
                                    }
                                }
                            });
                        } else {
                            showToast("注册模型注册失败:" + result);
                        }
                    }
                });
    }
    /**
     * 人脸识别
     */
    private void recognitionFace() {
        if (mGroupId.equals("")) {
            showToast("Please Create GroupId First");
            return;
        }
        if (mImage == null) {
            showToast("请拍照");
        }
        faceVerifyHelper.setFaceVerifyResultCallback(new StarMscAbility.onResultCallback() {
            @Override
            public void onResult(boolean flag, String result) {
                //返回参数flag为人脸识别结果
                //当flag为true时,result为空,表示图片中检测到了人脸,但没有匹配到人脸库中的人脸信息,当msg不为空时,msg的值表示匹配到的人脸结果(注册时提交的人脸标识)
                //当flag为false时,result的值表示人脸识别失败的信息(包括图片中没有检测到人脸)
                if (flag) {
                    if ("".equals(result)) {
                        showToast("该人脸还未注册!");
                    } else {
                        showToast("识别成功,欢迎您:" + result);
                    }
                } else {
                    showToast("没有匹配到人脸");
                }
            }
        });
        faceVerifyHelper.sendGroupVerify(mGroupId,mImage);
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode,resultCode,data);
        if (resultCode != RESULT_OK) {
            return;
        }
        String fileSrc = null;
        if (requestCode == 1000) {
            fileSrc = data.getStringExtra("bitmap");
            if (null != fileSrc) {
                // mPath = fileSrc;
                // 获取图片的宽和高
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inJustDecodeBounds = false;
                // 压缩图片
                options.inSampleSize = Math.max(1, (int) Math.ceil(Math.max(
                        (double) options.outWidth / 512f,
                        (double) options.outHeight / 512f)));
                mImage = BitmapFactory.decodeFile(fileSrc, options);
                // 若mImageBitmap为空则图片信息不能正常获取
                if (null == mImage) {
                    showToast("图片信息无法正常获取!");
                    return;
                }
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                //可根据流量及网络状况对图片进行压缩
                mImage.compress(Bitmap.CompressFormat.JPEG, 80, baos);
                // mImageData = baos.toByteArray();
                ((ImageView) findViewById(R.id.online_img)).setImageBitmap(mImage);
            }
        }
    }
    /**
     * 显示toast提升信息
     *
     * @param value
     */
    private void showToast(String value) {
        Toast.makeText(this, value, Toast.LENGTH_SHORT).show();
    }
}

步骤 5:应用权限申请

跟以前在安装 APP 的是就申请了权限不同,Google 在 API 23,也就 Android6.0 之后加入了动态权限。对于一些敏感的权限,决定权交还给了用户, 不再是强制申请了。因为这个原因,如果 APP 需要支持 Android6.0 以上的系 文档密级:外部公开 20 统,就需要进行一下适配,否则 APP 就会崩溃。 除了进入设置手动开启权限,还有两种方式让应用获得权限:动态权限申请、 平台签名。本次实验我们采用平台签名的方式获得权限。

image.png


步骤6:实验结果image.png

由上图可知试验成功,可以通过摄像头捕捉到我(注意:此处应该先创建group,然后再人脸识别)

具体流程如下:


1、我们先点击“创建Group”按钮,创建人脸组,完成人脸组的创建后,界面上会显示组ID信息;

2、然后我们点击“拍照”按钮,使用机器人开发平台的摄像头对准脸部进行拍照,完成后,界面上会显示照片信息,确保照片包含完整的人脸图片;

3、在用户标识输入框里面输入人脸标识信息,使用字母+数字的方式,然后点击“人脸注册”按钮,注册成功会弹出提示信息;

4、熟悉了人脸注册的方法,我们可以找不同的人按照同样的方式多注册几个人脸信息;

5、完成了人脸信息的注册后,我们使用摄像头再进行拍照,然后点击“人脸识别”按钮,查看是否对已经注册过的人脸信息能够准确的进行识别。


目录
相关文章
|
1天前
|
机器学习/深度学习 传感器 算法
智能机器人在工业自动化中的应用与前景###
本文探讨了智能机器人在工业自动化领域的最新应用,包括其在制造业中的集成、操作灵活性和成本效益等方面的优势。通过分析当前技术趋势和案例研究,预测了智能机器人未来的发展方向及其对工业生产模式的潜在影响。 ###
21 9
|
30天前
|
网络协议 机器人 C++
KUKA机器人Socket通讯配置方法:技术干货分享
【10月更文挑战第7天】在现代自动化生产线上,KUKA机器人凭借其高效、灵活和精确的特点,成为众多企业的首选。为了实现KUKA机器人与其他设备或系统之间的数据交互,Socket通讯配置显得尤为重要。本文将详细介绍KUKA机器人Socket通讯的配置方法,帮助大家在工作中更好地掌握这一技术。
151 2
|
30天前
|
人工智能 搜索推荐 机器人
挑战未来职场:亲手打造你的AI面试官——基于Agents的模拟面试机器人究竟有多智能?
【10月更文挑战第7天】基于Agent技术,本项目构建了一个AI模拟面试机器人,旨在帮助求职者提升面试表现。通过Python、LangChain和Hugging Face的transformers库,实现了自动提问、即时反馈等功能,提供灵活、个性化的模拟面试体验。相比传统方法,AI模拟面试机器人不受时间和地点限制,能够实时提供反馈,帮助求职者更好地准备面试。
40 2
|
2月前
|
安全 搜索推荐 机器人
纳米技术与医疗:纳米机器人的临床应用前景
【9月更文挑战第28天】纳米机器人作为纳米技术在医疗领域的重要应用,正逐步改变着传统医疗的面貌。它们在药物输送、癌症治疗、手术辅助和疾病诊断等方面展现出广阔的应用前景。随着科学技术的不断进步和纳米技术的不断成熟,我们有理由相信,纳米机器人将成为医疗领域的一个重要且不可或缺的组成部分,为人类的健康事业做出更大的贡献。同时,我们也应关注纳米技术的安全性和可靠性问题,确保其在医疗应用中的安全和有效。
|
3月前
|
机器学习/深度学习 自然语言处理 算法
聊天机器人开发的最佳实践:技术探索与案例分析
【8月更文挑战第22天】聊天机器人作为人工智能领域的重要应用之一,正逐步改变着人们的生活和工作方式。通过遵循最佳实践和技术探索,开发者可以开发出更加智能、高效、安全的聊天机器人产品。未来,随着技术的不断进步和应用场景的不断拓展,聊天机器人将在更多领域发挥重要作用。
|
3月前
|
机器人 C# 人工智能
智能升级:WPF与人工智能的跨界合作——手把手教你集成聊天机器人,打造互动新体验与个性化服务
【8月更文挑战第31天】聊天机器人已成为现代应用的重要组成部分,提供即时响应、个性化服务及全天候支持。随着AI技术的发展,聊天机器人的功能日益强大,不仅能进行简单问答,还能实现复杂对话管理和情感分析。本文通过具体案例分析,展示了如何在WPF应用中集成聊天机器人,并通过示例代码详细说明其实现过程。使用Microsoft的Bot Framework可以轻松创建并配置聊天机器人,增强应用互动性和用户体验。首先,需在Bot Framework门户中创建机器人项目并编写逻辑。然后,在WPF应用中添加聊天界面,实现与机器人的交互。
91 0
|
3月前
|
Apache UED 数据安全/隐私保护
揭秘开发效率提升秘籍:如何通过Apache Wicket组件重用技巧大翻新用户体验
【8月更文挑战第31天】张先生在开发基于Apache Wicket的企业应用时,发现重复的UI组件增加了维护难度并影响加载速度。为优化体验,他提出并通过面板和组件重用策略解决了这一问题。例如,通过创建`ReusableLoginPanel`类封装登录逻辑,使得其他页面可以轻松复用此功能,从而减少代码冗余、提高开发效率及页面加载速度。这一策略还增强了应用的可维护性和扩展性,展示了良好组件设计的重要性。
52 0
|
3月前
|
人工智能 自然语言处理 机器人
掌握未来沟通的艺术:运用TensorFlow与自然语言处理(NLP)技术,从零开始构建你的专属智能对话机器人,让机器理解你的一言一行
【8月更文挑战第31天】本文详细介绍如何利用TensorFlow与自然语言处理技术开发对话机器人。从准备问答数据集开始,通过预处理、构建Seq2Seq模型、训练及预测等步骤,最终实现了一个简易的聊天机器人。示例代码涵盖数据加载、模型搭建及对话功能,适合希望在实际项目中应用AI技术的开发者参考。
44 0
|
3月前
|
人工智能 自然语言处理 安全
盘点国内:AI写作助手_ai智能问答机器人
AI写作助手是利用人工智能技术,特别是自然语言处理(NLP)技术,来辅助用户进行写作的工具。这类助手通过分析大量文本数据,能够理解语言的结构和含义,从而生成、编辑或优化文本内容。AI写作助手通常具有自动纠错、语法检查、内容生成和风格调整等功能,帮助用户提高写作效率和质量。
|
6月前
|
传感器 人工智能 监控
智能耕耘机器人
智能耕耘机器人
130 3
下一篇
无影云桌面