Django人脸识别考勤系统TypeError错误:__call__参数不兼容求助
解决人脸识别考勤系统中的TypeError问题
错误原因
你遇到的TypeError核心是人脸编码的存储与读取逻辑错误:
- 注册环节中,
face_recognition.face_encodings()返回的是numpy数组,直接存入TextField会被自动转为字符串格式(如"0,0,0,...") - 识别环节中,你错误地将这个字符串传给
face_recognition.face_encodings()——该函数要求传入图像数组,而非编码字符串,因此触发类型不兼容错误。
修复方案
1. 修改注册逻辑:正确存储人脸编码
注册时需将numpy数组转换为可序列化的JSON字符串,再存入数据库:
# 导入必要模块 import json import numpy as np def register(request): if request.method == 'POST': name = request.POST.get('name', '') email = request.POST.get('email', '') image_file= request.FILES.get('image', None) if not image_file: messages.error(request, '请上传人脸图像') return render(request, 'register.html') image = face_recognition.load_image_file(image_file) face_encodings_list = face_recognition.face_encodings(image) if not face_encodings_list: messages.error(request, '未检测到人脸') return render(request, 'register.html') # 将numpy数组转为列表,再序列化为JSON字符串存储 face_encoding_json = json.dumps(face_encodings_list[0].tolist()) user = User(name=name, email=email, face_encodings=face_encoding_json) user.save() messages.success(request, '用户注册成功') return render(request, 'register.html') return render(request, 'register.html')
2. 修改识别逻辑:正确读取并比对人脸编码
识别时直接将存储的JSON字符串转回numpy数组,无需再调用face_recognition.face_encodings()(该函数用于从图像提取编码,我们已存储编码直接使用即可):
def recognize(request): if request.method == 'POST': image_file = request.FILES.get('image', None) if not image_file: return JsonResponse({'status': 'error', 'message': '请上传人脸图像'}) image = face_recognition.load_image_file(image_file) input_face_encodings = face_recognition.face_encodings(image) recognized_users = [] for input_encoding in input_face_encodings: users = User.objects.all() for user in users: if not user.face_encodings: continue # 将JSON字符串转回numpy数组 user_encoding = np.array(json.loads(user.face_encodings)) # 直接计算人脸距离并判断匹配度 distance = face_recognition.face_distance([user_encoding], input_encoding)[0] if distance < 0.6: recognized_users.append({'name': user.name, 'email': user.email}) return JsonResponse({'status': 'success', 'recognized_users': recognized_users}) return render(request, 'recognize.html')
3. 可选优化:数据库字段规范调整
若你的Django版本≥3.1,可将TextField替换为JSONField,简化JSON格式的存储与读取:
# models.py from django.db import models class User(models.Model): name = models.CharField(max_length=255) email = models.EmailField() face_encodings = models.JSONField(null=True, default=None)
使用JSONField时,注册环节可直接存储numpy数组转成的列表(无需手动序列化JSON),识别环节直接读取列表再转为numpy数组即可。
内容的提问来源于stack exchange,提问作者Rabin ghimire
相关产品推荐
相关产品推荐

