เรียนรู้การสร้างโมเดลรู้จำเสียง ผ่าน Kaggle : Rainforest Audio Detection
ThaiKeras and Kaggle 17 Jan 2021
สวัสดีครับเพื่อนๆ สำหรับคนที่สนใจวิธีการสร้างโมเดลที่รู้จำเสียงต่างๆ ได้ (input เป็นเสียง) หรือผู้ที่สนใจประยุกต์ AI/Data Science กับงานด้าน "วิทยาศาสตร์สิ่งแวดล้อม" (Environmental Science) วันนี้มีโอกาสดีดี ให้ลองเรียนรู้ผ่านการแข่งขันบน Kaggle ที่ชื่อว่า Rainforest Audio Detection หรือ "รู้จำเสียงสัตว์ต่างๆ ในป่าดงดิบ" ซึ่งทุกคนสามารถเข้าร่วมได้ที่นี่ครับ https://www.kaggle.com/c/rfcx-species-audio-detection/
บทความนี้ เราจะมาทำความเข้าใจ เรื่องดังต่อไปนี้ครับ
- ความสำคัญของโจทย์ ทำไมต้องจำเสียงสัตว์ในป่า ?
- ข้อมูลเสียงสัตว์ที่โจทย์กำหนดมาเบื้องต้น
- หลักการสร้างโมเดลรู้จำเสียง ประกอบไปด้วยขั้นตอนอะไรบ้าง
.
ความสำคัญของโจทย์ ทำไมต้องจำเสียงสัตว์ในป่า ?
ในภาวะที่เทคโนโลยีมนุษย์มีความเจริญก้าวหน้าอย่างรวดเร็ว มีการบุกรุกผืนป่ามากขึ้นเรื่อยๆ รวมทั้งมีภาวะโลกร้อนทำให้เกิดผลกระทบต่อสัตว์ต่างๆ ในระบบนิเวศน์มากมาย
ดังนั้นในการรักษาสัตว์ต่างๆ ในผืนป่าให้อยู่คู่กับมนุษย์ในระยะยาวนั้น เราต้องมีการตรวจสอบขนาดประชากรของสัตว์ชนิดต่างๆ อยู่เสมอ ในกรณีที่ประชากรของสัตว์ชนิดใดเริ่มลดจำนวนลง การรู้แต่เนิ่นๆ อาจยังพอช่วยแก้ไขได้
อย่างไรก็ดีในการตรวจสอบประชากรสัตว์นั้น ไม่สามารถตั้งกล้องถ่ายรูปและนับจำนวนง่ายๆ ได้ เนื่องจากพฤติกรรมสัตว์หลายชนิดมักซ่อนตัวอยู่ในที่ปลอดภัย รวมทั้งหลายชนิดอาจจะออกหากินในเวลากลางคืนเป็นหลัก
ในสถานการณ์แบบนี้ การนับประชากรจาก "เสียง" ของสัตว์เหล่านั้นจึงเป็นสิ่งที่ตรวจสอบได้ง่ายกว่า "ภาพ"
จึงเป็นที่มาของการแข่งขันครั้งนี้ที่ Kaggle ร่วมมือกับทีม Rainforest Connection (RFCx - https://www.rfcx.org/ ) ซึ่งเป็นองค์กร
ที่ได้วางเซนเซอร์เสียงเพื่อตรวจสอบเสียงสัตว์แบบ real-time ไว้ในป่าดิบชื้นที่สำคัญหลายแห่งทั่วโลกเช่นที่ อเมซอน บราซิล และที่ป่าในหมู่เกาะอินโดนีเซีย ซึ่งทั้งสองแหล่งเป็นที่อยู่อาศัยของสิ่งมีชีวิฅที่หลากหลายที่สุดในโลกบนบกของเราครับ
.
ข้อมูลเสียงสัตว์ที่โจทย์กำหนดมาเบื้องต้น
ในการเริ่มต้นโปรเจกต์ Data Science ใดๆ เราต้องเริ่มจากการทำความเข้าใจข้อมูลและวิธีการวัดผลก่อนเป็นสำคัญที่สุด ก่อนที่จะไปพูดเรื่องโมเดลครับ
ในการแข่งขันนี้ เป็นการจำลองสถานการณ์ในป่าง่ายๆ จึงกำหนดไว้มีเสียงของสัตว์ทั้งหมด 24 ชนิด ประกอบไปด้วย นกและกบหลากหลายพันธุ์
โดยข้อมูลฝึกสอน training data ประกอบไปด้วยคลิปเสียงความยาว 60 วินาทีจำนวน 4727 คลิป และข้อมูลทดสอบราว 2000 คลิปความยาว 60 วินาทีเท่ากันครับ โดยในคลิปหนึ่งๆ สามารถมีเสียงของสัตว์หลายชนิดได้ (multi-label classification problem)
ความยากของการแข่งขันครั้งนี้ก็คือ เป็นลักษณะ "incomplete labels" นั่นคือให้คำตอบมาไม่ครบถ้วนในแต่ละคลิป เช่น บอกว่าในคลิปที่ 1 มีเสียงของสัตว์ประเภทที่ 5 และ 10 อยู่ที่วินาทีที่ 23 และ 45 ตามลำดับ แต่ในขณะเดียวกันก็อาจจะมีเสียงของสัตว์อื่นๆ ใน 24 ชนิดที่กำหนดอยู่อีกในวินาทีอื่นๆ ก็ได้ (และแน่นอน มีเสียงของสัตว์อื่นๆ ที่ไม่ได้อยู่ใน 24 ประเภทเลยอีกด้วย ซึ่งคือ noise data ในที่นี่)
นอกจากบอกว่าเสียงของสัตว์ใน label ปรากฏในช่วงวินาทีใดในคลิปแล้ว ยังบอกช่วงคลื่นความถี่ (frequency band) ของเสียงชนิดนั้นอีกด้วย โดยเราสามารถดู EDA (Exploratory Data Analysis) โน้ตบุคเบื้องต้นของข้อมูลได้ที่นี่ครับ https://www.kaggle.com/gpreda/explore-the-rainforest-soundscape
การวัดผลใช้ ranking metric ที่เรียกว่า lwlrap (Label-weighted label-ranking average precision) สามารถดูรายละเอียดได้ที่
https://www.kaggle.com/c/rfcx-species-audio-detection/overview/evaluation
.
หลักการสร้างโมเดลรู้จำเสียง ประกอบไปด้วยขั้นตอนอะไรบ้าง
Standard pipeline ในการสร้างโมเดลสำหรับข้อมูลเสียงมีดังนี้
1. แปลข้อมูล audio ให้เป็น spectogram (รูปล่าง)
โดย spectogram นั้นแสดงถึงการเปลี่ยนแปลงความถี่ของเสียงในแต่ละช่วงเวลา ซึ่งสร้างได้จาก Short-time Fourier Transforms ( https://en.wikipedia.org/wiki/Short-time_Fourier_transform ) ซึ่งก็คือ
1.1) แบ่งข้อมูล audio input ออกเป็นส่วนๆ (window)
1.2) ทำ Fourier Transform ในแต่ละ windows
1.3) เอาผลลัพธ์ที่ได้มาเรียงกันเราจะได้ Spectogram ซึ่งเก็บในรูปของ Array 2 มิติ
2. เปลี่ยน frequency scale ของ Spectogram ให้อยู่ใน scale ที่เรียกว่า mel-frequency (มีสูตรตายตัว : https://en.wikipedia.org/wiki/Mel_scale ) โดยเชื่อว่าทำให้เห็นคุณสมบัติของ signal ได้ชัดกว่า
3. เนื่องจาก mel-Spectogram ถูกเก็บอยู่ใน array 2 มิติ เราจึงอาจมองว่ามันคือ "รูปภาพ" ได้ ดังนั้นวิธีที่ใช้กันโดยมาตรฐานคือใช้ Convolution Neural Networks เข้ามาเรียนรู้จาก Spectogram นี้ครับ
ถ้าพูดง่ายๆ นั่นคือเราเปลี่ยนปัญหาจาก audio classification ให้เป็น image classifcation นั่นเองครับ ทำให้จากนี้เราสามารถใช้ความรู้ image classification ที่เรามี (ดูได้จาก workshops ที่ผ่านมาของเรา) มาแก้ปัญหานี้ได้ในที่สุด
ในทางรายละเอียดยังมีเรื่องยิบย่อยอีกมากมาย เพื่อนๆ ท่านใดสนใจสามารถดูการเขียน Deep Learning Model สำหรับปัญหานี้ แบบ professional มากๆ ด้วย Tensorflow-Keras ได้ในโน้ตบุคนี้ครับ
https://www.kaggle.com/yosshi999/rfcx-train-resnet50-with-tpu
ซึ่งอาจจะได้มีโอกาสมาค่อยๆ แกะในบทความถัดไป วันนี้ขอจบที่ตรงนี้ก่อนครับ