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