Android NDK开发:SeetaFace2人脸识别算法简介
2019-08-26 本文已影响0人
itfitness
目录
SeetaFace2简介
SeetaFace2是中科院在2016年9月开源SeetaFace1.0人脸识别引擎之后的第二代人脸识别算法,SeetaFace2包含了完整的人脸检测、面部关键点定位和人脸特征提取与比对模块,还将陆续开源人脸跟踪、闭眼检测等辅助模块。SeetaFace2所有算法提供全部源代码、注释、接口文档以及样例程序,以帮助开发者快速基于SeetaFace2开发应用。
SeetaFace2采用标准C++开发,全部模块均不依赖任何第三方库,支持x86架构(Windows、Linux)和ARM架构(Android)。SeetaFace2支持的上层应用包括但不限于人脸门禁、无感考勤、人脸比对等。
SeetaFace2是面向于人脸识别商业落地的里程碑版本,其中人脸检测模块在FDDB上的100个误检条件下可达到超过92%的召回率,面部关键点定位支持5点和81点定位,1比N模块支持数千人规模底库的人脸识别应用。
与2016年开源的SeetaFace1.0相比,SeetaFace2在速度和精度两个层面上均有数量级的提升。
引入项目
●下载SDK和模型
文件下载地址:https://github.com/seetaface/SeetaFaceEngine2/blob/master/attachment/android/README.md
这里面包含的有:
headers:提供的SDK相关的类
libraries::4个.so库
model:3个一.ats结尾的文件,提供的训练好的人脸检测、识别、和特征点的模型
●将SDK导入项目
这里由于提供的SDK类里的JNI方法对应的包名必须为(com.seeta.sdk),所以我们需要新建一个library的Module。
然后将headers里面提供的java类拷贝进去。
接下来需要将libraries中的4个so库拷贝到app Module的libs目录下。
最后需要配置下app.gradle文件。
android {
compileSdkVersion 28
buildToolsVersion "29.0.1"
defaultConfig {
applicationId "com.itfitness.seetaface2"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
//这里需要加上abiFilters 'armeabi-v7a'不能多不能少
ndk {
abiFilters 'armeabi-v7a'
}
//===============================================
}
//======指定jniLibs目录========
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
//===============================
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
//将你新建的library添加到项目中
implementation project(path: ':seetalibrary')
//===========================
}
●将模型写到SD卡中
这里我是将模型文件放到了assets文件夹中,然后通过工具类将模型文件写到SD卡中。
工具类如下:
public class FileUtil {
/**
*
* @param context 上下文对象
* @param oldPath assets目录中要拷贝的文件名
* @param newPath 放到SD卡中的文件名
*/
public static void CopyAssets(Context context, String oldPath, String newPath) {
try {
String fileNames[] = context.getAssets().list(oldPath);// 获取assets目录下的所有文件及目录名
if (fileNames.length > 0) {// 如果是目录
File file = new File(newPath);
file.mkdirs();// 如果文件夹不存在,则递归
for (String fileName : fileNames) {
CopyAssets(context, oldPath + "/" + fileName, newPath + "/" + fileName);
}
} else {// 如果是文件
InputStream is = context.getAssets().open(oldPath);
FileOutputStream fos = new FileOutputStream(new File(newPath));
byte[] buffer = new byte[1024];
int byteCount = 0;
while ((byteCount = is.read(buffer)) != -1) {// 循环从输入流读取
// buffer字节
fos.write(buffer, 0, byteCount);// 将读取的输入流写入到输出流
}
fos.flush();// 刷新缓冲区
is.close();
fos.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
●添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>