Python 将图像模型与相似图像关联
在django应用程序中,我将拥有一个图像数据库,所有图像都分类在mymodels.py中的Python 将图像模型与相似图像关联,python,mysql,django,python-2.7,django-models,Python,Mysql,Django,Python 2.7,Django Models,在django应用程序中,我将拥有一个图像数据库,所有图像都分类在mymodels.py中的image类下。不幸的是,有些图像可能是彼此的重复,我想编写一个应用程序,允许我标记这些重复的图像。对于这样的数据库设置来说是新手,在mymodels.py中实现这一点的最佳方法是什么 我的models.py如下所示: class duplicate(models.Model): #some kind of code goes here? #perhaps... models.Im
image
类下。不幸的是,有些图像可能是彼此的重复,我想编写一个应用程序,允许我标记这些重复的图像。对于这样的数据库设置来说是新手,在mymodels.py中实现这一点的最佳方法是什么
我的models.py
如下所示:
class duplicate(models.Model):
#some kind of code goes here?
#perhaps...
models.ImageField(upload_to='directory/') #not uploading a new image here- just want to link it to a database full of images somehow?
class image(models.Model):
image = models.ImageField(upload_to='directory/')
duplicate = models.ManyToManyField(duplicate, null=True) #is this the correct way to do this?
好吧,您可以使用一些lib来处理图像:这些链接可能很有用:
您可以破解Model.save/delete方法将图像名称和校验和存储在数据库中,然后您可以使用一种方法计算具有相同校验和的图像数量
未经测试,只是为了让您从正确的方向开始:
class ImageAccounting(models.Model):
fk = models.IntegerField()
model_name = models.CharField(max_length=100)
md5 = models.CharField(max_length=32)
class SomeModel(models.Model)
...
image = models.ImageField(upload_to='somewhere')
...
def image_signature(self):
md5 = hashlib.md5(self.image.file.read()).hexdump()
model_name = self.__name__
return md5, model_name
def save(self, *args, *kwargs):
super(SomeModel, this).save(*args, **kwargs)
md5, model_name = self.image_signature()
try:
i = ImageAccounting.objects.get(fk=self.pk, md5=md5, model_name=model_name)
except ImageAccounting.DoesNotExist:
i = ImageAccounting(fk=self.pk, md5=md5, model_name=model_name)
i.save()
def delete(self, *args, **kwargs):
super(SomeModel, this).delete(*args, **kwargs)
md5, model_name = self.image_signature()
ImageAccounting.objects.filter(fk=self.pk, md5=md5, model_name=model_name)\
.delete()
def copies(self):
md5, _ = self.image_signature()
return ImageAccounting.objects.filter(md5=md5)
[更新]
并不是所有的图片都会被裁剪得完全一样,但我真的很喜欢我们要去的地方。在我的例子中,我有一个数据库,其中充满了可能相互重复的图像(但不是相同的扫描,因此它们的校验和不同)。我需要一种方式来说,“这张图片看起来和我几个小时前看到的另一张非常相似。我希望它们被链接起来,并包括原因的描述。”这不一定是automagic,只是一种方式让我说“我曾经上传的这两张图片是相关的。”如果你愿意的话,多张图片之间有很多关系(类图像)。–mh00h
如果图像不是完全重复的,那么我们就进入了模糊数据库和计算机视觉领域。这些都不是CS的简单主题,我担心完整的答案不适合这个领域,但它是可行的——有一个Python接口,这是一个受益于Python支持的快速原型设计的项目
因此,我只想在我的数据库中标记两个已经存在于数据库中的图像是彼此的副本。用户将手动将这些图像标记为彼此的副本。我只是不知道如何定义模型中的多对多关系。计算机不会发现副本,用户会发现。–mh00h
如果人类将图像分类为重复图像,您只需创建一个对称的递归关系。要创建一个对象(一个与自身具有多对一关系的对象),请使用模型。ManyToManyField('self')
,不需要中间模型:
duplicates = models.ManyToManyField('self', null=True)
虽然很高兴知道,但我的问题更多的是如何实现django数据库后端,以便手动标记已导入的图像。您可以破解Model.save/delete方法,将图像名称和校验和存储在数据库中,然后您可以使用一种方法计算具有相同校验和的图像数量。不是所有的图像将被裁剪得完全一样,但我真的很喜欢我们要去的地方。在我的例子中,我有一个数据库,其中的图像可能彼此重复(但不是相同的扫描,因此它们的校验和不同)。我需要一种方式来说,“这张图片看起来与我几个小时前看到的另一张图片非常相似。我希望将它们链接起来,并说明原因。”这不一定是automagic,我只是想说“我曾经上传的这两张图片是相关的。”如果你愿意的话,多张图片之间有很多关系(类图片
).没错。因此,我只想在我的数据库中标记两个已经存在于数据库中的图像是彼此的副本。用户将手动标记这些图像为彼此的副本。我只是不知道如何定义模型中的多对多关系。计算机不会发现重复的图像,而是用户请参阅有关如何包装递归关系的更新。