1

imagedjango アプリケーションでは、models.pyのクラスにすべて分類された画像のデータベースを作成します。残念ながら、これらの画像の一部が互いに重複している可能性があるため、これらの重複画像にタグを付けることができるアプリケーションを (部分的に) 作成したいと考えています。このようなデータベースのセットアップは初めてなので、これを my に実装する最良の方法は何models.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?
4

2 に答える 2

2

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)           
于 2013-07-14T21:22:10.797 に答える
1

さて、画像処理にいくつかのライブラリを使用できます: これらのリンクは役に立つかもしれません: http://atodorov.org/blog/2013/05/17/linux-and-python-tools-to-compare-images

画像処理、Python で?

于 2013-07-14T12:22:21.030 に答える