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)
[アップデート]
すべての画像が完全に同じようにトリミングされるわけではありませんが、ここで行っていることは本当に気に入っています。私の場合、互いに重複している可能性のある画像でいっぱいのデータベースがあります(ただし、同じスキャンではないため、チェックサムが異なります)。「この画像は、数時間前に見た別の画像と非常によく似ています。それらをリンクして、理由の説明を含めてほしい」と言う方法が必要です。オートマジックである必要はありません。「むかしむかしアップロードしたこれらの 2 つの画像は関連している」と私が言う方法です。複数のイメージ (クラス イメージ) の多対多関係。– mh00h
画像が完全に複製されていない場合は、ファジー データベースとコンピューター ビジョンの分野に参入しています。これらは CS のより簡単なテーマの 1つではなく、完全な答えがこのスペースに収まらないのではないかと心配していますが、実行可能です。OpenCV には Python インターフェイスがあり、Python によって可能になる高速なプロトタイピングの恩恵を受ける種類のプロジェクトです。
その結果、私がやりたいことは、既にデータベースにある 2 つの画像が互いに重複していることをデータベースにマークすることだけです。ユーザーは、相互の重複として画像を手動でタグ付けします。モデルで多対多の関係を定義する方法がわかりません。コンピュータが重複を発見するのではなく、ユーザーが発見します。– mh00h
人間が画像を重複として分類している場合は、対称的な再帰関係を作成するだけです。再帰的な関係(それ自体と多対 1 の関係を持つオブジェクト)を作成するには、 を使用しますmodels.ManyToManyField('self')
。中間モデルは必要ありません。
duplicates = models.ManyToManyField('self', null=True)