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

news2024/11/14 12:18:42

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

使用香橙派并基于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.coloradmin.cn/o/1482086.html

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

相关文章

Mac清理电脑垃圾工具CleanMyMac X4.15中文免费版下载

嘿&#xff0c;亲爱的Mac用户们&#xff0c;你们是否曾经想象过你的电脑是一座美丽的城市&#xff0c;而垃圾文件则是那些不速之客&#xff0c;悄悄堆积&#xff0c;影响着城市的整体美观。今天&#xff0c;我们就来聊聊Mac为什么会产生垃圾文件&#xff0c;这些垃圾文件会对你…

前端 css 实现标签的效果

效果如下图 直接上代码&#xff1a; <div class"label-child">NEW</div> // css样式 // 父元素 class .border-radius { position: relative; overflow: hidden; } .label-child { position: absolute; width: 150rpx; height: 27rpx; text-align: cente…

RISC-V特权架构 - 中断与异常概述

RISC-V特权架构 - 中断与异常概述 1 中断概述2 异常概述3 广义上的异常3.1 同步异常3.2 异步异常3.3 常见同步异常和异步异常 本文属于《 RISC-V指令集基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 中断概述 中断&#xff08;Interrupt&#xff09;机制&#xff0c;即…

Biotin aniline,生物素苯胺,用于研究蛋白质结构和功能

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;769933-15-5&#xff0c;Biotin aniline&#xff0c;生物素苯胺&#xff0c;Biotin-aniline&#xff0c;生物素-苯胺 一、基本信息 【产品简介】&#xff1a;Biotin aniline is composed of three parts: biotin, w…

【学习笔记】Diffusion扩散模型

导读 Diffusion models是现在人工智能领域最火的方向之一&#xff0c;并引爆了AIGC领域&#xff0c;一大批创业公司随之诞生。 AIGC&#xff08;AI-Generated Content&#xff09;&#xff1a;人工智能创作内容的生产方式。 扩散模型Diffusion 扩散模型Duffison的训练过程 …

leetcode 热题 100_移动零

题解一&#xff1a; 双指针遍历&#xff1a;将非零的值往数组前端依次放置&#xff0c;将放置之后数组后端多余的位置都置为0&#xff0c;参考下图&#xff08;来源. - 力扣&#xff08;LeetCode&#xff09;&#xff09; class Solution {public void moveZeroes(int[] nums)…

数据库进阶——如何提升数据库的安全性,以MySQL和Redis加固为例

目录 引出数据库加固加固思路MySQLRedis Redis冲冲冲——缓存三兄弟&#xff1a;缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 数据库进阶——如何提升数据库的安全性&#xff0c;以MySQL和Redis加固为例 数据库加固 加固思路 账号配置 应按照用户分配账号&…

B树系列(详解)

目录 一、B-树 二、B树 三、B*树 四、时间复杂度 五、Mysql与B树系列 一、B-树 首先再说B树的性质以及其他的之前&#xff0c;先要说一声&#xff0c;好多人都把这个树叫B减树&#xff0c;其实不是&#xff0c;他就叫B树&#xff0c;至于原因我觉的没必要再这个名字上纠结…

LED制造企业元亨光电牵手盘古信息,开启数字化转型新篇章

在多媒体时代&#xff0c;LED产品已经融入我们生活的方方面面&#xff0c;无论是在商场、超市、机场&#xff0c;还是在公交站、马路边、隧道内&#xff0c;它们的身影无处不在。 坐落在深圳宝安区福永&#xff0c;拥有40000㎡ 研发生产LED产品基地的深圳市元亨光电股份有限公…

哪个有名的工具可以安全记事 私密记事本笔记推荐

在这个数字化的时代&#xff0c;我们的生活已经离不开各种记事工具。它们帮助我们记录生活中的点点滴滴&#xff0c;无论是工作上的重要事项&#xff0c;还是个人的私密心情。然而&#xff0c;当我在寻找一个能够安心记录私密事情的工具时&#xff0c;安全性成为了我最关心的因…

Tomcat相关基础以及安装运行

目录 一、web概念 二、常见的web服务器 三、Tomcat 安装 下载&#xff1a; 安装&#xff1a; 四、Tomcat 目录结构 五、Tomcat 启动停止 一、web概念 软件架构&#xff1a; B/S&#xff1a; 浏览器/服务器端 ‐‐‐‐‐‐‐‐‐‐‐‐> 京东&#xff0c;网易&#xff0c…

buuctf_reverse_新年快乐+内涵的软件

新年快乐 题目&#xff1a;新年快乐.exe 这玩意有壳&#xff01;我去down了upx脱壳 开始放exeinfope的图片没截&#xff0c;我记得下载完upx后exeinfoPE显示还不一样。留了一张脱壳的实验图片&#xff1a; 然后放IDA 我是笔记本键盘&#xff0c;shiftFnF12转字符串 诶呦&…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:位置设置)

设置组件的对齐方式、布局方向和显示位置。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 align align(value: Alignment) 设置容器元素绘制区域内的子元素的对齐方式。 卡片能力&#xff1a; 从API…

判断子序列[简单]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给定字符串s和t&#xff0c;判断s是否为t的子序列。字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如ace是abcde的一个子序列&#xff0c…

html样式排版

<template><div class"box"><div class"header">头部</div><div class"main"><div class"left">菜单</div><div class"right"><div class"right-contentr"&g…

C++菱形继承_多态

&#x1f493;博主CSDN主页:麻辣韭菜-CSDN博客&#x1f493;   ⏩专栏分类&#xff1a;http://t.csdnimg.cn/362T6⏪   &#x1f69a;代码仓库:要相信光/C高阶&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C知识   &#x1f51d;&#x1f51d; 目录 前言…

容联云入选IDC生成式AI图谱,多个案例被评典型应用

随着生成式AI进入商业化初期&#xff0c;国际数据公司&#xff08;IDC&#xff09;于近日发布了《IDC Market Glance: 中国生成式AI市场概览》报告&#xff0c;报告分析了当前市场的整体情况以及市场格局&#xff0c;通过中国生成式AI市场生态图谱V1.0和代表厂商分析&#xff0…

BUUCTF---另外一个世界1

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

C# WPF如何自定义控件ComboBox

在WPF开发中&#xff0c;经常遇到需要修改原生ComboBox的控件样式。 对于新手来说&#xff0c;修改控件样式比较麻烦。 修改的最终样式如下&#xff1a; 你可以利用如下代码模板&#xff0c;修改为你自己想要的样式。 <Style TargetType"{x:Type ComboBox}"&…

CSP-202112-3-登机牌条码

CSP-202112-3-登机牌条码 解题思路 一、.处理大小写和数字 初始化变量&#xff1a;flag: 用来标识当前处理的字符类型&#xff0c;0代表大写字母&#xff0c;1代表小写字母&#xff0c;2代表数字。 大小写字母和数字的处理&#xff1a; 小写字母(a < it && it &l…