Hallo zusammen,
ich arbeite seit längerem an meinem eigenen machine learning Datensatz aus Bildern. Jetzt habe ich schon relativ viele Bilder(50.000 Bilder). Nun sind in dem Datensatz viele doppelte Bilder vorhanden die ich aussortieren will. Gibt es da eine Lösung die schnell auszusortieren die nicht sehr grafikintensive ist, denn ich habe nur einen alten Laptop.
VG
Julius
Doppelte Bilder finden
Das ist... hüstel so eine Sache. Einfache Duplikate von Dateien finden, kann schon ziemlich... tricky sein, denn so eine Datei kann ja viele Attribute haben.SAOJulius hat geschrieben: ↑Freitag 11. März 2022, 22:39 ich arbeite seit längerem an meinem eigenen machine learning Datensatz aus Bildern. Jetzt habe ich schon relativ viele Bilder(50.000 Bilder). Nun sind in dem Datensatz viele doppelte Bilder vorhanden die ich aussortieren will. Gibt es da eine Lösung die schnell auszusortieren die nicht sehr grafikintensive ist, denn ich habe nur einen alten Laptop.
Attribute, die mir spontan einfallen, könnten der Dateiname (wenn sie in verschiedenen Verzeichnissen liegen), das Erstellungsdatum und die Dateigröße sein. Trotzdem könnten Dateien denselben Namen, dasselbe Datum, und dieselbe Dateigröße haben... genau. Und trotzdem könnten es trotz Unterschieden dieselben Dateien sein... genau: oder auch nicht.
Man muß da einfach die Realitäten sehen: sogar dann, wenn Du dasselbe Bild mit denselben Algorithmen oder Bibliotheken -- oder sogar denselben Bibliotheken in unterschiedlichen Versionen -- komprimierst, kommen verschiedene Dateien heraus. Veränderst Du ein einziges Pixel in dem Bild, sind es (womöglich, sicher ist das nicht) verschiedene Dateien -- sogar dann, wenn die Dateien byteweise Unterschiede haben, können alle vorher genannten Attribute dieselben sein. Trotzdem wären es verschiedene Dateien...
Wenn Du wirklich auf 1:1-Duplikate gehen willst, da gibt es eine Reihe von Möglichkeiten, die mit einem alten Laptop aber... keinen Spaß machen. Aber Ansätze mit Machine Learning, die auch Ausschnitte von Bildern oder Ähnliches erkennen können, bei 50k Bildern... das würde nicht einmal auf meinem relativ dicken Desktop Spaß machen. Für sowas gibt es Compute Cluster, und auch dann ist das nichts, was man mal nebenbei macht.
Diese Thematik kann einfach oder auch komplex gelöst werden.
Deine "doppelten" Bilder, sind die denn Byteidentisch, d.h. die Dateien wurden kopiert?
Dann kannst du mit einem De-Duplizierer, ich empfehle hier die Freeware AllDup https://alldup.info/index.php , diese Dateien finden.
Das Programm bietet mittlerweile auch eine Suche nach ähnlichen Bildern an.
Die komplexe Lösung erschließt sich dir, wenn du mal diese Google Suche hier verwendest:
https://www.google.de/search?q=finding+ ... p+learning
Da gibt es so viele Lösungsansätze, da fehlt mir die Zeit, die alle hier aufzulisten.
Deine "doppelten" Bilder, sind die denn Byteidentisch, d.h. die Dateien wurden kopiert?
Dann kannst du mit einem De-Duplizierer, ich empfehle hier die Freeware AllDup https://alldup.info/index.php , diese Dateien finden.
Das Programm bietet mittlerweile auch eine Suche nach ähnlichen Bildern an.
Die komplexe Lösung erschließt sich dir, wenn du mal diese Google Suche hier verwendest:
https://www.google.de/search?q=finding+ ... p+learning
Da gibt es so viele Lösungsansätze, da fehlt mir die Zeit, die alle hier aufzulisten.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Definiere doppelt, wie schon geschrieben, wenn die bearbeitet wurden, ist es schwer, aber wenn es wirklich einfach nur Kopien sind, hast du eine Chance.
Ich sage mal, Stumpf ist Trumpf, einfach einen schnellen Hash wert über jedes Bild berechnen und den Hash mit den Dateinamen speichern, jetzt nur noch die gleichen Hash werte finden und du hast einen ersten verdacht welche Bilder gleich sein könnten. Wenn du nun in einem zweiten Schritt über die Doppelten Hashvalues nochmal einen anderen Hash Algorithmus laufen lasst und der kommt auch zum Ergebnis ist gleich, dann hast du die 1:1 Kopien gefunden.
Wichtig der erste Hash Algorithmus sollte schnell gehen, dafür kannst du gerne Hash Kollisionen in Kauf nehmen. Der zweite, Durchgang berechnet nur noch ein Bruchteil der Bilder. Hier solltest du einen Algorithmus vorziehen, der möglichst kollisionsfrei ist, aber dafür darf er aufwändiger rechnen.
Es gibt auch Hashfunktionen wie `pHash`, die speziell auf Bilder ausgelegt sind und „visuell“ hashen, sodass kleine Unterschiede (unterschiedliche Metadaten, unterschiedliche Kompressionsstufen bei JPEG, Bildrauschen) nicht dazu führen, dass man komplett unterschiedliche Hashes bekommt.
Die Bilder habe ich durch eine Web scraper aus dem Internet heruntergeladen ich weiß also nicht welche Bilder ich doppelt heruntergeladen habe und welche Bilder gleich sind mit einer anderen Auflösung. Würde es vielleicht etwas bringen wenn ich mir einfach einen PC mit einer gescheiten GPU zu lege? Habe das ganze schon mit 20 bis 30 Bildern mit der difpy library geschafft aber sobald ich mehr Bilder nehme (ungefähr 500)dauert das viel zu lange.
Was sind bei dir "Viele Doubletten"?
Wegen ein paar Doubletten im Dataset braucht man sich keinen Kopf
zu machen.Das ist bei großen Datasets eher der Normalfall und spielt
für das Training nicht wirklich eine Rolle.Wenn man den Eindruck hat
es gibt zuviele Doubletten bei den Rohdaten, geht man mit den bereits
erwähnten Hashwerten kurz drüber und mistet den gröbsten Kram aus.
Mehr ist da eigentlich nicht notwendig.d.h. wenn da ein paar Doubletten
übrigbleiben....geschenkt.
Hat man trotzdem das Gefühl die Vielfalt des Datasets ist wegen der
Doubletten zu gering, der Algorithmus "lernt" damit zu wenig und man
sollte unbedingt etwas für die Verbesserung der Trainingsqualität tun,
dafür gibt es andere Wege. z.B. Dropout
https://de.wikipedia.org/wiki/Dropout_( ... ales_Netz)
Dropout ist ja speziell dafür gedacht, aus möglichst wenig Trainingsdaten
eine größtmögliche Trainingsvielfalt und bestmögliche Trainingsqualität
herauszukitzeln.....und das funktioniert sogar recht gut.
d.h.
Man muß da auch nicht unbedingt irgendwelche Monsterdatasets trainieren
wollen.Weniger kann da durchaus mehr sein.
Wegen ein paar Doubletten im Dataset braucht man sich keinen Kopf
zu machen.Das ist bei großen Datasets eher der Normalfall und spielt
für das Training nicht wirklich eine Rolle.Wenn man den Eindruck hat
es gibt zuviele Doubletten bei den Rohdaten, geht man mit den bereits
erwähnten Hashwerten kurz drüber und mistet den gröbsten Kram aus.
Mehr ist da eigentlich nicht notwendig.d.h. wenn da ein paar Doubletten
übrigbleiben....geschenkt.
Hat man trotzdem das Gefühl die Vielfalt des Datasets ist wegen der
Doubletten zu gering, der Algorithmus "lernt" damit zu wenig und man
sollte unbedingt etwas für die Verbesserung der Trainingsqualität tun,
dafür gibt es andere Wege. z.B. Dropout
https://de.wikipedia.org/wiki/Dropout_( ... ales_Netz)
Dropout ist ja speziell dafür gedacht, aus möglichst wenig Trainingsdaten
eine größtmögliche Trainingsvielfalt und bestmögliche Trainingsqualität
herauszukitzeln.....und das funktioniert sogar recht gut.
d.h.
Man muß da auch nicht unbedingt irgendwelche Monsterdatasets trainieren
wollen.Weniger kann da durchaus mehr sein.