package com.basic.analy.utils;
|
|
import java.util.ArrayList;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.concurrent.RecursiveTask;
|
|
import ch.qos.logback.core.net.SyslogOutputStream;
|
import org.apache.commons.codec.binary.Base64;
|
import org.apache.commons.lang3.StringUtils;
|
import org.apache.log4j.Logger;
|
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONObject;
|
import com.basic.analy.service.FaceSdkTool;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.http.MediaType;
|
|
public class EsThreadUtils extends RecursiveTask<List<Map<String, Object>>>{
|
|
private static final int THRESHOLD = 500;
|
private List<JSONObject> hitArray;
|
// private String resultJson;
|
/**
|
* 比对分值
|
*/
|
private long likePer;
|
/**
|
* 人脸特征值
|
*/
|
private byte[] imageData;
|
|
private Logger logger = Logger.getLogger(EsThreadUtils.class);
|
|
public EsThreadUtils(List<JSONObject> hitArray, long likePer, byte[] imageData){
|
// this.resultJson = resultJson;
|
this.hitArray =hitArray;
|
this.likePer = likePer;
|
this.imageData = imageData;
|
}
|
|
@Override
|
public List<Map<String, Object>> compute(){
|
|
List<Map<String, Object>> computedList = new ArrayList<>();
|
// if(this.resultJson != null){
|
// JSONObject resp = JSONObject.parseObject(resultJson);
|
// JSONObject hits = (JSONObject) resp.get("hits");
|
// JSONArray hites = (JSONArray)hits.get("hits");
|
// this.jsonArray =JSONArray.parseArray(hites.toJSONString(),JSONObject.class);
|
// }
|
boolean canFork = hitArray.size() <= THRESHOLD;
|
if (canFork){
|
// boolean isPrinted = false;
|
for (int i = 0,item = hitArray.size(); i <item; i++){
|
JSONObject hit = hitArray.get(i);
|
Map<String,Object> map = JSONObject.parseObject(hit.get("_source").toString(),HashMap.class);
|
String FaceFeature = (String)map.get("FaceFeature");
|
if(StringUtils.isNotEmpty(FaceFeature) && !FaceFeature.startsWith("base64")){
|
// byte[] feature = Base64Utils.Base64Tobyte(FaceFeature);
|
byte[] feature = Base64.decodeBase64(FaceFeature);
|
// long compareStartTime = System.nanoTime();
|
if(feature.length == 2560){
|
Float num= FaceSdkTool.compareFeature(this.imageData, feature);
|
//logger.info(Math.round(num*100)+"num--------------");
|
// if(!isPrinted){
|
// isPrinted = true;
|
// logger.info("比对得分:"+ num +"调用jni比对耗时:"+(System.nanoTime()-compareStartTime));
|
// }
|
|
if(Math.round(num*100) < this.likePer){ //小于比对分值的数据丢弃
|
continue;
|
}
|
map.put("likePer",Math.round(num*100));
|
String baseName = (String) map.get("BaseName");
|
if(baseName!=null&&baseName.startsWith("lt_")){
|
map.put("BaseName", baseName.substring(3));
|
}
|
Object age = map.get("Age");
|
if(age!=null){
|
int agei = -1;
|
try {
|
agei = (Integer)age;
|
} catch (ClassCastException e){
|
agei = Integer.valueOf((String)age);
|
}
|
if(agei>0 && agei < 7){
|
age ="童年";
|
}else if(agei>=7 && agei < 18){
|
age ="少年";
|
}else if(agei>=18 && agei < 40){
|
age ="青年";
|
}else if(agei>=40 && agei < 65){
|
age ="中年";
|
}else if(agei>= 65){
|
age ="老年";
|
}
|
}
|
map.put("Age",age);
|
map.put("timeDay",((String)map.get("picDate")).substring(0,10));
|
// map.put("likePer",Math.round(Math.random()*100));
|
// currentList.add(map);
|
// EsThreadUtils.getCurrentList().add(map);
|
// sum++;
|
computedList.add(map);
|
}else{
|
logger.info("feature.length:"+feature.length+",_id:"+map.get("_id"));
|
}
|
|
}
|
}
|
}else {
|
// 分成step个小任务
|
long step = (hitArray.size()-1)/THRESHOLD+1;
|
ArrayList<EsThreadUtils> subTasks = new ArrayList<EsThreadUtils>();
|
int pos=0;
|
for (int i = 0; i < step; i++){
|
int start = pos ;
|
int end = start+THRESHOLD;
|
if (end > hitArray.size())
|
end = hitArray.size();
|
EsThreadUtils subTask = new EsThreadUtils(hitArray.subList(start, end), this.likePer, this.imageData);
|
pos = end;
|
subTasks.add(subTask);
|
subTask.fork();
|
}
|
|
for (EsThreadUtils t : subTasks) {
|
List<Map<String, Object>> taskResultList = t.join();
|
for(Map taskMap : taskResultList){
|
computedList.add(taskMap);
|
}
|
}
|
}
|
return computedList;
|
}
|
public static void main(String[] args) {
|
/*SearchServiceImpl impl = new SearchServiceImpl();
|
Long start = System.currentTimeMillis();
|
System.out.println("开始!"+start);
|
|
List<Map<String, Object>> searchScrollData = impl.searchScrollData("videopersons", null,
|
"2016-10-11 12:30:12","2019-10-11 12:30:12","picDate");
|
ElasticSearchUtil.closeClient();
|
Long end = System.currentTimeMillis();
|
System.out.println("借宿!"+end+";用时:"+(end-start)+"size:"+searchScrollData.size());
|
*/
|
|
}
|
|
// public List<JSONObject> getJsonArray() {
|
// return jsonArray;
|
// }
|
// public void setJsonArray(List<JSONObject> jsonArray) {
|
// this.jsonArray = jsonArray;
|
// }
|
// public String getResultJson() {
|
// return resultJson;
|
// }
|
// public void setResultJson(String resultJson) {
|
// this.resultJson = resultJson;
|
// }
|
//
|
// public long getLikePer(){
|
// return this.likePer;
|
// }
|
|
|
}
|