人脸识别-人脸建库学习:Sqlite3 的基本使用
一.创建和调用: face_feature.db
1.测试参考和配置
参考工程:https://github.com/Qengineering/Face-Recognition-Jetson-Nano
人脸识别建库需要调用其中:人脸检测(TRetina.cpp)+人脸对齐(TWarp.cpp)+人脸特征(
TArcface.cpp)。
调试:本次为方便调试,未使用参考工程中cmakelist搭建,选择qt5搭建测试工程,工程qmake.pro 配置:
QT -= guiCONFIG += c++11 console
CONFIG -= app_bundle
LIBS +=-lpthread \-fopenmp# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0#add opencv
INCLUDEPATH += /usr/local/include/opencv \$$PWD/Include/ncnn/LIBS += /usr/local/lib/libopencv_*SOURCES += \src/main_sqlit3.cpp \Common/cJSON.cpp \src/TRetina.cpp \src/TArcface.cpp \src/TWarp.cpp \HEADERS += \Common/cJSON.h \Common/CppSQLite3.h \Common/inifile.h \Common/jsonp.h \Common/sqlite3.h \$$PWD/Include/featuredb.h \$$PWD/Include/TRetina.h \$$PWD/Include/TArcface.h \$$PWD/Include/TWarp.h \#LIBS += -L$$PWD/lib/sqlite -llualibsqlite.0LIBS += $$PWD/lib/sqlite/libsqlite3.so \/home/xxx/sqlitefacedb/lib/libncnn.a \# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
2.建库目标:
db 文件存储人脸模型输出的1x128维度特征;能够支持戴口罩、不带口罩;
db 数据table 类型如:
name | int | NOMASKFEATURE | MASKFEATURE |
XXX_001 | 2 | 1X128 | 1X128 |
XXX_001 | 2 | 1X128 | 1X128 |
3.建库需要的工程搭建:
基于参考工程调用人脸检测+对其+特征提取:
TWarp Warp; //调用对其
std::vector<FaceObject> Faces; //人脸检测数据结构
const int RetinaWidth = 320;
const int RetinaHeight = 240;std::shared_ptr<TRetina> Rn(new TRetina(RetinaWidth, RetinaHeight, false)); //使用智能指针初始化和调用人脸检测
std::shared_ptr<TArcFace> ArcFace(new TArcFace());//使用智能指针初始化和调用人脸特征提取
3.Sqlite3 建立人脸库的基本使用
3.1 创建人脸数据库:
//人脸特征建库前数据存储形式,以下仅参考,对于db文件table 表中的name 和blob 输入可多中方式,如json 也可
std::vector< std::pair<std::string, cv::Mat> > fcdata ; //这里用vector+:pair的形式存储模型输出后names 和人脸的1x128维度的特征;
//如果存储一个人多个人脸可用:
std::vector< std::pair<std::string, vector<cv::Mat>> > mutilfcdata;
以文件夹下img/***1.jpg
img/***2.jpg 为例,遍历文件下所有图片使用检测+对其+特征提取fc,push进vector便于后续导入db 的table(这种方式,后续需要优化,大数据量情况不合理 )。
//创建脸部特征数据库
int getallimgfeature(string &image_dir,std::vector< std::pair<std::string, cv::Mat> > &tests)
{//获取图片数据vector<cv::String> NameFaces;cv::glob(image_dir, NameFaces);int FaceCnt=NameFaces.size();if(FaceCnt==0) {cout << "No image files[jpg] in database" << endl;return -1;}for(int i=0; i<FaceCnt; i++){string temp=NameFaces[i];std::vector<std::string> tempstring=split(temp, "/");std::vector<std::string> tempstring2=split(tempstring[tempstring.size()-1], ".");Faces.clear();cv::Mat imgs=cv::imread(temp,1);cv::Mat result_cnn;cv::resize(imgs, result_cnn, cv::Size(RetinaWidth,RetinaHeight),cv::INTER_LINEAR);Rn->detect_retinaface(result_cnn,Faces);if(Faces[0].FaceProb>0.5){//get centre aligned imagecv::Mat face_schipss = Warp.Process(result_cnn,Faces[0]); Faces[0].align_max=face_schipss;}else{cout<<"---std--create fail--:"<<endl;return -1;}cv::Mat prob_fc = ArcFace->GetFeature(Faces[0].align_max); //得到人脸特征,这里仅做测试,没有去求真实的最大人脸cv::Mat prob;normalize(prob_fc,prob,1,0,CV_MINMAX); //opencv 接口归一化string names=tempstring2[0];cout<<tempstring2[0]<<endl;tests.push_back(std::make_pair(names, prob));std::cout<<"-----fc---:"<<prob<<std::endl;}printf("tests: %d\n", tests.size());
}
3.2 Sqlite3 db 创建
当我们已获取文件夹下图像的id_names和特征后就可以使用sqlite3相关接口创建人脸数据库了,首先要建立db问价和建立table:
sqlite3 *db;char *zErrMsg = 0;int rc;char *sql;sqlite3_stmt* stmt;//打开数据库文件 rc = sqlite3_open("face_feature.db", &db);if( rc ){fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));exit(0);}else{fprintf(stdout, "Opened database successfully\n");}//创建脸部特征表sql = "CREATE TABLE FEATURES(" \ "NAME VARCHAR(256) NOT NULL," \ "NUMFEA INT NOT NULL," \ "NOMASKFACE BLOB NOT NULL," \"MASKFACE BLOB NOT NULL);";rc = sqlite3_exec(db, sql, NULL, 0, &zErrMsg);if( rc != SQLITE_OK ){fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg);}else{fprintf(stdout, "Table created successfully\n");}
当数据表建立后,我们就需要考虑按照自己table 格式导入我们用 std::vector< std::pair<std::string, ncnn::Mat> > facedata数据结构村的数据了。db table 导入的相关语法如下:
//导入前的准备语句
sqlite3_prepare(db,"INSERT INTO FEATURES (NAME,NUMFEA,NOMASKFACE,MASKFACE) VALUES(?,?,?,?);",-1,&stmt,NULL); // 导入//导入已存结构中的id 名字 在tabel 列中
sqlite3_bind_text(stmt,1,entry[i].first.c_str(),-1,SQLITE_STATIC);
//导入已存结构中有几组特征 在tabel 列中 int ,这里只是作为后续扩展一个人脸多个底库特征类型的记录
sqlite3_bind_int(stmt,2,entry[i].second.size[1]);//导入已存结构中的1x128 cv:Mat 特征 在tabel 列中NOMASKFACE--BLOB中 sqlite3_bind_blob(stmt,3,entry[i].second.data,entry[i].second.size[0]*entry[i].second.size[1]*4,SQLITE_TRANSIENT);//导入已存结构中的1x128 cv:Mat 特征 在tabel 列中MASKFACE--BLOB中 sqlite3_bind_blob(stmt,4,entry[0].second.data,entry[i].second.size[0]*entry[i].second.size[1]*4,SQLITE_TRANSIENT);
rc = sqlite3_step(stmt);
3.2 Sqlite3 db 生成后调用
当建立face_feature.db后,对于人脸识别系统来说,我们需要遍历db数据table中存储的人脸特征与输入人脸特征做1:N比较,并返回最大pred 得分和对应id name
.... 梳理测中。。。
人脸识别-人脸建库学习:Sqlite3 的基本使用相关推荐
- 虹软人脸识别 - 人脸特征数据的存取
虹软人脸识别 - 人脸特征数据的存取 文章目录 虹软人脸识别 - 人脸特征数据的存取 一.简介 二.数据库应用 1. 连接数据库 2. 建表 3. 注册人脸并保存其特征值到数据库 4. 获取人脸特征数 ...
- 人脸识别_云端人脸识别-人脸识别SDK+API-人脸识别闸机解决方案
云端人脸识别-人脸识别SDK+API-人脸识别闸机解决方案 人脸识别闸机-人脸识别闸机解决方案 软硬一体的人脸识别闸机解决方案,提升人员系统化管理的安全性与便捷性 方案构成 针对人员出入的闸机及门禁场 ...
- 人脸反光识别和读数识别_云端人脸识别-人脸识别SDK+API-人脸识别闸机解决方案...
云端人脸识别-人脸识别SDK+API-人脸识别闸机解决方案 人脸识别闸机-人脸识别闸机解决方案 软硬一体的人脸识别闸机解决方案,提升人员系统化管理的安全性与便捷性 方案构成 针对人员出入的闸机及门禁场 ...
- K210人脸识别+人脸信息存储
K210系列教程 使用MaixPy IDE开发K210 K210实现人脸识别(附代码解读) K210人脸识别+人脸信息存储 K210人脸识别+RFID录入信息 在我的上一篇博客中已经介绍了如何使用K2 ...
- 微信小程序公众号支付宝小程序的登录授权、支付、分享、人脸识别人脸核身
文章目录 一.微信小程序 1. 获取信息用户信息 2.支付 3.分享 4. 腾讯云小程序人脸核身 二.微信公众号 1.获取信息用户信息 2.支付 3. 分享(普通分享) 4.分享(vue单页面 配置分 ...
- CV之FR之MTCNN:基于TF框架利用MTCNN算法检测并对齐人脸图像进(人脸识别/人脸相似度)而得出人脸特征向量从而计算两张人脸图片距离案例应用之详细攻略
CV之FR之MTCNN:基于TF框架利用MTCNN算法检测并对齐人脸图像进(人脸识别/人脸相似度)而得出人脸特征向量从而计算两张人脸图片距离案例应用之详细攻略 目录 基于TF框架利用MTCNN算法检测 ...
- face_recognition使用:人脸识别开源python库(face_recognition是基于dlib的深度学习人脸识别库)
face_recognition实现人脸识别的思路: 1.给定想要识别的人脸的图片并对其进行编码(每个人只需要一张),并将这些不同的人脸编码构建成一个列表.编码其实就是将人脸图片映射成一个128维的特 ...
- 【论文学习】人脸识别——DeepFace:深度学习人脸识别开山之作
大家好,从今天开始就要学习人脸识别相关的知识啦,以后也会分享这一类的文章.人脸识别,必不可少的是Facebook AI研究院的这篇. 论文:DeepFace: Closing the Gap to H ...
- 京东AI:戴口罩人脸识别pytorch开源库
项目介绍 该项目是JDAI开源的基于PyTorch的人脸识别工具箱,提供了一个包括目前主流backbone和head的的training module,一个标准化的人脸识别evaluation mod ...
最新文章
- 在一个有返回值的方法中,用block回传的解决方法
- SQL Server 2008企业试用版到期,升级为企业版
- MySQL之mysql客户端工作的批处理一些使用手法
- axure web组件下载_实践干货:Axure插入图标的4种办法
- 使用各类BeanUtils的时候,切记注意这个坑!
- 万元大奖,FlyAI算法新赛事,心理卡牌目标检测
- 使用Spring容器最简单的代码姿势
- python库怎么绘画_python中的turtle库(图形绘画库)
- 根据歌曲(mp3/wav)的旋律生成它的简谱(粗略大致)
- java 生成ai矢量图,PS和AI将图片转成矢量图
- 批量给视频加水印的快速方法
- 计算机打字正确姿势,电脑打字手指的正确姿势,涨知识了
- PHP京东商城爬取网页乱码问题解决
- 详解MPO/MTP主干光纤跳线规格参数、MPO连接说明、MPO极性分类
- c jave等语言作用,编程语言的前世今生,看 Java、C、C++ 等语言的演变
- 赚钱,一定要对自己狠
- XM外汇官网 xm-cnfx.com 外汇新手交易者必备!选择交易商一定要看的7个方面
- ThinkPHP5支付宝支付(当面付)付款码ISV服务商模式
- 梦幻西游手游最多人的服务器,梦幻西游手游哪个区人多及区服选择分析
- 分享10个非常不错的封面设计模板
热门文章
- sqlserver查询字段string转数组
- HihoCoder 1634 Puzzle Game
- crontab 每天凌晨8点_关于定时执行任务:Crontab的20个例子
- python编写个人信息_Personalinformation
- 新必应(New Bing)申请教程
- 关于CLOS架构的举例 网络级 设备级 FATTREE网络 网络级CLOS 以及CLOS涉及的调度算法RR...
- php升降调_口语如何才地道?先把升调 降调弄清楚!
- 【教程】教你免费将“电影和电视”APP装上hevc扩展
- 夏天最火的几个小本生意;人人都适合去做,月入过万。丨国仁网络资讯
- c语言指针实验输出两个实根,【c语言】求方程式 ax^2+bx+c=0 的根,分别考虑:1、有两个不等的实根 2、有两个相等的实根...