50 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
from django.conf import settings
 | 
						|
import uuid
 | 
						|
import face_recognition
 | 
						|
import os
 | 
						|
from apps.hrm.models import Employee
 | 
						|
from apps.hrm.tasks import update_all_user_facedata_cache
 | 
						|
from apps.system.models import User
 | 
						|
from django.core.cache import cache
 | 
						|
 | 
						|
class HRMService:
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def face_compare_from_base64(cls, base64_data):
 | 
						|
        filename = str(uuid.uuid4())
 | 
						|
        filepath = settings.BASE_DIR +'/temp/' + filename +'.png'
 | 
						|
        with open(filepath, 'wb') as f:
 | 
						|
            f.write(base64_data)
 | 
						|
        try:
 | 
						|
            unknown_picture = face_recognition.load_image_file(filepath)
 | 
						|
            unknown_face_encoding = face_recognition.face_encodings(unknown_picture, num_jitters=2)[0]
 | 
						|
            os.remove(filepath)
 | 
						|
        except:
 | 
						|
            os.remove(filepath)
 | 
						|
            return None, '识别失败,请调整位置'
 | 
						|
 | 
						|
        # 匹配人脸库
 | 
						|
        face_datas = cache.get('face_datas')
 | 
						|
        if face_datas is None:
 | 
						|
            update_all_user_facedata_cache()
 | 
						|
            face_datas = cache.get('face_datas')
 | 
						|
        face_users = cache.get('face_users')
 | 
						|
        results = face_recognition.compare_faces(face_datas, 
 | 
						|
        unknown_face_encoding, tolerance=0.45)
 | 
						|
        for index, value in enumerate(results):
 | 
						|
            if value:
 | 
						|
                # 识别成功
 | 
						|
                user = User.objects.get(id=face_users[index])
 | 
						|
                return user, ''   
 | 
						|
        return None, '人脸未匹配,请调整位置'
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def get_facedata_from_img(cls, img_path):
 | 
						|
        try:
 | 
						|
            photo_path = settings.BASE_DIR + img_path
 | 
						|
            picture_of_me = face_recognition.load_image_file(photo_path)
 | 
						|
            my_face_encoding = face_recognition.face_encodings(picture_of_me, num_jitters=2)[0]
 | 
						|
            face_data_list = my_face_encoding.tolist()
 | 
						|
            return face_data_list, ''
 | 
						|
        except:
 | 
						|
            return None, '人脸数据获取失败请重新上传图片' |