Neredeyse Yinelenen Görüntü Algılama [kapalı]


93

Belirli bir dizi resmi birbirine benzerliklerine göre sıralamanın hızlı yolu nedir?

Şu anda iki görüntü arasında histogram analizi yapan bir sistemim var ama bu çok pahalı bir işlem ve çok fazla gözüküyor.

Optimal olarak, her görüntüye bir puan verecek bir algoritma arıyorum (örneğin, RGB Ortalama gibi bir tamsayı puanı) ve bu puana göre sıralayabilirim. Birbirinin yanında bulunan aynı puanlar veya puanlar olası kopyalardır.

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

RGB Ortalama görüntü başına berbat, benzer bir şey var mı?


5
Temel bir soru, yazdıklarınızı ve Naaff'ın işaret ettiği ilgili soruya verilen yanıtlardan bazılarını düşünerek, "benzerliğin" ne anlama geldiğini daha net bir şekilde tanımlamak isteyebilirsiniz. Aynı, ancak beş piksel ofset olan bir görüntü "benzer" olur mu? Görsel olarak evet ... ama bir algoritmaya göre ... muhtemelen düşünmediyseniz ve hesabını vermedikçe. Daha fazla ayrıntı verebilir misiniz? Kopyalar tam mı yoksa sadece "yakın" mı? Hafif bir açı ölçüsüne göre farklılık gösterebilecekleri taramalara mı bakıyorsunuz? Yoğunluk nasıl? Burada birçok değişken var ...
Beska

'Yinelenenler' nasıl farklılık gösterir? Örneğin, aynı konumun farklı poz / geçişe sahip görüntüleri mi olur? Görüntü sayısı ile O (nlog (n)) olan bir şey istiyor gibisiniz. Bunun mümkün olup olmadığını bilen var mı? Olabilir gibi görünüyor ..
Justin Scheiner

@The Unknown: Mevcut cevaplardan herhangi birinden memnun değilseniz, bize biraz daha rehberlik verebilir misiniz? Sorunuzu yanıtlamak için elimizden gelenin en iyisini yaptık, ancak herhangi bir geri bildirim olmadan daha iyi bir şey bulamayız.
Naaff

Bu, şu anda Bilgisayar Bilimlerinde çözülmemiş en büyük sorunlardan biridir. İyi şanslar dostum.
john ktejik

Yanıtlar:


70

Görsel arama ve benzerlik ölçüleri üzerine çok sayıda araştırma yapılmıştır. Bu kolay bir problem değil. Genel olarak, intgörüntülerin çok benzer olup olmadığını belirlemek için tek bir tek yeterli olmayacaktır. Yanlış pozitif oranınız yüksektir.

Bununla birlikte, çok fazla araştırma yapıldığından, bazılarına bir göz atabilirsiniz. Örneğin, bu kağıt (PDF), yinelenen görüntüleri hızlı ve fazla veri depolamadan bulmak için uygun olan kompakt bir görüntü parmak izi algoritması sağlar. Sağlam bir şey istiyorsanız bu doğru yaklaşım gibi görünüyor .

Daha basit ama kesinlikle daha geçici bir şey arıyorsanız, bu SO sorusunun birkaç iyi fikri vardır.


3
Bu makale 2004 yılına ait, bunun hala en iyi cevap olduğundan emin değil misiniz?
Andrew

50

Sadece bir RGB histogramı kullanmaktan uzaklaşmayı düşünmenizi tavsiye ederim.

Görüntünün 2d Haar dalgacıklarını alırsanız (göründüğünden çok daha kolaydır, sadece çok fazla ortalama ve katsayılarınızı ağırlıklandırmak için kullanılan bazı karekökler) ve sadece k en büyük olanını koruduğunuzda görüntünüzün daha iyi bir özeti elde edilebilir dalgacıktaki ağırlıklı katsayıları seyrek bir vektör olarak normalize edin ve boyutunu küçültmek için kaydedin. En azından önceden algısal ağırlıkları kullanarak RG ve B'yi yeniden ölçeklendirmelisiniz veya YIQ'ya (veya niceleme gürültüsünü önlemek için YCoCg'ye) geçmenizi öneririm, böylece krominans bilgisini daha az önemle örnekleyebilirsiniz.

Artık bu seyrek normalleştirilmiş vektörlerden ikisinin iç çarpımını benzerlik ölçüsü olarak kullanabilirsiniz. En büyük nokta ürünlere sahip görüntü çiftleri yapı olarak çok benzer olacaktır. Bu, yeniden boyutlandırmaya, renk değiştirmeye ve filigranlamaya biraz dirençli olma ve gerçekten kolay uygulama ve kompakt olma avantajına sahiptir.

K'yi artırarak veya azaltarak depolama ve doğruluktan vazgeçebilirsiniz.

Tek bir sayısal puana göre sıralama, bu tür bir sınıflandırma problemi için zor olacaktır. Düşünürseniz, görüntülerin yalnızca bir eksen boyunca 'değişebilmesi' gerekir, ancak bunlar yoktur. Bu nedenle bir vektör özniteliklere ihtiyacınız var. Haar dalgacık durumunda, yaklaşık olarak görüntüdeki en keskin süreksizliklerin meydana geldiği yerdir. Görüntüler arasındaki mesafeyi ikili olarak hesaplayabilirsiniz, ancak sahip olduğunuz tek şey bir mesafe ölçüsü olduğundan, doğrusal bir sıralama, eşit derecede uzak olan 3 görüntüden oluşan bir 'üçgeni' ifade etmenin bir yolu yoktur. (yani tamamen yeşil, tamamen kırmızı bir görüntü ve tamamen mavi bir görüntü düşünün.)

Bu, probleminize gerçek bir çözümün sahip olduğunuz görüntü sayısında O (n ^ 2) işlemlerine ihtiyaç duyacağı anlamına gelir. Oysa, ölçüyü doğrusallaştırmak mümkün olsaydı, sadece O (n log n) veya ölçü bir radix sıralama için uygunsa O (n) gerektirebilirdi. Bununla birlikte, O (n ^ 2) harcamanıza gerek yok çünkü pratikte tüm seti gözden geçirmeniz gerekmiyor, sadece bir eşikten daha yakın olan şeyleri bulmanız gerekiyor. Dolayısıyla, seyrek vektör uzayınızı bölümlemek için birkaç teknikten birini uygulayarak, 'belirli bir eşikten daha fazla benzer olan görüntülerin beni bulma' problemi için, her görüntüyü her görüntü ile saf bir şekilde karşılaştırmaktan çok daha hızlı asimptotik elde edebilirsiniz. Muhtemelen ihtiyacınız var ... tam olarak istediğiniz şey değilse.

Her halükarda, bunu birkaç yıl önce, sakladığım farklı dokuların sayısını en aza indirmeye çalışırken kişisel olarak iyi bir etki yaratmak için kullandım, ancak bu alanda etkinliğini gösteren çok fazla araştırma gürültüsü oldu (ve bu durumda daha karmaşık bir histogram sınıflandırması biçimine):

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

Algılamada daha iyi doğruluğa ihtiyacınız varsa, düzenlemeleri daha sağlam bir şekilde ele almak için minHash ve tf-idf algoritmaları Haar dalgacık (veya histogram) ile birlikte kullanılabilir:

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

Son olarak, Stanford'un bu tür bir yaklaşımın daha egzotik bir varyantına dayalı bir görsel araması var, görüntülerin döndürülmüş veya ölçeklenmiş bölümlerini vb. Bulmak için dalgacıklardan daha fazla özellik çıkarımı yapmaya dayanıyor, ancak bu muhtemelen sizin yaptığınız iş miktarının çok ötesine geçiyor. yapmak isterdim.

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


Görünüşe göre potansiyel adaylar için alan aramak için kd ağaçları ve benzerlerini dolaylı olarak tanımlıyorsunuz. Bunu belirtmeye değer olabilir.
Boojum

1
Pekala, belirsiz bir imanın ötesinde teknikleri belirtmememin nedeni, alanınızda nispeten az sayıda boyutunuz olduğunda kd-ağaçlarının iyi çalışmasıdır. Burada muhtemelen seyrek olarak doldurulmuş ~ 128 veya daha fazla boyuta sahipsiniz. Seyrek olduklarından, değerlerin çoğunluğu sıfır olacaktır, bu nedenle boyutlar arasında kd-stilinde bölümlemeye gidip gelmek neredeyse yararsızdır. Aynı şekilde R-ağaçları da parçalanır ve büyük olasılıkla en iyi bahsinizi bırakır: X-ağaçları. Ne yazık ki, bu boyutlarla karşılaştıklarında performanslarının sınırına da yaklaşıyorlar.
Edward KMETT

"ve dalgacıktaki en büyük k ağırlıklı katsayıları seyrek bir vektör olarak koruyun," - satır başına mı yoksa tüm dalgacık için mi?
ivan.ukr

"En azından önceden algısal ağırlıkları kullanarak RG ve B'yi yeniden ölçeklendirmelisiniz veya YIQ'ya (veya niceleme gürültüsünü önlemek için YCoCg'ye) geçmenizi öneririm, böylece krominans bilgisini daha az önemle örnekleyebilirsiniz." - ve ondan sonra? Dalgacık sadece Y için mi yoksa tüm kanallar için mi yapılıyor? Tüm kanallar için yapılıyorsa - görüntülerin birden çok kanalla benzerliği nasıl ölçülür? her kanalın iç çarpımını ekleyin ve bunu benzerlik ölçüsü olarak hesaba katın mı yoksa ağırlıklı bir ekleme mi olmalı?
ivan.ukr

15

Bunun için Hızlı Çoklu Çözünürlüklü Görüntü Sorgulama adlı çok güvenilir bir algoritma uyguladım . Bunun için (eski, korunmamış) kodum burada .

Hızlı Çoklu Çözünürlük Görüntü Sorgulamanın yaptığı şey, görüntüyü YIQ renk uzayına göre 3 parçaya bölmektir (eşleştirme farklılıkları için RGB'den daha iyidir). Daha sonra görüntü, her bir renk uzayından yalnızca en belirgin özellikler elde edilene kadar bir dalgacık algoritması kullanılarak sıkıştırılır. Bu noktalar bir veri yapısında saklanır. Sorgu görüntüleri aynı işlemden geçer ve sorgu görüntüsündeki öne çıkan özellikler, depolanan veritabanındakilerle eşleştirilir. Ne kadar çok eşleşme olursa, görsellerin benzer olma olasılığı o kadar yüksektir.

Algoritma genellikle "çizime göre sorgulama" işlevi için kullanılır. Yazılımım yalnızca URL aracılığıyla sorgu görüntülerinin girilmesine izin verdi, bu nedenle kullanıcı arayüzü yoktu. Ancak, küçük resimleri o görüntünün büyük sürümüyle eşleştirmek için son derece iyi çalıştığını gördüm.

Çok daha etkileyici benim yazılım daha retrievr kaynak olarak Flickr görüntüleri kullanılarak FMIQ algoritmasını deneyelim. Çok havalı! Eskiz yoluyla veya bir kaynak resim kullanarak deneyin ve ne kadar iyi çalıştığını görebilirsiniz.


Hala döndürülmüş resimleri tanıyabilir mi?
endolith

Bunun için çok işe yarayacağından şüpheliyim. İlgili eşleşmeleri en üst düzeye çıkarmak için muhtemelen her dönüş için görüntüleri kodlamak istersiniz.
Luke Francl

Geri alma bağlantısı bozuk görünüyor - bu herhangi bir yerde arşivlenmiş mi?
mmigdol

10

Bir resmin birçok özelliği vardır, bu nedenle kendinizi ortalama parlaklık gibi bir ile sınırlamazsanız, n boyutlu bir problem alanıyla uğraşıyorsunuz demektir.

Sizden dünyanın şehirlerine tek bir tam sayı atamanızı isteseydim, böylece hangilerinin birbirine yakın olduğunu söyleyebilirim, sonuçlar harika olmazdı. Örneğin, tek tamsayınız olarak saat dilimini seçebilir ve belirli şehirlerde iyi sonuçlar alabilirsiniz. Bununla birlikte, kuzey kutbuna yakın bir şehir ile güney kutbuna yakın bir başka şehir de gezegenin zıt uçlarında olsalar bile aynı zaman diliminde olabilir. İki tamsayı kullanmanıza izin verirsem, enlem ve boylamda çok iyi sonuçlar elde edebilirsiniz. Sorun, görüntü benzerliği için aynıdır.

Tüm söylenenler, benzer görüntüleri bir araya toplamaya çalışan algoritmalar var, ki bu da etkili bir şekilde istediğiniz şey. Picasa ile yüz algılama yaptığınızda olan budur. Siz herhangi bir yüzü tanımlamadan önce bile, benzer yüzleri bir araya getirir, böylece bir dizi benzer yüzün içinden geçip çoğuna aynı adı vermek kolaydır.

Ayrıca, n boyutlu verileri daha az sayıda boyuta indirmenize izin veren, Temel Bileşen Analizi adlı bir teknik de vardır. Böylece n özelliğe sahip bir resim tek bir özelliğe indirgenebilir. Ancak bu, görüntüleri karşılaştırmak için hala en iyi yaklaşım değildir.


1
Bu tartışmalı bir noktadır, ancak herhangi bir sayıda özelliğin kombinasyonunu temsil etmek için tek bir tamsayı kullanabilirsiniz, örneğin, x = 2 özelliği ve y = 3 özelliği ve z = 5 özelliği ve aa = 7 özelliği, vb. o zaman, bu asal tabanın çarpanlara ayrılmış tek bir tamsayı biçiminde yükseltildiği güç, o belirli görüntü için özelliğin değeri olacaktır. Yine tartışmalı bir nokta çünkü sayının boyutu saçma olurdu. Bu boyut daha da küçültülebilirse de ... sadece yapılandırılmış verilerden bahsediyoruz.
argyle

Doğru. Ancak asıl nokta, sayıları, benzer görüntüler sayısal olarak birbirine yakın olacak şekilde düzenlemektir. Yukarıda söylediğime rağmen bu mümkün. Kısacası, n boyutlu uzaydaki görüntüler arasında minimum (veya minimuma yakın) bir yol bulmak için Gezici Satış Elemanı problemini çözebilirsiniz (burada n, görüntüleri karşılaştırmak için kullanmak istediğiniz özelliklerin sayısıdır). Ama bu pahalıdır.
Neil

8

Bir görüntünün "algısal karmasını" hesaplayacak ve karmaları karşılaştırarak benzer görüntüleri tespit etmenize olanak tanıyan bir C kitaplığı ("libphash" - http://phash.org/ ) vardır (böylece her görüntüyü karşılaştırmak zorunda kalmazsınız) doğrudan diğer görüntülere karşı) ancak ne yazık ki denediğimde çok doğru görünmüyordu.


5

Neyin "benzer" olduğuna karar vermelisiniz. Kontrast? Hue?

Bir resim aynı resme "benzer" mi?

Bahse girerim görüntüleri 4x4 parçalara bölerek ve her ızgara hücresi için ortalama bir renk elde ederek çok sayıda "yakın arama" bulabilirsiniz. Resim başına on altı puanınız olur. Benzerliği değerlendirmek için, görüntüler arasındaki farkların karelerini toplamanız yeterli.

Renk tonu, parlaklık veya kontrast gibi tek bir konsepte aykırı olmadığı sürece tek bir hash'in mantıklı olduğunu düşünmüyorum.

İşte fikriniz:

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

Öncelikle, bunların R * (2 ^ 16) + G * (2 ^ 8) + B olan ondalık sayılar veya bunun gibi bir şey olduğunu varsayacağım. Açıkçası bu iyi değil çünkü kırmızı aşırı derecede ağırlıklandırılıyor.

HSV alanına taşınmak daha iyi olurdu. Sen olabilir HSV bitlerini yaymak karma içine, ya da sadece tek tek H veya S veya V yerleşmek gibi, veya resim başına üç karmaları olabilir.


Bir şey daha. R, G ve B ağırlıklarını yaparsanız, ağırlık en yüksek yeşil, sonra kırmızı, sonra insan görsel hassasiyetine uyması için mavi.


5

Web hizmetleri çağında http://tineye.com'u deneyebilirsiniz.


3
Tineye'ın arkasındaki kod, soruyu soranın tam olarak peşinde olduğu şey gibi görünüyor, ancak bir web hizmeti olarak çok kullanışlı olduğunu düşünmüyorum, çünkü ona iki görüntü vermenin ve "bunlar aynı mı? " - ikinci görsel bir web sayfasında olmalı ve tineye tarafından indekslenmeli
dbr

1
Belki de işletme kullanıcıları için API sağlıyorlar? Bu konuda kendileriyle iletişime geçilmelidir.
zproxy

Tam olarak bu services.tineye.com/MatchEngine'i sağlayan ticari bir API vardır .
Gajus


1

Diğer yinelenen görüntü arama yazılımının görüntüler üzerinde bir FFT gerçekleştirdiğini ve farklı frekansların değerlerini vektör olarak sakladığını varsaydım:

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

ve sonra iki görüntünün ağırlık vektörleri arasındaki mesafeyi hesaplayarak iki görüntüyü eşitlik açısından karşılaştırabilirsiniz :

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

2
Çoğu doğal görüntünün frekans içeriği çok benzer, bu yüzden bunun çok iyi bir ölçü olacağından şüpheliyim.
Hannes Ovrén

1

Çözümlerden biri, balon sıralaması gerçekleştirmek için gereken her resim çiftinde RMS / RSS karşılaştırması yapmaktır. İkinci olarak, her bir görüntü üzerinde bir FFT gerçekleştirebilir ve her görüntü için sıralama için bir dizin olarak kullanacağınız tek bir tamsayı almak için bazı eksen ortalamaları yapabilirsiniz. Ne kadar küçük bir fark görmezden gelmeyi seçtiğinize ve ne kadar hızlandırmaya ihtiyaç duyduğunuza bağlı olarak, orijinalin yeniden boyutlandırılmış (% 25,% 10) bir versiyonunda herhangi bir karşılaştırma yapmayı düşünebilirsiniz. Bu çözümlerin ilginç olup olmadığını bana bildirin, tartışabiliriz veya örnek kod sağlayabilirim.


FFT size yalnızca renk bilgisi sağlar ve konum hakkında bilgi vermez. Yeniden boyutlandırma, ortaya çıkan görüntü üzerindeki etkisinden bağımsız olarak belirli bir boyutun altındaki tüm özellikleri yok sayar. Gri bir görüntü ve bir dama tahtası bu ölçü altında aynı olabilir. Bir dalgacık yaklaşımı (Daubechies, Haar, vb.), Her veri noktasında konumsal ve renk bilgilerinin oranını değiştirerek hem konum hem de renk bilgisi sağlama avantajlarına sahiptir.
Edward KMETT

2
Hayır, bir görüntünün FFT'si orijinalin tüm uzamsal bilgilerini içerir. Orijinali FFT'den yeniden oluşturabilirsiniz. homepages.inf.ed.ac.uk/rbf/HIPR2/fourier.htm Ancak bir histogram, sizin düşündüğünüz gibi değildir.
Paul

1

Yakın yinelenen görüntü algılamayı algılamaya yönelik çoğu modern yaklaşım, ilginç nokta algılaması ve bu tür noktaların etrafındaki alanı tanımlayan tanımlayıcılar kullanır. Genellikle EĞER kullanılır. Daha sonra tanımlayıcıları sıralayabilir ve kümeleri görsel kelime dağarcığı olarak kullanabilirsiniz.

Dolayısıyla, iki görselin ortak görsel kelimelerinin bu görsellerin tüm görsel kelimelerine oranını görürsek, görseller arasındaki benzerliği tahmin edersiniz. Bir sürü ilginç makale var. Bunlardan biri Neredeyse Yinelenen Görüntü Algılama: minHash ve tf-idf Ağırlıklandırma


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.