การจับคู่โปรไฟล์ใน Point Cloud


14

เมฆจุด(x,y,z)จะถูกสร้างขึ้นโดยใช้ฟังก์ชั่นการสุ่มชุดสำหรับ ดังที่แสดงในรูปภาพต่อไปนี้ระนาบการตัดแบบเรียบ ( โปรไฟล์ ) กำลังถูกตรวจสอบว่าตรงกับที่ดีที่สุด (แม้ว่าจะไม่ใช่แบบที่แน่นอน) โปรไฟล์เป้าหมายคือที่ให้ไว้ที่มุมซ้ายล่าง ดังนั้นคำถามคือ:

1- วิธีการค้นหาการจับคู่ดังกล่าวtarget 2D point mapผ่านการpoint cloudพิจารณาบันทึกย่อ / เงื่อนไขต่อไปนี้?
2- อะไรคือพิกัด / ทิศทาง / องศาของความคล้ายคลึงกัน ฯลฯ ?

หมายเหตุ 1:โปรไฟล์ที่น่าสนใจอาจอยู่ที่ใดก็ได้ที่มีการหมุนตามแกนและอาจมีรูปร่างที่แตกต่างกันเช่นสามเหลี่ยมสี่เหลี่ยมผืนผ้าสี่เหลี่ยมจัตุรัส ฯลฯ ขึ้นอยู่กับตำแหน่งและทิศทางของมัน ในการสาธิตต่อไปนี้จะแสดงเฉพาะสี่เหลี่ยมที่เรียบง่าย

หมายเหตุ 2:ค่าความคลาดเคลื่อนอาจถือได้ว่าเป็นระยะทางของคะแนนจากโปรไฟล์ แสดงให้เห็นถึงนี้สำหรับรูปต่อไปนี้สมมติว่าความอดทนของ0.01ครั้งมิติที่มีขนาดเล็กที่สุดเพื่อให้(~1) tol=0.01ดังนั้นหากเราลบส่วนที่เหลือออกและฉายจุดที่เหลือทั้งหมดบนระนาบของโปรไฟล์ที่ถูกตรวจสอบแล้วเราจะสามารถตรวจสอบความคล้ายคลึงกันกับโปรไฟล์เป้าหมายได้

หมายเหตุ 3:หัวข้อที่เกี่ยวข้องอาจจะพบได้ที่จุดรับรู้รูปแบบ

ป้อนคำอธิบายรูปภาพที่นี่


@Developer Off topic แต่คุณใช้ซอฟต์แวร์อะไรในการสร้างแปลงเหล่านั้น?
Spacey

1
@ Mohammad ฉันใช้Python+ MatPlotLibเพื่อทำวิจัยของฉันและเพื่อสร้างกราฟ ฯลฯ
นักพัฒนา

@Developer Fantastic - มันผ่าน Python แต่พวกมันหมายถึงอะไร 'Python shell ala Matlab'?
Spacey

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

@endolith P:{x,y,z}ทุกจุดได้พิกัดที่เกี่ยวข้องเป็น พวกเขาเป็นจุดไร้มิติแน่นอน ด้วยการประมาณบางอย่างอย่างไรก็ตามพวกเขาสามารถ discretized มิติหนึ่งพิกเซลเป็นอาร์เรย์ 3D พวกเขาอาจรวมถึงคุณสมบัติอื่น ๆ (เช่นน้ำหนัก ฯลฯ ) ผ่านพิกัด
นักพัฒนา

คำตอบ:


4

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

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

ความพยายามของฉันในการแก้ปัญหา:

สมมติฐาน:

  • คุณต้องการค้นหาคู่ที่ดีที่สุดไม่ใช่แค่การจับคู่ที่หลวมหรือ "อาจถูกต้อง"
  • การจับคู่จะมีข้อผิดพลาดเล็กน้อยเนื่องจากเสียงรบกวนในการวัดหรือการคำนวณ
  • จุดที่มาคือ coplanar
  • แหล่งที่มาทั้งหมดต้องมีอยู่ในเป้าหมาย (= จุดที่ไม่ตรงกันใด ๆนั้นไม่ตรงกันสำหรับโปรไฟล์ทั้งหมด)

ดังนั้นคุณควรใช้ทางลัดจำนวนมากโดยตัดสิทธิ์สิ่งต่าง ๆ และลดเวลาในการคำนวณ ในระยะสั้น:

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

รายละเอียดเพิ่มเติม:

pick a point from the source for testing s1 = (x1, y1)
Find nearest point in source s2 = (x2, y2)
d12 = (x1-x2)^2 + (y1-y2)^2
Find second nearest point in source s3 = (x3, y3)
d13 = (x1-x3)^2 + (y1-y3)^2
d23 = (x2-x3)^2 + (y2-y3)^2

for all (x,y,z) test points t1 in target:
    # imagine s1 and t1 are coincident
    for all other points t2 in target:
        if distance from test point > d12:    
            break out of loop and try another t2 point
        if distance ≈ d12:
            # imagine source is now rotated so that s1 and s2 are collinear with t1 and t2
            for all other points t3 in target:
                if distance from t1 > d13 or from t2 > d23:
                    break and try another t3
                if distance from t1 ≈ d13 and from t2 ≈ d23:
                    # Now you've found matching triangles in source and target
                    # align source so that s1, s2, s3 are coplanar with t1, t2, t3
                    project all source points onto this target plane 
                    for all other points in source:
                        find nearest point in target
                        measure distance from source point to target point
                        if it's not within a threshold:
                            break and try a new t3
                        else:
                            sum errors of all matched points for this configuration (defined by t1, t2, t3)

การกำหนดค่าใดก็ตามที่มีข้อผิดพลาดกำลังสองน้อยที่สุดสำหรับจุดอื่น ๆ ทั้งหมดจะเป็นการจับคู่ที่ดีที่สุด

เนื่องจากเราทำงานกับจุดทดสอบเพื่อนบ้านที่ใกล้ที่สุด 3 จุดการจับคู่เป้าหมายสามารถทำได้ง่ายขึ้นโดยการตรวจสอบว่าอยู่ในรัศมีหรือไม่ ตัวอย่างเช่นหากค้นหารัศมี 1 จาก (0, 0) เราสามารถตัดสิทธิ์ (2, 0) โดยยึดตาม x1 - x2 โดยไม่คำนวณระยะทางแบบยุคลิดจริงเพื่อเพิ่มความเร็วสักเล็กน้อย นี่ถือว่าการลบนั้นเร็วกว่าการคูณ มีการค้นหาที่ปรับให้เหมาะสมที่สุดตามรัศมีที่กำหนดโดยพลการมากขึ้นเช่นกัน

function is_closer_than(x1, y1, z1, x2, y2, z2, distance):
    if abs(x1 - x2) or abs(y1 - y2) or abs(z1 - z2) > distance:
        return False
    return (x1 - x2)^2 + (y1 - y2)^2 + (z1 - z2)^2 > distance^2 # sqrt is slow

d=(x1-x2)2+(Y1-Y2)2+(Z1-Z2)2

(20002)

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

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


1
ส่วนแรกในคำตอบของคุณเป็นวิธีการที่โหดร้ายกำลังค้นหาจุดใกล้เคียง (นับด้วยความเคารพต่อขีด จำกัด ) รอบระนาบที่เป็นไปได้ทั้งหมดผ่านคลาวด์พอยต์ มันเป็นการคำนวณที่เข้มข้นมากเช่นในปี 2000 เพียงต้องการคะแนนการคำนวณระยะทางจำนวน 2,662,668,000,000 (สูตร) !
นักพัฒนา

@ ผู้พัฒนา: ใช่มันจะต้องใช้การคำนวณเป็นจำนวนมากโดยเฉพาะถ้าคุณมีคะแนนนับพัน ใช่สำหรับ 2,000 คะแนนหากคุณไม่พบเครื่องบินใด ๆ คุณจะต้องคำนวณ 2,658,673,998,000 ครั้ง สมมุติว่าคุณจะพบกับเครื่องบินซึ่งจะลดเวลาเพราะมันจะหยุดทันทีที่พบว่ามีคะแนนมากพอ แต่อย่างไรก็ตามฉันกำลังคิดเกี่ยวกับเรื่องนี้และอาจมีความคิดที่ดีกว่าและฉันจะเปลี่ยนคำตอบ
endolith

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

2

ฉันจะเพิ่มคำอธิบาย @ mirror2image บนโซลูชันทางเลือกข้าง RANSAC คุณอาจพิจารณาอัลกอริทึม ICP (จุดที่ใกล้เคียงที่สุดซ้ำ) คำอธิบายสามารถพบได้ที่นี่ !

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

ปรับปรุง:

ขั้นตอนในรูปแบบง่ายคือ:

  1. ค้นหาจุดที่ใกล้ที่สุดสำหรับแต่ละจุดอินพุต
  2. คำนวณการแปลงจากอินพุตไปยังเป้าหมายแล้วย้ายจุดอินพุตโดยใช้การแปลง
  3. คำนวณฟังก์ชั่นความคล้ายคลึงกัน (เช่นระยะทางสำหรับแต่ละจุดอินพุต wrt ไปยังจุดเป้าหมายคู่ที่สอดคล้องกัน)
  4. ตรวจสอบสภาพการหยุด

ทำซ้ำขั้นตอนที่ 1-4

มีห้องสมุดที่คุณสามารถพิจารณาได้ที่นี่ ! (ฉันยังไม่ได้ลองเลย) มีหนึ่งส่วนในส่วนการลงทะเบียน (รวมถึงวิธีอื่น ๆ )


ขอบคุณสำหรับลิงค์และข้อเสนอแนะ แนวคิดที่มีประโยชน์เช่นนี้ช่วยให้เราเป็นนักวิจัยมือใหม่ที่จะเรียนรู้สิ่งต่าง ๆ ได้เร็วขึ้น ฉันชอบคำอธิบายเพิ่มเติมเสมอ
นักพัฒนา
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.