Sabit Hatlar

Özet

Sabit Çizgiler, Google Earth uydu görüntülerini hareketle keşfetmenize olanak tanıyan bir denemedir. Makine öğrenimi, veri optimizasyonu ve grafik kartı gücünün bir kombinasyonunu kullanan deneme, arka uç sunucularına ihtiyaç duymadan telefonunuzun web tarayıcısında verimli bir şekilde çalışabilir. Bu, geliştirme sürecimize ve bizi nihai sonuca ulaştırmaya çalıştığımız çeşitli yaklaşımlara bir bakıştır.

https://g.co/LandLines

Data Arts ekibi bir veri kümesini araştırmak üzere bana geldiğinde çok heyecanlandım. Resimler çok güzeldi. İnsan yapımı ve doğal olmak üzere farklı her tür yapı ve dokuyu ortaya çıkaran görseller vardı. Bu veri kümesini nasıl bağlayacağımı da merak ettim. Resim benzerliğini ve bunları filtrelemenin ve düzenlemenin farklı yollarını inceleyen çeşitli ilk denemeler yaptım.

t-sne benzerliği düzeni
t-sne benzerlik düzeni, yüksek çözünürlüklü 50 mb

Grup olarak görsellerdeki güzel ve baskın çizgilere geri dönmeye devam ettik. Otoyollar, nehirler, dağ kenarları ve arazi arazileri gibi bu çizgileri bulmak kolaydı ve bunları keşfetmek üzere birkaç proje tasarladık. Bir sanatçı olarak, satır koleksiyonlarıyla yapabileceğiniz güzel şeyler bana ilham verdi (örneğin Cassandra C Jones'un yıldırımla çalışması) ve bu veri kümesiyle çalışmaktan heyecan duydum.

Çizgi Algılama

Baştaki zorluklardan biri, resimlerdeki çizgilerin nasıl algılanacağıydı. Bir parça izleme kağıdını çıkarmak, bu fotoğraflardan birinin çıktısının üzerine atmak ve gözünüzün gördüğü çizgileri çizmek kolaydır. Ancak, genelde çizgileri bulmaya yönelik bilgisayar görüşü algoritmaları, çok çeşitli görüntülerde iyi çalışmaz.

Aramanın önceki bir sürümünü Yerel Projeler ile bir projeye algoritma çizerek geliştirdim ve bunun için aranacak çizgilere ek açıklamalar ekledik. Sanat eserlerinin üzerine çizim yapmak eğlenceliydi, ancak onlarca görüntüden binlerce resme geçmek yorucuydu. Hat bulma sürecini otomatik hale getirmek istiyordum.

Bu havadan çekilen görüntülerle, OpenCv'nin canny kenar algılama algoritması gibi geleneksel çizgi algılama algoritmalarını denedim, ancak bunların ya çok kesintili çizgi segmentleri ya da eşiğin çok rahat olması durumunda, tonlarca sahte çizgi verdiğini gördüm. Ayrıca, iyi sonuçlar elde etme eşikleri farklı görüntü kümelerinde farklıydı ve gözetim olmadan tutarlı bir iyi hat kümesi bulmak için bir algoritma istedim.

gPb (PDF) gibi en yeniler de dahil olmak üzere çeşitli çizgi algılama algoritmalarıyla denemeler yaptım. Olağanüstü sonuçlar üretmesine rağmen, her resim için birkaç dakika çalıştırmak gerekir. Sonunda, openCV ile birlikte gönderilen bir algoritma olan Yapılandırılmış Orman kenar algılama ile çalışmaya başladım.

İyi bir "çizgi resmi" elde ettikten sonra, çizgileri alma ve ayrı ayrı çizgileri birbirinden bağımsız olarak tanımlama gibi, bu kafes verilerini nasıl alıp nasıl vektör yapacağım gibi bir sorun yaşıyordum. Bilgisayarla görme sorunlarına baktığımda, çoğu zaman bilim insanları ve araştırmacılar tarafından kullanılan ve sağlıklı bir eklenti ekosistemine sahip olan açık kaynaklı Java tabanlı görüntü işleme ortamı olan imageJ'yi araştırıyorum. Sırt algılama adlı, yoğunluk görüntüsü alıp bunu bir dizi çizgi segmentine dönüştürmeye yardımcı olan bir eklenti buldum. (Ayrıca, Matlab'in sunduğu bu kenar algılama ve etiketleme kodunu da faydalı buldum.)

Algılanan çizgi segmentleri içeren resim
Algılanan çizgi segmentleri içeren resim

Sunucusuz

Ayrıca, eşleştirme ve bağlanmanın zor işlerinin istemci tarafında gerçekleştiği, esasen sunucusuz bir veri görselleştirme uygulaması yapmanın mümkün olup olmadığını görmek istedim. Genellikle reklam öğesi kodlaması için c++ çerçevesi olan openFrameworks'te çalışıyorum ve zaman zaman düğüm projesinin yanı sıra sunucu tarafında çok fazla kodlama yapmadım. Tüm hesaplama istemcisi tarafını yapmanın ve sunucuyu yalnızca json ve görüntü verilerini sunmak için kullanmanın mümkün olup olmadığını merak ediyorum.

Çekme uygulaması için eşleştirme, çok ağır bir işlemdir. Bir çizgi çizdiğinizde, on binlerce çizgi segmenti arasından en yakın eşleşmeyi bulmamız gerekir. Bir çizimin diğerine olan mesafesini hesaplamak için birçok mesafe hesaplaması içeren dolar hareketi tanıyıcıdan bir metrik kullanırız. Geçmişte, ileti dizisi oluşturma ve başka numaralar kullanırdım. Ancak, bir istemci cihazında (cep telefonları dahil) gerçek zamanlı olarak çalışması için daha iyi bir şeye ihtiyacım vardı. En yakın/en yakın komşuları bulmak için metrik ağaçlarını araştırdım ve görüş noktası ağaçlarına (javascript uygulaması) karar verdim. Bakış noktası ağacı temel olarak bir dizi veriden ve bir mesafe metriğinden oluşturulur. Yeni bir veri parçası yerleştirdiğinizde en yakın değerlerin oldukça hızlı bir listesini elde edebilirsiniz. Bu çalışmayı cep telefonunda ilk gördüğümde yerden yere düşmüştüm. Bu özel seyir noktası ağacı uygulamasının en büyük avantajlarından biri, hesaplandıktan sonra ağacı kurtarabilmeniz ve bu ağacı hesaplama maliyetlerinden tasarruf edebilmenizdir.

En yakın sonuçlar Çizilen sonuçlar
Görüş noktası ağacından sonuç örnekleri, çizilen giriş sağ tarafta, en yakın sonuçlar soldadır.

Sunucu olmadan çalışmasının bir başka zorluğu da verileri bir mobil cihaza yüklemektir. Çizim söz konusu olduğunda, ağaç ve çizgi segmenti verilerinin 12 MB'tan büyük olması ve resimler oldukça büyüktür. Bu nedenle, deneyimin hızlı ve duyarlı bir şekilde çalışmasını istedik ve hedef, indirme boyutunu küçük tutmaktı. Çözümümüz, verileri kademeli olarak yüklemekti. Çizim uygulamasında, görüş noktası ağacı veri kümesini 5 parçaya böleriz. Uygulama yüklendiğinde yalnızca ilk parçayı yükler ve ardından her 10 saniyede bir arka planda başka bir veri parçası yükler. Böylece, uygulama aslında kullanıldığı ilk dakika boyunca daha iyi ve daha iyi hale gelir. Drag uygulamasında resimleri önbelleğe almak için de yoğun bir çalışma yapıldı. Böylece, siz sürüklerken arka planda yeni resimler yüklendi.

Son olarak, beklediğimden daha zor bir şey oldu; her iki uygulama için de ön yükleyici yapmaktı, böylece veri yüklemelerinin makul olacağı için ilk gecikmeyi yaşayabilirsiniz. Ajax isteklerinde ilerleme geri çağırmasını kullandım ve pixi.js tarafında, eşzamansız olarak yüklenen resimleri kontrol ettim ve önceden yükleme mesajını sağlamak için bunu kullandım.

Bağlı Hat

Sürüklemek için, kenar algılamada bulduğumuz çizgilerden sonsuz bir çizgi oluşturmak istedim. İlk adım, çizgi algılama algoritmasından çizgileri filtrelemek ve bir kenarda başlayıp diğer üç kenarın birinde biten uzun çizgileri tanımlamaktı.

Bağlantı için iyi olan hatlar kırmızı renkle işaretlenmiştir Bağlantı için iyi olan hatlar kırmızı renkle işaretlenmiştir
Bağlantı için iyi çizgiler kırmızıyla işaretlenmiştir

Elimdeki uzun çizgileri birbirine bağlamak için (veya daha doğru bir terim kullanmak istiyorsanız çoklu çizgiler, yani birbirine bağlı noktalardan oluşan) bu çizgileri bir dizi açı değişikliğine dönüştürdüm. Bir çoklu çizgiyi genellikle bir noktalar dizisi olarak hayal edersiniz: a noktası, c noktasına bağlı olan b noktasına bağlanır. Bunun yerine, çizgiyi açı değişiklikleri olarak ele alabilirsiniz: İleri hareket edin ve belirli miktarda döndürün, ileri doğru hareket edin ve biraz döndürün. Bunu görselleştirmenin iyi bir yolu, tel bükme makinelerini düşünmektir. Bu makineler, bir parça gerilirken dönme işlemini gerçekleştirir. Çizimin şekli çevirmeden gelir.

Çizgiyi noktalar değil, açı değişimleri olarak kabul ederseniz çizgileri daha az süreksizlik içeren daha büyük tek bir çizgide birleştirmek daha kolay hale gelir. Sonuçta, noktaları birleştirmek yerine göreceli açı değişiklikleri eklersiniz. Çizgi eklemek için, resim0 ana çizgisinin geçerli açısını alıp eklemek istediğiniz çizgiyle ilgili değişiklikleri ona eklersiniz.

Not olarak, sanatsal kullanım amacıyla bir çizgiyi açı değişikliklerine dönüştüren bu tekniği kullandım. Kablonun kıvrılıp sıyrılmasına benzer şekilde çizimler yapabilirsiniz. Bazı örnekler: bir, iki, üç

Bu açı hesaplaması, siz sürüklerken çizgiyi yönlendirmemizi sağlar. Ana açının olmak istediğimiz yerden ne kadar uzak olduğunu hesaplar ve çizginin doğru yönde gitmesini en iyi şekilde sağlayacak bir resim ararız. Bu tamamen nispeten düşünme meselesidir.

Son olarak, bu projeye dahil olmanın çok eğlenceli olduğunu söylemek istiyorum. Bir sanatçı olarak bu resimler kadar etkileyici bir veri kümesi kullanmasının istenmesi heyecan verici. Veri Sanatları Ekibi'nin sizinle iletişime geçmesinden onur duyuyorum. Umarım bunu denemekten eğlenin.