3D Object detection using Point clouds
โอเคครับ วันนี้เราจะเริ่มบล็อคที่สดใสหลังจากไม่ได้เขียนบล็อคแรกมานานพอตัวนะครับ วันนี้ผมจะมาโชว์ให้ทุกคนเห็นถึงความสามารถของเจ้า Deep learning ว่ามันทำอะไรได้มากขนาดไหน ตอนแรกก็คิดว่าจะไม่ได้ทำเรื่องนี้หรอกนะ แต่ว่าเรื่องนี้น่าสนใจแล้วมันก็เป็น Trend ที่มาแรงหลังจากความโด่งดังของ Elon Musk ได้เข้าถึงบุคคลที่ไม่ใช่สาย Tech ซึ่งเรื่องที่น่าสนใจที่ว่าก็คงไม่พ้นเจ้ารถยนต์ไฟฟ้า Tesla นั่นเอง แน่นอนเราต้องจ่ายตังค์ซื้อระบบ Auto pilot แหละเนอะ ว่าแต่… Auto pilot ที่ว่ามันทำงานยังไงกันนะ มันเห็นว่านี่รถ นี่เรือ นี่คน นี่เลนได้ยังไงกัน เพราะฉะนั้นวันนี้ผมจะมาลองสร้างโมเดล Deep learning ให้ทุกคนได้เห็นกันครับบ
เริ่มจากสิ่งแรกนั่นคือ Dataset หรือข้อมูลของเรานั่นเองครับ Dataset สำหรับ Autonomous vihecle นี่มีมาช้านานมาก และก็มีหลายเจ้าด้วยครับ แต่เราจะเลือกใช้ KITTI Dataset ที่นิยมใช้กันและมีขนาดเล็กพอเหมาะกับ Starter pack อย่างพวกเราด้วย
จริงๆเราสามารถดาวน์โหลดหน้าเว็บไซต์ได้เลยนะครับ แต่จะต้องกรอกอีเมลแล้วเขาจะส่งลิงก์ดาวน์โหลด Dataset ให้ซึ่งจริงๆแล้วก็ไม่แน่ใจนะว่าจะให้กรอกทำไมในเมื่อก็ส่งลิ้งก์ Amazon S3 มาให้แบบไม่ต้อง Authen อะไร 555+
แต่..แต่..แต่!!! ผมเห็นว่ามันช้ามากๆๆ (1 mb/s เพื่อโหลด 30GB ได้) เลยจะแนะนำอีกที่ให้นั่นคือ Kaggle Dataset มีคนใจดีเอามาลงไว้ให้ดาวน์โหลดได้ และไวมากด้วยครับเพียงแค่มี Account ของ Kaggle ก็สามารถโหลดได้ผ่านทางลิงก์นี้เลยนะครับ → https://www.kaggle.com/garymk/kitti-3d-object-detection-dataset
โอเครร เราได้ข้อมูลมาแล้วต่อไป ต่อไปเราก็ลองมาตรวจสอบข้อมูลกับหน่อยเนอะว่ามันเป็นยังไงหน้าตาประมาณไหน มันจะหล่อเท่กว่าคนทำมั้ย ทำได้หลายวิธีเลยครับอย่างผมก็จะใช้ mayavi ในการแสดงออกมานั่นเองครับ
อื่มม….สมกับชื่อ Point clouds จริงๆนะครับ ซึ่งจุดพวกนี้ก็จะมาจากการสะท้อนของเลเซอร์จากเซนเซอร์ LiDAR ที่ใช้เป็นเซนเซอร์ของรถหรือยานพาหนะส่วนใหญ่นะครับ หลังจากพล็อตดูแล้ว ก็ลองมาลุยสร้างโมเดลกันโลดดด
สำหรับวันนี้เพื่อไม่ให้ยุ่งยากและงงจนเกินไป ผมจะแนะนำให้รู้จัก OpenMMLab ซึ่งเขาได้รวบรวมโมเดลเกี่ยวกับเรื่องนี้ไว้ให้เป็นเฟรมเวิร์คเรียบร้อยมากครับ หรือเราจะสร้างของเราใหม่เองก็ได้นะครับ → https://github.com/open-mmlab/OpenPCDet
แน่นอน เราคงจะไม่ Implement เองทั้งหมดแน่ๆ!! มันใหญ่โตอลังการมาก และเราก็คงไม่ได้มีเทคนิคดีไปกว่าผู้เข้าพรีเซนต์ CVPR อยากโชกโชนกันมาแล้ว งั้นเราจะมาลองใช้ของพวกเขาดูกันก่อนเลยนะครับบ ก่อนอื่นเราก็จะทำการติดตั้งตามวิธีของเขานะครับซึ่งก็จำเป็นจะต้องมี CUDA ติดตั้งไว้ หรือมี Environment parameter ‘CUDA_HOME’ อยู่ด้วยครับบ
หลังจากเราทำการติดตั้งเรียบร้อยแล้ว ต่อไป ก็จะเป็น Dependencies อีกตัวถ้าเราอยากเล่นและตกแต่งโมเดลเพิ่มเติมนะครับ นั่นคือ Spatially-Sparse Convolution ครับ ถ้าอยากรู้รายละเอียดว่าต่างจาก Convolution ธรรมดายังไงลองดูได้จากที่นี่เลย →https://github.com/facebookresearch/SparseConvNet แต่เราจะไม่ได้ใช้ของ Facebook เขา Implement มาให้นะครับเพราะมันมีบางอย่างที่ไม่ได้ลงตัวกับ OpenPCDet ที่เพิ่งลงกันไปเมื่อกี้โดยเราจะใช้จากของคนนี้แทนครับ → https://github.com/traveller59/spconv
หลังจากติดตั้งเสร็จแล้ว เราลองมาดูสิว่าเราต้องทำอะไรบ้างเราถึงจะหาวัตถุจากจุดเมฆเหล่านั้นได้ด้วยโมเดลของเราครับบ
อย่างที่เห็นเขาจะไกด์วิธีการวางไฟล์ไว้นะครับ เราก็แค่แตกไฟล์ลงไปในโฟล์ดเดอร์ที่เขาเขียนไว้และ Pre-process ตามประเภทของ Dataset เท่านั้นเองครับ มีให้เลือกได้หลายแบบไม่ว่าจะเป็น KITTI, Waymo, NuScences ทีนี้เราก็จะมาเข้าสู่ช่วงการปั้นโมเดลมาเทรนกันแล้วสินะ :-3
วิธีการตั้งค่านะครับ เราก็ตั้งค่า Dataset ให้ได้ในรูปแบบที่เราต้องการด้วยไฟล์ YAML อย่างของที่ผมตั้งไปก็จะมีการจำกัดช่วงของ Point cloud ออกเพราะยิ่งไกลมันยิ่งบางยิ่งดูไม่รู้เรื่อง แต่ก็อย่าลืมตัด Labels หรือ Targets ตรงนี้ออกด้วยครับ เดี๋ยจะได้เทรนรถผีสิงแทน บรึ๋ยเลยที่นี้
หลังจากนั้นเราก็มาตั้งค่าโมเดล อ้ออ…ลืมไป จริงๆเราสามารถมาตั้งได้ในนี้ไฟล์เดียวกับโมเดลของเราเลยครับ แต่แนะนำให้แยกเพราะเวลาไล่อ่านเราจะไม่งงครับโดยการตั้งค่านั้นผมจะลองตั้งให้มันเริ่มจาก PointNet++ ซึ่งเป็น Feature extractor module ที่เบสิคมากๆสำหรับงาน 3D Point cloud เลยครับ
หลังจากระบุโมเดลและ Hyperparameters แล้ว เราก็ได้ถึงเวลาไปหาของกินเล่นมากินกันดีกว่าครับ นั่นคือช่วงเวลาที่เราจะเทรนโมเดลนั่นเอง!!
หลังจากนั้นเราก็รอจนมันเทรนเสร็จแล้วเราก็จะวัดผลด้วยการ Test นั่นเองครับ
นี่ไงล่ะผลลัพธ์ที่เราอยากได้ โมเดลของเราเจอรถกับคนแล้ว ความถูกต้องก็เยอะมากด้วย เยย้!! อืมมม…แล้วถ้าเราอยากจะลองแก้ไขโมเดลของเราบ้างล่ะจะต้องทำยังไง ในกรณีที่เรามีไอเดียวว่ามันต้องเท่และตรวจจับได้ดีกว่า เราสามารถแก้ไขได้ด้วยการสร้างไฟล์ใน Directory ของที่เราได้ทำการโคลนมา → <git>/pcdet/models/* แน่นอนครับ…เขาก็ไม่ใจร้ายเกินที่จะให้เรางมโค้ดทั้งหมดเขาได้ Provide โค้ดบางส่วนให้เป็น Template ให้เรามา Implement ต่อกันได้ง่ายขึ้นอีกเยอะเลยครับ แต่ในที่นี้ ผมก็อยากจะลองทำเองทั้งหมดแต่ก็พบหลากหลายปัญหาเสียเหลือเกินแต่สุดท้ายก็มาบากบั่นทำแหละ ;-;
ผลลัพธ์ที่ได้ก็ไม่ค่อยน่าภูมิใจสักเท่าไหร่นะครับ….
โอ้มายกอด วันนี้จะได้ปิดบล็อกสวยๆมั้ยเนี่ยย…อย่างน้อยมันก็ไม่ได้กระจุกกันเกินแหละนะ 555+ ทำไมผม Implement แบบใหม่ขึ้นมาเองแล้วมันถึงได้ทุเรศทุรังอะไรขนาดเนนน้
โอเคครับ หลังจากไปรีวิวมา ก็พบว่า ด้วยความที่ KITTI Dataset มีขนาดเล็กและบางไฟล์ถ้าเราต้องการ Train, Evaluate, Predict มันอาจจะไม่มีคลาสนั้นๆเลยก็ได้เช่น…
ตู้มม ทั้ง Scene มีแค่รถคันเดียวแต่อยากหาคนใน Training set ก็เป็นว่าไม่เจอสิครับ…แปลว่าเราจำเป็นและควรยิ่งในการทำ Data augmentation บน KITTI Dataset เพื่อทำให้เกิด Sample เพิ่มขึ้นใน Dataset ของเราครับ เพราะใน KITTI Dataset เขาจะให้ gt_database มาเพื่อทำ Augmented แต่ว่าโมเดลของผมนอกจากจะไม่ได้ Augmented แล้วเราก็ไม่ได้ทำ Anchor Box แบบ PointPillars หรือโมเดลอื่นๆด้วยครับ ก็เอาเป็นว่าบล็อกนี้คงจบไปไม่สวย และก็ขอให้ทุกคนลองไปใช้ OpenPCDet สำหรับผู้ที่อยากทำการสร้างโมเดลแบบนี้นะครับ เพราะว่าเขาให้มาครบมากๆๆ ถ้าเราอยากทำโมเดลใหม่เขาก็มีเทมเพลตให้ด้วยนะครับ
อ้อออ…แล้วคนอื่นจะใช้โมเดลเรายังไงได้น่ะหรือในส่วนนี้มีคนแนะนำให้ใช้ Streamlit เพื่อทำการ Deploy นะครับ ซึ่งเจ้าตัวก็ใช้งานง่ายมาก และสร้าง Front-end ให้เราด้วยโค้ดไม่กี่บรรทัดสำหรับบล็อกนี้ผมก็ได้ทำการ deploy บน Heroku ซึ่ง…RAM ไม่พอ ผมเลยทำได้แค่แสดงรูปภาพที่ผ่านการ Predict ว่ามันเจออะไรบ้างให้ทุกคนได้ดูที่ → https://lidar-object-detection.herokuapp.com/ กันนะคร้าบบ วันนี้ลาไปก่อนแค่นี้หลังจากนอนตี 2 มาสักพักนะครับ วันนี้ขอนอนยาวๆสักวัน อ่าว..มีเรียนนี่หว่า หมดกันน!
References
PointPillars : https://arxiv.org/abs/1812.05784
LiDAR : https://oceanservice.noaa.gov/facts/lidar.html