Deteksi Gambar Hampir Duplikat [ditutup]


93

Sungguh cara yang cepat untuk mengurutkan kumpulan gambar tertentu berdasarkan kemiripannya satu sama lain.

Saat ini saya memiliki sistem yang melakukan analisis histogram antara dua gambar, tetapi ini adalah operasi yang sangat mahal dan tampaknya terlalu berlebihan.

Secara optimal, saya mencari algoritme yang akan memberikan skor pada setiap gambar (misalnya skor integer, seperti RGB Average) dan saya bisa mengurutkan berdasarkan skor itu. Skor Identik atau skor yang bersebelahan adalah kemungkinan duplikat.

0299393
0599483
0499994 <- possible dupe
0499999 <- possible dupe
1002039
4995994
6004994 

RGB Average per gambar menyebalkan, apakah ada yang serupa?


5
Sebuah pertanyaan kunci, memikirkan tentang apa yang telah Anda tulis dan tentang beberapa jawaban atas pertanyaan terkait yang ditunjukkan Naaff, Anda mungkin ingin lebih jelas mendefinisikan apa arti "kesamaan". Akankah gambar yang identik, tetapi offset lima piksel, menjadi "serupa"? Secara visual ya ... tetapi untuk algoritme ... mungkin tidak, kecuali Anda telah memikirkannya, dan memperhitungkannya. Bisakah Anda memberikan detail lebih lanjut? Apakah duplikatnya tepat, atau hanya "mendekati"? Apakah Anda melihat pindaian yang dapat berbeda dengan sedikit ukuran sudut? Bagaimana dengan intensitas? Ada banyak variabel di sini ...
Beska

Apa perbedaan 'duplikat'? mis. Apakah itu gambar dari lokasi yang sama dengan pose / pergeseran yang berbeda? Anda sepertinya menginginkan sesuatu yang O (nlog (n)) dengan jumlah gambar. Adakah yang tahu jika ini mungkin? Sepertinya mungkin ..
Justin Scheiner

@ The Unknown: Jika Anda tidak puas dengan jawaban saat ini, dapatkah Anda memberi kami beberapa panduan lagi? Kami telah melakukan yang terbaik untuk menjawab pertanyaan Anda, tetapi tanpa umpan balik, kami tidak mungkin dapat menemukan sesuatu yang lebih baik.
Naaff

Ini saat ini adalah salah satu masalah besar yang belum terpecahkan dalam Ilmu Komputer. Semoga berhasil sobat.
john ktejik

Jawaban:


70

Telah banyak penelitian tentang pencarian gambar dan ukuran kesamaan. Ini bukan masalah yang mudah. Secara umum, satu gambar inttidak akan cukup untuk menentukan apakah gambar sangat mirip. Anda akan mendapatkan rasio positif palsu yang tinggi.

Namun, karena ada banyak penelitian yang dilakukan, Anda dapat melihat beberapa di antaranya. Misalnya, makalah ini (PDF) memberikan algoritma sidik jari gambar kompak yang cocok untuk menemukan gambar duplikat dengan cepat dan tanpa banyak menyimpan data. Sepertinya ini yang benar pendekatan yang jika Anda menginginkan sesuatu yang kuat.

Jika Anda mencari sesuatu yang lebih sederhana, tetapi pasti lebih ad-hoc, pertanyaan SO ini memiliki beberapa ide yang bagus.


2
kertas itu dari tahun 2004, tidak yakin apakah ini masih merupakan jawaban terbaik?
Andrew

50

Saya akan merekomendasikan mempertimbangkan untuk menjauh dari hanya menggunakan histogram RGB.

Pencernaan yang lebih baik dari gambar Anda dapat diperoleh jika Anda mengambil wavelet 2d Haar dari gambar (ini jauh lebih mudah daripada kedengarannya, hanya banyak rata-rata dan beberapa akar kuadrat digunakan untuk membobot koefisien Anda) dan hanya mempertahankan k terbesar koefisien tertimbang di wavelet sebagai vektor jarang, menormalkannya, dan menyimpannya untuk mengurangi ukurannya. Anda harus mengubah skala RG dan B menggunakan bobot persepsi sebelumnya setidaknya atau saya sarankan beralih ke YIQ (atau YCoCg, untuk menghindari derau kuantisasi) sehingga Anda dapat mengambil sampel informasi chrominance dengan tingkat kepentingan yang berkurang.

Anda sekarang dapat menggunakan perkalian titik dari dua vektor normalisasi renggang ini sebagai ukuran kemiripan. Pasangan gambar dengan hasil perkalian titik terbesar akan memiliki struktur yang sangat mirip. Manfaatnya karena sedikit tahan terhadap pengubahan ukuran, pergeseran rona dan tanda air, serta sangat mudah diterapkan dan dipadatkan.

Anda dapat menukar penyimpanan dan akurasi dengan menambah atau mengurangi k.

Mengurutkan berdasarkan skor numerik tunggal akan menjadi sulit untuk masalah klasifikasi semacam ini. Jika Anda memikirkannya, diperlukan gambar untuk hanya dapat 'berubah' sepanjang satu sumbu, tetapi ternyata tidak. Inilah mengapa Anda membutuhkan vektor fitur. Dalam kasus wavelet Haar, kira-kira di mana diskontinuitas paling tajam dalam gambar terjadi. Anda dapat menghitung jarak antara gambar secara berpasangan, tetapi karena yang Anda miliki hanyalah metrik jarak, pengurutan linier tidak memiliki cara untuk menyatakan 'segitiga' dari 3 gambar yang semuanya sama jauhnya. (misal, pikirkan gambar yang semuanya hijau, gambar yang semuanya merah dan gambar yang semuanya biru.)

Itu berarti bahwa solusi nyata apa pun untuk masalah Anda akan memerlukan operasi O (n ^ 2) dalam jumlah gambar yang Anda miliki. Sedangkan jika dimungkinkan untuk melinierisasi ukuran, Anda dapat memerlukan O (n log n), atau O (n) jika ukuran tersebut cocok untuk, katakanlah, jenis radix. Meskipun demikian, Anda tidak perlu menghabiskan O (n ^ 2) karena dalam praktiknya Anda tidak perlu menyaring seluruh rangkaian, Anda hanya perlu menemukan barang yang lebih dekat dari ambang batas tertentu. Jadi dengan menerapkan salah satu dari beberapa teknik untuk mempartisi ruang vektor renggang Anda, Anda dapat memperoleh asimtotik yang jauh lebih cepat untuk masalah 'menemukan saya k dari gambar yang lebih mirip daripada ambang batas yang diberikan' daripada secara naif membandingkan setiap gambar dengan setiap gambar, memberi Anda apa Anda mungkin perlu ... jika tidak persis seperti yang Anda minta.

Bagaimanapun, saya menggunakan ini beberapa tahun yang lalu untuk efek yang baik secara pribadi ketika mencoba meminimalkan jumlah tekstur berbeda yang saya simpan, tetapi ada juga banyak kebisingan penelitian di ruang ini yang menunjukkan kemanjurannya (dan dalam hal ini membandingkan ke bentuk klasifikasi histogram yang lebih canggih):

http://www.cs.princeton.edu/cass/papers/spam_ceas07.pdf

Jika Anda membutuhkan akurasi yang lebih baik dalam pendeteksian, algoritma minHash dan tf-idf dapat digunakan dengan Haar wavelet (atau histogram) untuk menangani pengeditan dengan lebih kuat:

http://cmp.felk.cvut.cz/~chum/papers/chum_bmvc08.pdf

Terakhir, Stanford memiliki penelusuran gambar berdasarkan varian yang lebih eksotis dari pendekatan semacam ini, berdasarkan melakukan lebih banyak ekstraksi fitur dari wavelet untuk menemukan bagian gambar yang diputar atau diskalakan, dll, tetapi itu mungkin jauh melampaui jumlah pekerjaan Anda. ingin melakukannya.

http://wang14.ist.psu.edu/cgi-bin/zwang/regionsearch_show.cgi


Sepertinya Anda secara tidak langsung mendeskripsikan kd-tree dan sejenisnya untuk mencari ruang untuk kandidat potensial. Ini mungkin perlu diperhatikan.
Boojum

1
Nah, alasan saya tidak menentukan teknik di luar semacam kiasan yang kabur adalah karena kd-tree bekerja dengan baik ketika Anda memiliki jumlah dimensi yang relatif kecil di ruang Anda. Di sini Anda mungkin memiliki ~ 128 atau lebih dimensi yang penduduknya jarang. Karena mereka jarang, sebagian besar nilainya akan menjadi nol, jadi melakukan round-robin melintasi dimensi untuk mempartisi dalam gaya kd sebenarnya hampir tidak berguna. Dengan cara yang sama R-pohon rusak, meninggalkan kemungkinan besar sebagai taruhan terbaik Anda: X-pohon. Sayangnya, performa mereka juga mendekati batas ketika dihadapkan pada dimensi yang banyak itu.
Edward KMETT

"dan hanya mempertahankan k koefisien tertimbang terbesar di wavelet sebagai vektor jarang," - pertahankan per baris atau untuk seluruh wavelet?
ivan.ukr

"Anda harus mengubah skala RG dan B menggunakan bobot perseptual sebelumnya setidaknya atau saya sarankan beralih ke YIQ (atau YCoCg, untuk menghindari derau kuantisasi) sehingga Anda dapat mengambil sampel informasi chrominance dengan kepentingan yang dikurangi." - lalu apa? Apakah wavelet hanya untuk Y atau lakukan untuk semua channel? Jika lakukan untuk semua saluran - bagaimana cara mengukur kemiripan gambar dengan beberapa saluran? tambahkan produk titik dari setiap saluran dan anggap ini sebagai ukuran kesamaan atau harus ada penambahan yang berbobot?
ivan.ukr

15

Saya menerapkan algoritme yang sangat andal untuk ini yang disebut Fast Multiresolution Image Querying . Kode saya (kuno, tidak terawat) untuk itu ada di sini .

Apa yang dilakukan Fast Multiresolution Image Querying adalah membagi gambar menjadi 3 bagian berdasarkan ruang warna YIQ (lebih baik untuk mencocokkan perbedaan daripada RGB). Kemudian gambar pada dasarnya dikompresi menggunakan algoritma wavelet sampai hanya fitur paling menonjol dari setiap ruang warna yang tersedia. Titik-titik ini disimpan dalam struktur data. Gambar kueri melalui proses yang sama, dan fitur menonjol di gambar kueri dicocokkan dengan yang ada di database yang disimpan. Semakin banyak kecocokan, semakin besar kemungkinan gambarnya serupa.

Algoritme ini sering digunakan untuk fungsionalitas "kueri dengan sketsa". Perangkat lunak saya hanya mengizinkan memasukkan gambar kueri melalui URL, jadi tidak ada antarmuka pengguna. Namun, menurut saya ini bekerja sangat baik untuk mencocokkan thumbnail dengan versi besar gambar itu.

Jauh lebih mengesankan daripada software saya adalah Retrievr yang memungkinkan Anda mencoba algoritma FMIQ menggunakan Flickr gambar sebagai sumber. Sangat keren! Cobalah melalui sketsa atau menggunakan gambar sumber, dan Anda dapat melihat seberapa baik kerjanya.


Apakah masih dapat mengenali gambar yang diputar?
endolit

Saya ragu itu akan bekerja dengan baik untuk itu. Anda mungkin ingin mengenkode gambar untuk setiap rotasi untuk memaksimalkan kecocokan terkait.
Luke Francl

Tautan ke pengambilan tampaknya tidak aktif - apakah itu diarsipkan di mana saja?
mmigdol

10

Sebuah gambar memiliki banyak fitur, jadi kecuali Anda mempersempit diri Anda menjadi satu, seperti kecerahan rata-rata, Anda berurusan dengan masalah ruang dimensi-n.

Jika saya meminta Anda untuk menetapkan satu bilangan bulat ke kota-kota di dunia, jadi saya tahu mana yang dekat, hasilnya tidak akan bagus. Anda mungkin, misalnya, memilih zona waktu sebagai bilangan bulat tunggal dan mendapatkan hasil yang bagus untuk kota-kota tertentu. Namun, kota di dekat kutub utara dan kota lain di dekat kutub selatan juga bisa berada di zona waktu yang sama, meskipun mereka berada di ujung planet yang berlawanan. Jika saya membiarkan Anda menggunakan dua bilangan bulat, Anda bisa mendapatkan hasil yang sangat bagus dengan garis lintang dan garis bujur. Masalahnya sama untuk kemiripan gambar.

Semua yang dikatakan, ada algoritme yang mencoba mengelompokkan gambar serupa bersama-sama, yang secara efektif adalah apa yang Anda minta. Inilah yang terjadi bila Anda melakukan deteksi wajah dengan Picasa. Bahkan sebelum Anda mengidentifikasi wajah apa pun, fitur ini akan mengelompokkan wajah yang mirip sehingga mudah untuk melihat sekumpulan wajah yang mirip dan memberi sebagian besar dari mereka nama yang sama.

Ada juga teknik yang disebut Principle Component Analysis, yang memungkinkan Anda mengurangi data n-dimensi menjadi beberapa dimensi yang lebih kecil. Jadi gambar dengan n fitur bisa direduksi menjadi satu fitur. Namun demikian, ini masih bukan pendekatan terbaik untuk membandingkan gambar.


1
Ini adalah poin yang bisa diperdebatkan, tetapi Anda DAPAT menggunakan satu bilangan bulat untuk mewakili kombinasi sejumlah fitur, jika, misalnya, fitur x = 2 dan fitur y = 3 dan fitur z = 5 dan fitur aa = 7, dan sebagainya, maka kekuatan basis utama yang dinaikkan dalam bentuk faktorisasi dari bilangan bulat tunggal akan menjadi nilai fitur untuk gambar spesifik tersebut. Sekali lagi, poin yang diperdebatkan karena ukuran nomor tersebut akan menjadi tidak masuk akal. Meskipun ukuran itu dapat dikurangi lebih jauh ... kita hanya berbicara tentang data terstruktur.
argyle

Benar. Tapi intinya adalah mengatur angka-angka sehingga gambar yang mirip berdekatan secara numerik. Terlepas dari apa yang saya katakan di atas, ini mungkin. Singkatnya, Anda dapat memecahkan masalah Penjual Perjalanan untuk menemukan jalur minimum (atau mendekati minimum) melalui gambar dalam ruang n-dimensi (di mana n adalah jumlah fitur yang ingin Anda gunakan untuk membandingkan gambar). Tapi itu mahal.
Neil

8

Ada pustaka C ("libphash" - http://phash.org/ ) yang akan menghitung "hash perseptual" dari sebuah gambar dan memungkinkan Anda mendeteksi gambar serupa dengan membandingkan hash (jadi Anda tidak perlu membandingkan setiap gambar langsung terhadap setiap gambar lainnya) tetapi sayangnya tampaknya tidak terlalu akurat ketika saya mencobanya.


5

Anda harus memutuskan apa yang "serupa". Kontras? Warna?

Apakah gambar "mirip" dengan gambar yang sama secara terbalik?

Saya yakin Anda dapat menemukan banyak "panggilan akrab" dengan memecah gambar menjadi bagian 4x4 dan mendapatkan warna rata-rata untuk setiap sel kisi. Anda akan memiliki enam belas skor per gambar. Untuk menilai kesamaan, Anda hanya perlu melakukan penjumlahan kuadrat perbedaan antara gambar.

Saya rasa satu hash tidak masuk akal, kecuali bertentangan dengan konsep tunggal seperti hue, atau kecerahan, atau kontras.

Inilah ide Anda:

0299393
0599483
0499994 <- possible dupe
0499999 <- possible dupe
1002039
4995994
6004994

Pertama-tama, saya akan menganggap ini adalah bilangan desimal yang R * (2 ^ 16) + G * (2 ^ 8) + B, atau semacamnya. Jelas itu tidak bagus karena warna merah terlalu berbobot.

Pindah ke ruang HSV akan lebih baik. Anda dapat menyebarkan bit HSV ke dalam hash, atau Anda dapat menetapkan H atau S atau V satu per satu, atau Anda dapat memiliki tiga hash per gambar.


Satu hal lagi. Jika Anda melakukan bobot R, G, dan B. Bobot hijau paling tinggi, lalu merah, lalu biru agar sesuai dengan kepekaan visual manusia.


5

Di era layanan web, Anda dapat mencoba http://tineye.com


3
Kode di balik tineye tampaknya persis seperti yang diinginkan oleh penanya, tetapi menurut saya, sebagai layanan web, kode ini tidak sangat berguna, karena tidak ada cara (yang jelas) untuk memberikan dua gambar dan bertanya "apakah ini sama? " - gambar kedua harus ada di halaman web, dan diindeks oleh tineye
dbr

1
Mungkin menyediakan API untuk pengguna bisnis? Mereka harus dihubungi tentang itu.
zproxy

Ada API komersial yang menyediakan persis seperti services.tineye.com/MatchEngine .
Gajus


1

Saya berasumsi bahwa perangkat lunak pencarian gambar duplikat lainnya melakukan FFT pada gambar, dan menyimpan nilai frekuensi yang berbeda sebagai vektor:

Image1 = (u1, u2, u3, ..., un)
Image2 = (v1, v2, v3, ..., vn)

dan kemudian Anda dapat membandingkan dua gambar untuk persamaan dengan menghitung jarak antara vektor bobot dua gambar:

distance = Sqrt(
     (u1-v1)^2 +
     (u2-v2)^2 +
     (u2-v3)^2 +
     ...
     (un-vn)^2);

2
Sebagian besar gambar alami memiliki konten frekuensi yang sangat mirip, jadi saya ragu ini akan menjadi metrik yang sangat bagus.
Hannes Ovrén

1

Salah satu solusinya adalah dengan melakukan perbandingan RMS / RSS pada setiap pasang gambar yang diperlukan untuk melakukan semacam gelembung. Kedua, Anda dapat melakukan FFT pada setiap gambar dan melakukan beberapa sumbu rata-rata untuk mengambil satu bilangan bulat untuk setiap gambar yang akan Anda gunakan sebagai indeks untuk diurutkan. Anda dapat mempertimbangkan untuk melakukan perbandingan apa pun pada versi asli yang diubah ukurannya (25%, 10%) tergantung pada seberapa kecil perbedaan yang Anda pilih untuk diabaikan dan berapa banyak percepatan yang Anda butuhkan. Beri tahu saya jika solusi ini menarik, dan kita dapat berdiskusi atau saya dapat memberikan kode contoh.


FFT hanya memberi Anda informasi warna dan tidak ada informasi tentang posisi. Mengubah ukuran mengabaikan semua fitur di bawah ukuran tertentu terlepas dari dampaknya pada gambar yang dihasilkan. Gambar abu-abu dan papan catur bisa jadi identik dengan ukuran itu. Pendekatan wavelet (Daubechies, Haar, dll.) Memiliki manfaat menyediakan informasi posisi dan warna dengan menukar proporsi informasi posisi dan warna di setiap titik data.
Edward KMETT

2
Tidak, FFT suatu gambar berisi semua informasi spasial aslinya. Anda dapat merekonstruksi aslinya dari FFT. homepages.inf.ed.ac.uk/rbf/HIPR2/fourier.htm Histogram, bagaimanapun, yang mungkin Anda pikirkan, tidak.
Paul

1

Kebanyakan pendekatan modern untuk mendeteksi deteksi gambar duplikat Dekat menggunakan deteksi titik menarik dan deskriptor yang mendeskripsikan area di sekitar titik tersebut. Seringkali SIFT digunakan. Kemudian Anda dapat membuat quatize deskriptor dan menggunakan cluster sebagai kosakata visual kata.

Jadi jika kita melihat rasio kata-kata visual yang umum dari dua gambar dengan semua kata-kata visual dari gambar-gambar ini, Anda memperkirakan kesamaan antar gambar. Ada banyak sekali artikel menarik. Salah satunya adalah Near Duplicate Image Detection: minHash dan tf-idf Weighting


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.