Teknoloji & Çalışmalarım

Linear Discriminant Analysis (LDA) and Principal Component Analysis (PCA) are widely used methods for linear dimensionality reduction. Due to its supervised nature LDA may perform better than PCA in many cases if the data set is sufficiently large. In literature, various relevance weighted variants of LDA are offered in order to increase the performance on challenging cases on which the original LDA may fail. In this work LDA with different relevance weighting functions is compared with the original LDA and PCA on a synthetically generated data set and three natural data sets which have previously been used for vision-based recognition tasks.

Introduction

Linear discriminant analysis (LDA) is a commonly used method for supervised linear dimensionality reduction on multivariate data in order to obtain lower dimensional data with increased separability. Even though the original LDA is a powerful tool in many cases, it has weaknesses due to its assumptions on data. In the original LDA it is assumed that the distributions of all the classes have the same covariance matrix which is the average of covariance matrices of all classes weighted by their prior probabilities. In this assumption each class including outlier classes affect the common covariance matrix directly proportional with their priori.

In order to achieve a better classification performance on multi-class data, some relevance weighted variants of LDA are proposed with dissimilarity functions using Euclidean distance, Mahalanobis distance (MD), Bayesian classification accuracy function (BA), approximate pairwise accuracy criterion (aPac) [2], Chernoff criterion (CC)[3] and evolutionary weighting algorithms which use these functions as a first generation of iteration [1].

In this study weighted LDA algorithms with different relevance functions will be compared with the original LDA and principal component analysis (PCA) in terms of classification performance on a synthetically generated data set and three natural data sets that have previously been used for hand gesture recognition, fingerspelling recognition and optical character recognition. The classification accuracy is computed by using k-nearest neighbour (k-NN) classifier for different values of k.

Devamını Oku »

Giyim mağazalarında çoğu zaman bir ürünü almadan önce denemek isteriz, peki ya denemek mümkün değilse? Seçeneklerin artması ile denemenin daha zahmetli hale gelmesi bir yana online alışveriş gibi durumlarda denemek hiç mümkün olmayabilir. Bu yazıda geçenlerde geliştirdiğim bir uygulama olan sanal giyinme odasından bahsedeceğim. Uygulamada kullanıcı sanal bir ortamda giysi seçebilmekte ve seçtiği giysileri üzerinde deneyebilmektedir.

Uygulamayı geliştirirken bir görüntü ve derinlik sensörü olan Microsoft Kinect’i ve Microsoft Research tarafından geliştirilen yazılım geliştirme kitini (Kinect SDK) kullandım, uygulamanın çalışma mantığını genel olarak aşağıdaki gibi özetleyebilirim:

  • Derinlik ve kullanıcı etiketi verisinden faydalanılarak kullanıcının canlı video akışından çıkarılması (arkaplan silme),
  • İstenmeyen örtüşmelerin engellenmesi için ten rengi algılama,
  • Giysi modelinin konum ve rotasyonunun eklem noktalarının koordinatlarına göre hizalanması,
  • Giysinin eklemler arası uzaklık ve kameradan uzaklık verisinin kullanılarak ölçeklenmesi,
  • Modelin kullanıcının üzerinde gösterilmesi.

Ön işlemler: arkaplan silme ve ten rengi algılama

Arkaplan silme bu uygulamada iki açıdan kolaylık sağlamaktadır. Birincisi kullanıcıyı çıkartarak ileriki işlemler için ilgili olan alanı (ROI) belirlememizi sağlamaktadır. Bu sayede ten rengi algılama aşamasında arkaplandaki ten rengine benzer alanların da ten rengi olarak algılanması problemi çözülmüş olmaktadır. İkincisi ise arkaplanı sildiğimizde herhangi istediğimiz bir arkaplanla değiştirerek sanal bir ortam oluşturabiliriz. KinectSDK’nın sağlamış olduğu derinlik ve kullanıcı etiketi verisini kullanarak basit bir maskeleme ile bu işlemi kolayca gerçekleştirebiliriz.

Giysi modeli görüntünün üstüne eklendiğinden kullanıcının hareketi modelin arkasında kısıtlı kalmaktadır. Bu bağlamda ten rengi algılamada istenmeyen örtüşmelerin engellenmesi amaçlanmıştır.  Uygulamada ten rengine sahip alanlar en üst katmana taşınarak model ile örtüşmeleri engellenmektedir. Bu konuda yapılabilecek daha akıllıca bir çözüm derinlik verisinden faydalanarak giysi modeli ile kullanıcının derinlik sıralamasını ayarlamak olabilir. Burada böyle bir yaklaşımı benimsememin tek nedeni daha kolay olmasıydı. Kameradan gelen RGB görüntü YCbCr renk uzayına dönüştürülüp her renk kanalı için basit bir eşikleme uygulanması ten rengi algılamada en basit çözüm olarak kolayca gerçeklenebilir.

Hizalama ve ölçekleme

Kinect SDK ile sağlanan iskeletsel takipçi (skeletal tracker) vücut eklemlerinin 3 boyutlu koordinatlarını yaklaşık olarak vermektedir. Eklemlerin ekrandaki piksel konumları ve birbirleri ile yaptıkları açılardan faydalanılarak giysi modelinin konumlandırılması ve döndürülmesi sağlanmıştır. Omuzlar arası uzaklık, boy uzunluğu ve kullanıcının kameradan uzaklığı değerlendirilerek giysi modeli ölçeklenmiştir.

Daha neler yapılabilir?

Başarım kriterini kullanıcının giysi modeli ile örtüşme oranı olarak belirleyerek uygulamayı farklı koşullar altında test ettiğimizde %83 ortalama başarı oranı elde ettik. İlerleyen aşamalarda 3 boyutlu giysi modelleri ve fizik motoru kullanılarak daha gerçekçi sonuçlar elde edilebilir. Alternatif olarak giysilerin farklı açılardan çekilmiş fotoğrafları kullanılarak sahte 3d izlenimi oluşturulabilir. Örtüşmelerin işlenmesinde daha önce de bahsettiğim gibi renk özellikleri yerine derinlik verisinden faydalanılabilir.

Gelen geribildirimler üzerine şunu da belirtmek istiyorum evet daha önce yapılmış benzer uygulamalar var, zaten bu fikri ilk benim bulduğum gibi bir iddiada bulunmuyorum. Benimkisi ticari olmayan yalnızca deneysel amaçlı bir çalışma.

Daha detaylı bilgi için:
A more detailed report (in English): A Real Time Virtual Dressing Room Application using Kinect ]

HSV renk uzayında bildiğimiz gibi renkler renk özü (hue), doygunluk (saturation) ve parlaklık (brightness, value) değerleri ile tanımlılar. Bu uzaydaki renklerin renk ve doygunluk bileşenlerinin özelliklerinden faydalanarak genel amaçlı görüntü sınıflamada kullanabileceğimiz parlaklıktan bağımsız bir özellik çıkarıcı tanımlayabiliriz. Buradaki örnekte bir görselin “şehir”, “yüz”, “doğa”, “ev – dış görünüm”, “ev – iç mekan”, “ofis” ve “deniz” kategorilerinden hangisine ait olduğunu sınıflamaya çalışacağız.

Burada en basit yaklaşım muhtemelen görüntünün tümünün histogramını bir özellik vektörü olarak kullanmak olacaktır. Renk histogramları görüntülerdeki renklerin olasılık dağılımlarını ifade ettiğinden böyle bir özellik vektörü kullandığımızda sınıflama görüntüdeki genel renk dağılımına göre yapılmış olacaktır. Örneğin deniz görüntülerinde mavi tonlarının dağılımı, şehir görüntülerinde gri tonlarının dağılımı ağırlıklı olacağından bu iki kategorideki görüntüleri birbirinden ayırmak zor olmayacaktır.

Bu yaklaşımda yalnızca renk dağılımlarının dikkate alınması ve konumsal herhangi bir bilginin bulunmaması bazı durumlarda dezavantaj oluşturabilir. Bu örneğe baktığımızda bütün dış mekan görüntülerinin (şehir, doğa, ev, deniz) mavi gökyüzüne sahip olması oldukça muhtemel bir durum, bütün dış mekan görüntülerinde mavinin baskın olması bu sınıflara ait görüntülerin ayırt ediciliğinin azalmasına yol açabilir. Bu durumda görüntüleri  eşit sayıda parçalara bölüp her bir bölme için ayrı histogram hesaplayabiliriz.

Örnek olarak her bir görüntüyü 4′e bölüp her bir bölme için hesapladığımız histogramlara ilave olarak tüm görüntünün histogramını da aldığımızda toplam 5 histogramdan oluşan bir  görüntü tanımlayıcısı elde edebiliriz. Her bir histogram için 4 aralık değeri kullandığımızda toplamda 4 (aralık sayısı)*2 (kanal sayısı)*5 (histogram sayısı) = 40 boyutlu bir özellik vektörü elde etmiş oluruz.

Sınıflama için herhangi bir sınıflayıcı kullanabiliriz. Bu örnekte ben bir Destek Vektör Makinası (Support Vector Machine) kütüphanesi olan LIBSVM‘yi kullandım. Google görseller üzerinde yaptığım sınıflama %70 doğruluk oranı ile sonuçlandı.

Bugün neredeyse bütün kamera ve görüntü işleme yazılımlarının sahip olduğu görüntü birleştirme (panoramik çekim) özelliğinin nasıl çalıştığını merak ettiniz mi? Bu yazıda en basit anlamda görüntü birleştirmenin nasıl yapılabileceğine değineceğim, kaynak kodları ve daha detaylı raporu yazının ekinde bulabilirsiniz.

Birleştirilecek görüntüler farklı perspektiflerden çekilmiş olduğundan doğrudan görüntüleri uç uca ekleyerek güzel sonuçlar almamız pek mümkün değil. Bu yüzden ilk olarak görüntülerin perspektiflerini birbirine göre hizalamamız gerekiyor. Neyi neye göre hizalamamız gerektiğini bulmak için öncelikle ardışık iki görüntünün kesiştiği alandaki bazı ortak noktaları buluyoruz.

1. Ortak Noktaların Bulunması

Ortak noktaları SIFT veya SURF gibi çeşitli anahtar nokta tanımlayıcı algoritmalar yardımı ile otomatik olarak bulabiliriz ancak bu örnekte karmaşıklığı artırmamak için noktaları el ile işaretliyoruz. Örneğin iki görüntüde de yer alan binaların köşe noktalarını işaretleyebiliriz.

2. Görüntülerin Hizalanması

İlk görüntüde bulduğumuz ortak noktalardan oluşan matrise X, bu noktalara karşılık gelen ikinci görüntüdeki noktaların koordinatlarından oluşan matrise x diyecek olursak bu noktaları arasında eşleşme yapmamıza olanak sağlayacak “X = Hx” eşitliğini sağlayan bir dönüşüm matrisi (H) bulmamız gerekir (daha detaylı matematiksel açıklama için ekteki rapora bakabilirsiniz).

Dönüşüm matrisini bulduktan sonra ilk görüntüdeki bütün noktaların koordinatlarına bu dönüşümü uygulayarak hizalamadan sonra olması gereken koordinatlarını bulabiliriz. Bu şekilde bir dönüşüm uygulandığında bir bakıma noktalara birebir eşleme yapmış oluyoruz. Bu durumda görüntüdeki toplam nokta sayısı değişmemiş oluyor ve küçük bir görüntüden daha büyük bir görüntüye eşleme yaptığımızda elde edilen piksellerde boşluklar bulunması muhtemel olacaktır. Bu sebeple kaynak görüntüdeki her nokta için yeni değer hesaplamak yerine hedef görüntüdeki her noktanın olması gereken değerini interpolasyon ile hesaplamak (inverse mapping) daha mantıklı olacaktır.

3. Görüntülerin Birleştirilmesi

Görüntüler hizalandıktan sonra birleştirme aşamasında kesişen bölgelerde basitçe iki görüntünün ortalaması alınabilir veya yakın olan görüntünün ağırlığı daha yüksek olacak şekilde ağırlıklı ortalama alınabilir. Bu örnekte daha basit olması için kesişen bölgelerde en parlak pikselin değeri alınmıştır.

Daha detaylı bilgi ve MATLAB kodları için:
More detailed report (in English) and the source code: [Image Stitching /Mosaicing by Furkan Isikdogan]

Zar sayısının, arka plan renginin veya zarların renginin belli olmadığı bir ortamda zarların kaç geldiğini otomatik olarak nasıl algılayabiliriz? Zarların daima açık renklerde olacağını varsayacak olursak akla gelen ilk cevap basit eşikleme uygulamak olabilir. Ancak aşağıdaki temsili histogramdaki gibi arka planın tek renk olmaması ve zar renklerinin arka plan renklerinin arasındaki değerlerde yoğunlaşmış olması probleme yol açacaktır.

Bu durumda zarların masada az yer kapladıklarını varsayarsak görüntüdeki en baskın renklerin arka plan deseni üzerinde yer alan renkler olacağını düşünebilir ve bu renk aralıklarını maskeleyerek zarların temiz görüntüsüne ulaşabiliriz. Ulaşırız demiyorum çünkü bu uygulamanın benim elimdeki veri setinde başarılı sonuçlar vermiş olması her koşulda iyi sonuçlar vereceğini göstermeyebilir.

Önerdiğim algoritmayı aşağıdaki gibi özetleyebiliriz:

- Görüntünün histogramının elde edilmesi,
- Histograma ortalama filtresi uygulanarak ( y[i] = (y[i-1] + y[i] + y[i+1])/3 ) keskinliklerin giderilmesi,
- Histogramda en baskın renklerin bulunması ve bu renklere belirli bir tölerans değerinden daha yakın olan renklerin görüntü üzerinde maskelenmesi,
- Görüntüye adaptif eşitleme uygulanması,
- Elde edilen ikili(binary) görüntüdeki bağlı bileşenlerin bulunması ve her biri içinde kalan boşlukların sayılması.

 

Çıktı: {5,2}

Not: Soldaki temsili histogram sağdaki görüntülere ait değildir.

Elde edilen bağlı bileşenlerin bize zarları vereceğini ve içlerinde kalan boşluk sayılarının da zarların kaç geldiğini vereceğini düşünürsek görüntüde kaç tane zar olduğunu ve her birinin kaç geldiğini bulabiliriz.

Edit: Ön işleme aşamasında baskın renklerin maskelenmesi yerine Biliteral Filter (Photoshop’taki adıyla Surface Blur) kullanmak bu problemde daha iyi sonuçlar veriyor.

Polonya’daki stajımın son haftasında bilim günü isimli etkinlikte küçük çocuklar için sergilenmek üzere kamera kontrollü küçük bir oyun geliştirdim. Oyunu kullanıcı etkileşimi ve oyun mantığı olmak üzere iki bölümde inceleyebiliriz.

Kullanıcı Etkileşimi
Oyun kontrolünün farklı renklerde başlıklar giyen oyuncuların kuş bakışı bir kameradan alınan görüntüleri aracılığıyla sağlanması amaçlanmaktadır. Ancak test aşamasında kullanım kolaylığı nedeniyle normal kamera ve kullanıcıları temsilen renkli işaretçiler kullanılmıştır.

Her kullanıcı için bir renk aralığı tanımlanmakta ve bu aralığa göre eşikleme uygulanmaktadır. Elde edilen görüntünün ağırlık merkezi bulunarak kullanıcının konumu belirlenmektedir. Ağırlık merkezinin x ve y koordinat değerleri görüntü momentleri kullanılarak bulunabilir. Aşağıdaki formülde I(x,y) görüntünün (x,y) koordinatlarına karşılık gelen piksel değerini ifade etmektedir.

Position(x) = M10/M00
Position(y) = M01/M00

Oyun Mantığı
Oyunda kullanıcılar, oyun nesneleri ve bunların ilişkileri aşağıdaki oyun kuralları çerçevesinde tasarlanmıştır:
(1) Her oyuncu yalnızca kendi rengindeki bayrakları alabilir ve her bayrak için bir puan değeri oyun başlangıcında tanımlanabilmektedir. (2) Bomba ikonu bütün kullanıcılar tarafından alınabilmektedir ve alınması durumunda bütün diğer oyuncular kurulum sırasında tanımlanmış değer kadar puan kaybetmektedirler. (3) Her nesne için belirli bir zaman aşımı bulunmaktadır ve hiçbir oyuncu tarafından yakalanmayan nesneler tanımlanan süre sonunda kaybolmaktadır.

Bu arada telif hakları problem olmasın diye oyun grafiklerini de kendim tasarladım. :)

 

PSNC’deki 3. haftamın sonunda tamamladığım bu proje ile kamera görüş alanı içerisinde hareket eden öğelerin tespit edilmesi ve her ögenin kendi tanımlayıcı numarası ile takip edilmesi sağlanıyor. Bir önceki projemde olduğu gibi bu uygulamayı da Java ile OpenCV kütüphanesi arasında bir köprü niteliğinde olan JavaCV sarmalayıcısını kullanarak geliştirdim. Projenin temel işleyiş biçimini aşağıdaki başlıklar altında özetleyebiliriz.

Mevcut anlık görüntü içerisinde nesne bulma (Blob Detection)
Anlık görüntü içerisinde hareket eden cisimlerin bulunması için uygulanan yöntemler;
Mixture of Gaussians yaklaşımı ile dinamik arkaplan çıkarımı,
Elde edilen görüntünün eşikleme uygulanarak binary görüntüye dönüştürülmesi,
Biçimsel işlemler ile gürültünün giderilmesi ve nesne içi kopuklukların kapatılması,
Bağlı bileşenlerin bulunması ve çevreleyen dikdörtgenlerin elde edilmesi şeklinde özetlenebilir.

Bulunan nesnelerin bir önceki anlık görüntü ile ilişkilendirilmesi
Videonun ardışık çerçevelerinde aynı nesnelerin birbirleriyle ilişkilendirilmesini sağlamak için temel olarak aşağıdaki adımlar uygulanmıştır;
Bir önceki görüntüdeki nesnelerin mevcut nesnelere koordinat uzaklıklarının bulunması,
Görüntünün RGB renk uzayından HSV uzayına dönüştürülmesi ve nesnelerin Hue-Saturation histogramlarının elde edilmesi,
Histogramların normalizasyonu ve birbirine olan uzaklıklarının bulunması,
Ardisik iki görüntüdeki nesnelerin koordinat ve histogram uzaklıklarının karşılaştırılması,
Mesafe ve renk olarak en yakın olan nesnelerin uzaklığı belirli bir değerin altındaysa nesne tanımlayıcılarının (ID) eşleştirilmesi, değilse nesneye yeni ID atanması.

Çerçeveler arası süreksizlik probleminin çözümü
Anlık çerçevede bir nesne kaybolduğunda nesnenin önceki çerçevelerdeki hareketi göz önünde bulundurularak lineer regresyon ile yeni konumu hesaplanmaktadır. Nesnenin gerçekten kaybolmuş olabileceği durumunu da ele alabilmek için hesaplanarak konumu tahmin edilen nesneler hayalet nesne olarak işaretlenmekte ve ardisik çerçeve sayısı cinsinden bir ömür atanmaktadır. İlerileyen çerçevelerde nesne tekrar tespit edilirse yakalanmakta ve gerçek nesne olarak işaretlenmekte, ömrü bitene kadar tespit edilemezse silinmektedir. Bir nesnenin kisa bir sure icin kaybolmasi sorun oldugu gibi, genellikle görüntüdeki küçük hareketliliklerden kaynaklanan (örneğin ağaçların rüzgarla hareket etmesi) kisa sureli istenmeyen nesnelerin ortaya çıkması da problem olmaktadir. Bu sorun da benzer şekilde her nesneye bir yaşam süresi atanması ve belirli bir süreden daha uzun süre varlığını sürdürmeyen nesnelerin silinmesi ile çözülmüştür.

Stajımın ilk haftasında Java ve (JavaCV sarmalayıcısı ile) OpenCv kullanarak geliştirdiğim bir çeşit görü tabanlı izleme sistemi olan bu proje ile otopark alanına bakan bir kameradan alınan görüntüler işlenerek park alanında kaç araç bulunduğu, hangi alanların boş hangilerinin dolu olduğu gibi bilgiler kamera görüntüsü üzerinde görüntülenebiliyor.

Sistemin işleyişi oldukça basit, genel adımları aşağıdaki gibi özetleyebilirim:

Devamını Oku »

Arşivler
Meta