离线识别sdk-Android版,在批量注册的时候,39张图片只能成功注册2张,并且每次批量注册时,成功的图片有时候不是固定的,试过十多次,最多只能成功2张。考虑过使用FaceDetectManager对图片集合中的图片先进行人脸检测,看是否能检测到人脸,将检测到的人脸组成一个图片集合,再进行批量注册,但是这个地方又发现使用一个for循环+FaceDetectManager,只能检测出第一张图片的人脸,其余图片均检测人脸失败。
求指教~
收藏
点赞
0
个赞
请登录后评论
TOP
切换版块
我都改成pc批量导入了
亲测休眠100毫秒的时候4张一成功,休眠150、200毫秒的时候2张一成功,休眠250毫秒40张21成功,300毫秒10张7成功。。。。。。400毫秒的时候就能全部成功了。
我也发现了这个问题,它这个应该是sdk的限制。图片是常口库的图片,都是身份证上面用的,尺寸固定。sdk里面有个检测帧率的间隔设置,但是没有用到,但是它肯定有个默认值的,所以猜测它应该是在多少ms内固定执行一次检测,就好比一个大门,固定1秒开一次,如果你数据过来太快正好门没开也就被抛弃了。我在导1000张图片的时候,成功的数值是一秒成功一条,共成功34条,耗时大概34s,导2000张图,耗时65s,成功65张。所以可以肯定的说是1s一张图片。这样也就只能加锁或进行休眠控制了,而且它的检测和成功并不是同步的,导致不确定拿到的特征是否为用于检测的那一帧的图像。
每个头像的像素值都不一样,有的符合要求,有的不符合要求,很正常
不支持markdown...
本来也想着可能是人脸图片大小不合适,做了裁剪后,也不行。
后来试着在官方demo的离线批量注册人脸的asyncImport方法中对线程做了一个休眠的处理,结果是:39张图片都可以注册成功了...
贴上一段代码:
```java
Executors.newSingleThreadExecutor().submit(new Runnable() {
@Override
public void run() {
for (int i = 0; i < files.length; i++) {
if (!importing) {
break;
}
Log.e("-------", "currentThread name: " + Thread.currentThread().getName());
String file = files[i];
boolean success = false;
File facePath = new File(batchfaceDir, file);
if (facePath.exists()) {
Bitmap bitmap = BitmapFactory.decodeFile(facePath.getAbsolutePath());
ARGBImg argbImg = FeatureUtils.getImageInfo(bitmap);
byte[] bytes = new byte[2048];
int ret = FaceSDKManager.getInstance().getFaceFeature().faceFeature(argbImg, bytes);
if (ret == FaceDetector.NO_FACE_DETECTED) {
Log.e("-------", "未检测到人脸,可能原因:人脸太小(必须大于最小检测人脸minFaceSize),"
+ "或者人脸角度太大,人脸不是朝上");
} else if (ret == 512) {
//512是什么意思???
String fileName = facePath.getName();
String userName = fileName.substring(0, fileName.indexOf('['));
String userid = fileName.substring(fileName.indexOf('[') + 1, fileName.lastIndexOf(']'));
Feature feature = new Feature();
feature.setGroupId(groupId);
// final String uid = UUID.randomUUID().toString();
feature.setUserId(userid);
feature.setFeature(bytes);
feature.setImageName(file);
User user = new User();
user.setUserId(userid);
user.setUserName(userName);
user.setGroupId(groupId);
user.getFeatureList().add(feature);
if (FaceApi.getInstance().userAdd(user)) {
success = true;
File faceDir = FileUitls.getFaceDirectory();
if (faceDir != null) {
File saveFacePath = new File(faceDir, file);
if (FileUitls.saveFile(saveFacePath, bitmap)) {
// facePath.delete();
}
}
}
try {
//因为线程不睡眠一下的话,注册失败率极高,39张图片只能成功1张或者2张
//这里睡眠一下,基本都能注册成功
Thread.sleep(700);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else if (ret == -1) {
Log.e("-------", "抽取特征失败");
} else {
Log.e("-------", "未检测到人脸");
}
}
if (success) {
successCount++;
} else {
failCount++;
Log.i("wtf", "失败图片:" + file);
}
finishCount++;
progressDisplay("总人脸数:" + totalCount + ", 完成:" +
finishCount + " 成功:" + successCount + " 失败:" + failCount);
}
importFinish();
}
});
```
检测对人脸有像素要求的,太小太大都不行的
我这里感觉也是,我做成视频流对比1:N,结果明显卡顿。之前还以为是mat转base64卡,听你这么说真有可能是搜索慢,官网倒是说蛮快的,具体原因不知道
我后来也想了想:离线怎么会有QPS限制呢?但是确实是39张图片,批量注册,成功的一般只有两张,而且两张还不是固定的,有的时候会改变。如果是批量注册,但是文件夹中只有一张的时候,一般是会成功的;若是有两张,一般会成功一张,失败一张。
1:N性能测试没有做,想着先把人脸库以公司想要的样子建立起来,然后再来测性能,但是发现批量注册好像有问题,demo也有这个问题。
不会吧,离线还有QPS。你们andorid测试过1:N性能没有?这边用windows的性能好差,几个人脸做搜索都要上1秒。难道真有QPS限制
是因为QPS默认为2的原因吗?
技术不精,求大佬指教,这个问题看了一天了...