İçindekiler:

Bilgisayarla Görme (OpenCV) Kullanarak Yıldız Tanıma: 11 Adım (Resimlerle)
Bilgisayarla Görme (OpenCV) Kullanarak Yıldız Tanıma: 11 Adım (Resimlerle)

Video: Bilgisayarla Görme (OpenCV) Kullanarak Yıldız Tanıma: 11 Adım (Resimlerle)

Video: Bilgisayarla Görme (OpenCV) Kullanarak Yıldız Tanıma: 11 Adım (Resimlerle)
Video: Python ve OpenCv Eğitimi Ders 13 Bitwise Operatörü ile resimler üzerinde ve veya ters işlemleri 2024, Kasım
Anonim
Bilgisayarla Görme (OpenCV) Kullanarak Yıldız Tanıma
Bilgisayarla Görme (OpenCV) Kullanarak Yıldız Tanıma

Bu talimat, bir görüntüdeki yıldız modellerini otomatik olarak tanımlamak için bir bilgisayarlı görü programının nasıl oluşturulacağını size açıklayacaktır. Yöntem, belirli yıldız modellerini tanımak için kullanılabilecek bir dizi eğitimli HAAR kademesi oluşturmak için OpenCV (Açık Kaynak Bilgisayar Görüntüsü) kitaplığını kullanır. Bu kılavuz yıldız örüntü tanıma bağlamında olmasına rağmen, açıkladığım OpenCV işlemi diğer uygulamalara da uygulanabilir - bu yüzden umarım faydalı olur!

Proje bu videoda özetlenmiştir:

Bu talimatı neden yazdım?

  1. Geliştirmekte olduğum yıldız örüntüsü tanımlama yönteminin, çok çeşitli amatör astronomi projelerine uygulanma potansiyeli olduğuna inanıyorum - bu ister teleskop yönlendirme, ister otomatik görüntü sınıflandırma, hatta nihayetinde bir açık kaynak veya amatör CubeSat üzerindeki bir yıldız sensörü olsun.
  2. Burada çok sayıda iyi OpenCV talimatı var, ancak buna rağmen başlangıçta öğrenmeyi çok zor buldum, bu yüzden bu kılavuzun OpenCV için HAAR sınıflandırıcılarını eğitmek isteyen diğer insanlar için iyi bir referans olacağını umuyorum (mutlaka bununla ilgisi yok). astronomi belki!).
  3. Ben kendim eğitimli bir programcı değilim, bu yüzden bu proje gerçekten anlayışımı zorladı. Umarım bu Eğitilebilir Yazıyı yazarak diğer, daha deneyimli yapımcılar bu konsept üzerinde çalışmak için ilham alacak ve GitHub'a ve bu talimata bu sayfadaki yorumlar yoluyla katkıda bulunacaklardır.
  4. Amatör astronomi ve oryantasyon yöntemleri benim büyük ilgi alanım, Teleskoplar için Arduino Yıldız Bulucu içeren önceki talimatıma bakın.

Bu Eğitilebilir Dosyanın kapak fotoğrafı, tasarımına katıldığım bir konsept 3U CubeSat tasarımına aittir. Bilgisayarlı görü yıldız tanıma sisteminin orijinal uygulaması, bir Raspberry Pi V2 Kamera kullanan amatör yapımı CubeSats için bir yönlendirme sensörü için olduğu için, bu talimatı göstermek için kullandım. Bilgisayarlı görü yıldız tanımanın başka birçok potansiyel uygulaması olduğuna inanıyorum, ama bence bu en havalısı!

Küçük Bir Sözlük:

Bilgisayarla görü hakkında bilgi edinmek, kullanılan aptalca uzmanlık terimleri yüzünden daha yavaş hale geliyor, bu yüzden burada bizim için bazılarını tanımlayacağım:

Cascade - Belirli bir hedef nesneyi tanımlamak için eğitilmiş bir sınıflandırıcı.

Fiducial Marker - Bir görüntüye görsel referans noktası ekleyen bir işaretçi.

HAAR - Haar benzeri özellikler, sınıflandırıcı eğitimi için kullanılan bir tür görüntü özelliğidir.

OpenCV - Açık Kaynaklı Bilgisayarla Görme, bilgisayarla görme araçları kitaplığı.

Stellarium - Açık Kaynak astronomi yazılımı.

Adım 1: Gereksinimler

OpenCV Linux tabanlı bir kitaplıktır, bu nedenle Windows üzerinde iyi bir şekilde çalıştırılmasının mümkün olduğu söylense de, onu bir Linux ortamında çalıştırmak çok daha kolay olacaktır (bunu benden alın ve tam olarak çalışmasını sağlamak için birçok gün çalışın). Pencereler!). Bir deney olarak, Raspberry Pi 3B+ cihazıma OpenCV indirdim ve çalıştırdım, bu başarılı oldu, sınıflandırıcı eğitimi çok RAM yoğun bir süreç olmasına rağmen, bu yüzden herhangi bir hızda yapmak isterseniz, önerilen rota bir Linux Sanal Sunucu kiralamaktır. (aslında şaşırtıcı derecede ucuz olabilir) birkaç gün/hafta/ay için ve bunu sınıflandırıcı eğitiminin yürütüleceği özel bir ortam olarak kullanın. Putty gibi bir SSH istemcisi kullanarak sunucuyu bir Windows PC'den kontrol edebileceksiniz. Kaskadlar VPS kullanılarak eğitildikten sonra, Windows PC'nize indirilebilir ve Python, bir Windows ortamında görüntü tanıma programını çalıştırmak için kullanılabilir.

Linux Sanal Sunucusu:

HAAR kademeli eğitim süreçlerini gerçekleştirmek için bir Linux Sanal Sunucusu (VPS) gereklidir. Başlangıçta 8 GB RAM ve Ubuntu 16.04.6 (LTS) x64'e sahip bir sunucu tuttum ve daha sonra kaskadları eğitebileceğim hızı iki katına çıkarmak için ikinci bir sunucu tuttum, ancak en az bir taneye ihtiyacınız olacak

Yazılım:

  • Stellarium - bu, ücretsiz olarak kullanılabilen sanal bir planetaryum/astronomi yazılımıdır. Testte kullanılmak üzere simüle edilmiş yıldız görüntülerini toplamak için kullanılacaktır.
  • Putty - Bu, VPS'yi komut satırı üzerinden kontrol etmek için kullanılan bir SSH istemcisidir.
  • WinSCP - bu, Windows PC'den dosya aktarımı yapmak için kullanılır.

Adım 2: VPS Kurulumu

VPS'yi kurmak ve çalıştırmak için küçük bir kurulum süreci vardır. İlk seferde biraz zaman alabilir ama adımları dikkatli takip ederseniz çok zor olmaz. Bu eğitim benim için harika bir referanstı, bu talimat üzerinde çalışırken bunu da okumanızı tavsiye ederim. Harfi takip etmek için gerekli olan linux komutlarının özelliklerini satır satır kapsar.

Kabaca, süreç şunları içerir:

  1. Doğru Ubuntu sürümüyle Linux sunucusunun oluşturulması.
  2. Sunucunun Yükseltilmesi ve Güncellenmesi.
  3. OpenCV'nin kurulu olduğu bir çalışma alanı dizini oluşturulması.
  4. Derleyici, çeşitli kitaplıklar ve Python bağlamaları gibi bazı temel öğelerin yüklenmesi.

Bu aşamadan sonra eğitim sürecine hazırlanmaya başlayabilirsiniz.

Adım 3: Süreç

HAAR basamaklarını kullanan tüm bilgisayarlı görme süreci, ilk başta oldukça kafa karıştırıcıdır, bu nedenle bu Adım, mantığı biraz daha ayrıntılı olarak açıklar:

Temel Süreç

  1. İlgilenilen nesneyi içermeyen birkaç bin görüntüden oluşan bir negatif görüntü veri seti mevcuttur. Bunun VPS'ye yüklenmesi gerekecek.
  2. İlgilenilen nesneyi içeren tek bir pozitif görüntü oluşturulur. Bunun da VPS'ye yüklenmesi gerekecektir.
  3. Tek bir pozitif görüntü, bir dizi seçilmiş parametre tarafından bozulur, çarpıtılır, döndürülür, vb. Bu, tek bir görüntüden büyük bir pozitif veri kümesi oluşturmanın yapay bir yoludur. (Bir kediyi tanımlamak gibi diğer gerçek dünya uygulamaları için, sadece birkaç bin kedi görüntüsünü kullanabilirsiniz, ancak bu kadar büyük bir pozitif görüntü grubunuz yoksa bu yöntem her zaman uygun değildir. Burada kullanılan yapay yaklaşım daha az etkili olacaktır, ancak bunun gibi bir kullanım durumu için tek seçenek budur).
  4. Aşamalar halinde çalışan bir eğitim süreci yürütülür. Her aşama, görüntü kümeleri içindeki farklı HAAR tipi özellikleri tanımlamak için bir kademeli eğitecektir. Her aşamanın tamamlanması katlanarak daha uzun sürer ve sınıflandırıcının etkinliği her seferinde artar (bilin diye aşırı eğitim de mümkündür!).
  5. Tek bir eğitimli kaskad, tek bir hedef nesneyi arayabilecektir. Birden çok benzersiz nesneyi tanımlamak istiyorsanız, her biri için eğitimli bir kademeye ihtiyacınız olacaktır. Bu durumda, kuzey göksel yarım küreyi kapsayabilecek bir küme oluşturmak için benzersiz yıldız desenleri için yaklaşık 50 farklı kaskad eğittim.
  6. Son olarak, bir girdi görüntüsüne karşı bir kümenin her kademesini çalıştıran bir algılama programı kullanılır. Basamak, giriş görüntüsü içinde verilen hedef nesneyi arayacaktır.
  7. Başarılı olursa, hedef nesne giriş görüntüsü içinde tanımlanacaktır.

not örneğin bir uydu yönlendirme bağlamında kullanılırsa, yerleşik bir kamera kullanılarak bir görüntü yakalanacaktır. Bu görüntüdeki en parlak yıldızlar belirlenecek ve bu konumlarda işaretçiler yer alacaktır. Bu görüntü daha sonra, giriş görüntüsünün hedef nesnelerden herhangi birini içerip içermediğini test edecek olan eğitimli basamaklar kümesine sunulur. Gerçek bir pozitif tespit edilirse, bilinen bir takımyıldızın açısal konumu, uydu gövdesinin eksenlerine göre keşfedilir.

4. Adım: Negatifler ve Pozitifler

olumsuzlar

Kademeli eğitimin gerçekten önemli bir yönü, mümkün olduğunca büyük bir negatif görüntü veri setine sahip olmaktır. Binlerce, ideal olarak on binlerce görüntüden bahsediyoruz. İçeriğinin pek bir önemi yok, amaç sadece görsel bilgi çeşitliliği sağlamak. Sınıflandırıcı Eğitim klasörü, derlediğim çeşitli farklı negatif görüntü veri kümelerini içerir. Başlangıçta bunlar yalnızca Stellarium'dan toplanan simüle edilmiş yıldız alanı görüntülerinden oluşuyordu, ancak daha sonra veri setini bulabildiğim kadar rastgele görüntü ile genişlettim (evet, tatil fotoğraflarım dahil…). Buradaki en büyük veri seti, şimdiye kadar oluşturduğum en büyük olan neredeyse 9000 görüntü içeriyor. Bunu kullanarak, kendinizinkini derlemekten kurtulacaksınız.

pozitif

Pozitif görüntü (kaskatın tanımak için eğitileceği hedef yıldız düzenidir), Stellarium'daki bir yıldız düzeninin ekran görüntüsü olarak başlar. Bir piton programı daha sonra görüntüdeki en parlak yıldızları tanımlar ve işaretçileri (bu talimatta daha sonra açıklanmıştır) bu yıldız konumlarının üzerine yerleştirir. Bu görüntü daha sonra 50x50 piksele küçültülür. Bu küçüktür, ancak kaskadlar için gereken eğitim süresi, bu boyut arttıkça katlanarak artacaktır ve bu nedenle bu, kalite ve zaman arasında iyi bir uzlaşmadır.

Adım 5: Stellarium Kontrolü

Stellarium Kontrolü
Stellarium Kontrolü
Stellarium Kontrolü
Stellarium Kontrolü

GitHub deposunun Stellarium Komut Dosyaları klasörü, Stellarium kullanımını kontrol etmek için yazdığım üç programı içerir. Bunları kullanmak için Stellarium yükleme klasörünüzün komut dosyaları klasörüne yerleştirin. Bunları çalıştırmak için, komut dosyaları penceresini Stellarium menüsünden açabilir veya komut dosyaları klasöründeki programa çift tıklayarak Stellarium'u başlatabilir ve seçilen programı hemen çalıştırabilirsiniz.

tez_4 ve tez_5, sırasıyla kuzey ve güney göksel yarıkürelerin her biri için yaklaşık 2000 görüntü yakalar. Bunlar, olumsuz görüntülerin veritabanlarını oluşturmak, olumlu görüntüyü eğitmek için kullanıldı. Kuzey ve güney arasındaki ayrım, kuzey yarımküre yıldız desenlerini güney göksel yarımküre görüntü veri setine karşı eğiterek hedef (pozitif) yıldız deseninin negatif veri setinde bulunmamasını sağlamanın basit bir yoluydu. (Negatif görüntü veri setinde pozitif bir görüntü de mevcutsa, sınıflandırıcının kalitesini etkileyecektir).

thesis_setup da yararlıdır - bu, Stellarium'u görüntüleri yakalamak için uygun olacak şekilde ayarlar - Uzaydan bir görünümü simüle etmek için kullanılan görüntüler. Menüleri, kılavuz çizgilerini, etiketleri vb. gizleme gibi işlemleri otomatik olarak yapar ve her görüntü almak istediğinizde ihtiyaç duymanızı engeller.

Adım 6: Roket Adam

Roket Adam
Roket Adam

Eğittiğim ilk kaskadlar herhangi bir yıldız modelini doğru bir şekilde tanımlayamadı. Çok güvenilmezlerdi ve yanlış pozitiflere çok eğilimliydiler. Benim varsayımım, Stellarium'dan alınan yıldız alanı görüntülerinin (temelde siyah bir arka plan üzerinde yalnızca beyaz noktalar) başarılı bir sınıflandırıcı eğitimi için yeterli HAAR tipi özelliği içermek için yeterli görsel bilgi içermediğiydi. Sanırım gece geç bir saatti ama bir yıldız alanı görüntüsündeki her parlak yıldızın konumu üzerine otomatik olarak küçük bir küçük resim yerleştirecek bir program yazma fikrini denemeye karar verdim.

Elton

Bu aptalca bir testti, ancak her parlak yıldız konumuna Elton John'un yüzünün küçük bir resmini ekleyerek, sınıflandırıcıyı bu olumlu görüntüye karşı eğiterek ve ardından basamakları orijinal görüntüye karşı çalıştırarak, doğru bir şekilde bulmakta çok daha etkiliydi. doğru desen. Bir şeyin peşinde olduğumu biliyordum!

Adım 7: Referans İşaretleri

Referans İşaretleri
Referans İşaretleri

'Eltonlar' teoriyi kanıtlamış olsa da, tam dönme simetrisine sahip bir işarete ihtiyacım vardı, böylece hangi yönde olursa olsun yıldız deseni aynı görünecekti. Bir dizi işaretleyici türünü test ettim ve sağ alttaki türün, zıt siyah ve beyaz halkalarla en etkili olduğunu buldum. GitHub deposunun pozitif klasöründe sunulan python programı, belirli bir görüntüdeki en parlak yıldızların nasıl tanımlandığını ve bu işaretlerin bu konumlarda otomatik olarak üst üste bindiğini gösterir. Şimdi, eğitilebilecek anahtar yıldız modellerinin bir temsilini oluşturduk.

Adım 8: Kaskadları Kullanma

Kaskadları Kullanma
Kaskadları Kullanma

Bir dizi kademeyi eğittiğinizde, bir görüntüdeki bir nesneyi tanımlamak için bunları nasıl kullanacağınızı bilmeniz gerekir!

cascade_test19.py programını bulacağınız GitHub'ın Star Identification klasörüne bakın. Bu akılda kalıcı olarak adlandırılan program, belirli bir klasörden bir dizi basamak alır ve hepsini bir giriş görüntüsüne karşı çalıştırır ve yapılan algılamaları raporlar. 'DetectMultiScale' işlevi bunun özüdür ve algılama sürecini tanımlayan çeşitli argümanlar alır. Bunları değiştirmek, kademeli sınıflandırıcının performansı için kritik öneme sahiptir ve bununla ilgili daha fazla tartışma, yanlış pozitifleri nasıl ortadan kaldıracağımıza baktığımız sonraki adımda bulunabilir.

Bu, sınırlayıcı kutunun merkezindeki piksel değeri ile tanımlanan yıldız deseninin Ra/Dec göksel koordinatı arasında bağıntı kurarak ve ardından bunu görüntünün merkezinden (kamera) açısal yer değiştirmeyle ilişkilendirerek bir uydu yönlendirme sisteminde uygulanabilir. eksen). Bundan, mercek distorsiyonunun anlaşılmasını kullanarak (gnomonik bir projeksiyona yakın), uydunun açısı sadece iki pozitif tanımlamadan bulunabilir.

9. Adım: Yanlış Pozitifler Hakkında Nasıl Pozitif Kalınır?

Yanlış Pozitifler Hakkında Nasıl Pozitif Kalınır?
Yanlış Pozitifler Hakkında Nasıl Pozitif Kalınır?
Yanlış Pozitifler Hakkında Nasıl Pozitif Kalınır?
Yanlış Pozitifler Hakkında Nasıl Pozitif Kalınır?

Bu iki görüntü, birbirinin aynı görüntüye karşı ancak farklı parametrelerle kaskad kümesinin test edilmesinin sonuçlarını gösterir. Açıkça, ilk görüntü gerçek tanımlamayı içerir, ancak aynı zamanda çok sayıda yanlış pozitif içerir, oysa ikinci görüntü yalnızca doğru tanımlamayı içerir.

GitHub deposunun Yıldız Tanımlama klasöründeki cascade_test19.py programı, sonuçları sıralamak için iki yöntem kullanır. İlk olarak,DetectMultiScale işlevi, pencere içindeki hedef yıldız modelinin yaklaşık boyutu olarak makul olan, bulunabilecek bir Minimum ve Maksimum sonuç boyutunu ayarlar (verilen lens ve büyütme için - simüle edilen Stellarium görüntülerim şu özellikleri kullanır: Raspberry Pi V2 Kamera) bilinmektedir. İkinci olarak, kod en büyük sınırlayıcı kutuya sahip sonucu seçecektir (önceki sınırlar dahilinde). Testte, bunun gerçek pozitif olduğu bulundu. Üçüncü olarak, program bu kimliği gerçek bir pozitif olarak ele almak için gereken minimum bir 'levelWeights' (etkili olarak 'güven değeri') belirler. Bu yöntemle kaskadlar doğru sonucu bulmada etkiliydi.

Yıldız alanı resimlerinin yanı sıra, bunu örneğin masamın resimlerine karşı da test ettim, örneğin defterimi, kupamı vb. tanımlamak için eğitim basamakları, yanlış pozitifleri ortadan kaldırma alıştırması. Yukarıdaki yöntemler, cesaret verici olan her koşulda iyi çalıştı.

Adım 10: Tartışma

Tartışma
Tartışma
Tartışma
Tartışma
Tartışma
Tartışma

İyileştirme Alanları

Bu benim için karmaşık bir proje oldu ve konuyu anlamamı gerçekten zorladı. Projeyi sizinle paylaşabileceğim bu noktaya getirmek için toplamda birkaç ay neredeyse tam zamanlı bir çalışma gerekti, ancak yöntemin performansını iyileştirmek için yapılacak daha çok iş var. Mevcut haliyle, belirli kısıtlamalar dahilinde iyi çalışabilir. Hangi alanların ek çalışmaya ihtiyaç duyduğunu belirlemek için çalıştım ve umarım önümüzdeki aylarda bunları ele almak için zaman harcayabilirim. Onlar:

Açı - Bu karmaşık bir alandır, sınıflandırıcıların sonuçlarının rotasyonel olarak değişmez olması gerektiği fikridir, yani hedef yıldız desenini içeren görüntünün sunulduğu açıdan bağımsız olarak hedef yıldız desenini güvenilirlik olarak tanımlamalıdır. Tek bir oryantasyonda bir girdi görüntüsü kullanılarak eğitilen bir kaskad, bu resmi rastgele oryantasyonlarda tanımlayamaz, bu nedenle, girdi açılarında bir aralığı kabul edebilen kaskadları eğitmek için pozitif görüntü açısının varyansı eğitim sürecine dahil edilmelidir. Kademeli eğitim komutlarındaki 'maxzangle' parametresi, giriş pozitif görüntüsünün sağlanan negatif görüntüler üzerine bindirileceği açının bir sınırını kontrol eden radyan cinsinden bir argüman alır; olumlu görüntü. Ancak, bu maksimum açı arttıkça, kaskadın kabul oranı (genel anlamda, kalite) keskin bir şekilde düşecektir. Çözümün, büyük bir oryantasyon yayılımını içeren bile iyi kalitede bir kademeli sınıflandırıcının oluşturulabilmesini sağlamak için kullandığımdan çok daha büyük bir negatif görüntü veritabanı kullanarak kaskadları eğitmek olduğuna inanıyorum.

Başka bir potansiyel çözüm, belirli bir hedef için bir dizi basamak eğitmek olacaktır; her basamak, tam 360 derecelik bir dönüşün belirli bir bölümünü yönetir. Bu şekilde her kademenin kalitesi yüksek seviyede tutulabilir, ancak diğer yandan bu çok daha fazla kademeye neden olacak ve dolayısıyla tanımlama süreci daha yavaş olacaktır.

'DetectMultiScale' işlevi tarafından sağlanan bir değer olan 'levelWeight' parametresi, yapılan algılamadaki bir güven değerine benzer. Bunu inceleyerek, görüntünün oryantasyonu her iki yönde arttıkça pozitif tanımlamanın güveninin nasıl keskin bir şekilde azaldığını gösteren ve bunun zayıf bir nokta olduğu düşüncesini doğrulayan yukarıdaki grafik oluşturuldu.

Piksel Yerleştirme - Çok daha basit ama aynı zamanda sorunlu bir nokta, aşağıdaki iki resimde gösterilen, bir yıldız görüntüsünün büyütülmüş bir görünümünü gösteren piksel yerleşimidir, böylece iki yıldızın tek tek pikselleri açıkça görülebilir. Programda görüntüdeki en parlak yıldızlar dışındaki tüm yıldızları temizlemek için kullanılan aşındırma işlemi, eşit parlaklıkta olmalarına rağmen ilk yıldızı tutacak ve ikincisini atacaktır. Bunun nedeni, birinci yıldızın bir piksel üzerinde ortalanmış olması, ikincisinin ise öyle olmamasıdır. Erozyon işlevi, bir grubun merkezi pikselinin etrafındaki eşmerkezli piksel halkalarını çıkarır ve böylece ilk yıldız, merkezi pikselin aşındırma işlevinden kurtulmasını sağlar, ancak ikinci yıldız görüntüden tamamen çıkarılır. Bu nedenle referans işaretleri yalnızca ilk yıldıza yerleştirilecektir, ikinciye değil. Bu, belirli bir yıldız alanındaki hangi parlak yıldızların belirteçleri alacağına (ve dolayısıyla eğitimli sınıflandırıcılarla karşılaştırılacağına) ilişkin tutarsızlıklara neden olacaktır - bu nedenle doğru bir pozitif gözlemin mümkün olmaması mümkündür.

Adım 11: Son Söz

Son söz
Son söz

Talimatımı okuduğunuz için teşekkür ederim, umarım bu projeyi ilgi çekici bulmuşsunuzdur. Üzerinde çalışmak çok ilginç bir süreç oldu, konsept üzerinde çalışmaya başlayalı bir yıldan fazla oldu ve bu noktaya kadar elde edilen sonuçlar beni cesaretlendirdi. Okuduğum literatüre göre, bu oldukça orijinal bir kavram ve daha fazla gelişme ile kesinlikle amatör astronomi veya daha fazlası için bir dizi uygulamada uygulanabilir.

Bu proje benim için dik bir öğrenme eğrisiydi ve bu yüzden daha fazla programlama deneyimine sahip bazı okuyucuların projenin GitHub sayfası aracılığıyla devam etmesine katkıda bulunmak için ilham alabileceğini ve bu açık kaynaklı aracı geliştirmeye devam edebileceğimizi umuyorum. Herhangi bir yorumunuzu okumak için sabırsızlanıyorum, ancak lütfen çok fazla zor soru sormayın!

Uzay Mücadelesi
Uzay Mücadelesi
Uzay Mücadelesi
Uzay Mücadelesi

Uzay Yarışmasında İkincilik

Önerilen: