ใส่คำอธิบายประกอบข้อมูลจุดคลาวด์ที่หนาแน่นโดยใช้ SageMaker Ground Truth

โหนดต้นทาง: 834877

บริษัทรถยนต์อิสระมักใช้ LiDAR เซ็นเซอร์เพื่อสร้างความเข้าใจ 3 มิติเกี่ยวกับสภาพแวดล้อมรอบ ๆ รถของพวกเขา ตัวอย่างเช่น พวกเขาติดตั้งเซ็นเซอร์ LiDAR บนยานพาหนะเพื่อจับภาพสแนปชอตแบบ point-in-time ของสภาพแวดล้อม 3D โดยรอบอย่างต่อเนื่อง เอาต์พุตเซ็นเซอร์ LiDAR เป็นลำดับของเฟรมคลาวด์แบบจุด 3 มิติ (อัตราการจับภาพโดยทั่วไปคือ 10 เฟรมต่อวินาที) ความจริงของ Amazon SageMaker ทำให้ง่ายต่อการติดป้ายกำกับวัตถุในเฟรม 3 มิติเดียวหรือข้ามลำดับของเฟรมคลาวด์ 3 มิติสำหรับการสร้างชุดข้อมูลการฝึกอบรมแมชชีนเลิร์นนิง (ML) Ground Truth ยังรองรับการรวมเซ็นเซอร์ของกล้องและข้อมูล LiDAR ด้วยอินพุตกล้องวิดีโอสูงสุดแปดช่อง

เนื่องจากเซ็นเซอร์ LiDAR เข้าถึงได้ง่ายขึ้นและคุ้มค่าขึ้น ลูกค้าจึงใช้ข้อมูล point cloud ในพื้นที่ใหม่ๆ เช่น วิทยาการหุ่นยนต์ การทำแผนที่สัญญาณ และความเป็นจริงเสริมมากขึ้น อุปกรณ์มือถือใหม่บางรุ่นยังมีเซ็นเซอร์ LiDAR ซึ่งหนึ่งในนั้นให้ข้อมูลสำหรับโพสต์นี้! ความพร้อมใช้งานที่เพิ่มขึ้นของเซ็นเซอร์ LiDAR ได้เพิ่มความสนใจในข้อมูล point cloud สำหรับงาน ML เช่น การตรวจจับและติดตามวัตถุ 3 มิติ การแบ่งส่วน 3 มิติ การสังเคราะห์และการสร้างวัตถุ 3 มิติ และแม้แต่การใช้ข้อมูล 3 มิติเพื่อตรวจสอบการประมาณความลึก 2 มิติ

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

วิธีหนึ่งในการลดต้นทุนและเวลาเหล่านี้คือการแปลงงานการติดฉลากบนคลาวด์พอยต์ให้เป็นงานที่เล็กลงและแสดงผลได้ง่ายขึ้น ซึ่งจะรักษาข้อมูลดั้งเดิมของ point cloud ส่วนใหญ่ไว้สำหรับทำหมายเหตุประกอบ เราเรียกแนวทางเหล่านี้อย่างกว้างๆ ว่า ลดขนาด, คล้ายกับ ลดขนาด ในโดเมนการประมวลผลสัญญาณ เช่นเดียวกับในโดเมนการประมวลผลสัญญาณ วิธีการสุ่มตัวอย่างแบบ point cloud จะพยายามลบจุดต่าง ๆ ในขณะที่ยังคงความเที่ยงตรงของ point cloud ดั้งเดิมไว้ เมื่อใส่คำอธิบายประกอบของ point clouds คุณสามารถใช้เอาต์พุต 3D ทรงลูกบาศก์ for การติดตามวัตถุ และ การตรวจจับวัตถุ งานโดยตรงสำหรับการฝึกอบรมหรือการตรวจสอบความถูกต้องบนระบบคลาวด์แบบจุดขนาดเต็ม โดยแทบไม่มีผลกระทบต่อประสิทธิภาพของแบบจำลองเลยในขณะเดียวกันก็ช่วยประหยัดเวลาในการติดฉลาก สำหรับรูปแบบอื่นๆ เช่น การแบ่งส่วนความหมาย โดยที่แต่ละจุดมีป้ายกำกับของตัวเอง คุณสามารถใช้ป้ายกำกับที่สุ่มตัวอย่างเพื่อคาดการณ์ป้ายกำกับในแต่ละจุดใน point cloud ดั้งเดิม ช่วยให้คุณทำการแลกเปลี่ยนระหว่างต้นทุนของผู้ติดฉลาก (และด้วยเหตุนี้จำนวนข้อมูลที่ติดป้ายกำกับ) และจำนวนเล็กน้อย การจัดประเภทคะแนนผิดในคลาวด์พอยต์ขนาดเต็ม

ในโพสต์นี้ เราจะอธิบายวิธีการใช้เทคนิคการสุ่มตัวอย่างเพื่อเตรียมข้อมูล point cloud ของคุณสำหรับการติดป้ายกำกับ จากนั้นสาธิตวิธีเพิ่มตัวอย่างป้ายกำกับเอาต์พุตของคุณเพื่อนำไปใช้กับชุดข้อมูลขนาดเต็มดั้งเดิมของคุณโดยใช้การอนุมานในตัวอย่างด้วยโมเดล ML อย่างง่าย เพื่อให้บรรลุสิ่งนี้ เราใช้ Ground Truth และ อินสแตนซ์โน้ตบุ๊ก Amazon SageMaker เพื่อดำเนินการติดฉลากและขั้นตอนก่อนการประมวลผลและหลังการประมวลผลทั้งหมด

ข้อมูล

ข้อมูลที่เราใช้ในโพสต์นี้เป็นการสแกนหลังคาอาคารอพาร์ตเมนต์ที่สร้างโดยใช้แอปเครื่องสแกน 3 มิติบน iPhone12 Pro แอพนี้ให้คุณใช้เครื่องสแกน LiDAR ในตัวบนอุปกรณ์มือถือเพื่อสแกนพื้นที่ที่กำหนดและส่งออกไฟล์ point cloud ในกรณีนี้ ข้อมูล point cloud จะอยู่ในรูปแบบ xyzrgb ซึ่งเป็นรูปแบบที่ยอมรับสำหรับ Ground Truth point cloud สำหรับข้อมูลเพิ่มเติมเกี่ยวกับประเภทข้อมูลที่อนุญาตในคลาวด์จุด Ground Truth โปรดดูที่ ยอมรับรูปแบบข้อมูลดิบ 3 มิติ.

ภาพต่อไปนี้แสดงการสแกน 3 มิติของเรา

วิธีการ

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

วิธีการสุ่มตัวอย่าง

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

การปูกระเบื้อง

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

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

ตัวอย่างขั้นตอนคงที่

วิธีอื่นคือการเลือกหรือสร้างจำนวนจุดที่ลดลงโดยตัวอย่างย่อยเชิงเส้นที่เรียกว่า a ตัวอย่างขั้นตอนคงที่. สมมติว่าคุณต้องการบรรลุเป้าหมาย 500,000 คะแนน (เราสังเกตเห็นว่าสิ่งนี้สามารถแสดงผลได้โดยทั่วไปบนแล็ปท็อปสำหรับผู้บริโภค—ดู ยอมรับรูปแบบข้อมูลดิบ 3 มิติ) แต่คุณมี point cloud ที่มี 10 ล้านคะแนน คุณสามารถคำนวณขนาดขั้นตอนของคุณเป็น step = 10,000,000 / 500,000 = 20. หลังจากที่คุณมีขนาดขั้นตอนแล้ว คุณสามารถเลือกจุดที่ 20 ในชุดข้อมูลของคุณเพื่อสร้าง point cloud ใหม่ หากข้อมูล point cloud ของคุณมีความหนาแน่นเพียงพอ ผู้ติดฉลากควรจะสามารถระบุคุณลักษณะที่เกี่ยวข้องใดๆ สำหรับการติดป้ายกำกับได้ แม้ว่าคุณจะมี 1 คะแนนต่อทุกๆ 20 ในฉากดั้งเดิมก็ตาม

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

Voxel หมายถึง

อีกรูปแบบหนึ่งของการสุ่มตัวอย่างที่ใช้จุดทั้งหมดเพื่อสร้างคลาวด์จุดที่สุ่มตัวอย่างคือการดำเนินการ การกรองตะแกรง. การกรองตารางหมายความว่าคุณแบ่งพื้นที่อินพุตออกเป็นกล่อง 3 มิติปกติ (หรือ voxels) ทั่ว point cloud และแทนที่จุดทั้งหมดภายใน voxel ด้วยจุดตัวแทนเพียงจุดเดียว (เช่น จุดเฉลี่ย) แผนภาพต่อไปนี้แสดงตัวอย่างกล่องสีแดง voxel

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

วิธีการสุ่มตัวอย่าง

หลังจากดาวน์แซมปลิงและติดป้ายกำกับข้อมูลของคุณแล้ว คุณอาจต้องการดูป้ายกำกับที่สร้างขึ้นบนคลาวด์จุดที่เล็กกว่าและสุ่มตัวอย่างซึ่งฉายบนคลาวด์พอยต์ขนาดเต็ม ซึ่งเราเรียกว่า สุ่มตัวอย่าง. งานตรวจจับหรือติดตามวัตถุไม่จำเป็นต้องมีการประมวลผลภายหลังในการดำเนินการนี้ ป้ายกำกับใน point cloud ที่มีการลดขนาดตัวอย่าง (เช่น cuboids) สามารถใช้ได้โดยตรงกับ point cloud ที่ใหญ่กว่า เนื่องจากถูกกำหนดไว้ในพื้นที่พิกัดโลกที่แชร์โดย point cloud ขนาดเต็ม (x, y, z, height, width, length) ป้ายกำกับเหล่านี้มีความอ่อนไหวน้อยที่สุดต่อข้อผิดพลาดเล็กๆ น้อยๆ ตามขอบเขตของออบเจ็กต์เมื่อจุดขอบเขตไม่อยู่ในชุดข้อมูลที่ลดขนาดตัวอย่าง แต่ข้อผิดพลาดเป็นครั้งคราวและเล็กน้อยดังกล่าวจะเกินดุลด้วยจำนวนจุดพิเศษที่ติดป้ายกำกับอย่างถูกต้องภายในทรงลูกบาศก์ที่สามารถ อบรม.

อย่างไรก็ตาม สำหรับงานการแบ่งเซ็กเมนต์ความหมายของคลาวด์แบบจุด 3 มิติ ป้ายกำกับไม่สามารถใช้กับชุดข้อมูลขนาดเต็มได้โดยตรง เรามีเพียงชุดย่อยของป้ายกำกับ แต่เราต้องการคาดการณ์ป้ายกำกับชุดข้อมูลทั้งหมดที่เหลือตามชุดย่อยนี้ ในการทำเช่นนี้เราสามารถใช้คำสั่งง่าย ๆ ได้ K-Nearest Neighbors (K-NN) ลักษณนาม โดยมีแต้มติดไว้เป็นชุดฝึก K-NN เป็นอัลกอริธึม ML ที่มีการควบคุมดูแลอย่างง่าย ซึ่งคาดการณ์ป้ายกำกับของจุดโดยใช้จุดที่มีป้ายกำกับ "K" ใกล้เคียงที่สุดและการลงคะแนนแบบถ่วงน้ำหนัก ด้วย K-NN เราสามารถทำนายระดับจุดของจุดที่เหลือที่ไม่มีป้ายกำกับในชุดข้อมูลขนาดเต็มตามระดับส่วนใหญ่ของจุดที่ใกล้เคียงที่สุด (ตามระยะทางแบบยุคลิด) สามจุดที่ใกล้เคียงที่สุด เราสามารถปรับแต่งแนวทางนี้เพิ่มเติมได้โดยเปลี่ยนไฮเปอร์พารามิเตอร์ของตัวแยกประเภท K-NN เช่น จำนวนจุดที่ใกล้เคียงที่สุดที่ต้องพิจารณา ตลอดจนเมตริกระยะทางและโครงร่างการถ่วงน้ำหนักของจุด

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

ตอนนี้เราได้ตรวจสอบวิธีการที่ใช้ในโพสต์นี้แล้ว เราสาธิตเทคนิคเหล่านี้ในสมุดบันทึก SageMaker ในตัวอย่างฉากคลาวด์จุดแบ่งกลุ่มความหมายตามความหมาย

เบื้องต้น

ในการดำเนินการแก้ไขปัญหานี้ คุณต้องมีสิ่งต่อไปนี้:

  • An บัญชี AWS.
  • โน๊ตบุ๊ค AWS Identity และการจัดการการเข้าถึง บทบาท (IAM) ที่มีสิทธิ์ที่จำเป็นในการดำเนินการแนะนำนี้ บทบาท IAM ของคุณต้องมีนโยบายที่จัดการโดย AWS แนบมาด้วย:
    • AmazonS3FullAccess
    • AmazonSageMakerFullAccess
  • An บริการจัดเก็บข้อมูลอย่างง่ายของ Amazon บัคเก็ต (Amazon S3) ที่จัดเก็บสิ่งประดิษฐ์ของโน้ตบุ๊ก (ข้อมูลอินพุตและป้ายกำกับ)
  • ทีมงาน SageMaker สำหรับโพสต์นี้เราใช้ทีมงานส่วนตัว คุณสามารถสร้างทีมงานได้บนคอนโซล SageMaker

การตั้งค่าโน้ตบุ๊ก

เราใช้โน๊ตบุ๊ค ground_truth_annotation_dense_point_cloud_tutorial.ipynb ใน ตัวอย่าง SageMaker ของอินสแตนซ์โน้ตบุ๊กเพื่อสาธิตวิธีการสุ่มตัวอย่างและสุ่มตัวอย่างเหล่านี้ สมุดบันทึกนี้มีรหัสทั้งหมดที่จำเป็นสำหรับการประมวลผลล่วงหน้า การติดป้ายกำกับ และการประมวลผลภายหลัง

ในการเข้าถึงโน้ตบุ๊ก ให้ทำตามขั้นตอนต่อไปนี้:

  1. สร้างอินสแตนซ์สมุดบันทึก. คุณสามารถใช้ประเภทอินสแตนซ์ ml.t2.xlarge เพื่อเปิดใช้อินสแตนซ์โน้ตบุ๊ก โปรดเลือกอินสแตนซ์ที่มี RAM อย่างน้อย 16 GB
    1. คุณต้องใช้บทบาท IAM ของสมุดบันทึกที่คุณสร้างไว้ตั้งแต่เนิ่นๆ บทบาทนี้ช่วยให้โน้ตบุ๊กของคุณสามารถอัปโหลดชุดข้อมูลของคุณไปยัง Amazon S3 และเรียกใช้ API โซลูชันได้
  2. เปิด Jupyter Lab หรือ Jupyter ไปที่ เข้าถึงอินสแตนซ์สมุดบันทึกของคุณ.
  3. ใน Jupyter ให้เลือก ตัวอย่าง SageMaker ใน Jupyter Lab เลือกไอคอน SageMaker
  4. Choose งานติดฉลากความจริงพื้น Ground จากนั้นเลือก ไอพินบ์ สมุดบันทึก.
  5. หากคุณกำลังใช้ Jupyter ให้เลือก ใช้ เพื่อคัดลอกสมุดบันทึกไปยังอินสแตนซ์ของคุณและเรียกใช้ หากคุณอยู่ในแล็บ Jupyter ให้เลือก สร้างสำเนา.

จัดเตรียมอินพุตโน้ตบุ๊ก

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

ส่วนที่ 1: ดึงชุดข้อมูลและแสดงภาพจุด cloud

เราดาวน์โหลดข้อมูลของเราโดยเรียกใช้ส่วนที่ 1 ของโน้ตบุ๊ก ซึ่งจะดาวน์โหลดชุดข้อมูลของเราจาก Amazon S3 และโหลด point cloud ลงในอินสแตนซ์โน้ตบุ๊กของเรา เราดาวน์โหลดข้อมูลที่เตรียมไว้แบบกำหนดเองจากบัคเก็ตที่ AWS เป็นเจ้าของ วัตถุที่เรียกว่า rooftop_12_49_41.xyz ควรอยู่ในรูทของที่ฝากข้อมูล S3 ข้อมูลนี้เป็นการสแกนของอาคารอพาร์ตเมนต์บนชั้นดาดฟ้าที่สร้างขึ้นเองบนอุปกรณ์มือถือ ในกรณีนี้ ข้อมูล point cloud จะอยู่ในรูปแบบ xyzrgb

เราสามารถเห็นภาพ point cloud ของเราได้โดยใช้ Matplotlib กระจาย3d การทำงาน. ไฟล์ point cloud มีจุดที่ถูกต้องทั้งหมดแต่ไม่ได้หมุนอย่างถูกต้อง เราสามารถหมุนวัตถุรอบแกนของมันได้โดยคูณจุดเมฆด้วยเมทริกซ์การหมุน เราสามารถรับเมทริกซ์การหมุนโดยใช้ สคิปปี้ และระบุการเปลี่ยนแปลงระดับที่เราต้องการทำกับแต่ละแกนโดยใช้ from_euler วิธี:

!aws s3 cp s3://smgt-downsampling-us-east-1-322552456788/rooftop_12_49_41.xyz pointcloud.xyz # Let's read our dataset into a numpy file pc = np.loadtxt("pointcloud.xyz", delimiter=",") print(f"Loaded points of shape {pc.shape}") # playing with view of 3D scene from scipy.spatial.transform import Rotation def plot_pointcloud(pc, rot = [[30,90,60]], color=True, title="Simple Downsampling 1", figsize=(50,25), verbose=False): if rot: rot1 = Rotation.from_euler('zyx', [[30,90,60]], degrees=True) R1 = rot1.as_matrix() if verbose: print('Rotation matrix:','n',R1) # matrix multiplication between our rotation matrix and pointcloud pc_show = np.matmul(R1, pc.copy()[:,:3].transpose() ).transpose() if color: try: rot_color1 = np.matmul(R1, pc.copy()[:,3:].transpose() ).transpose().squeeze() except: rot_color1 = np.matmul(R1, np.tile(pc.copy()[:,3],(3,1))).transpose().squeeze() else: pc_show = pc fig = plt.figure( figsize=figsize) ax = fig.add_subplot(111, projection="3d") ax.set_title(title, fontdict={'fontsize':20}) if color: ax.scatter(pc_show[:,0], pc_show[:,1], pc_show[:,2], c=rot_color1[:,0], s=0.05) else: ax.scatter(pc_show[:,0], pc_show[:,1], pc_show[:,2], c='blue', s=0.05) # rotate in z direction 30 degrees, y direction 90 degrees, and x direction 60 degrees rot1 = Rotation.from_euler('zyx', [[30,90,60]], degrees=True) print('Rotation matrix:','n', rot1.as_matrix()) plot_pointcloud(pc, rot = [[30,90,60]], color=True, title="Full pointcloud", figsize=(50,30)) 

ส่วนที่ 2: ลดขนาดชุดข้อมูล

ต่อไป เราลดขนาดชุดข้อมูลให้เหลือน้อยกว่า 500,000 จุด ซึ่งเป็นจำนวนจุดในอุดมคติสำหรับการแสดงภาพและการติดฉลาก ดูรายละเอียดเพิ่มเติมได้ที่ ขีดจำกัดความละเอียดของ Point Cloud in ยอมรับรูปแบบข้อมูลดิบ 3 มิติ. จากนั้นเราพลอตผลลัพธ์ของการสุ่มตัวอย่างของเราโดยเรียกใช้ส่วนที่ 2

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

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

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

#Basic Approach target_num_pts = 500_000 subsample = int(np.ceil(len(pc) / target_num_pts)) pc_downsample_simple = pc[::subsample] print(f"We've subsampled to {len(pc_downsample_simple)} points") #Advanced Approach boxsize = 0.013 # 1.3 cm box size. mins = pc[:,:3].min(axis=0) maxes = pc[:,:3].max(axis=0) volume = maxes - mins num_boxes_per_axis = np.ceil(volume / boxsize).astype('int32').tolist() num_boxes_per_axis.extend([1]) print(num_boxes_per_axis) # For each voxel or "box", use the mean of the box to chose which points are in the box. means, _, _ = scipy.stats.binned_statistic_dd( pc[:,:4], [pc[:,0], pc[:,1], pc[:,2], pc[:,3]], statistic="mean", bins=num_boxes_per_axis, ) x_means = means[0,~np.isnan(means[0])].flatten() y_means = means[1,~np.isnan(means[1])].flatten() z_means = means[2,~np.isnan(means[2])].flatten() c_means = means[3,~np.isnan(means[3])].flatten() pc_downsample_adv = np.column_stack([x_means, y_means, z_means, c_means]) print(pc_downsample_adv.shape) 

ส่วนที่ 3: เห็นภาพการเรนเดอร์ 3 มิติ

เราสามารถเห็นภาพเมฆแบบจุดโดยใช้พล็อตแบบกระจาย 3 มิติของจุดต่างๆ แม้ว่า point cloud ของเราจะมีสี แต่การแปลงสภาพของเรามีผลกับสีต่างกัน ดังนั้นการเปรียบเทียบพวกมันในสีเดียวจึงเป็นการเปรียบเทียบที่ดีกว่า เราจะเห็นได้ว่าวิธีการเฉลี่ย voxel ขั้นสูงสร้าง point cloud ที่นุ่มนวลขึ้นเพราะการเฉลี่ยมีผลในการลดสัญญาณรบกวน ในโค้ดต่อไปนี้ เราสามารถดูที่ point clouds ของเราจากสองเปอร์สเปคทีฟที่แยกจากกัน โดยการคูณ point clouds ของเราด้วยเมทริกซ์การหมุนที่ต่างกัน

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

rot1 = Rotation.from_euler('zyx', [[30,90,60]], degrees=True) R1 = rot1.as_matrix() simple_rot1 = pc_downsample_simple.copy() simple_rot1 = np.matmul(R1, simple_rot1[:,:3].transpose() ).transpose() advanced_rot1 = pc_downsample_adv.copy() advanced_rot1 = np.matmul(R1, advanced_rot1[:,:3].transpose() ).transpose() fig = plt.figure( figsize=(50, 30)) ax = fig.add_subplot(121, projection="3d") ax.set_title("Simple Downsampling 1", fontdict={'fontsize':20}) ax.scatter(simple_rot1[:,0], simple_rot1[:,1], simple_rot1[:,2], c='blue', s=0.05) ax = fig.add_subplot(122, projection="3d") ax.set_title("Voxel Mean Downsampling 1", fontdict={'fontsize':20}) ax.scatter(advanced_rot1[:,0], advanced_rot1[:,1], advanced_rot1[:,2], c='blue', s=0.05) # to look at any of the individual pointclouds or rotate the pointcloud, use the following function plot_pointcloud(pc_downsample_adv, rot = [[30,90,60]], color=True, title="Advanced Downsampling", figsize=(50,30)) 

ส่วนที่ 4: เปิดตัวงานการแบ่งส่วนความหมาย

เรียกใช้ส่วนที่ 4 ในสมุดบันทึกเพื่อใช้ point cloud นี้และเปิดใช้ Ground Truth point cloud semantic segmentation labeling job โดยใช้ เซลล์เหล่านี้สร้างไฟล์ Manifest อินพุตที่จำเป็นและจัดรูปแบบ point cloud ในรูปแบบที่เข้ากันได้กับ Ground Truth

หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับรูปแบบอินพุตของ Ground Truth ที่เกี่ยวข้องกับการชี้ข้อมูลบนคลาวด์ โปรดดูที่ ป้อนข้อมูล และ ยอมรับรูปแบบข้อมูลดิบ 3 มิติ.

ในส่วนนี้ เรายังดำเนินการติดฉลากในพอร์ทัลผู้ปฏิบัติงาน เราติดป้ายกำกับชุดย่อยของ point cloud เพื่อให้มีคำอธิบายประกอบเพื่อทำการสุ่มตัวอย่างด้วย เมื่องานเสร็จสมบูรณ์ เราจะโหลดคำอธิบายประกอบจาก Amazon S3 ลงในอาร์เรย์ NumPy สำหรับการประมวลผลภายหลังของเรา ต่อไปนี้เป็นภาพหน้าจอจากเครื่องมือแบ่งกลุ่มความหมายของ Ground Truth point cloud

ส่วนที่ 5: ทำการสุ่มตัวอย่างฉลาก

ตอนนี้เรามีป้ายกำกับที่ลดขนาดตัวอย่างแล้ว เราฝึกตัวแยกประเภท K-NN จาก SKLearn เพื่อคาดการณ์ป้ายกำกับชุดข้อมูลทั้งหมดโดยถือว่าจุดที่มีคำอธิบายประกอบเป็นข้อมูลการฝึกและทำการอนุมานจุดที่เหลือในจุดที่ไม่มีป้ายกำกับใน point cloud ขนาดเต็มของเรา

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

# There's a lot of possibility to tune KNN further # 1) Prevent classification of points far away from all other points (random unfiltered ground point) # 2) Perform a non-uniform weighted vote # 3) Tweak number of neighbors knn = KNeighborsClassifier(n_neighbors=3) print(f"Training on {len(pc_downsample_adv)} labeled points") knn.fit(pc_downsample_adv[:,:3], annotations) print(f"Upsampled to {len(pc)} labeled points") annotations_full = knn.predict(pc[:,:3]) 

ส่วนที่ 6: เห็นภาพฉลากที่สุ่มตัวอย่าง

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

pc_downsample_annotated = np.column_stack((pc_downsample_adv[:,:3], annotations)) pc_annotated = np.column_stack((pc[:,:3], annotations_full)) labeled_area = pc_downsample_annotated[pc_downsample_annotated[:,3] != 255] min_bounds = np.min(labeled_area, axis=0) max_bounds = np.max(labeled_area, axis=0) min_bounds = [-2, -2, -4.5, -1] max_bounds = [2, 2, -1, 256] def extract_tile(point_cloud, min_bounds, max_bounds): return point_cloud[ (point_cloud[:,0] > min_bounds[0]) & (point_cloud[:,1] > min_bounds[1]) & (point_cloud[:,2] > min_bounds[2]) & (point_cloud[:,0] < max_bounds[0]) & (point_cloud[:,1] < max_bounds[1]) & (point_cloud[:,2] < max_bounds[2]) ] tile_downsample_annotated = extract_tile(pc_downsample_annotated, min_bounds, max_bounds) tile_annotated = extract_tile(pc_annotated, min_bounds, max_bounds) rot1 = Rotation.from_euler('zyx', [[30,90,60]], degrees=True) R1 = rot1.as_matrix() down_rot = tile_downsample_annotated.copy() down_rot = np.matmul(R1, down_rot[:,:3].transpose() ).transpose() down_rot_color = np.matmul(R1, np.tile(tile_downsample_annotated.copy()[:,3],(3,1))).transpose().squeeze() full_rot = tile_annotated.copy() full_rot = np.matmul(R1, full_rot[:,:3].transpose() ).transpose() full_rot_color = np.matmul(R1, np.tile(tile_annotated.copy()[:,3],(3,1))).transpose().squeeze() fig = plt.figure(figsize=(50, 20)) ax = fig.add_subplot(121, projection="3d") ax.set_title("Downsampled Annotations", fontdict={'fontsize':20}) ax.scatter(down_rot[:,0], down_rot[:,1], down_rot[:,2], c=down_rot_color[:,0], s=0.05) ax = fig.add_subplot(122, projection="3d") ax.set_title("Upsampled Annotations", fontdict={'fontsize':20}) ax.scatter(full_rot[:,0], full_rot[:,1], full_rot[:,2], c=full_rot_color[:,0], s=0.05) 

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

ทำความสะอาด

โน๊ตบุ๊คอินสแตนซ์: คุณมีสองตัวเลือกหากคุณไม่ต้องการให้อินสแตนซ์สมุดบันทึกที่สร้างขึ้นทำงานต่อไป หากคุณต้องการบันทึกในภายหลัง คุณสามารถหยุดแทนที่จะลบออก

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

สรุป

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

สุดท้าย เราแสดงให้เห็นว่าคุณสามารถทำงาน 3D point cloud semantic segmentationation บนชุดข้อมูล downsampled และจับคู่ label กับ point cloud ขนาดเต็มผ่านการทำนายในตัวอย่าง เราทำสิ่งนี้สำเร็จโดยการฝึกตัวแยกประเภทเพื่อทำการอนุมานจุดขนาดชุดข้อมูลเต็มที่เหลืออยู่ โดยใช้จุดที่ติดป้ายกำกับแล้วเป็นข้อมูลการฝึก วิธีนี้ช่วยให้สามารถติดฉลากฉากคลาวด์ที่มีความหนาแน่นสูงได้อย่างคุ้มค่า ในขณะที่ยังคงคุณภาพฉลากโดยรวมที่ดี

ทดสอบ สมุดบันทึกนี้ ด้วยฉากเมฆจุดหนาแน่นของคุณเองใน Ground Truth ลองใช้เทคนิคการสุ่มตัวอย่างใหม่ และลองใช้โมเดลใหม่ๆ นอกเหนือจาก K-NN สำหรับการทำนายในตัวอย่างขั้นสุดท้าย เพื่อดูว่าเทคนิคการสุ่มตัวอย่างการสุ่มตัวอย่างและการสุ่มตัวอย่างสามารถลดต้นทุนการติดฉลากของคุณได้หรือไม่


เกี่ยวกับผู้เขียน

 วิทยาสาคร รวิปาติ เป็นสถาปนิก Deep Learning ที่ ห้องปฏิบัติการโซลูชัน Amazon MLซึ่งเขาใช้ประสบการณ์มากมายในระบบแบบกระจายขนาดใหญ่และความหลงใหลในการเรียนรู้ของเครื่องเพื่อช่วยลูกค้า AWS ในอุตสาหกรรมต่างๆ เร่งการนำ AI และระบบคลาวด์ไปใช้ ก่อนหน้านี้ เขาเป็นวิศวกรแมชชีนเลิร์นนิ่งใน Connectivity Services ที่ Amazon ซึ่งช่วยสร้างแพลตฟอร์มส่วนบุคคลและการบำรุงรักษาเชิงคาดการณ์

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

เจเรมี เฟลแทรคโก เป็นวิศวกรพัฒนาซอฟต์แวร์ของ Amazon ML Solutions Lab ที่ Amazon Web Services เขาใช้ภูมิหลังด้านคอมพิวเตอร์วิทัศน์ วิทยาการหุ่นยนต์ และการเรียนรู้ของเครื่องเพื่อช่วยให้ลูกค้า AWS เร่งการนำ AI ไปใช้

ที่มา: https://aws.amazon.com/blogs/machine-learning/annotate-dense-point-cloud-data-using-sagemaker-ground-truth/

ประทับเวลา:

เพิ่มเติมจาก บล็อก AWS Machine Learning

สร้างโมเดลคอมพิวเตอร์วิทัศน์โดยใช้ Amazon Rekognition Custom Labels และเปรียบเทียบผลลัพธ์กับโมเดล TensorFlow ที่ได้รับการฝึกอบรมแบบกำหนดเอง

โหนดต้นทาง: 1576512
ประทับเวลา: ธันวาคม 15, 2021