সারসংক্ষেপ
ল্যান্ড লাইনস একটি পরীক্ষা যা আপনাকে অঙ্গভঙ্গির মাধ্যমে Google আর্থ স্যাটেলাইট চিত্রগুলি অন্বেষণ করতে দেয়৷ মেশিন লার্নিং, ডেটা অপ্টিমাইজেশান, এবং গ্রাফিক্স কার্ড পাওয়ারের সংমিশ্রণ ব্যবহার করে, পরীক্ষাটি ব্যাকএন্ড সার্ভারের প্রয়োজন ছাড়াই আপনার ফোনের ওয়েব ব্রাউজারে দক্ষতার সাথে চালাতে সক্ষম। এটি আমাদের উন্নয়ন প্রক্রিয়া এবং বিভিন্ন পন্থা যা আমরা আমাদের চূড়ান্ত ফলাফলের দিকে নিয়ে যাওয়ার চেষ্টা করেছি তার একটি নজর।
যখন ডেটা আর্টস টিম পৃথিবীর চিত্রগুলির একটি ডেটা সেট অন্বেষণ করার বিষয়ে আমার সাথে যোগাযোগ করেছিল তখন আমি বেশ উত্তেজিত ছিলাম - ছবিগুলি সুন্দর ছিল, যা মানুষের তৈরি এবং প্রাকৃতিক উভয় ধরণের কাঠামো এবং টেক্সচার প্রকাশ করে এবং আমি এই ডেটা কীভাবে সংযুক্ত করব তা নিয়ে আগ্রহী ছিলাম সেট আমি চিত্রের মিল এবং সেগুলিকে ফিল্টারিং এবং সংগঠিত করার বিভিন্ন উপায়ের দিকে লক্ষ্য করে বিভিন্ন ধরণের প্রাথমিক পরীক্ষা করেছি।
একটি গোষ্ঠী হিসাবে আমরা চিত্রগুলিতে সুন্দর এবং প্রভাবশালী লাইনগুলিতে ফিরে আসছি। হাইওয়ে, নদী, পাহাড়ের কিনারা এবং জমির প্লটগুলি - এই লাইনগুলি চিহ্নিত করা সহজ ছিল এবং আমরা এইগুলি অন্বেষণ করার জন্য কয়েকটি প্রকল্প ডিজাইন করেছি৷ একজন শিল্পী হিসাবে আমি লাইনের সংগ্রহের সাথে আপনি যে সুন্দর জিনিসগুলি করতে পারেন তা দ্বারা অনুপ্রাণিত হয়েছিলাম - উদাহরণস্বরূপ দেখুন ক্যাসান্দ্রা সি জোন্সের বাজ নিয়ে কাজ - এবং আমি এই ডেটা সেটের সাথে কাজ করতে পেরে উত্তেজিত ছিলাম৷
লাইন সনাক্তকরণ
প্রাথমিক চ্যালেঞ্জগুলির মধ্যে একটি ছিল কীভাবে চিত্রগুলিতে লাইনগুলি সনাক্ত করা যায়। ট্রেসিং পেপারের টুকরো বের করা সহজ, এই ফটোগুলির একটির একটি প্রিন্টআউটের উপরে এটি ফেলে দেওয়া এবং আপনার চোখ যে লাইনগুলি দেখে সেগুলি আঁকতে পারে তবে লাইনগুলি খুঁজে পাওয়ার জন্য সাধারণ কম্পিউটার ভিশন অ্যালগরিদমগুলি খুব বৈচিত্র্যময় চিত্রগুলিতে ভালভাবে কাজ করে না। .
আমি স্থানীয় প্রকল্পগুলির সাথে একটি প্রকল্পে অ্যালগরিদম অঙ্কন করে অনুসন্ধানের একটি পূর্ববর্তী সংস্করণ তৈরি করেছি এবং এর জন্য আমরা অনুসন্ধানের জন্য লাইনগুলি হাতে টীকা করেছি৷ আর্টওয়ার্কের উপরে আঁকতে মজা লাগল কিন্তু আপনি কয়েক ডজন ছবি থেকে হাজার হাজারে যাওয়ার সময় ক্লান্তিকর। আমি লাইন খোঁজার প্রক্রিয়া স্বয়ংক্রিয় করার চেষ্টা করতে চেয়েছিলাম।
এই বায়বীয় চিত্রগুলির সাথে আমি ওপেনসিভির ক্যানি এজ ডিটেকশন অ্যালগরিদমের মতো প্রথাগত লাইন সনাক্তকরণ অ্যালগরিদমগুলি চেষ্টা করেছি কিন্তু দেখতে পেয়েছি যে তারা হয় খুব বিচ্ছিন্ন লাইন সেগমেন্ট দেয় বা যদি প্রান্তটি খুব শিথিল হয়, প্রচুর সংখ্যক নকল লাইন। এছাড়াও, ভাল ফলাফল পাওয়ার থ্রেশহোল্ডগুলি বিভিন্ন ইমেজ সেট জুড়ে আলাদা ছিল এবং আমি তত্ত্বাবধান ছাড়াই ভাল লাইনের একটি ধারাবাহিক সেট খুঁজে পাওয়ার জন্য একটি অ্যালগরিদম চেয়েছিলাম।
আমি জিপিবি (পিডিএফ) এর মতো সাম্প্রতিকগুলি সহ বিভিন্ন লাইন সনাক্তকরণ অ্যালগরিদম নিয়ে পরীক্ষা করেছি যা যদিও আশ্চর্যজনক ফলাফল তৈরি করে, প্রতি ছবি চালানোর জন্য কয়েক মিনিটের প্রয়োজন। শেষ পর্যন্ত আমি স্ট্রাকচার্ড ফরেস্ট এজ ডিটেকশনের সাথে মীমাংসা করেছি, একটি অ্যালগরিদম যা ওপেনসিভি দিয়ে পাঠানো হয়।
একবার আমার একটি ভাল "লাইন ইমেজ" ছিল, আমার তখনও আসলে লাইনগুলি পেতে এবং একে অপরের থেকে পৃথক লাইন সনাক্ত করার সমস্যা ছিল - অর্থাত্, আমি কীভাবে এই রাস্টার ডেটা গ্রহণ করব এবং এটিকে ভেক্টর তৈরি করব। প্রায়শই যখন আমি কম্পিউটারের দৃষ্টি সমস্যার দিকে তাকাই, তখন আমি ইমেজজে তদন্ত করি, একটি ওপেন সোর্স জাভা ভিত্তিক ইমেজ প্রসেসিং এনভায়রনমেন্ট যা বিজ্ঞানী এবং গবেষকদের দ্বারা ব্যবহৃত হয় যার প্লাগইনগুলির একটি সুস্থ ইকোসিস্টেম রয়েছে। আমি রিজ সনাক্তকরণ নামক একটি প্লাগইন পেয়েছি, যা একটি তীব্রতার চিত্র নিতে এবং এটিকে লাইন সেগমেন্টের সেটে পরিণত করতে সহায়তা করে। (একটি পার্শ্ব নোট হিসাবে, আমি ম্যাটল্যাব থেকে এই প্রান্ত সনাক্তকরণ এবং লেবেলিং কোডটি দরকারী খুঁজে পেয়েছি)।
সার্ভারহীন
আমি এটিও দেখতে চেয়েছিলাম যে ডেটা ভিজ্যুয়ালাইজেশন অ্যাপটি করা সম্ভব কিনা যা মূলত সার্ভারহীন, যেখানে মেলানো এবং সংযোগ করার কঠোর পরিশ্রম ক্লায়েন্টের পক্ষে ঘটে। আমি সাধারণত openFrameworks এ কাজ করি, সৃজনশীল কোডিংয়ের জন্য একটি c++ ফ্রেমওয়ার্ক এবং মাঝে মাঝে নোড প্রকল্পের পাশাপাশি আমি অনেক সার্ভার সাইড কোডিং করিনি। আমি কৌতূহলী ছিলাম যদি সমস্ত গণনা ক্লায়েন্ট সাইড করা সম্ভব হয় এবং শুধুমাত্র json এবং ইমেজ ডেটা পরিবেশনের জন্য সার্ভারটি ব্যবহার করা যায়।
ড্র অ্যাপ্লিকেশনের জন্য, ম্যাচিং একটি খুব ভারী অপারেশন। আপনি যখন একটি রেখা আঁকেন, তখন আমাদের দশ হাজারেরও বেশি লাইন সেগমেন্টের মধ্যে সবচেয়ে কাছের মিল খুঁজে বের করতে হবে। একটি ড্রয়িং থেকে অন্য ড্রয়ের দূরত্ব গণনা করতে আমরা ডলার অঙ্গভঙ্গি সনাক্তকারী থেকে একটি মেট্রিক ব্যবহার করি যা নিজেই অনেক দূরত্ব গণনা জড়িত। অতীতে, আমি থ্রেডিং এবং অন্যান্য কৌশল ব্যবহার করেছি কিন্তু এটি একটি ক্লায়েন্ট ডিভাইসে (মোবাইল ফোন সহ) রিয়েল টাইমে কাজ করার জন্য আমার আরও ভাল কিছু দরকার ছিল। আমি নিকটতম/নিকটবর্তী প্রতিবেশীদের খুঁজে বের করার জন্য মেট্রিক গাছের দিকে তাকালাম এবং আমি ভ্যানটেজ পয়েন্ট ট্রিগুলিতে বসতি স্থাপন করেছি ( জাভাস্ক্রিপ্ট বাস্তবায়ন )। ভ্যানটেজ পয়েন্ট ট্রিটি মূলত ডেটার একটি সেট এবং একটি দূরত্বের মেট্রিক তৈরি করে এবং আপনি যখন একটি নতুন ডেটা রাখেন তখন এটি আপনাকে খুব দ্রুত নিকটতম মানগুলির একটি তালিকা দেয়। মোবাইল ফোনে এই কাজটি প্রথম দেখেই আমি ফ্লোর হয়ে গেলাম। এই বিশেষ সুবিধার পয়েন্ট ট্রি বাস্তবায়নের একটি দুর্দান্ত সুবিধা হল যে আপনি গাছটিকে গণনা করার পরে সংরক্ষণ করতে পারেন এবং এই গাছের গণনা করার খরচ বাঁচাতে পারেন।
সার্ভার ছাড়া কাজ করার আরেকটি চ্যালেঞ্জ হল মোবাইল ডিভাইসে ডেটা লোড করা - ড্রয়ের জন্য, ট্রি এবং লাইন সেগমেন্টের ডেটা 12mb-এর বেশি এবং ছবিগুলি বেশ বড়, আমরা অভিজ্ঞতাটি দ্রুত এবং প্রতিক্রিয়াশীল মনে করতে চেয়েছিলাম এবং লক্ষ্য ডাউনলোড ছোট রাখার চেষ্টা করা হয়। আমাদের সমাধান ছিল ধীরে ধীরে ডেটা লোড করা। ড্র অ্যাপে আমরা ভ্যানটেজ পয়েন্ট ট্রি ডেটা সেটটিকে 5 টুকরোতে বিভক্ত করি এবং যখন অ্যাপটি লোড হয় তখন এটি শুধুমাত্র প্রথম খণ্ডটি লোড করে এবং তারপর প্রতি 10 সেকেন্ডে এটি ব্যাকগ্রাউন্ডে আরও একটি খণ্ড ডেটা লোড করে, তাই মূলত অ্যাপটি আরও ভাল হয় ব্যবহার করার প্রথম মিনিট। ড্র্যাগ অ্যাপটিতে ছবি ক্যাশে করার জন্যও কঠোর পরিশ্রম করা হয়েছিল যাতে আপনি টেনে আনলে নতুন ছবি পটভূমিতে লোড হয়।
অবশেষে, একটি জিনিস আমার কাছে প্রত্যাশার চেয়ে কঠিন ছিল তা হল উভয় অ্যাপের জন্য একটি প্রি-লোডার তৈরি করা, তাই আপনি ডেটা লোড হওয়ার প্রাথমিক বিলম্ব বোধগম্য হবে। আমি ajax রিকোয়েস্টে এবং pixi.js সাইডে প্রোগ্রেস কলব্যাক ব্যবহার করেছি, অ্যাসিঙ্ক্রোনাসভাবে লোড হচ্ছে এমন চেক করা ইমেজগুলো আসলে লোড হয়েছে এবং প্রিলোড মেসেজ চালাতে ব্যবহার করেছি।
সংযুক্ত লাইন
টেনে আনার জন্য, আমি প্রান্ত সনাক্তকরণে পাওয়া লাইনগুলি থেকে একটি অন্তহীন লাইন তৈরি করতে চেয়েছিলাম। প্রথম পদক্ষেপটি ছিল লাইন সনাক্তকরণ অ্যালগরিদম থেকে লাইনগুলি ফিল্টার করা এবং লম্বা লাইনগুলি সনাক্ত করা যা একটি প্রান্তে শুরু হয় এবং তিনটি অন্য প্রান্তের একটিতে শেষ হয়।
একবার আমার কাছে লম্বা লাইনের একটি সেট ছিল (অথবা আরও সঠিক শব্দ ব্যবহার করার জন্য, পলিলাইন , সংযুক্ত পয়েন্টগুলির একটি সংগ্রহ) তাদের সংযোগ করার জন্য আমি এই লাইনগুলিকে কোণ পরিবর্তনের একটি সেটে রূপান্তর করেছি। সাধারণত আপনি যখন একটি পলিলাইনের কথা ভাবেন তখন আপনি এটিকে বিন্দুর সেট হিসাবে কল্পনা করেন: বিন্দু a বিন্দুর সাথে সংযুক্ত যা বি বিন্দুর সাথে সংযুক্ত। পরিবর্তে, আপনি লাইনটিকে কোণ পরিবর্তনের একটি সেট হিসাবে বিবেচনা করতে পারেন: এগিয়ে যান এবং কিছু পরিমাণ ঘোরান, এগিয়ে যান এবং কিছু পরিমাণ ঘোরান। এটি কল্পনা করার একটি ভাল উপায় হল তারের বাঁকানো মেশিনগুলি সম্পর্কে চিন্তা করা, যেগুলি তারের একটি টুকরো নেয় এবং এটি বহিষ্কৃত হওয়ার সাথে সাথে ঘূর্ণন সম্পাদন করে। আঁকার আকৃতি বাঁক থেকে আসে।
আপনি যদি রেখাটিকে কোণ পরিবর্তন হিসাবে বিবেচনা করেন এবং বিন্দু নয়, তবে কম বিরতি সহ একটি বড় লাইনে লাইনগুলিকে একত্রিত করা সহজ হয়ে যায় - পয়েন্টগুলি সেলাই করার পরিবর্তে আপনি মূলত আপেক্ষিক কোণ পরিবর্তনগুলি যোগ করছেন। একটি লাইন যোগ করার জন্য, আপনি মূল লাইনের বর্তমান কোণটি নিন aimage0nd এটিতে আপনি যে লাইনটি যোগ করতে চান তার আপেক্ষিক পরিবর্তনগুলি যোগ করুন।
একটি পার্শ্ব নোট হিসাবে, আমি শৈল্পিক শোষণের জন্য একটি লাইনকে একটি কোণ পরিবর্তনের সেটে রূপান্তর করার এই কৌশলটি ব্যবহার করেছি - আপনি কীভাবে তারের কার্ল এবং আনকার্ল করতে পারে তার অনুরূপ অঙ্কনগুলিকে "আনকার্ল" করতে পারেন। কিছু উদাহরণ: এক , দুই , তিন
এই কোণ গণনাটি হল যা আপনি টেনে আনতে আমাদেরকে লাইনটি পরিচালনা করতে দেয় - আমরা মূল কোণটি যেখান থেকে আমরা হতে চাই সেখান থেকে কতটা দূরে তা গণনা করি এবং আমরা এমন একটি ছবি খুঁজি যা লাইনটিকে সঠিক দিকে যেতে সাহায্য করবে। সবই তুলনামূলকভাবে চিন্তা করার বিষয়।
পরিশেষে, আমি শুধু বলতে চাই যে এটির সাথে জড়িত থাকার জন্য এটি একটি সত্যিই মজাদার প্রকল্প ছিল। একজন শিল্পী হিসাবে এই চিত্রগুলির মতো সুন্দর একটি ডেটা সেট ব্যবহার করতে বলাটা উত্তেজনাপূর্ণ এবং আমি ডেটা আর্টস দলকে সম্মানিত করছি৷ আমি আশা করি আপনি এটি নিয়ে পরীক্ষা করে মজা পাবেন!