Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用自定义函数在django向量模型中搜索_Python_Django_Django Models - Fatal编程技术网

Python 使用自定义函数在django向量模型中搜索

Python 使用自定义函数在django向量模型中搜索,python,django,django-models,Python,Django,Django Models,我正在使用django进行人脸识别应用程序,我需要将人脸描述符保存在djangomodel中,然后检索它们并与新图像的向量进行比较,然后在数据库中获得与新向量存储最接近的模型 简而言之 我有一个人物模型 每个模型都有一个表示向量的文本字段 我有一个函数compare(vec1,vec2),它将两个向量作为 并返回它们之间的距离 我有一个新的向量(不在数据库中) 我需要在模型上应用compare函数并检索 他的向量场与新向量场的最小距离 载体 因此,首先,您可能需要自定义查询集,而不是自定义管理

我正在使用django进行人脸识别应用程序,我需要将人脸描述符保存在djangomodel中,然后检索它们并与新图像的向量进行比较,然后在数据库中获得与新向量存储最接近的模型

简而言之

  • 我有一个人物模型
  • 每个模型都有一个表示向量的文本字段
  • 我有一个函数compare(vec1,vec2),它将两个向量作为 并返回它们之间的距离
  • 我有一个新的向量(不在数据库中)
  • 我需要在模型上应用compare函数并检索 他的向量场与新向量场的最小距离 载体

因此,首先,您可能需要自定义查询集,而不是自定义管理器。让我简单地解释一下两者之间的区别:在这两种情况下,目标都是允许执行类似于
Person.objects.my_custom_method()
的操作,但如果使用自定义管理器,则只能直接使用它,而如果使用自定义查询集,则可以将chained与返回查询集的其他查询集方法一起使用,例如
Person.objects.filter(country\u iso\u code2='US').my\u custom\u method()
,这可能对您的应用程序有所帮助

对于您的问题,您需要一个自定义方法,允许您获取所有用户向量,将这些向量与给定向量进行比较,并根据您的距离返回最接近的向量,因此该方法应将要比较的向量作为参数,并返回最接近的人的实例。我会这样写:

创建managers.py字段,在其中编写自定义查询集和管理器:

class PersonQueryset(models.QuerySet):
    def get_closest_user(self, input_vector):
        for person in self:    
            # this is a loop over every person in your database unless the qs is filtered
            current_dist = compare(input_vector, person.vector)
            if best_dist is None or current_dist < best_dist:
                best_dist = current_dist
                closest_person = person
        return closest_person, best_dist

class PersonManager(models.Manager):
    def get_queryset(self):
        return PersonQuerySet(self.model, using=self.db)

    def get_closest_user(self, input_vector):
        return self.get_queryset().get_closest_user(input_vector)
完成这些修改后,当您需要获取person时,您只需调用
person.objects.get\u closest\u user(输入向量)


请注意,给定您的用例,您可能会发现自己处于计算量非常大的情况下,因此您可能希望使用更复杂的方法来过滤您的请求,而不必计算整个数据库上的距离。限制计算的一个好方法是使用。直接修改查询集以实现这种逻辑。

此逻辑可能应该使用自定义查询集或管理器来实现:@Raynaud我试图阅读有关管理器的内容,但找不到如何实现。如果这对您来说不太合适,您能告诉我如何实现吗。我将用伪代码编写一个更全面的响应。谢谢非常感谢您的详细回复,我将在明天试一试(无法在我的电脑上试一试)。但是对于LHS,我不需要计算每个向量的哈希码吗?在计算方面不是一样吗?除非我可以在queryset中使用另一个模型,以便将哈希保存在单独的模型中(作为哈希表),并使用一对多关系引用它。抱歉,如果这个问题有点奇怪,因为我是新来的django,我只知道创建一个简单网站的基础知识。
from .managers import PersonManager
class Person(models.Model):
    # Manager
    objects = PersonManager()
    (...) # your code for the class Person.