แนวเส้นดิน

สรุป

Land Lines เป็นการทดลองที่ให้คุณสำรวจภาพดาวเทียมของ Google Earth ผ่านท่าทางสัมผัส การใช้ทั้งแมชชีนเลิร์นนิง การเพิ่มประสิทธิภาพข้อมูล และพลังของการ์ดกราฟิกจะทําให้การทดสอบทํางานได้อย่างมีประสิทธิภาพในเว็บเบราว์เซอร์ของโทรศัพท์โดยไม่จำเป็นต้องใช้เซิร์ฟเวอร์แบ็กเอนด์ นี่คือขั้นตอนการพัฒนาของเราและแนวทางต่างๆ ที่เราพยายามนำไปสู่ผลลัพธ์สุดท้าย

https://g.co/LandLines

ตอนที่ทีมศิลปข้อมูลมาติดต่อฉันเรื่องการสำรวจชุดข้อมูลรูปภาพโลก ฉันรู้สึกตื่นเต้นมาก รูปภาพนั้นสวยงามมาก แสดงให้เห็นโครงสร้างและพื้นผิว ต่างๆ ทั้งที่มนุษย์สร้างขึ้นและธรรมชาติ ฉันสนใจวิธีเชื่อมโยงชุดข้อมูลนี้ ฉันทำการทดสอบเบื้องต้นหลายอย่างเพื่อดูความคล้ายคลึงกันของรูปภาพ รวมถึงวิธีต่างๆ ในการกรองและจัดระเบียบรูปภาพ

เลย์เอาต์ความคล้ายคลึง t-sne
เลย์เอาต์ที่คล้ายกับ t-sne, ความละเอียดสูง 50 MB

ในกลุ่ม เรามักจะกลับมาดูที่เส้นที่สวยงามและโดดเด่นในรูปภาพ เส้นเหล่านี้มองเห็นได้ง่าย ทั้งทางหลวง แม่น้ำ ขอบภูเขา และแปลงที่ดิน และเราได้ออกแบบโครงการ 2-3 โครงการให้สำรวจเส้นทางเหล่านี้ ในฐานะศิลปิน ผมได้รับแรงบันดาลใจจากสิ่งสวยงามที่คุณทำได้กับคอลเล็กชันของเส้น ดูตัวอย่าง ผลงานของ Cassandra C Jones กับ Lightning ผมรู้สึกตื่นเต้นที่ได้ทำงานกับชุดข้อมูลนี้

การตรวจจับเส้น

หนึ่งในปัญหาแรกเริ่มคือวิธีตรวจหาเส้นในรูปภาพ การนำกระดาษรอยทางออกมา แล้วแปะบนรูปที่พิมพ์ออกมา และลากเส้นที่ดวงตาของคุณมองเห็น แต่ในอัลกอริทึมคอมพิวเตอร์วิทัศน์ทั่วไปสำหรับการหาเส้นมักจะทำงานได้ไม่ดีกับรูปภาพที่หลากหลาย

ผมได้พัฒนาการค้นหาเวอร์ชันก่อนหน้าด้วยการวาดอัลกอริทึมในโปรเจ็กต์ด้วย Local Projects และเราได้ใส่คำอธิบายประกอบไว้ในบรรทัดสำหรับค้นหา การวาดภาพทับงานศิลปะเป็นเรื่องสนุกแต่ก็น่าเบื่อ เมื่อคุณเปลี่ยนรูปภาพหลายสิบรูปไปเป็นรูปหลักพันรูป ผมอยากทำให้ขั้นตอนการค้นหาบรรทัด เป็นไปโดยอัตโนมัติ

ภาพถ่ายทางอากาศเหล่านี้ ผมได้ลองใช้อัลกอริทึมการตรวจจับเส้นแบบเดิมอย่างอัลกอริทึมการตรวจจับขอบหน้ามืดของ openCv แต่พบว่าให้ส่วนของเส้นตรงที่ไม่ต่อเนื่องกัน หรือเมื่อเกณฑ์ไม่เข้มงวดจนเกินไป เส้นปลอมจำนวนมากก็จะเป็นปริมาณมหาศาล เกณฑ์ในการได้รับผลลัพธ์ที่ดีก็แตกต่างกันในแต่ละชุดรูปภาพ และฉันต้องการอัลกอริทึมในการค้นหาชุดรูปภาพที่สอดคล้องกันโดยไม่ต้องมีการควบคุมดูแล

ผมได้ทดลองกับอัลกอริทึมการตรวจจับเส้นประเภทต่างๆ รวมถึงอัลกอริทึมใหม่ๆ อย่าง gPb (PDF) ซึ่งแม้ว่าจะให้ผลลัพธ์ที่น่าทึ่ง แต่ต้องใช้เวลาหลายนาทีในการเรียกใช้ต่อรูปภาพ สุดท้ายแล้ว ผมได้ตัดสินใจกับการตรวจจับขอบป่าที่มีโครงสร้าง ซึ่งเป็นอัลกอริทึมที่มาพร้อมกับ openCV

เมื่อฉันได้ "ภาพเส้น" ที่ดีแล้ว ฉันยังคงประสบปัญหาในการรับเส้นและการระบุแต่ละบรรทัดจากกัน กล่าวคือ ฉันจะนำข้อมูลแรสเตอร์นี้ มาสร้างเป็นเวกเตอร์ได้อย่างไร บ่อยครั้งที่ผมมองปัญหาการมองเห็นของคอมพิวเตอร์ ผมจะตรวจสอบ imageJ ซึ่งเป็นสภาพแวดล้อมการประมวลผลรูปภาพแบบโอเพนซอร์สที่ใช้ Java ทำให้นักวิทยาศาสตร์และนักวิจัยใช้ปลั๊กอินในระบบนิเวศที่เหมาะสม ผมพบปลั๊กอินชื่อการตรวจจับแนวสัน ซึ่งช่วยถ่ายภาพความเข้มและเปลี่ยนชิ้นส่วนดังกล่าวเป็นชุดเส้นตรง (นอกจากนี้ เรายังพบว่าการตรวจจับและติดป้ายกำกับโค้ดจาก Matlab นี้มีประโยชน์)

รูปภาพที่มีกลุ่มเส้นที่ตรวจพบ
รูปภาพที่มีกลุ่มเส้นที่ตรวจพบ

Serverless

แล้วผมอยากดูว่าจะเป็นไปได้ไหมที่จะสร้างแอปแสดงข้อมูลเป็นภาพแบบ Serverless ซึ่งการทำงานยากในการจับคู่และการเชื่อมต่อนั้นเกิดขึ้นที่ฝั่งไคลเอ็นต์ ฉันมักจะทำงานใน openFrameworks ซึ่งเป็นเฟรมเวิร์ก c++ สำหรับการเขียนโค้ดอย่างสร้างสรรค์ และนอกเหนือจากโปรเจ็กต์โหนดที่บางครั้งฉันก็ไม่ได้เขียนโค้ดด้านเซิร์ฟเวอร์มากนัก ฉันอยากทราบว่าคุณทำทุกอย่างที่ฝั่งไคลเอ็นต์สำหรับการคำนวณ และจะใช้เฉพาะเซิร์ฟเวอร์เพื่อแสดงข้อมูล JSON และรูปภาพเท่านั้นได้ไหม

สำหรับแอปพลิเคชันวาดเขียน การจับคู่จะเป็นการดำเนินการที่หนักมาก เมื่อคุณวาดเส้น เราต้องหาเส้นที่ตรงที่สุดในบรรดาเส้นหลายหมื่นส่วน ในการคำนวณระยะห่างของภาพวาดหนึ่งไปยังอีกรูปหนึ่ง เราจะใช้เมตริกจากโปรแกรมรู้จำท่าทางสัมผัสดอลลาร์ ซึ่งเกี่ยวข้องกับการคำนวณระยะทางมากมาย ที่ผ่านมาผมเคยใช้การแยกชุดข้อความ และกลเม็ดอื่นๆ แต่ผมต้องการเครื่องมือที่ดีกว่านี้เพื่อให้มันทำงานได้แบบเรียลไทม์ในอุปกรณ์ไคลเอ็นต์ ฉันได้ดูแผนผังเมตริกเพื่อหาเพื่อนบ้านที่ใกล้เคียงที่สุด/ใกล้ที่สุดแล้ว และหาต้นไม้จุดได้เปรียบ (การใช้ JavaScript) โดยทั่วไปแล้ว แผนผังจุดชมวิวจะสร้างขึ้นจากชุดข้อมูลและเมตริกระยะทาง และเมื่อคุณใส่ข้อมูลใหม่ ระบบจะแสดงรายการค่าที่ใกล้เคียงที่สุดอย่างรวดเร็ว ครั้งแรกที่ผมเห็นงานนี้บนโทรศัพท์มือถือ ผมยืนหยัดอยู่ได้ ประโยชน์ที่ดีมากอย่างหนึ่งของการใช้งานแผนผังจุดชมวิวเดียวกันนี้คือคุณสามารถประหยัดโครงสร้างต้นไม้หลังจากที่คำนวณแล้วและช่วยประหยัดค่าใช้จ่ายในการคำนวณโครงสร้างต้นไม้นี้

ผลการค้นหาที่ใกล้เคียงที่สุด ผลการจับฉลาก
ตัวอย่างผลลัพธ์จากแผนผังจุดมุมมอง อินพุตที่วาดจะอยู่ทางด้านขวา และผลลัพธ์ที่ใกล้เคียงที่สุดจะอยู่ทางด้านซ้าย

ความท้าทายอีกข้อหนึ่งในการทำให้แอปทำงานได้โดยไม่ต้องมีเซิร์ฟเวอร์คือการโหลดข้อมูลลงในอุปกรณ์เคลื่อนที่ อย่างแรกคือ ข้อมูลโครงสร้างต้นไม้และเส้นตรงมีขนาดใหญ่กว่า 12 MB และรูปภาพมีขนาดใหญ่มาก เราอยากให้การใช้งานรวดเร็วและตอบสนองได้ดี และเป้าหมายคือพยายามทำให้การดาวน์โหลดมีขนาดเล็ก โซลูชันของเราคือ เพิ่มความเร็วในการโหลดข้อมูล ในแอปวาด เราแบ่งชุดข้อมูลต้นไม้ของจุดที่มองเห็นเป็นส่วนๆ ออกเป็น 5 ส่วน และเมื่อแอปโหลดเฉพาะส่วนแรก จากนั้นทุกๆ 10 วินาทีจะโหลดข้อมูลอีกชุดหนึ่งอยู่เบื้องหลัง ดังนั้นแอปจึงดีขึ้นและดีขึ้นเรื่อยๆ เมื่อใช้นาทีแรก ในแอปแดร็กยังทำงานอย่างหนักเพื่อแคชรูปภาพ ดังนั้นเมื่อคุณลาก รูปภาพใหม่จะถูกโหลดในพื้นหลัง

สุดท้ายนี้ สิ่งหนึ่งที่ผมพบว่ายากกว่าที่คาดไว้คือการสร้างตัวโหลดล่วงหน้าสำหรับทั้ง 2 แอป คุณจึงจะทราบความล่าช้าในช่วงแรกเนื่องจากการโหลดข้อมูลก็พอจะเข้าใจได้ ฉันใช้โค้ดเรียกกลับความคืบหน้าในคำขอ Ajax และในฝั่ง pixi.js ตรวจสอบว่ารูปภาพที่โหลดแบบไม่พร้อมกันนั้นโหลดขึ้นมาจริงๆ และใช้เพื่อผลักดันข้อความโหลดล่วงหน้า

สายที่เชื่อมต่อ

สำหรับการลาก ฉันอยากสร้างเส้นที่ไม่สิ้นสุดจากเส้นที่เราพบในการตรวจจับขอบ ขั้นตอนแรกคือการกรองเส้นจากอัลกอริทึมการตรวจจับเส้นและระบุเส้นยาวๆ ที่เริ่มจากขอบด้านหนึ่งและสิ้นสุดที่ขอบอื่นอีก 1 ใน 3 ด้าน

สายที่ดีสำหรับการเชื่อมต่อมีเครื่องหมายสีแดง สายที่ดีสำหรับการเชื่อมต่อมีเครื่องหมายสีแดง
สายที่ดีสำหรับการเชื่อมต่อที่มีเครื่องหมายสีแดง

เมื่อได้เส้นยาว 1 ชุด (หรือใช้คำที่แม่นยำยิ่งขึ้น ซึ่งก็คือโพลีไลน์ กลุ่มของจุดที่เชื่อมต่อ) ผมแปลงเส้นเหล่านี้เป็นชุดการเปลี่ยนแปลงมุม โดยปกติแล้วเมื่อคุณนึกถึงโพลีไลน์ ให้คิดว่าเป็นเส้นชุดของจุด นั่นคือ จุด a เชื่อมต่อกับจุด b ซึ่งเชื่อมต่อกับจุด c คุณสามารถใช้เส้นตรงเป็นชุดของการเปลี่ยนมุมแทนได้ โดยเลื่อนไปข้างหน้า หมุนตัวเลข ไปข้างหน้า และหมุนตัวเลขบางส่วน วิธีที่ดีในการแสดงภาพนี้คือ ให้นึกถึงเครื่องดัดลวด ที่เอาสายไฟมา 1 เส้นและถูกยกขึ้นเพื่อหมุน รูปร่างของภาพวาดมาจากการหมุน

ถ้าคุณคิดว่าเส้นเปลี่ยนมุม ไม่ใช่จุด คุณจะสามารถรวมเส้นเข้าด้วยกันเป็นเส้นใหญ่เส้นเดียวโดยมีความไม่ต่อเนื่องน้อยกว่า แทนที่จะรวมจุดต่อกัน คุณจะเพิ่มการเปลี่ยนแปลงมุมสัมพัทธ์ ในการเพิ่มเส้น ให้นำมุมปัจจุบันของเส้นหลักที่อยู่ถัดจาก การเปลี่ยนแปลงแบบสัมพัทธ์ของเส้นที่คุณต้องการเพิ่ม

หมายเหตุ: ผมใช้เทคนิคนี้ในการแปลงเส้นเป็นชุดการเปลี่ยนแปลงมุมเพื่อแสวงหาประโยชน์ทางศิลปะ คุณสามารถทำให้ภาพวาด "งัดเงย" คล้ายกับวิธีที่ลวดงอและงอได้ ตัวอย่างเช่น 1, 2, 3

การคำนวณมุมนี้คือสิ่งที่ทำให้เราสามารถบังคับทิศทางของเส้นขณะที่คุณลากได้ เราคำนวณว่ามุมหลักห่างจากตำแหน่งที่เราต้องการมากแค่ไหน และเรามองหารูปภาพที่จะช่วยให้เส้นลากไปในทิศทางที่ถูกต้องได้มากที่สุด ทั้งหมดนี้เป็นเรื่องของการคิดอย่างรอบคอบ

สุดท้ายนี้ ฉันอยากจะบอกว่านี่เป็นโครงการสนุกๆ ที่ได้มีส่วนร่วม เป็นเรื่องน่าตื่นเต้นมากที่ศิลปินให้เราใช้ชุดข้อมูลที่น่ารักเหมือนรูปภาพเหล่านี้ และผมรู้สึกเป็นเกียรติอย่างยิ่งที่ทีม Data Arts ติดต่อมา เราหวังว่าคุณจะได้ลอง สนุกไปกับการทดลอง