基于阿里云平台 通过树莓派实现 1:1人脸识别

之前的学习中,曾经在香橙派上使用阿里云平台的服务实现过类型识别:

使用香橙派并基于Linux实现最终版智能垃圾桶项目 --- 下_香橙派 项目-CSDN博客

现在,尝试在树莓派上通过阿里云平台的服务实现人脸识别!

 

通过VScode远程连接树莓派

当然,使用SourceInsight来编写代码也可以,全看个人喜好。

我的个人理解是:

  • VScode 更适合远程编写和调试
  • SourceInsight 更适合本地编写多文件的项目

对于本节想要实现的人脸识别,并不特别需要很多文件,且经常需要调试,如果使用SourceInsight就要经常涉及将文件传给树莓派这个操作,较为繁琐。

关于如何连接,可以参考之前连接香橙派的博文,步骤几乎一模一样,唯一需要注意的是在.config文件中,树莓派的用户名是“pi”而不是“rasberrypi”:

小插曲 -- 使用Visual Studio Code远程连接香橙派_visual code 连接 inspect-CSDN博客

VSCODE小操作回顾&补充

  • “ALT + SHIFT":多行缩进
  • “CTRL + S”:保存
  • “CTRL + F”:变量名查找 / 替换

 连接成功后的样子:

 

树莓派Python版本检查

python版本不够的升级方法:

使用香橙派 在Linux环境中安装并学习Python_如何在香橙派上运行python文件-CSDN博客

在之前就提到过,想要使用阿里云的人工智能模型,python版本最好是3开头的,所以在树莓派中同样运行以下指令检查python版本:

python --version

 

可见python版本已经是3.11了,那就不需要改动了!

并且由于这是自带的python,所以其库就在“/usr/bin” 下:

ls /usr/bin

配置环境变量

在后面的代码中,涉及到C语言调用python,所以需要调用<Python.h>,因此需要配置环境变量,否则这个库找不到:

vi ~/.bashrc 

#将以下内容加到最后,保存退出
export C_INCLUDE_PATH=/usr/include/python3.11

注意,配置后,要重启树莓派后才能生效 !!

阿里云的人脸识别方案

  • 阿里云官网:阿里云|达摩院视觉智能开放平台

  • 如果之前没有进行过注册,则需要通过支付宝注册,并获取AccessKey ID和Secret

我之前就创建过账号,现在再获取一组 ID & Secret (如果之前有用之前的应该也可以):阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

AccessKey ID 和 密码 一定要自己保存好!!

  • 在树莓派上下载相应的SDK:

关于人脸人体的SDK的查找:

如何获取、安装、使用视觉智能开放平台PythonSDK及代码示例_视觉智能开放平台(VIAPI)-阿里云帮助中心

pip install alibabacloud_facebody20191230

此处发生了报错:

解决办法:

sudo mv /usr/lib/python3.11/EXTERNALLY-MANAGED /usr/lib/python3.11/EXTERNALLY-MANAGED.bak
  •  安装完成后,根据自己实际的ACCESS_KEY_ID 和 ACCESS_KEY_SECRET,将以下内容写入到家目录下的.bashrc中:

vi ~/.bashrc 
 
#然后在末尾输入以下内容:
export ALIBABA_CLOUD_ACCESS_KEY_ID="XXX" #根据自己实际的ID填写
export ALIBABA_CLOUD_ACCESS_KEY_SECRET="XXXX" #根据自己实际的SECRET填写

 

保存退出后,重启树莓派,再输入“export”验证:

可见,ACCESSKEY已经成功被配置成为环境变量!

  •  在官网的人脸识别中找到一个感兴趣的模型,我此处找了“人脸比对1:1 ”:能力展示-阿里云视觉智能开放平台

  1. 点击“立即开通”开通服务
  2. 点击“立刻购买”购买服务(此处似乎有优惠,免费使用1年)

此时,就可以使用这个模型了!

  • 下载示例代码进行测试

不能直接在人脸比对1:1下使用那个python代码例程,而是要在以下链接中找到“文件在本地或文件不在同一地域OSS”的例程:

人脸比对1:1示例代码_视觉智能开放平台(VIAPI)-阿里云帮助中心

在树莓派”mjm_code“下创建一个“face_detect_test”文件夹,将示例代码拷贝进来并稍作修改:

test.py:

# -*- coding: utf-8 -*-
# 引入依赖包
# 最低SDK版本要求:facebody20191230的SDK版本需大于等于4.0.8
# 可以在此仓库地址中引用最新版本SDK:https://pypi.org/project/alibabacloud-facebody20191230/
# pip install alibabacloud_facebody20191230

import os
import io
from urllib.request import urlopen
from alibabacloud_facebody20191230.client import Client
from alibabacloud_facebody20191230.models import CompareFaceAdvanceRequest
from alibabacloud_tea_openapi.models import Config
from alibabacloud_tea_util.models import RuntimeOptions


def face_detect(): #定义成一个函数,方便调用!
    config = Config(
    # 创建AccessKey ID和AccessKey Secret,请参考https://help.aliyun.com/document_detail/175144.html。
    # 如果您用的是RAM用户的AccessKey,还需要为RAM用户授予权限AliyunVIAPIFullAccess,请参考https://help.aliyun.com/document_detail/145025.html。
    # 从环境变量读取配置的AccessKey ID和AccessKey Secret。运行代码示例前必须先配置环境变量。
    access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
    access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
    # 访问的域名
    endpoint='facebody.cn-shanghai.aliyuncs.com',
    # 访问的域名对应的region
    region_id='cn-shanghai'
    )
    runtime_option = RuntimeOptions()
    compare_face_request = CompareFaceAdvanceRequest()

    #场景一:文件在本地
    streamA = open(r'/home/pi/mjm_code/face_detect_test/mjm.png', 'rb') #预存的照片
    compare_face_request.image_urlaobject = streamA
    
    streamB = open(r'/home/pi/mjm_code/face_detect_test/face.png', 'rb') #待测试的照片
    compare_face_request.image_urlbobject = streamB


    try:
        # 初始化Client
        client = Client(config)
        response = client.compare_face_advance(compare_face_request, runtime_option)
        # 获取整体结果
        print(response.body)
    except Exception as error:
        # 获取整体报错信息
        print(error)
        # 获取单个字段
        print(error.code)
        # tips: 可通过error.__dict__查看属性名称

    # 关闭流
    streamA.close()
    streamB.close()

if __name__ == '__main__': #写一个main调用face_detect函数来测试
    face_detect()

我使用了我自己的照片作为标准,并使用了两张照片进行测试,第一张是我本人的另一张照片第二张是我同学的照片

分别存在树莓派本地:

  1. /home/pi/mjm_code/face_detect_test/mjm.png //预存的照片

  2. /home/pi/mjm_code/face_detect_test/face.png //待测试的照片

 可见,当我使用本人照片时,置信度约为77%,而当我使用同学照片时,置信度直接变为0%(我同学和我长的也太不一样了哈哈哈),所以综合来说测试成功!

  • 置信度的提取和转化

但是返回的结果是一个结构非常的数据体,所以尝试将置信度单独返回,并只保留整数部分

提取的代码如下:

# 单独提取置信度
confidence = response.body.to_map()['Data']['Confidence'] #to_map()函数很重要,不要忘记
score = int(confidence)
print(score)
return score

现在,就可以返回置信度的整数部分了! 而之后就可以根据这个整数score来进行判断了!

编写C语言调用python的人脸识别

在刚刚的测试中,写出了调用阿里云人脸识别服务的pyhton程序,那么现在,尝试写C语言程序来调用python程序从而实现人脸识别!

  • ①将刚刚的test.py中的main函数部分删除并重命名为face.py

刚刚加入main函数是为了直接调用封装好的face_detect函数,而现在要使用C语言来调用它,自然就不需要main函数了!

  • ②编写调用face_detect函数的C函数

回顾“C语言调用Python的步骤”:

详见之前的博文:

使用香橙派并基于Linux实现最终版智能垃圾桶项目 --- 下_香橙派 项目-CSDN博客

face_cmp.c: 

#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <Python.h>

#include "face_cmp.h"
 
 
void face_init(void)
{
    Py_Initialize();
    PyObject *sys = PyImport_ImportModule("sys");
    PyObject *path = PyObject_GetAttrString(sys, "path");
    PyList_Append(path, PyUnicode_FromString("."));
}
 
void face_final(void)
{
    Py_Finalize();
}
 
int face_score(void) //python下face_detect函数返回的是已经经过提取和取证过的置信度score,是个int型
{
    PyObject *pModule = PyImport_ImportModule("face"); //加载python文件
    if (!pModule)
    {
        PyErr_Print();
        printf("Error: failed to load module\n");
        goto FAILED_MODULE; //goto的意思就是如果运行到这里就直接跳转到FAILED_MODULE
    }
    PyObject *pFunc = PyObject_GetAttrString(pModule, "face_detect"); //加载python文件中的对应函数
    if (!pFunc)
    {
        PyErr_Print();
        printf("Error: failed to load function\n");
        goto FAILED_FUNC;
    }
    PyObject *pValue = PyObject_CallObject(pFunc, NULL);
    if (!pValue)
    {
        PyErr_Print();
        printf("Error: function call failed\n");
        goto FAILED_VALUE;
    }
    int result = 0;
    if (!PyArg_Parse(pValue, "i", &result)) //ace_detect函数返回的是已经经过提取和取证过的置信度score,是个int型,用‘i’表示
    {
        PyErr_Print();
        printf("Error: parse failed");
        goto FAILED_RESULT;
    }
    /* 如果函数返回的是字符串,上面的PyArg_Parse则需要用‘s’来表示,且下面注释的代码非常重要,因为字符串名代表了其首地址,所以不能直接复制而是需要使用strncpy函数!!!
    category = (char *)malloc(sizeof(char) * (strlen(result) + 1) ); //开辟一个新的字符串常量。+1是为了留出空间给\0
    memset(category, 0, (strlen(result) + 1)); //初始化字符串
    strncpy(category, result, (strlen(result) + 1)); //将result的结果复制给新的字符串
    */
 
FAILED_RESULT:
    Py_DECREF(pValue);
FAILED_VALUE:
    Py_DECREF(pFunc);
FAILED_FUNC:
    Py_DECREF(pModule);
FAILED_MODULE:
    return result;
}

face_cmp.h:

#ifndef __face__H
#define __face__H
 
void face_init(void);
void face_final(void);
int face_score(void);

#endif
  • face_cmp的作用就是封装C语言下的人脸识别函数
  • C语言下的人脸识别函数的实现通过调用python代码下的face_detect函数
  • ③编写C程序调用刚刚的C函数实现人脸识别

face_test.c:

#include <stdio.h>
#include <stdlib.h>
#include "face_cmp.h"
 
int main()
{
	int score = 0;
	face_init();
	score = face_score();
	printf("score=%d\n", score);
	face_final();
	return 0;
}
  • ④编译并试运行 

运行以下代码编译:

gcc face_test.c face_cmp.c -I /usr/include/python3.11/ -l python3.11

可见,调用成功! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/421410.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

EasyRecovery数据恢复软件2024最新版包括Windows和Mac

EasyRecovery数据恢复软件适用于多种环境和使用场景。首先&#xff0c;它适用于各种操作系统&#xff0c;包括Windows和Mac。无论用户使用的是哪种操作系统&#xff0c;都可以使用该软件进行数据恢复。 其次&#xff0c;EasyRecovery支持从各种存储设备和媒介中恢复数据&#…

iOS消息转发流程

当向Objc对象发送消息时&#xff0c;如果找到对象对应的方法&#xff0c;就会进入消息转发流程&#xff0c;给开发者提供一些最后的机会处理消息无法发送问题&#xff0c;以免出现程序崩溃。 1. 回调对象的resolveInstanceMethod方法&#xff0c;在这个方法中&#xff0c;允许开…

【图论】【并集查找】【C++算法】928. 尽量减少恶意软件的传播 II

作者推荐 动态规划的时间复杂度优化 涉及知识点 图论 并集查找 LeetCode928. 尽量减少恶意软件的传播 II 给定一个由 n 个节点组成的网络&#xff0c;用 n x n 个邻接矩阵 graph 表示。在节点网络中&#xff0c;只有当 graph[i][j] 1 时&#xff0c;节点 i 能够直接连接到…

JVM内存回收算法

1.1 引用计数法 每个对象创建的时候&#xff0c;会分配一个引用计数器&#xff0c;当这个对象被引用的时候计数器就加1&#xff0c;当不被引用或者引用失效的时候计数器就会减1。任何时候&#xff0c;对象的引用计数器值为0就说明这个对象不被使用了&#xff0c;就认为是“垃圾…

YOLO算法

YOLO介绍 YOLO&#xff0c;全称为You Only Look Once: Unified, Real-Time Object Detection&#xff0c;是一种实时目标检测算法。目标检测是计算机视觉领域的一个重要任务&#xff0c;它不仅需要识别图像中的物体类别&#xff0c;还需要确定它们的位置。与分类任务只关注对…

第七十一天 漏洞发现-Web框架中间件联动GobyAfrogXrayAwvsVulmap

第71天 漏洞发现-Web框架中间件&联动&Goby&Afrog&Xray&Awvs&Vulmap 知识点&#xff1a; 1、Bup简单介绍&使用说明 2、Xray简单介绍&使用说明 3、AWWS简单介绍&使用说明 4、Goby简单介绍&使用说明 5、Afrog简单介绍&使用说明 6、…

抽象类、模板方法模式

抽象类概述 在Java中abstract是抽象的意思&#xff0c;如果一个类中的某个方法的具体实现不能确定&#xff0c;就可以申明成abstract修饰的抽象方法&#xff08;不能写方法体了&#xff09;&#xff0c;这个类必须用abstract修饰&#xff0c;被称为抽象类。 抽象方法定义&…

驱动高级--mknod

一、起源 仅devfs&#xff0c;导致开发不方便以及一些功能难以支持&#xff1a; 热插拔 不支持一些针对所有设备的统一操作&#xff08;如电源管理&#xff09; 不能自动mknod 用户查看不了设备信息 设备信息硬编码&#xff0c;导致驱动代码通用性差&#xff0c;即没有分离…

vscode 引入外部依赖包

背景 我要在vscode中写一些antlr代码生成的cpp代码&#xff0c;但是在引入头文件#include "antlr4-runtime.h"的时候&#xff0c;出现报错&#xff0c;显示没有这个头文件&#xff0c;显然这是我们没有导入相关的包&#xff0c;因此我首先尝试了将antlr4的依赖源码在…

百度百科人物创建要求是什么?

百度百科作为我国最大的中文百科全书&#xff0c;其收录的人物词条要求严谨、客观、有权威性。那么&#xff0c;如何撰写一篇高质量的人物词条呢&#xff1f;本文伯乐网络传媒将从内容要求、注意事项以及创建流程与步骤三个方面进行详细介绍。 一、内容要求 1. 基本信息&#…

springcloud:3.2测试超时机制

服务提供者 Openfeign远程调用服务提供者搭建 文章地址http://t.csdnimg.cn/06iz8 PaymentController【控制层】 /*** 测试超时机制** return*/GetMapping("/timeout")public String TimeOut() {try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {…

EdgeX Foundry 边缘物联网中间件平台

文章目录 1.EdgeX Foundry2.平台架构3.平台服务3.1.设备服务3.2.核心服务3.3.支持服务3.4.应用服务3.5.安全服务3.6.管理服务 EdgeX Foundry # EdgeX Foundryhttps://iothub.org.cn/docs/edgex/ https://iothub.org.cn/docs/edgex/edgex-foundry/1.EdgeX Foundry EdgeX Found…

babylonjs入门-半球光

基于babylonjs封装的一些功能和插件 &#xff0c;希望有更多的小伙伴一起玩babylonjs&#xff1b; 欢迎加群&#xff08;点击群号传送&#xff09;&#xff1a;464146715 官方文档 中文文档 案例传送门 懒得打字 粘贴复制 一气呵成

php httpfs链接hdfs

一.代码&#xff08;有bug&#xff09; GitHub - michaelbutler/php-WebHDFS: A PHP client for WebHDFS 二.调用代码 1.代码1.代码 require_once(../webhdfs/src/org/apache/hadoop/WebHDFS.php);require_once(../webhdfs/src/org/apache/hadoop/tools/Curl.php); require_o…

雅马哈伺服器TS-S系列说明具体详情内容可参看PDF目录内容

雅马哈伺服器TS-S系列说明具体详情内容可参看PDF目录内容

应用健康状态检测

一、Liveness 与 Readiness 1、初识 Liveness 与 Readiness (1) Liveness&#xff08;存活性&#xff09;&#xff1a;Liveness 探针是一个用于检测应用程序是否处于活动状态的机制&#xff0c;通常通过周期性地向应用程序发送请求并检查其响应来完成。如果应用程序未能响应&…

Spring MVC源码中设计模式——适配器模式

适配器模式介绍 适配器模式&#xff08;Adapter Pattern&#xff09;是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式&#xff0c;它结合了两个独立接口的功能。 应用场景&#xff1a; 1、系统需要使用现有的类&#xff0c;而此类的接口不符合系统的需要…

Qt Creator配置MSVC编译环境、调试环境

在windows上开发&#xff0c;一般使用Qt Creator自带mingw编译器&#xff0c;编译和调试都很方便&#xff0c;安装Qt时勾选后&#xff0c;自动配置完毕。 但是有时候我们需要使用MSVC的编译器&#xff0c;这个时候我们没法直接使用&#xff0c;需要配置环境才能使用&#xff0…

Vue中<style scoped lang=“scss“>的含义

这段代码中的<style scoped lang"scss">是HTML和Vue框架结合使用时常见的一个模式&#xff0c;具体含义如下&#xff1a; scoped&#xff1a;这是一个Vue.js特有的属性&#xff0c;用来指定样式只应用于当前组件的元素。没有这个属性时&#xff0c;样式会全局应…

网络卡顿是怎么回事?

网络卡顿是指在网络通信过程中&#xff0c;数据传输出现延迟或中断&#xff0c;导致用户在使用网络时出现卡顿、延迟或不流畅的情况。例如&#xff1a;系统响应时间长&#xff0c;网页加载速度慢&#xff1b;视频或游戏掉帧&#xff0c;导致画面卡顿或不流畅&#xff1b;音视频…
最新文章