खास जानकारी
Land Lines एक प्रयोग है जो आपको जेस्चर की मदद से Google Earth की सैटलाइट इमेज को एक्सप्लोर करने का विकल्प देता है. मशीन लर्निंग, डेटा ऑप्टिमाइज़ेशन, और ग्राफ़िक कार्ड पावर के कॉम्बिनेशन का इस्तेमाल करके, इस प्रयोग को बिना बैकएंड सर्वर की ज़रूरत के आपके फ़ोन के वेब ब्राउज़र पर बेहतर तरीके से चलाया जा सकता है. यह हमारी विकास प्रक्रिया और उन तरीकों पर नज़र है जिन्हें हमने आखिरी नतीजे तक पहुंचाने की कोशिश की.
जब डेटा आर्ट्स की टीम ने पृथ्वी की इमेज के डेटा सेट को खोजने के लिए मुझसे संपर्क किया, तो मैं बहुत उत्साहित थी - ये इमेज खूबसूरत थीं और इंसानों के बनाए और प्राकृतिक, सभी तरह के स्ट्रक्चर और टेक्सचर के बारे में बताती थीं. मुझे इस डेटा सेट को कनेक्ट करने के तरीके की जानकारी थी. इमेज की समानता और उन्हें फ़िल्टर करने और व्यवस्थित करने के अलग-अलग तरीकों को देखने के लिए मैंने कई तरह के शुरुआती प्रयोग किए.
एक समूह के रूप में हम, इमेज में मौजूद खूबसूरत और प्रमुख लाइनों पर वापस आते रहे. इन लाइनों - हाइवे, नदियों, पहाड़ों के किनारों, और प्लॉट जैसी जगहों को आसानी से देखा जा सकता था. हमने इनके बारे में जानने के लिए कुछ प्रोजेक्ट डिज़ाइन किए. एक कलाकार के तौर पर, मैं उन खूबसूरत चीज़ों से प्रेरित थी जिन्हें लाइन के संग्रह की मदद से किया जा सकता है - उदाहरण के लिए देखें कैसांड्रा सी जोंस का लाइटनिंग के साथ काम - और मैं इस डेटा सेट के साथ काम करने के लिए उत्साहित हूं.
लाइन डिटेक्शन
शुरुआती चुनौतियों में से एक था, इमेज में लाइनों का पता लगाना. ट्रेसिंग पेपर का एक टुकड़ा निकालना, इन फ़ोटो में से किसी एक के प्रिंटआउट पर उसे फेंकना, और वह रेखाएं बनाना आसान है जो आपकी आंखों को दिखती है. हालांकि, सामान्य कंप्यूटर विज़न एल्गोरिदम में लाइनों को ढूंढने के लिए, अलग-अलग तरह की इमेज पर अच्छी तरह से काम नहीं करता है.
मैंने स्थानीय प्रोजेक्ट वाले एक प्रोजेक्ट पर एल्गोरिदम बनाकर, खोज का पिछला वर्शन बनाया है और इसके लिए हमने खोज के लिए लाइनों की व्याख्या की है. चित्रकलाओं के ऊपर चित्र बनाना मज़ेदार था, लेकिन दर्जनों चित्रों से हज़ारों में जाते हुए बेहद थकान भरा होता था. मैं लाइन ढूंढने की प्रोसेस को ऑटोमेट करना चाहता था.
इन एरियल इमेज की मदद से, मैंने OpenCv के कैनी एज का पता लगाने वाले एल्गोरिदम जैसे पारंपरिक लाइन डिटेक्शन एल्गोरिदम को आज़माए. हालांकि, उन्होंने या तो बहुत अनियमित लाइन सेगमेंट दिए या सीमा काफ़ी आरामदेह थी, बड़ी संख्या में नकली लाइनें दीं. साथ ही, इमेज के अलग-अलग सेट पर अच्छे नतीजे पाने के थ्रेशोल्ड अलग-अलग थे. इसलिए, मुझे ऐसा एल्गोरिदम चाहिए था जिससे मेरी निगरानी के बिना एक जैसी अच्छी लाइनें खोजी जा सकें.
मैंने लाइन का पता लगाने वाले कई तरह के एल्गोरिदम के साथ प्रयोग किए. इनमें हाल ही के एल्गोरिदम भी शामिल हैं, जैसे कि gPb (PDF). हालांकि, इससे शानदार नतीजे मिले, लेकिन हर इमेज को चलाने में मिनट लगते थे. आखिर में मैंने स्ट्रक्चर्ड फ़ॉरेस्ट एज डिटेक्शन के साथ काम किया. यह एक ऐसा एल्गोरिदम है जो openCV के साथ शिप किया जाता है.
अच्छी "लाइन इमेज" मिलने के बाद भी, मुझे लाइनें पाने और एक-दूसरे से अलग-अलग लाइनों को पहचानने में समस्या होती थी. जैसे, इस रास्टर डेटा को कैसे लिया जा सकता है और इसे वेक्टर कैसे बनाया जा सकता है. अक्सर कंप्यूटर विज़न से जुड़ी समस्याएँ देखते समय, मैं imageJ की जांच करता हूँ. यह एक ओपन सोर्स जावा इमेज प्रोसेसिंग एनवायरमेंट है, जिसका इस्तेमाल वैज्ञानिक और शोधकर्ताओं ने किया है. इस एनवायरमेंट में प्लगिन का एक बेहतर इकोसिस्टम होता है. मुझे रिज डिटेक्शन नाम का एक प्लगिन मिला. इसकी मदद से, इंटेंसिटी वाली इमेज ली जा सकती है और उसे लाइन सेगमेंट के सेट में बदला जा सकता है. (एक और ध्यान देने के लिए, मुझे लगता है कि Matlab का यह एज डिटेक्शन और लेबलिंग कोड काम का है).
सर्वरलेस
मैं यह भी देखना चाहता था कि क्या ऐसा डेटा विज़ुअलाइज़ेशन ऐप्लिकेशन बनाया जा सकता है जिसमें सर्वर का इस्तेमाल न किया गया हो, जहां डेटा को मैचिंग और कनेक्ट करने में बहुत मुश्किल होती है. मैं आम तौर पर openFrameworks में काम करता हूं. यह क्रिएटिव कोडिंग के लिए एक c++ फ़्रेमवर्क है. इसके अलावा, मैंने कभी-कभी होने वाले नोड प्रोजेक्ट के अलावा, सर्वर साइड कोडिंग पर भी बहुत ज़्यादा काम नहीं किया है. मैंने सोचा कि क्या क्लाइंट साइड का हिसाब-किताब करना और सिर्फ़ सर्वर का इस्तेमाल सिर्फ़ JSON और इमेज डेटा दिखाने के लिए किया जा सकता है.
ड्रॉ ऐप्लिकेशन के लिए, मिलान करना एक बहुत बड़ा ऑपरेशन होता है. जब कोई लाइन बनाई जाती है, तो हमें हज़ारों लाइन सेगमेंट में से सबसे नज़दीकी मैच ढूंढने की ज़रूरत होती है. एक ड्रॉइंग से दूसरी ड्रॉइंग की दूरी का पता लगाने के लिए, हम डॉलर जेस्चर आइडेंटिफ़ायर की मेट्रिक का इस्तेमाल करते हैं. इस मेट्रिक में, दूरी की कई कैलकुलेशन शामिल होती हैं. पहले मैंने थ्रेडिंग और दूसरी तरकीबों का इस्तेमाल किया है, लेकिन क्लाइंट डिवाइस (मोबाइल फ़ोन भी शामिल है) पर रीयल टाइम में यह काम कर सके, इसके लिए मुझे कुछ बेहतर बनाना था. मैंने सबसे नज़दीकी/आस-पास पड़ोसी को खोजने के लिए मेट्रिक ट्री को देखा और वैंटेज पॉइंट ट्री (JavaScript लागू करने की सुविधा) पर फ़ैसला लिया. वैंटेज पॉइंट ट्री मूल रूप से डेटा के एक सेट और दूरी की मेट्रिक से बनी है. डेटा का कोई नया सेट डालने पर, यह आपको बहुत जल्द सबसे नज़दीकी वैल्यू की सूची देता है. जब मैंने पहली बार यह काम अपने मोबाइल फ़ोन पर देखा, तो तुरंत मैं बहुत खुश हो गया था. इस खास वैंटेज पॉइंट ट्री को लागू करने का एक बड़ा फ़ायदा यह है कि इसका हिसाब लगाने के बाद ट्री को बचाया जा सकता है. साथ ही, इस पेड़ की गणना करने में आने वाला खर्च भी बचाया जा सकता है.
सर्वर के बिना काम करने की एक और चुनौती है मोबाइल डिवाइस पर डेटा लोड करना - ड्रॉ के लिए, ट्री और लाइन सेगमेंट का डेटा 12 एमबी से ज़्यादा का था और इमेज काफ़ी बड़ी हैं. हम चाहते थे कि अनुभव तेज़ और प्रतिक्रियाशील हो. साथ ही, हमारा लक्ष्य डाउनलोड को छोटा रखने की कोशिश करना है. हमारा समाधान था कि धीरे-धीरे डेटा को लोड किया जाए. ड्रॉ ऐप्लिकेशन में, हम वैंटेज पॉइंट ट्री के डेटा को पांच हिस्सों में बांटते हैं. ऐप्लिकेशन लोड होने पर, यह सिर्फ़ पहला हिस्सा लोड करता है. इसके बाद, हर 10 सेकंड में यह बैकग्राउंड में डेटा का दूसरा हिस्सा लोड करता है. इसलिए, इस्तेमाल किए जाने के पहले मिनट में ऐप्लिकेशन बेहतर और बेहतर होता जाता है. ड्रैग ऐप्लिकेशन में इमेज को कैश मेमोरी में सेव करने की भी कड़ी मेहनत की गई थी, ताकि जब आप खींचकर छोड़ें, तो बैकग्राउंड में नई इमेज लोड हो जाएं.
आखिर में, एक चीज़ जो मुझे उम्मीद से ज़्यादा मुश्किल लगी, वह था दोनों ऐप्लिकेशन के लिए प्री-लोडर बनाना. इसलिए, डेटा लोड होने में हुई देरी को समझा जा सकता है. मैंने Ajax अनुरोधों पर और pixi.js साइड पर प्रोग्रेस कॉलबैक का इस्तेमाल किया. इससे, एसिंक्रोनस तरीके से लोड हो रही इमेज लोड हो गई थीं और प्रीलोड मैसेज चलाने के लिए उसका इस्तेमाल किया गया था.
कनेक्ट की गई लाइन
ड्रैग करने के लिए, मैं एज डिटेक्शन में मिली लाइनों से एक अनगिनत लाइन बनाना चाहता था. पहला कदम, लाइन की पहचान करने वाले एल्गोरिदम से लाइनों को फ़िल्टर करना और ऐसी लंबी लाइनों की पहचान करना था जो एक किनारे से शुरू होकर तीन अन्य किनारों पर खत्म होती हैं.
जब मैंने लंबी लाइनों का सेट तैयार किया (या ज़्यादा सटीक शब्दों का इस्तेमाल करने के लिए, पॉलीलाइन, कनेक्ट किए गए पॉइंट का कलेक्शन है), तो उन्हें जोड़ने के लिए मैंने इन लाइनों को ऐंगल बदलने वाले सेट में बदल दिया. आम तौर पर, जब आप पॉलीलाइन के बारे में सोचते हैं, तो आप इसे पॉइंट के सेट के रूप में देखते हैं: पॉइंट a, पॉइंट b से जुड़ा हुआ है जो पॉइंट c से जुड़ा है. इसके बजाय, आप रेखा को कोण में बदलाव का सेट मान सकते हैं: आगे बढ़ें और कुछ रकम को घुमाएं, आगे बढ़ें और कुछ रकम घुमाएं. इसे देखने का एक अच्छा तरीक़ा यह है कि तार को बांधने वाली मशीनों के बारे में सोचें, जो तार का एक टुकड़ा लेकर, उसे बाहर निकालने के दौरान घुमाती हैं. ड्रॉइंग का आकार, मोड़ने पर आता है.
अगर आप रेखा को पॉइंट के बजाय कोण के तौर पर बदलते हैं, तो लाइनों को कम गड़बड़ियां वाली एक बड़ी लाइन में जोड़ना आसान हो जाता है - न कि स्टिचिंग पॉइंट के मुकाबले कोण में बदलाव करना. किसी लाइन को जोड़ने के लिए, मुख्य लाइन का मौजूदा ऐंगल लें और उसमें उस लाइन में हुए मिलते-जुलते बदलाव जोड़ें.
एक और बात के तौर पर, मैंने एक लाइन को कोण में बदलने वाली तकनीक का इस्तेमाल कला के शोषण के लिए किया है - आप चाहें, तो ड्रॉइंग "अनurl" कर सकते हैं. कुछ उदाहरण: एक, दो, तीन
कोण की इस कैलकुलेशन के ज़रिए हम लाइन को सही दिशा में ले जाते हैं - हम यह पता करते हैं कि मुख्य कोण कितना दूर है, जहां से हम चाहते हैं. हम ऐसी तस्वीर ढूंढते हैं जिससे लाइन को सही दिशा में ले जाने में सबसे ज़्यादा मदद मिले. यह सब सोच-समझकर करने की ज़रूरत है.
आखिर में, मैं बस यह कहना चाहती हूं कि इस प्रोजेक्ट में शामिल होना वाकई एक मज़ेदार प्रोजेक्ट था. किसी कलाकार के रूप में इन इमेज जितने सुंदर डेटा सेट का इस्तेमाल करना बहुत रोमांचक होता है. साथ ही, Data Arts की टीम से संपर्क करने के लिए मैं बहुत खुश हूं. मुझे उम्मीद है कि इसे आज़माने में आपको आनंद आया होगा!