基于阿里云平臺 通過樹莓派實現 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.pswp.cn/news/713638.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713638.shtml
英文地址,請注明出處:http://en.pswp.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;使用戶能夠與這個虛擬環境進行交互…

Spring Boot文檔目錄

目錄 官方文檔 說明&#xff1a;本文檔翻譯的版本&#xff1a;2.7.18-SNAPSHOT。 1. 法規&#xff08;Legal&#xff09; 2. 獲取幫助&#xff08;Getting Help&#xff09; 3. 文檔概述&#xff08;Documentation Overview&#xff09; 4. 開始使用&#xff08;Getting Sta…

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

干凈的語料沒有免疫力嗎?

干凈的語料指的是沒有雜音、無污染、無錯誤的語言材料。雖然干凈的語料本身沒有免疫力&#xff0c;但可以提供給機器學習算法或自然語言處理模型&#xff0c;幫助提高其性能和準確性。通過使用干凈的語料&#xff0c;可以降低噪聲干擾&#xff0c;減少模型的誤差&#xff0c;提…

Java類加載器 和 雙親委派【詳解】

一.類加載器&#xff1a; 由JDK提供的&#xff0c;用于加載一些資源文件到JVM內存里的一項技術。主要是加載class文件到內存&#xff0c;也可以加載一些資源文件。 2.JDK提供了三個類加載器&#xff1a; BootstrapClassLoader&#xff1a;引導類加載器&#xff0c; 是c語言編寫…

LightGBM高級教程:高級特征工程

導言 特征工程是機器學習中至關重要的一部分&#xff0c;它直接影響到模型的性能和泛化能力。在LightGBM中進行高級特征工程可以進一步提高模型的效果。本教程將詳細介紹如何在Python中使用LightGBM進行高級特征工程&#xff0c;并提供相應的代碼示例。 1. 特征交叉 特征交叉…

界面控件DevExpress .NET MAUI v23.2新版亮點 - 擁有全新的彩色主題

DevExpress擁有.NET開發需要的所有平臺控件&#xff0c;包含600多個UI控件、報表平臺、DevExpress Dashboard eXpressApp 框架、適用于 Visual Studio的CodeRush等一系列輔助工具。屢獲大獎的軟件開發平臺DevExpress 今年第一個重要版本v23.1正式發布&#xff0c;該版本擁有眾多…

python鏈接數據庫,實現數據增刪改查

要在Python中鏈接數據庫并實現數據的增刪改查&#xff0c;需要使用數據庫的API&#xff08;Application Programming Interface&#xff09;。以下是一個示例&#xff0c;演示如何使用Python的SQLite3模塊連接并操作數據庫&#xff1a; 安裝SQLite3模塊&#xff08;如未安裝&a…

如何克隆樹莓派系統到較小的硬盤/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 測試獲取工具 四、運行結果 一、前言 在很…

Linux運維_Bash腳本_部署安裝DocBook-XML-4.5(XML-DTD)

Linux運維_Bash腳本_部署安裝DocBook-XML-4.5(XML-DTD) Bash (Bourne Again Shell) 是一個解釋器&#xff0c;負責處理 Unix 系統命令行上的命令。它是由 Brian Fox 編寫的免費軟件&#xff0c;并于 1989 年發布的免費軟件&#xff0c;作為 Sh (Bourne Shell) 的替代品。 您可…