You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 05:22:42