虹软人脸识别活体检测只有Android版本的嘛 ?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了虹软人脸识别活体检测只有Android版本的嘛 ?相关的知识,希望对你有一定的参考价值。

现在开放平台单独的活体检测只有安卓版本的 刚上线的2.1集成了其他平台的 参考技术A 准备工作
1.进入 http://ai.arcsoft.com.cn/product/arcface.html 网站,注册账号并登录
2.选择需要下载的SDK版本填写下载申请,并提交
点击提交后获得APPID和SDKKey,点击下载链接下载SDK压缩包,AppID与SDKKey在后面激活时会用到,所以可以先保存下来。
下载成功后我们拿到的包结构应该是如下所示,红框标出的三个库为引擎库,也就是我们后面需要用到的库。
项目实现
包和key都已经到手,那么该如何使用这个包,来实现我们想要的活体检测呢?我发现在下载的包中有一个samplecode,这个示例代码虽然简单,但是也能足够实现我想要的效果了,因此在这里偷一下懒,直接使用虹软提供的示例代码来进行本次项目的说明。
打开示例代码的工程,我们可以看到目录结构如下,lib目录下存放jar包,jnilibs下存放so包,后面如果我们自己要写一个新的工程就要这样做了。

虹软人脸识别应用开发过程

趁空闲的一点点时间向大家分享一个好用的人脸识别的应用——来自虹软公司的人脸识别
推荐这家的产品主要有以下几个理由~
1、免费!免费!免费!
它家比较良心。人脸识别、人证核验、活体检测等等一切的sdk都是免费下载使用的- -即使商用也可以~非常适合我这种小穷人
2、根据不同操作平台提供不同的SDK
目前可下载Windows x86,x64平台(c++/Java语言)、Linux x64平台(c++/Java语言)、iOS平台(Objective-C语言)与Android arm32平台(Java语言)
3、官方针对各版本的SDK均提供了对应的Demo,下载的SDK包里面有示例代码可以参考
这里丢个地址来算了……想试用demo的可以去下:https://ai.arcsoft.com.cn/ucenter/resource/build/index.html#/demoList
除官方提供的demo以外,如需使用其它语言开发,也可以自行封装。
4、虹软的人脸识别是应用于离线开发的,因为不需要网络,所以它的识别速度较快。
只有首次激活需要联网,后面就都可以离线用了,比较方便~

好了,废话不多说,接下来就开始教大家怎样使用了。

1.首先就是去官网申请APPKEY,各种密匙,然后在下载jar包,这些就不一一给大家讲解了。注意一下,要在app的gradle里面加上这句话,不然可能会造成so库加载不了的错误。

sourceSets {   
     main {         
   jniLibs.srcDirs = [‘libs‘]       
   }    
}

2.接下来就需要进行开发了。就拿人脸检测的功能来说吧,首先需要 对引擎初始化

AFD_FSDKEngine engine1 = new AFD_FSDKEngine();   AFD_FSDKError err = engine1.AFD_FSDK_InitialFaceEngine(Config.APP_ID, Config.FD_KEY, AFD_FSDKEngine.AFD_OPF_0_HIGHER_EXT, 16, 5);

我们还需要一个集合,用来存放我们检测到的人脸

List<AFD_FSDKFace> result = new ArrayList<AFD_FSDKFace>();//新建AFD_FSDKFacejihe,用于存放识别的人脸信息 

接下来我们就可以进行人脸的检测了,但是对于照片的选取和格式是有要求的,所以我们需要对照片进行格式处理一下。

Bitmap bitmap1 = decodeImage(path1);//path是照片的路径,先选取照片,转化为bitmap   
byte[] data1 = getNv21(bitmap1);//再将bitmap转化为NV21格式的 

下面是工具类decodeImage和getNv21的代码:

//getNv21 和 decodeImage 是照片格式的转化工具    
public byte[] getNv21(Bitmap mBitmap) {       
         byte[] data = new byte[mBitmap.getWidth() * mBitmap.getHeight() * 3 / 2];        
         ImageConverter convert = new  ImageConverter();        
         convert.initial(mBitmap.getWidth(), mBitmap.getHeight(), ImageConverter.CP_PAF_NV21);      
         if (convert.convert(mBitmap, data)) {     
                Log.e("TAG", "convert ok!");     
         }   
           convert.destroy();     
        return data;   
   }  
  public static Bitmap decodeImage(String path) {    
                  Bitmap res;      
                  try {     
                        ExifInterface exif = new ExifInterface(path);          
                        int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);        
                        BitmapFactory.Options op = new BitmapFactory.Options();    
                        op.inSampleSize = 1;      
                        op.inJustDecodeBounds = false;            //op.inMutable = true;          
                        res = BitmapFactory.decodeFile(path, op);            //rotate and scale.         
                       Matrix matrix = new Matrix();        
                       if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {            
                                matrix.postRotate(90);     
                         } else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) {        
                                matrix.postRotate(180);       
                        } else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {       
                                matrix.postRotate(270);           
                         }    
                Bitmap temp = Bitmap.createBitmap(res, 0, 0, res.getWidth(), res.getHeight(), matrix, true);          
                Log.d("com.arcsoft", "check target Image:" + temp.getWidth() + "X" + temp.getHeight());      
               if (!temp.equals(res)) {         
                     res.recycle();  
                     }  
                   return temp;       
                    } catch (Exception e) {     
                         e.printStackTrace(); 
                     }   
                 return null;  
  } 

对格式进行转化完成后,就开始进行人脸的检测了。

err = engine1.AFD_FSDK_StillImageFaceDetection(data1, bitmap1.getWidth(), bitmap1.getHeight(), AFD_FSDKEngine.CP_PAF_NV21, result);        Log.e("TAG", "getBit: " + result.size()); 

我们可以查看集合result的size,来确定是否检测到人脸。 在代码的最后,一定要对初始化的引擎进行销毁处理。不然程序会因为内存问题而崩溃。 engine1.AFD_FSDK_UninitialFaceEngine(); 人脸对比是在人脸检测的基础上进行的,在一张照片上先检测到人脸的信息,然后再将人脸的信息进行比对。 List result = new ArrayList(); 上面已经介绍了,检测到的人脸信息都是存放在result的集合中的, 然后是创建两个存放人脸点位信息的类

AFR_FSDKFace face1 = new AFR_FSDKFace();
AFR_FSDKFace face2 = new AFR_FSDKFace(); 将检测到的人脸信息的点位信息存放到 face类中        
 //新建两个AFR_FSDKFace类,保存人脸特征信息                 
 AFR_FSDKFace face1 = new AFR_FSDKFace();                
  AFR_FSDKFace face2 = new AFR_FSDKFace();                //对人脸特征信息的检测               
       er = engine_camera.AFR_FSDK_ExtractFRFeature(data_image, 
                                                                                     bitmap_idcard.getWidth(),
                                                                                     bitmap_idcard.getHeight(),      
                                                                                     AFR_FSDKEngine.CP_PAF_NV21,      
                                                                                     new Rect(result_image.get(0).getRect()), 
                                                                                     result_image.get(0).getDegree(),
                                                                                     face1);           
     er = engine_camera.AFR_FSDK_ExtractFRFeature(data, 
                                                                                     wid, 
                                                                                      hei, 
                                                                                     AFR_FSDKEngine.CP_PAF_NV21, 
                                                                                     new Rect(result_fd.get(0).getRect()),
                                                                                     result_fd.get(0).getDegree(),
                                                                                     face2); 

最后的比对的相似度信息存放在score中, float score_face = score.getScore(); 我们可以通过这种方式得到 我们想要的相似度信息,最后得到的数据是float类型的。
注意:
1、在使用照片的时候,分辨率大小最好是偶数的,不然会发生未知的错误。 图像尺寸限制宽高大于0,宽度为4的倍数,YUYV/I420/NV21/NV12格式的图片高度为2的倍数,BGR24格式的图片高度不限制。
2、在进行人脸信息提取的时候,会耗时,耗时的时长,是根据设备的CPU处理能力来说的。
好了,先分享这么多,后面再慢慢写使用体会,也欢迎大家与我交流~
如果有想体验虹软人脸识别功能的,链接拿去~:虹软开放平台

以上是关于虹软人脸识别活体检测只有Android版本的嘛 ?的主要内容,如果未能解决你的问题,请参考以下文章

活体检测安卓版本SDK有没有免费的?

Android的虹软人脸识别和活体检测(附含10000个人脸图片和特征zip下载)

虹软人脸识别 - faceId及IR活体检测的介绍

听说虹软的人脸识别算法已经升级到3.0的版本了,更新了啥功能啊?

虹软人脸识别活体检测有没有用过的,效果怎么样?

我们公司要做人脸识别的考勤,哪里有免费的活体检测安卓版本SDK?可以识别真人的