1. 人臉識別簡介
人臉識別,是基于人的臉部特征信息進行身份識別的一種生物識別技術。用攝像機或攝像頭采集含有人臉的圖像或視頻流,并自動在圖像中檢測和跟蹤人臉,進而對檢測到的人臉進行臉部識別的一系列相關技術,通常也叫做人像識別、面部識別。
人臉識別系統主要包括四個組成部分,分別為:人臉圖像采集及檢測、人臉圖像預處理、人臉圖像特征提取以及匹配與識別,本實例也包括這幾個流程。
本人臉識別算法在數據集表現如下所示:
人臉識別算法 | performance |
LFW | 99.80% |
IJB-C(E4) | 97.12% |
基于EASY-EAI-Orin-Nano硬件主板的運行效率:
算法種類 | 運行效率 |
face_detect | 16ms |
face_recognition | 12.8ms |
2. 快速上手
如果您初次閱讀此文檔,請閱讀:《入門指南/源碼管理及編程介紹/源碼工程管理》,按需管理自己工程源碼(注:此文檔必看,并建議采用【遠程掛載管理】方式,否則有代碼丟失風險!!!)。
2.1 源碼工程下載
先在PC虛擬機定位到nfs服務目錄,再在目錄中創建存放源碼倉庫的管理目錄:
cd ~/nfsroot mkdir GitHub cd GitHub
再通過git工具,在管理目錄內克隆遠程倉庫(需要設備能對外網進行訪問)
git clone https://github.com/EASY-EAI/EASY-EAI-Toolkit-3576.git

注:
* 此處可能會因網絡原因造成卡頓,請耐心等待。
* 如果實在要在gitHub網頁上下載,也要把整個倉庫下載下來,不能單獨下載本實例對應的目錄。
2.2 開發環境搭建
通過adb shell進入板卡開發環境,如下圖所示。
通過以下命令,把nfs目錄掛載上nfs服務器。
mount -t nfs -o nolock : /home/orin-nano/Desktop/nfs/

2.3 例程編譯
然后定位到板卡的nfs的掛載目錄(按照實際掛載目錄),進入到對應的例程目錄執行編譯操作,具體命令如下所示:
cd EASY-EAI-Toolkit-3576/Demos/algorithm-face_recognition/ ./build.sh

2.4 模型部署
要完成算法Demo的執行,需要先下載人臉檢測算法模型
百度網盤鏈接為:https://pan.baidu.com/s/1AHGYKQQzpbgcMI5seieX1A?pwd=1234(提取碼:1234 )。
也要下載人臉識別算法模型。
百度網盤鏈接為:https://pan.baidu.com/s/1yLIG8fLCLIXGFYw7EPSX4A?pwd=1234 (提取碼:1234 )。
然后需要把下載的人臉檢測算法模型和人臉識別算法模型復制粘貼到Release/目錄:
2.5 例程運行及效果
進入開發板Release目錄,執行下方命令,運行示例程序:
cd Release/ ./test-face-recognition 1.jpg 2.jpg
運行例程命令如下所示,similarity值大于0.4認為是同一個人,值越大可能性越高,similarity值范圍在-1~1之間:
API的詳細說明,以及API的調用(本例程源碼),詳細信息見下方說明。
3. 人臉檢測API說明
3.1 引用方式
為方便客戶在本地工程中直接調用我們的EASY EAI api庫,此處列出工程中需要鏈接的庫以及頭文件等,方便用戶直接添加。
選項 | 描述 |
頭文件目錄 | easyeai-api/algorithm/face_detect |
庫文件目錄 | easyeai-api/algorithm/face_detect |
庫鏈接參數 | -lface_detect |
3.2 人臉檢測初始化函數
設置人臉檢測初始化函數原型如下所示。
int face_detect_init(rknn_context *ctx, const char *path)
具體介紹如下所示。
函數名: face_detect_init() | |
頭文件 | face_detect.h |
輸入參數 | ctx:rknn_context句柄 |
輸入參數 | path:算法模型的路徑 |
返回值 | 成功返回:0 |
失敗返回:-1 | |
注意事項 | 無 |
3.3 人臉檢測運行函數
設face_detect_run原型如下所示。
int face_detect_run(rknn_context ctx, cv::Mat &input_image, std::vector &result)
具體介紹如下所示。
函數名:face_detect_run () | |
頭文件 | face_detect.h |
輸入參數 | ctx: rknn_context句柄 |
輸入參數 | input_image:Opencv Mat格式圖像 |
輸出參數 | result:人臉檢測的結果輸出 |
返回值 | 成功返回:0 |
失敗返回:-1 | |
注意事項 | 無 |
3.4 人臉檢測釋放函數
人臉檢測釋放函數原型如下所示。
int face_detect_release(rknn_context ctx)
具體介紹如下所示。
函數名:face_detect_release () | |
頭文件 | face_detect.h |
輸入參數 | ctx: rknn_context句柄 |
返回值 | 成功返回:0 |
失敗返回:-1 | |
注意事項 | 無 |
4. 人臉標準化API說明
4.1 引用方式
為方便客戶在本地工程中直接調用我們的EASY EAI api庫,此處列出工程中需要鏈接的庫以及頭文件等,方便用戶直接添加。
選項 | 描述 |
頭文件目錄 | easyeai-api/algorithm/face_recognition |
庫文件目錄 | easyeai-api/algorithm/face_recognition |
庫鏈接參數 | -lface_recognition |
4.2 人臉標準化函數
設置人臉標準化函數原型如下所示。
cv::Mat face_alignment(cv::Mat img, cv::Point2f* points)
具體介紹如下所示。
函數名: face_alignment() | |
頭文件 | face_alignment.h |
輸入參數 | img: opencv圖像輸入 |
輸入參數 | points: Point2f人臉關鍵點輸入 |
返回值 | 成功返回:112*112*3的人臉標準化圖像 |
注意事項 | 輸入圖片和人臉關鍵點坐標,輸出標準化的人臉頭像 |
5. 人臉識別API說明
5.1 引用方式
為方便客戶在本地工程中直接調用我們的EASY EAI api庫,此處列出工程中需要鏈接的庫以及頭文件等,方便用戶直接添加。
選項 | 描述 |
頭文件目錄 | easyeai-api/algorithm/face_recognition |
庫文件目錄 | easyeai-api/algorithm/face_recognition |
庫鏈接參數 | -lface_recognition |
5.2 人臉識別初始化函數
設置人臉識別初始化函數原型如下所示。
int face_recognition_init(rknn_context *ctx, const char * path)
具體介紹如下所示。
函數名: face_recognition_init() | |
頭文件 | face_recognition.h |
輸入參數 | ctx:rknn_context句柄 |
輸入參數 | path:算法模型的路徑 |
返回值 | 成功返回:0 |
失敗返回:-1 | |
注意事項 | 無 |
5.3 人臉識別運行函數
設face_recognition_run原型如下所示。
int face_recognition_run(rknn_context ctx, cv::Mat *face_image, float (*feature)[512])
具體介紹如下所示。
函數名:face_recognition_run () | |
頭文件 | face_recognition.h |
輸入參數 | ctx: rknn_context句柄 |
輸入參數 | face_image:圖像數據輸入(cv::Mat是Opencv的類型) |
輸出參數 | feature:算法輸出的人臉特征碼 |
返回值 | 成功返回:0 |
失敗返回:-1 | |
注意事項 | 無 |
5.4 人臉識別特征比對函數
設face_recognition_comparison原型如下所示。
float face_recognition_comparison(float *feature_1, float *feature_2, int output_len)
具體介紹如下所示。
函數名:face_recognition_comparison () | |
頭文件 | face_recognition.h |
輸入參數 | feature_1: 人臉特征碼1 |
輸入參數 | feature_2:人臉特征碼2 |
返回值 | 成功返回:人臉識別相似度 |
注意事項 | 一般相似度大于0.4可以似為同一個人 |
5.5 人臉識別釋放函數
人臉識別釋放函數原型如下所示。
int face_recognition_release(rknn_context ctx)
具體介紹如下所示。
函數名:face_recognition_release () | |
頭文件 | face_recognition.h |
輸入參數 | ctx: rknn_context句柄 |
返回值 | 成功返回:0 |
失敗返回:-1 | |
注意事項 | 無 |
6. 人臉識別算法例程
例程目錄為Demos/algorithm-face_recognition/test-face-recognition.cpp,操作流程如下。
參考例程如下所示。
#include #include #include #include #include #include #include "face_detect.h" #include "face_alignment.h" #include "face_recognition.h" using namespace cv; int main(int argc, char **argv) { rknn_context detect_ctx, recognition_ctx; std::vector result1, result2; int ret; struct timeval start; struct timeval end; float time_use=0; if( argc != 3) { printf("./face_recognition_demo xxx.jpg xxx.jpgn"); return -1; } cv::Mat src_1, src_2; src_1 = cv::imread(argv[1], 1); src_2 = cv::imread(argv[2], 1); /* 人臉檢測初始化 */ printf("face detect init!n"); ret = face_detect_init(&detect_ctx, "./face_detect.model"); if( ret < 0) { printf("face_detect_init fail! ret=%dn", ret); return -1; } /* 人臉識別初始化 */ printf("face recognition init!n"); ret = face_recognition_init(&recognition_ctx, "./face_recognition.model"); if( ret < 0) { printf("face_recognition fail! ret=%dn", ret); return -1; } /* 人臉檢測執行 */ face_detect_run(detect_ctx, src_1, result1); face_detect_run(detect_ctx, src_2, result2); Point2f points1[5], points2[5]; for (int j = 0; j < (int)result1[0].landmarks.size(); ++j) { points1[j].x = (int)result1[0].landmarks[j].x; points1[j].y = (int)result1[0].landmarks[j].y; } for (int j = 0; j < (int)result2[0].landmarks.size(); ++j) { points2[j].x = (int)result2[0].landmarks[j].x; points2[j].y = (int)result2[0].landmarks[j].y; } Mat face_algin_1, face_algin_2; face_algin_1 = face_alignment(src_1, points1); face_algin_2 = face_alignment(src_2, points2); /* 人臉識別執行 */ float feature_1[512], feature_2[512]; gettimeofday(&start,NULL); face_recognition_run(recognition_ctx, &face_algin_1, &feature_1); gettimeofday(&end,NULL); time_use=(end.tv_sec-start.tv_sec)*1000000+(end.tv_usec-start.tv_usec);//微秒 printf("time_use is %fn",time_use/1000); face_recognition_run(recognition_ctx, &face_algin_2, &feature_2); float similarity; similarity = face_recognition_comparison(feature_1, feature_2, 512); printf("similarity:%fn", similarity); /* 人臉檢測釋放 */ face_detect_release(detect_ctx); /* 人臉識別釋放 */ face_recognition_release(recognition_ctx); return 0; } 審核編輯 黃宇
-
開發板
+關注
關注
25文章
5590瀏覽量
103196 -
人臉識別
+關注
關注
77文章
4071瀏覽量
83844 -
rk3576
+關注
關注
1文章
159瀏覽量
618
發布評論請先 登錄
【米爾RK3576開發板評測】+項目名稱RetinaFace人臉檢測
基于RK3576開發板的MIPI-DSI使用

評論