Görüntü Sınıflandırma - algılama Kat Planları

9 Cevap php

I am working on a real estate website and i would like to write a program that can figure out(classify) if an image is a floor plan or a company logo.

I php yazıyorum bu yana ben bir php çözümü tercih edecektir fakat herhangi bir c + + veya opencv çözüm de iyi olacak.

Kat Planı Örnek:

alt text

alt text

Logo Örnek:

alt text

9 Cevap

Her zaman olduğu gibi, a-built-in PHP function for this yoktur. Sadece şaka. =)

Onlar oldukça monokromatik vardır Gördüğüm tüm kat planları, ben oldukça iyi bir tahmin resim, logo veya bir kat planı olduğunu için renk sayısı ve renk doygunluğu ile oynayabilirsiniz düşünüyorum.

Örn: is the image has less than 2 or 3 colors is a floor plan.

Örn: if the sum / average of the saturation is less than X it's a floor plan.

Logolar görsel olarak daha çekici olma eğilimi ise siyah ve beyaz (kat planları kullanılır ve diğer benzer renkler) dolayısıyla daha doygun renkler kullanın, sıfır ya da sıfıra çok yakın bir doygunluk var.

Burada bir Hex RGB renk doygunluğu hesaplamak için basit bir fonksiyonudur:

function Saturation($color)
{
    $color = array_map('hexdec', str_split($color, 2));

    if (max($color) > 0)
    {
    	return (max($color) - min($color)) / max($color);
    }

    return 0;
}

var_dump(Saturation('000000')); // black    0.0000000000000000
var_dump(Saturation('FFFFFF')); // white    0.0000000000000000
var_dump(Saturation('818185')); // grey     0.0300751879699249
var_dump(Saturation('5B9058')); // green    0.3888888888888889
var_dump(Saturation('DE1C5F')); // pink     0.8738738738738738
var_dump(Saturation('FE7A15')); // orange   0.9173228346456692
var_dump(Saturation('FF0000')); // red      1.0000000000000000
var_dump(Saturation('80FF80')); // ---      0.4980392156862745
var_dump(Saturation('000080')); // ---      1.0000000000000000

Kullanımı imagecolorat() ve imagecolorsforindex() Eğer görüntü ve tutarların her piksel / doygunluk ortalamasını hesaplar oluk döngüler basit bir işlevi uygulayabilirsiniz. Görüntü tanımladığınız özel bir eşiğin üstünde bir doygunluk düzeyi varsa resim bir logo olduğunu varsayabiliriz.

Unutmamanız gereken tek şey, bu algoritmanın uğruna ve aynı zamanda sunucu performansı uğruna tüm boyutlandırmak için akıllıca olacaktır böylece daha yüksek bir çözünürlüğe sahip görüntüler normal, daha fazla doygunluk (Özetle daha fazla piksel) sahip olmasıdır ortak bir karara (diyelim 100x100 veya 50x50) için görüntüleri onları sınıflandırmak ve bir kez sınıflandırılmış orijinal (non-resized) görüntüleri kullanabilirsiniz.

Ben burada kullanılan kod, sağlanan görüntüleri ile basit bir test yaptı:

$images = array('./44199.jpg', './68614.jpg', './95205.jpg', './logo.png', './logo.gif');

foreach ($images as $image)
{
    $sat = 0;
    $image = ImageCreateFromString(file_get_contents($image));

    for ($x = 0; $x < ImageSX($image); $x++)
    {
    	for ($y = 0; $y < ImageSY($image); $y++)
    	{
    		$color = ImageColorsForIndex($image, ImageColorAt($image, $x, $y));

    		if (is_array($color) === true)
    		{
    			$sat += Saturation(dechex($color['red']) . dechex($color['green']) . dechex($color['blue']));
    		}
    	}
    }

    echo ($sat / (ImageSX($image) * ImageSY($image)));
    echo '<hr />';
}

Ve işte sonuçlar:

green floor plant:      0.0151028053
black floor plant:      0.0000278867
black and white logo:   0.1245559912
stackoverflow logo:     0.0399864136
google logo:            0.1259357324

Using only these examples, I would say the image is a floor plant if the average saturation is less than 0.03 or 0.035, you can tweak it a little further by adding extra examples.

Bu insanlara bu outsource kolay olabilir.

Eğer bir bütçe varsa, düşünün Amazon's Mechanical Turk. Bir için Wikipedia'ya bakınız general description.

Alternatif olarak, dış kaynak kendiniz yapabilirdi. Senin resimlerden birisini görüntüleyebilir ve ya bir "logosu" Bizim gibi sıralamak için kullanıcı istemi için bir PHP komut dosyası yazın "yer planı." Eğer bir web sunucusu üzerinde çalışan bu var, kişisel bir iyilik olarak 20 görüntüleri sıralamak için herkese sormak ve tüm ofis e-posta.

Daha da iyisi, bir yarışma yapmak - en görüntüleri sıralar kişi bir ipod kazanacak!

Belki de en basit, pizza ve bira ve kurulum dizüstü bilgisayarlar bir demet Eğer üzerinde bilmek herkesi davet ediyoruz ve herkes sıralama birkaç dakika geçirmek için olsun.

Orada görevi yerine getirmek için yazılım yolu vardır, ama bin daha az bir kaç resim ve yüz en az birkaç dolar bir bütçe ile bir kerelik bir olay ise, bence daha hayat insanları kullanarak daha kolay olabilir.

Akla gelen ilk şeylerden biri, kat planları normal bir logo olandan 90 derecelik açıda oldukça fazla satırları sahip olma eğilimi olmasıdır.

Hızlı bir ilk geçiş görüntü üzerinde Canny edge detection çalıştırın ve bir Hough transform ve rho, bir çizgi Teta tanımını kullanarak açıları oy olacaktır. Eğer Teta için çok güçlü bir yazışma görürseniz = (0, 90, 180, 270) Rho üzerinde toplanır, bir kat planı olarak görüntüyü sınıflandırabiliriz.

Başka bir seçenek Canny adım sadece uzun, kesintisiz bir hat kesimlerinden oy sayımı sonrasında gürültü çıkarmadan, kenar görüntüyü yürümek olacaktır.

Ben çok böyle bir aracı zaten var şüphe ve doğru şey yaratma non-önemsiz olacaktır. Sizin ihtiyaç (bir Sıralanmamış dizin var örneğin,) mevcut görüntülerin bir dizi sıralamak için ise, o zaman "yeterince iyi" aracı yazmak ve manuel hataları işlemek mümkün olabilir. Yeni görüntüleri ile dinamik olarak bunu yapmak gerekirse, muhtemelen yanlış bir yaklaşımdır.

Yaramaz Ben eski dava için bu girişimi, muhtemelen ben bir vekil olarak kullanabilirsiniz trivially farklı bir şey olmazdı. Kat planları (dosya boyutu veya görüntü boyutları birinde) logoları sonra genellikle çok daha büyüktür? Kat planları ardından bir logo daha az renkler var mı? Önemsiz bir şey kullanarak% 75 doğruluk alabilirsiniz, muhtemelen gitmek için yoludur.

Görüntülerde desen recoginition - - Bu gibi şeyler korkunç güvenilmez ve güncellenmesi ve yeni vakaları maç yama sürekli ihtiyacı, zaman açısından korkunç pahalı olma eğilimindedir.

Bunu yapmak için neden ihtiyaç sorabilir miyim? Bir resim, logo veya bir kat planı olup olmadığı elle tespit edilebilir web sitenizin iş akışında bir nokta yok mudur? Kullanıcıların yüklenme sırasında hangi belirlemek sağlayan bir uygulama yazmak için daha kolay olmaz mıydı? Neden ilk etapta verilerin karışık bir dizi var mı?

Bu elle müdahale gerektiren bir şey olduğunu düşünerek rağmen, yapabileceği bir şey görüntünün boyutunu kontrol etmektir.

Küçük bir (her ikisi de MB ve boyutlar açısından) resim, logo olması muhtemeldir.

A (her ikisi de MB açısından ve boyutlarda) büyük resim bir floorplan olması muhtemeldir.

Ancak, bu sadece bir olasılık ölçümü olması ve hiçbir şekilde kusursuz demektir olacaktır.

Görüntünün türü de bir göstergesi olduğunu, ancak bir daha az. Logolar JPG, PNG veya GIF, floorplans muhtemelen TIFF veya diğer kayıpsız bir format olacak olması daha muhtemeldir - ama garantisi yok.

Ben ilk denemek istiyorum basit bir no-beyin girişimi örneklerinden elde ELEMEK keypoints öğrenmek için SVM kullanmak olacaktır. Bunu Ama önce, bunu ya -1 (kat planı) veya 1 (logo) vererek, görüntülerin küçük bir alt etiket gerek. Bir görüntü, bir kat planı olarak sınıflandırılır daha keypoints varsa o zaman bir logo olarak sınıflandırılır daha keypoints varsa o zaman bir logo olmalı, bir floorplan olmalıdır. Computer Vision, bu çanta-of-özellikler yaklaşımla basit yöntemlerden biri olarak da bilinir. Daha karmaşık yöntemler muhtemelen daha iyi sonuç verecektir, ama bu iyi bir başlangıç.

Diğerleri söylediler, böyle bir görüntü tanıma genellikle korkunç karmaşık. PHP unutun.

Ancak, MIGHT oldukça iyi çalışır ve bunu yapsaydım uygulamak oldukça kolay olurdu bir ölçüt görmek numune üzerinde seyir:

Iyi OCR yoluyla görüntüyü çalıştırın, dizeler pop görmek. Eğer oda veya bu özellikleri tanımlayan bir kelime bir demet bulursanız ...

Ben görüntü 90 derece döndürün ve dikey etiketleri yakalamak için tekrar denemek istiyorum.

Edit: Since you say you tried it and it doesn't work maybe you need to clean out the clutter first. Slice the image up based on whitespace. Run the OCR against each sub-image in case it's getting messed up trying to parse the lines. You could test this manually using an image editor to slice it up.

Renk doygunluğunu and görüntü boyutu (her ikisi de önceki cevaplar ayrı ayrı önerilen) hem de kullanın. Insan sınıflandırılmış figürleri büyük bir örnek kullanın ve daha sonra nerede sınır koymak için karar 2-B alan (boyut x doygunluk) çizmek nasıl görmek. Sınır ihtiyacı düz bir çizgi değil, ama çok katlanmış tüm noktalar uygun yapmaya çalışıyorum, ya da yeni verilerin pahasına örnek "memoryzing" olacak yapmazlar. Iyi örneklerin en uygun nispeten basit bir sınır bulmak için, ve bu verilerin en uygun olmalıdır.

Belirli bir hata tahammül gerekir. Bu bir kusursuz bir çözüm mümkün değildir. Ne benim şirketin logosu olarak bir floorplan seçerseniz? (Bu bir şaka değil, sadece komik olur)