Odcisk palca obrazu do porównania podobieństwa wielu obrazów


95

Muszę utworzyć odciski palców wielu obrazów (około 100 000 istniejących, 1000 nowych dziennie, RGB, JPEG, maksymalny rozmiar 800x800), aby bardzo szybko porównać każdy obraz z każdym innym. Nie mogę użyć binarnych metod porównywania, ponieważ powinny zostać rozpoznane również obrazy, które są prawie podobne.

Najlepsza byłaby istniejąca biblioteka, ale również kilka wskazówek dotyczących istniejących algorytmów bardzo by mi pomogło.


1
Język, w którym powinna pracować biblioteka?
Ben S

Odpowiedzi:


57

Zwykłe algorytmy haszowania lub obliczania CRC nie działają dobrze z danymi obrazu. Należy wziąć pod uwagę wymiarowy charakter informacji.

Jeśli potrzebujesz wyjątkowo solidnych odcisków palców, takich jak transformacje afiniczne (skalowanie, obrót, translacja, odwracanie), możesz użyć transformacji Radona na źródle obrazu, aby utworzyć normatywne mapowanie danych obrazu - przechowuj to z każdym obrazem i następnie porównaj tylko odciski palców. To złożony algorytm, który nie jest przeznaczony dla osób o słabym sercu.

możliwych jest kilka prostych rozwiązań:

  1. Utwórz histogram jasności dla obrazu jako odcisk palca
  2. Utwórz pomniejszone wersje każdego obrazu jako odcisk palca
  3. Połącz technikę (1) i (2) w podejście hybrydowe w celu poprawy jakości porównania

Histogram jasności (szczególnie taki, który jest podzielony na komponenty RGB) to rozsądny odcisk palca dla obrazu - i można go wdrożyć dość wydajnie. Odejmowanie jednego histogramu od drugiego utworzy nowy historgram, który możesz przetworzyć, aby zdecydować, jak podobne są dwa obrazy. Histogramy, ponieważ jedyni oceniają rozkład i występowanie informacji o jasności / kolorze całkiem dobrze radzą sobie z transformacjami afinicznymi. Jeśli skwantyzujesz informacje o jasności każdego składnika koloru do wartości 8-bitowej, 768 bajtów pamięci wystarczy na odcisk palca obrazu o niemal każdym rozsądnym rozmiarze. Histogramy jasności dają fałszywe negatywy, gdy manipuluje się informacjami o kolorze na obrazie. Jeśli zastosujesz transformacje, takie jak kontrast / jasność, posteryzacja, przesunięcie kolorów, zmiany jasności.

Korzystanie ze skalowanych obrazów to kolejny sposób na zmniejszenie gęstości informacji obrazu do poziomu, który jest łatwiejszy do porównania. Redukcje poniżej 10% oryginalnego rozmiaru obrazu generalnie powodują utratę zbyt dużej ilości informacji, aby można je było wykorzystać - więc obraz o rozdzielczości 800x800 pikseli można zmniejszyć do 80x80 i nadal zapewniać wystarczającą ilość informacji, aby wykonać przyzwoity odcisk palca. W przeciwieństwie do danych histogramu, musisz przeprowadzić anizotropowe skalowanie danych obrazu, gdy rozdzielczości źródła mają różne współczynniki proporcji. Innymi słowy, zmniejszenie obrazu 300x800 do miniatury 80x80 powoduje deformację obrazu, tak że w porównaniu z obrazem 300x500 (to jest bardzo podobne) spowoduje fałszywe negatywy. Odciski palców w postaci miniatur również często dają fałszywie ujemne wartości, gdy występują transformacje afiniczne. Jeśli odwrócisz lub obrócisz obraz,

Połączenie obu technik to rozsądny sposób na zabezpieczenie zakładów i ograniczenie występowania zarówno fałszywych trafień, jak i fałszywie negatywnych wyników.


Odnośnie CRC, zgodził się. Jeśli jednak ktoś chce z niego skorzystać, lepiej użyć hash MD5 niż CRC32
mloskot

5
Nie chciałbyś używać MD5, ponieważ jest to jednokierunkowy skrót kryptograficzny. Musisz użyć metody mieszania, która da podobny wynik dla podobnych danych wejściowych, aby można było bezpośrednio porównać różnice między skrótami.
AJ Quick

34

Istnieje znacznie mniej ad-hoc podejścia niż przeskalowane warianty obrazu, które zostały tutaj zaproponowane, które zachowują swój ogólny smak, ale dają znacznie bardziej rygorystyczne matematyczne podstawy tego, co się dzieje.

Weź falkę Haar z obrazu. Zasadniczo falka Haara to ciąg różnic między obrazami o niższej rozdzielczości i każdym obrazem o wyższej rozdzielczości, ale ważony według tego, jak głęboko jesteś w „drzewie” mipmap. Obliczenie jest proste. Następnie, gdy falka Haara jest już odpowiednio wyważona, wyrzuć wszystkie oprócz k największych współczynników (w kategoriach wartości bezwzględnej), znormalizuj wektor i zapisz go.

Jeśli weźmiemy iloczyn skalarny dwóch z tych znormalizowanych wektorów, otrzymamy miarę podobieństwa, gdzie 1 jest prawie identyczne. Tutaj zamieściłem więcej informacji .


20

Zdecydowanie powinieneś rzucić okiem na phash .

Do porównania obrazów służy ten projekt php : https://github.com/kennethrapp/phasher

I mój mały klon javascript : https://redaktor.me/phasher/demo_js/index.html

Niestety jest to oparte na "bitcount", ale rozpoznaje obrócone obrazy. Innym podejściem w javascript było zbudowanie histogramu jasności z obrazu za pomocą płótna. Możesz zwizualizować histogram wielokąta na płótnie i porównać ten wielokąt w swojej bazie danych (np. MySQL przestrzenny ...)


czy to na npm? Szukam sposobu na porównanie podobieństwa między dwoma obrazami za pomocą javascript
chovy

Hm, myślałem, że to „za tanio za npm”. To było po prostu demo napisane szybko od podstaw. Jednak możesz robić, co chcesz ze źródłem. Jeśli dam radę, przyjrzę się temu później i wrzucę na github github.com/redaktor ...
sebilasse

@SebastianLasse Właśnie sprawdziłem twój port JS i jest fantastyczny! Chciałbym tylko, abyś mógł przekazać identyfikator URI obrazu do Compare()funkcji, zamiast najpierw pobierać obraz. Ponadto z moich testów wynika, że ​​próg dla „bardzo podobnego obrazu” powinien wynosić> 90%, a nie> 98%.
thdoan

12

Dawno temu pracowałem nad systemem, który miał podobne cechy i jest to przybliżenie algorytmu, który stosowaliśmy:

  1. Podziel obraz na strefy. W naszym przypadku mieliśmy do czynienia z wideo w rozdzielczości 4: 3, więc użyliśmy 12 stref. W ten sposób rozdzielczość obrazów źródłowych zostaje usunięta z obrazu.
  2. Dla każdej strefy oblicz ogólny kolor - średnią wszystkich pikseli w strefie
  3. Dla całego obrazu oblicz ogólny kolor - średnią wszystkich stref

Więc dla każdego obrazu przechowujesz n + 1wartości całkowite, gdzie njest liczba stref, które śledzisz.

W celu porównania należy również spojrzeć na każdy kanał koloru osobno.

  1. W przypadku całego obrazu porównaj kanały kolorów dla ogólnych kolorów, aby sprawdzić, czy mieszczą się w określonym progu - powiedzmy 10%
  2. Jeśli obrazy mieszczą się w progu, następnie porównaj każdą strefę. Jeśli wszystkie strefy również znajdują się w progu, obrazy są na tyle silne, że można je przynajmniej oznaczyć do dalszego porównania.

Pozwala to szybko odrzucić obrazy, które nie pasują; możesz także użyć większej liczby stref i / lub zastosować algorytm rekurencyjnie, aby uzyskać silniejszą pewność dopasowania.


6

Podobnie jak odpowiedź Ic - możesz spróbować porównać obrazy w wielu rozdzielczościach. Zatem każdy obraz zostanie zapisany jako 1x1, 2x2, 4x4 .. 800x800. Jeśli najniższa rozdzielczość nie pasuje (podlega progowi), możesz ją natychmiast odrzucić. Jeśli tak, możesz je porównać w następnej wyższej rozdzielczości i tak dalej.

Ponadto - jeśli obrazy mają podobną strukturę, na przykład obrazy medyczne, możesz wyodrębnić tę strukturę w opisie, który jest łatwiejszy / szybszy do porównania.


To mapuje do jakiegoś rodzaju wyszukiwania drzew. To interesujące.
André Laszlo

3

Więc chcesz zrobić „dopasowywanie odcisków palców”, które jest całkiem inne niż „dopasowywanie obrazów”. Analiza odcisków palców była dogłębnie badana w ciągu ostatnich 20 lat i opracowano kilka interesujących algorytmów zapewniających właściwy współczynnik wykrywania (w odniesieniu do miar FAR i FRR - współczynnik fałszywej akceptacji i współczynnik fałszywych odrzuceń ).

Sugeruję, abyś lepiej przyjrzał się klasie technik wykrywania LFA (Local Feature Analysis) , głównie opartej na inspekcji drobiazgów. Minucje to specyficzne cechy każdego odcisku palca i zostały sklasyfikowane w kilku klasach. Odwzorowanie obrazu rastrowego na mapę drobiazgów jest tym, co w rzeczywistości robi większość władz publicznych, aby zgłosić przestępców lub terrorystów.

Zobacz tutaj, aby uzyskać dalsze referencje


Czy wiesz, jak obliczyć współczynnik fałszywej akceptacji, jeśli masz rozkład Gaussa wyników dla danego systemu biometrycznego?
GobiasKoffi,

1
OP chce „tworzyć odciski palców wielu obrazów”. Nie porównuj obrazów ludzkich odcisków palców.
Navin


3

Od 2015 r. (Wracając do przyszłości ... w sprawie tego pytania z 2009 r., Które jest obecnie wysoko oceniane w Google) podobieństwo obrazów można obliczyć za pomocą technik głębokiego uczenia. Rodzina algorytmów znana jako Auto Encoders może tworzyć reprezentacje wektorowe, które można przeszukiwać pod kątem podobieństwa. Jest tutaj demo .


Czy można wygenerować obraz odcisku palca z danych binarnych?
SwR

Jasne, istnieją SSN do tego zadania, ale Twoja odpowiedź nie wydaje się odpowiadać na nic. Pytanie brzmi: jak to się robi? Strona, do której prowadzi link, nie ujawnia żadnych informacji, a termin „Automatyczne kodery” również nie pomaga.
Simon Steinberger

Oryginalne Pytanie nie mówi „Jak to się robi?”, ale mówi, że „niektóre wskazówki do istniejących algorytmów bardzo by mi pomogły”.
Alex R

Nie podałeś „podpowiedzi” do algorytmu, w rzeczywistości strona, do której prowadzi link, mówi: „działa, ale nikt nie wie dlaczego. Nie oczekuj zbyt wiele po wyniku” ...
odyth,

To deeplearning4j.org/deepautoencoder#use-cases zapewnia większą jasność co do tego, w jaki sposób można użyć Auto Encoders do tworzenia odcisków palców, a następnie w jaki sposób można użyć tego odcisku palca, aby znaleźć podobieństwa w innych obrazach w oparciu o podobieństwo wierzchołków.
odyth

2

Jednym ze sposobów jest zmiana rozmiaru obrazu i znaczne obniżenie rozdzielczości (może do 200x200?), Zapisując mniejszą (uśrednioną w pikselach) wersję do porównania. Następnie określ próg tolerancji i porównaj każdy piksel. Jeśli RGB wszystkich pikseli mieści się w tolerancji, masz dopasowanie.

Twój początkowy przebieg to O (n ^ 2), ale jeśli skatalogujesz wszystkie dopasowania, każdy nowy obraz jest tylko algorytmem O (n) do porównania (wystarczy porównać go z każdym wcześniej wstawionym obrazem). W końcu jednak się rozpadnie, gdy lista obrazów do porównania stanie się większa, ale myślę, że przez chwilę będziesz bezpieczny.

Po 400 dniach działania będziesz mieć 500 000 obrazów, co oznacza (pomijając czas potrzebny na zmniejszenie rozmiaru obrazu) 200(H)*200(W)*500,000(images)*3(RGB)= 60 000 000 000 porównań. Jeśli każdy obraz jest dokładnie dopasowany, zostaniesz w tyle, ale prawdopodobnie tak nie będzie, prawda? Pamiętaj, że możesz zdyskontować obraz jako dopasowanie, gdy tylko pojedyncze porównanie przekroczy Twój próg.


2

Czy chcesz dosłownie porównać każdy obraz z innymi? Jaka jest aplikacja? Może potrzebujesz po prostu indeksowania i pobierania obrazów na podstawie określonych deskryptorów? Następnie możesz na przykład spojrzeć na standard MPEG-7 dla interfejsu opisu treści multimedialnych. Następnie możesz porównać różne deskryptory obrazów, które nie będą tak dokładne, ale znacznie szybsze.


może wybór między wyczerpującym a ograniczonym
johnny

0

Wydaje się, że wyspecjalizowane algorytmy haszowania obrazów są obszarem aktywnych badań, ale być może zwykłe obliczanie skrótu bajtów obrazu załatwi sprawę.

Czy szukasz obrazów identycznych bajtowo, a nie obrazów pochodzących z tego samego źródła, ale mogą mieć inny format lub rozdzielczość (co wydaje mi się raczej trudnym problemem).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.