前言:先说明这个不是优化人脸识别的算法,这个是解决人脸识别算法在工程运用中遇到的速度慢的问题。项目中有个需要人脸识别的功能,比较慢,学弟是这样做的,因为我目前还不懂熟悉人脸识别的算法,据学弟口述流程是这样的,用户上传的照片传到后台后,学弟调用旷视接口判断照片的可用性,如果可以的话,就再调用xx接口提取体征值,提取完体征值后保存到数据库,最后返回给用户识别的结果,目前这样有点慢。
目录
第一章 原代码(学弟写的)
1.1 controller层
接收用户上传的左、正、右脸的照片并提交给service层处理
@RequestMapping(value="/addFace",method = RequestMethod.POST)
public @ResponseBody Map<Integer,String> addFace(HttpSession session,
@RequestParam(value = "leftFace" ,required = false) MultipartFile leftFace,
@RequestParam(value = "midFace",required = false) MultipartFile midFace,
@RequestParam(value = "rightFace",required = false)MultipartFile rightFace){
String studentId = session.getAttribute("FAMILY_STUDENTID").toString();
int schoolId = Integer.parseInt(session.getAttribute("FAMILY_SCHOOLID").toString());
return faceService.uploadFace(studentId,leftFace,midFace,rightFace,schoolId);
}
1.2 service层
学弟在这里使用了FutureTask,将调用旷视接口的返回值放到了HashMap中,并在FutureTask任务结束后调用提取特征值的faceDetect,FutureTask会被提交到线程池中,最后将储存了检测结果的result返回。
private ExecutorService executor = Executors.newCachedThreadPool();
@Override
public Map<Integer,String> uploadFace(String studentId,MultipartFile left, MultipartFile mid,MultipartFile right, int schoolId){
Map<Integer,String> result = new HashMap<Integer,String>();
FutureTask ft1 = null;
FutureTask ft2 = null;
FutureTask ft3 = null;
long lefts = System.currentTimeMillis();
long mids = System.currentTimeMillis();
long rights = System.currentTimeMillis();
byte[] leftbytes;
byte[] midbytes;
byte[] rightbytes;
if(left!=null){
try {
leftbytes = left.getBytes();
String src = left.getOriginalFilename();
String prefix=src.substring(src.lastIndexOf(".")+1).toLowerCase();
//在此task中判断图片是否符合要求,把结果存到result中
FaceplusplusTask f1 = new FaceplusplusTask(leftbytes,1,result,prefix);
ft1 = n