前端自定义tolerance

This commit is contained in:
caoqianming 2022-04-22 14:36:13 +08:00
parent 74efc14911
commit f20756ec6d
4 changed files with 21 additions and 17 deletions

View File

@ -23,9 +23,11 @@ class FaceLoginSerializer(serializers.Serializer):
class FaceLoginPathSerializer(serializers.Serializer): class FaceLoginPathSerializer(serializers.Serializer):
path = serializers.CharField() path = serializers.CharField()
tolerance = serializers.FloatField(required=False, default=0.45)
class FaceClockCreateSerializer(serializers.Serializer): class FaceClockCreateSerializer(serializers.Serializer):
base64 = serializers.CharField() base64 = serializers.CharField()
tolerance = serializers.FloatField(required=False, default=0.45)
class ClockRecordListSerializer(serializers.ModelSerializer): class ClockRecordListSerializer(serializers.ModelSerializer):
create_by_ = UserSimpleSerializer(source='create_by', read_only=True) create_by_ = UserSimpleSerializer(source='create_by', read_only=True)

View File

@ -10,7 +10,7 @@ from django.core.cache import cache
class HRMService: class HRMService:
@classmethod @classmethod
def face_compare_from_path(cls, path): def face_compare_from_path(cls, path, tolerance=0.45):
filepath = settings.BASE_DIR +path filepath = settings.BASE_DIR +path
try: try:
unknown_picture = face_recognition.load_image_file(filepath) unknown_picture = face_recognition.load_image_file(filepath)
@ -27,16 +27,23 @@ class HRMService:
face_datas = cache.get('face_datas') face_datas = cache.get('face_datas')
face_users = cache.get('face_users') face_users = cache.get('face_users')
results = face_recognition.compare_faces(face_datas, results = face_recognition.compare_faces(face_datas,
unknown_face_encoding, tolerance=0.46) unknown_face_encoding, tolerance=tolerance)
for index, value in enumerate(results): user_index = cls.get_user_index(results)
if value: user_index_len = len(user_index)
# 识别成功 if user_index_len == 1:
user = User.objects.get(id=face_users[index]) user = User.objects.get(id=face_users[user_index[0]])
return user, '' return user, ''
return None, '人脸未匹配,请调整位置' elif user_index_len == 0:
return None, '人脸未匹配,请调整位置'
else:
user_ids = []
for i in user_index:
user_ids.append(face_users[i])
user_name_str = ','.join(list(User.objects.filter(id__in=user_ids).values_list('name', flat=True)))
return None, '匹配多张人脸:' + user_name_str
@classmethod @classmethod
def face_compare_from_base64(cls, base64_data): def face_compare_from_base64(cls, base64_data, tolerance=0.45):
filename = str(uuid.uuid4()) filename = str(uuid.uuid4())
filepath = settings.BASE_DIR +'/temp/' + filename +'.png' filepath = settings.BASE_DIR +'/temp/' + filename +'.png'
with open(filepath, 'wb') as f: with open(filepath, 'wb') as f:
@ -56,12 +63,7 @@ class HRMService:
face_datas = cache.get('face_datas') face_datas = cache.get('face_datas')
face_users = cache.get('face_users') face_users = cache.get('face_users')
results = face_recognition.compare_faces(face_datas, results = face_recognition.compare_faces(face_datas,
unknown_face_encoding, tolerance=0.46) unknown_face_encoding, tolerance=tolerance)
for index, value in enumerate(results):
if value:
# 识别成功
user = User.objects.get(id=face_users[index])
return user, ''
user_index = cls.get_user_index(results) user_index = cls.get_user_index(results)
user_index_len = len(user_index) user_index_len = len(user_index)
if user_index_len == 1: if user_index_len == 1:

View File

@ -159,7 +159,7 @@ class FaceLogin(CreateAPIView):
""" """
人脸识别登录 人脸识别登录
""" """
base64_data = base64.urlsafe_b64decode(tran64(request.data.get('base64').replace(' ', '+'))) base64_data = base64.urlsafe_b64decode(tran64(request.data.get('base64').replace(' ', '+')), request.data.get('tolerance', 0.45))
user, msg = HRMService.face_compare_from_base64(base64_data) user, msg = HRMService.face_compare_from_base64(base64_data)
if user: if user:
refresh = RefreshToken.for_user(user) refresh = RefreshToken.for_user(user)
@ -198,7 +198,7 @@ class FacePathLogin(CreateAPIView):
""" """
人脸识别登录-文件地址 人脸识别登录-文件地址
""" """
user, msg = HRMService.face_compare_from_path(request.data.get('path')) user, msg = HRMService.face_compare_from_path(request.data.get('path'), request.data.get('tolerance', 0.45))
if user: if user:
refresh = RefreshToken.for_user(user) refresh = RefreshToken.for_user(user)
# 可设为在岗 # 可设为在岗

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB