基于阿里云平台 通过树莓派实现 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_facebody20191230import 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 RuntimeOptionsdef 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',# 访问的域名对应的regionregion_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 = streamAstreamB = open(r'/home/pi/mjm_code/face_detect_test/face.png', 'rb') #待测试的照片compare_face_request.image_urlbobject = streamBtry:# 初始化Clientclient = 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是为了留出空间给\0memset(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__Hvoid 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.mzph.cn/news/713638.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年新提出的算法|鹦鹉优化器(Parrot optimizer):算法及其在医疗问题中的应用

本期介绍一种基于训练后鹦鹉关键行为的高效优化方法——鹦鹉优化器(Parrot Optimizer, PO)。该成果于2024年2月发表在中科院2区top SCI期刊Computers in Biology and Medicine&#xff08;IF7.7&#xff09; 1、简介 鹦鹉优化器&#xff08;PO&#xff09;是一种受训练有素的…

pytest教程-13-conftest.py文件

上一小节我们学习了fixture的作用域&#xff0c;本小节我们学习一下pytest conftest.py文件的使用方法。 conftest.py文件的作用 conftest.py文件是pytest框架中的一个特殊文件&#xff0c;用于定义共享的设置、夹具(fixture)和钩子函数&#xff08;hook&#xff09;。 在py…

2.模拟问题——2.使用二维数组输出图形

用二维数组描述图形 首先要计算出整个输出的方框大小&#xff0c;从而判定相应关键循环点 #include <cstdio> char arr[1000][3000]; int main() {int h;//初始化&#xff0c;全部内部填空格while(scanf("%d",&h) ! EOF){for (int i 0; i < h; i) {f…

HTML---表单验证

文章目录 目录 本章目标 一.表单验证概述 二.表单选择器 属性过滤选择器 三.表单验证 表单验证的方法 总结 本章目标 掌握String对象的用法会使用表单选择器的选择页面元素会使用JQuery事件进行表单验证Ajax的概念和作用 一.表单验证概述 前端中的表单验证是在用户提交表…

图神经网络导论 - 刘知远

一、神经网络基础 近年来&#xff0c;机器学习领域的发展迅速&#xff0c;主要表现在多种神经网络架构的出现。尽管不同的神经网络架构相差甚远&#xff0c;但现有的神经网络架构可以分为几个类别&#xff1a; 卷积神经网路是前馈神经网路的特殊形式&#xff0c;FNN通常是全…

什么是VR虚拟现实|虚拟科技博物馆|VR设备购买

虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;是一种通过计算机技术模拟出的一种全新的人机交互方式。它可以通过专门的设备&#xff08;如头戴式显示器&#xff09;将用户带入一个计算机生成的虚拟环境之中&#xff0c;使用户能够与这个虚拟环境进行交互…

BUUCTF---另外一个世界1

1.这是一道杂项题&#xff0c;也是我觉得最值得记录的一道题。 2.话不多说&#xff0c;题目描述&#xff08;真的是另一个世界&#xff09; 3.下载附件&#xff0c;是一张图片 4.尝试了查看属性&#xff0c;以及在记事本中打开看看有没有什么有用的信息&#xff0c;发现没什么…

FaceBook获取广告数据

1、访问 广告管理工具 确认自己登陆的账号下面能看到户。 ​ 2、使用 图谱Api探索工具 生成用户短期口令 ​ 3、get请求(或者浏览器直接打开)访问&#xff1a; https://graph.facebook.com/v19.0/me?fieldsid,name, email&access_token{上一步生成的口令} ​ 4、短期…

c# 获取源码路径与当前程序所在路径

获取源码路径 private static string GetFilePath([CallerFilePath] string path null) {return path;}//当程序所在路径string str67 System.Environment.CurrentDirectory;//源码路径 var path GetFilePath();var directory Path.GetDirectoryName(path);参考

Vue2:用node+express写一个轻量级的后端服务

1、桌面创建demo文件夹 进入demo&#xff0c;执行如下命令 npm init输入名称&#xff1a; test_server然后一路回车 2、安装express框架 npm i express3、新建server.js 在demo文件夹中&#xff0c;新建server.js const express require(express) const app express()…

2023年12月CCF-GESP编程能力等级认证Scratch图形化编程三级真题解析

一、单选题(共15题,共30分) 第1题 现代计算机是指电子计算机,它所基于的是( )体系结构。 A:艾伦图灵 B:冯诺依曼 C:阿塔纳索夫 D:埃克特-莫克利 答案:B 第2题 默认小猫角色,执行下列程序,舞台上会看到? ( ) A: B: C: D: 答案:C

Java类加载器 和 双亲委派【详解】

一.类加载器&#xff1a; 由JDK提供的&#xff0c;用于加载一些资源文件到JVM内存里的一项技术。主要是加载class文件到内存&#xff0c;也可以加载一些资源文件。 2.JDK提供了三个类加载器&#xff1a; BootstrapClassLoader&#xff1a;引导类加载器&#xff0c; 是c语言编写…

界面控件DevExpress .NET MAUI v23.2新版亮点 - 拥有全新的彩色主题

DevExpress拥有.NET开发需要的所有平台控件&#xff0c;包含600多个UI控件、报表平台、DevExpress Dashboard eXpressApp 框架、适用于 Visual Studio的CodeRush等一系列辅助工具。屡获大奖的软件开发平台DevExpress 今年第一个重要版本v23.1正式发布&#xff0c;该版本拥有众多…

如何克隆树莓派系统到较小的硬盘/SD卡上(如何分区、设置修复引导)

最近有个老固态硬盘空下来了&#xff0c;虽然写入速度没那么快&#xff0c;但是足够满足千兆网络了&#xff0c;所以我就想把现在给树莓派使用的固态硬盘换下来。由于一些设置很浪费时间&#xff0c;所以我不打算重装系统。此外这个老固态是 120GB 的&#xff0c;要小于正在使用…

redis实现分布式全局唯一id

目录 一、前言二、如何通过Redis设计一个分布式全局唯一ID生成工具2.1 使用 Redis 计数器实现2.2 使用 Redis Hash结构实现 三、通过代码实现分布式全局唯一ID工具3.1 导入依赖配置3.2 配置yml文件3.3 序列化配置3.4 编写获取工具3.5 测试获取工具 四、运行结果 一、前言 在很…

leetcode 热题 100_最长连续序列

题解一&#xff1a; 哈希表&#xff1a;找连续最长的数字序列&#xff0c;很容易联想到排序&#xff0c;但排序的时间复杂度O(nlogN)过大&#xff0c;判题容易超时。因此我们需要使用哈希表来快速查找&#xff0c;序列中是否存在与某个数相邻的数。用HashSet建立哈希表并去重&a…

【Javascript编程实操02】1、判断一个年份是闰年还是平年 2、找到三个数中最小的数

目录 前言 1、判断一个年份是闰年还是平年 原理&#xff1a; 代码&#xff1a; 实现效果&#xff1a; 2、找到三个数中最小的数 流程图&#xff1a; 代码&#xff1a; 实现效果&#xff1a; 总结 前言 本次继续针对Javascript阶段的if...else...的实操练习&#xff0…

IDEA 配置股票插件

IDEA配置股票基金实时查看插件&#xff0c;步骤如下&#xff1a; 打开Settings&#xff0c;找到Plugins&#xff0c;在Marketplace中搜索&#xff1a;Money Never Sleeps&#xff0c;如下图所示&#xff1a; Money Never Sleeps是IntelliJ IDEA平台插件. 支持查看股票实时行情…

three.js 叉乘判断物体在人前左,前右,后左、后右

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs"></div><div style"padding: 10px;text-align: left;">叉乘判断物体…

加密与安全_探索对称加密算法

文章目录 概述常用的对称加密算法AESECB模式CBC模式 (推荐)ECB VS CBC 附&#xff1a;AES工具类总结 概述 对称加密算法是一种加密技术&#xff0c;使用相同的密钥来进行加密和解密数据。在这种算法中&#xff0c;发送方使用密钥将明文&#xff08;未加密的数据&#xff09;转…