สร้างโมเดลการจัดประเภทเสียงที่ฝึกล่วงหน้าที่กําหนดเอง

สร้างโมเดลการจัดประเภทเสียงที่ฝึกล่วงหน้าที่กําหนดเอง

เกี่ยวกับ Codelab นี้

subjectอัปเดตล่าสุดเมื่อ พ.ย. 3, 2021
account_circleเขียนโดย lgusm@

1 ข้อควรทราบก่อนที่จะเริ่มต้น

ใน Codelab ที่ผ่านมา คุณได้สร้างแอปพื้นฐานสําหรับการแยกประเภทเสียง

การปรับแต่งรูปแบบการแยกประเภทเสียงเพื่อจดจําเสียงจากคลาสต่างๆ ที่ไม่มีในโมเดลก่อนการฝึกต้องทําอย่างไร หรือหากต้องการปรับแต่งโมเดลโดยใช้ข้อมูลของคุณเอง

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

สิ่งที่ต้องมีก่อน

Codelab นี้ได้รับการออกแบบมาสําหรับนักพัฒนาแอปบนอุปกรณ์เคลื่อนที่ที่มีประสบการณ์ซึ่งต้องการมีประสบการณ์เกี่ยวกับแมชชีนเลิร์นนิง คุณควรทําความคุ้นเคยกับสิ่งต่อไปนี้

  • การพัฒนาแอป Android โดยใช้ Kotlin และ Android Studio
  • ไวยากรณ์ Python พื้นฐาน

สิ่งที่คุณจะได้เรียนรู้

  • วิธีโอนการเรียนรู้สําหรับโดเมนเสียง
  • วิธีสร้างข้อมูลของคุณเอง
  • วิธีทําให้โมเดลของคุณใช้งานได้ในแอป Android

สิ่งที่ต้องมี

  • Android Studio เวอร์ชันล่าสุด (v4.1.2+)
  • อุปกรณ์ Android กายภาพที่ใช้ Android เวอร์ชัน 23 (Android 6.0)
  • โค้ดตัวอย่าง
  • ความรู้เบื้องต้นเกี่ยวกับการพัฒนา Android ใน Kotlin

2 ชุดข้อมูลของ Birds

คุณจะใช้ชุดข้อมูล Birdsong ที่เตรียมไว้แล้วเพื่อให้ใช้งานได้ง่ายขึ้น ไฟล์เสียงทั้งหมดมาจากเว็บไซต์ Xeno-canto

ชุดข้อมูลนี้มีเพลงจาก:

ชื่อ: House Sparrow

โค้ด: houspa

ภาพนกในบ้านของสแปลชโดย Alejandro Bayer Tamayo จากอาร์เมเนีย โคลอมเบีย

[เสียง]

ชื่อ: Red Crossbill

โค้ด: redcro

รูปภาพนกสายพันธุ์ Red Crossbill ของ Elaine Wilson

[เสียง]

ชื่อ: ประแจหัวไม้สีขาว

โค้ด: wbwwre1

รูปภาพ Wood-Wรอน แม่มดขาว ไม่ทราบผู้เขียน

[เสียง]

ชื่อ: Antpitta เป็นเจ้าของเกาลัด

โค้ด: chcant2

รูปภาพ Antpitta อันเป็นส่วนประกอบของเกาลัด

[เสียง]

ชื่อ: Azara's Spinetail

โค้ด: azaspi1

รูปภาพนกสับปะรดอาซารา'

[เสียง]

ชุดข้อมูลนี้อยู่ในไฟล์ ZIP และเนื้อหามีลักษณะดังนี้

  • metadata.csv ที่มีข้อมูลทั้งหมดเกี่ยวกับไฟล์เสียงแต่ละไฟล์ เช่น ผู้ที่บันทึกเสียง สถานที่บันทึกเสียง ใบอนุญาตการใช้ และชื่อนก
  • โฟลเดอร์การฝึกและการทดสอบ
  • ในโฟลเดอร์ฝึก/โฟลเดอร์ทดสอบจะมีโฟลเดอร์สําหรับรหัสนกแต่ละรหัส ในแต่ละหน้าจะมีไฟล์ .wav ทั้งหมดของนกตัวนั้นในการแยกนั้น

ไฟล์เสียงทั้งหมดอยู่ในรูปแบบ Wav และเป็นไปตามข้อกําหนดต่อไปนี้

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

เพื่อให้ขั้นตอนทั้งหมดง่ายขึ้น คุณไม่จําเป็นต้องดาวน์โหลดชุดข้อมูลในเครื่องของคุณ ใช้ใน Google Colab (หลังจากนั้นในคู่มือนี้)

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

3 รับโค้ดตัวอย่าง

ดาวน์โหลดโค้ด

คลิกลิงก์ต่อไปนี้เพื่อดาวน์โหลดโค้ดทั้งหมดสําหรับ Codelab นี้:

หรือโคลนที่เก็บ หากต้องการ

git clone https://github.com/googlecodelabs/odml-pathways.git

คลายการคลายไฟล์ ZIP ที่ดาวน์โหลด การดําเนินการนี้จะเปิดเผยโฟลเดอร์รูท (odml-pathways) พร้อมทรัพยากรทั้งหมดที่จําเป็น แต่สําหรับ Codelab นี้ คุณจะต้องใช้แหล่งที่มาในไดเรกทอรีย่อยของ audio_classification/codelab2/android เท่านั้น

ไดเรกทอรีย่อย android ในที่เก็บ audio_classification/codelab2/android จะมีไดเรกทอรี 2 ไดเรกทอรี ดังนี้

  • android_studio_folder.เงื่อนไขเริ่มต้น - โค้ดเริ่มต้นที่สร้างขึ้นสําหรับ Codelab นี้
  • android_studio_folder.final - โค้ดเสร็จสมบูรณ์สําหรับแอปตัวอย่างที่เสร็จสมบูรณ์

นําเข้าแอปเริ่มต้น

เริ่มด้วยการนําเข้าแอปเริ่มต้นไปยัง Android Studio โดยทําดังนี้

  1. เปิด Android Studio และเลือกนําเข้าโปรเจ็กต์ (Gradle, Eclipse ADT ฯลฯ)
  2. เปิดโฟลเดอร์ starter (audio_classification/codelab2/android/starter) จากซอร์สโค้ดที่คุณดาวน์โหลดไว้ก่อนหน้านี้

7c0f27882a2698ac.png

หากต้องการตรวจสอบว่าทรัพยากร Dependency ทั้งหมดพร้อมใช้งานในแอป คุณควรซิงค์โปรเจ็กต์กับไฟล์ Gradle เมื่อระบบนําเข้าเสร็จแล้ว

  1. เลือกซิงค์โปรเจ็กต์กับไฟล์ Gradle (b451ab2d04d835f9.png) จากแถบเครื่องมือ Android Studio

4 ทําความเข้าใจแอปเริ่มต้น

แอปนี้เหมือนกับแอปที่สร้างขึ้นใน Codelab แรกสําหรับการจัดประเภทเสียง ดังนี้ สร้างแอปพื้นฐานสําหรับการแยกประเภทเสียง

เพื่อทําความเข้าใจโค้ดในรายละเอียดให้ดียิ่งขึ้น เราขอแนะนําให้คุณทํา Codelab ดังกล่าวก่อนที่จะดําเนินการต่อ

โค้ดทั้งหมดจะอยู่ใน MainActivity (เพื่อให้เรียบง่ายที่สุดเท่าที่จะทําได้)

โดยสรุปแล้ว โค้ดจะจัดการงานต่างๆ ต่อไปนี้

  • กําลังโหลดโมเดล
val classifier = AudioClassifier.createFromFile(this, modelPath)
  • กําลังสร้างโปรแกรมอัดเสียงและเริ่มการบันทึก
val tensor = classifier.createInputTensorAudio()

val format
= classifier.requiredTensorAudioFormat
val recorderSpecs
= "Number Of Channels: ${format.channels}\n" +
       
"Sample Rate: ${format.sampleRate}"
recorderSpecsTextView
.text = recorderSpecs

val record
= classifier.createAudioRecord()
record
.startRecording()
  • การสร้างชุดข้อความของเครื่องควบคุมเวลาเพื่อเรียกใช้การอนุมาน พารามิเตอร์ของเมธอด scheduleAtFixedRate คือระยะเวลาที่ระบบจะรอและเริ่มดําเนินการ รวมทั้งระยะเวลาระหว่างการดําเนินการที่กระทําต่อ โค้ดด้านล่างจะเริ่มทํางานใน 1 มิลลิวินาที และจะทํางานอีกครั้งทุกๆ 500 มิลลิวินาที
Timer().scheduleAtFixedRate(1, 500) {
...
}
  • การอนุมานเสียงที่บันทึกไว้
val numberOfSamples = tensor.load(record)
val output
= classifier.classify(tensor)
  • การแยกประเภทตัวกรองเพื่อหาคะแนนต่ํา
val filteredModelOutput = output[0].categories.filter {
   it
.score > probabilityThreshold
}
  • แสดงผลการค้นหาในหน้าจอ
val outputStr = filteredModelOutput.map { "${it.label} -> ${it.score} " }
   
.joinToString(separator = "\n")

runOnUiThread
{
   textView
.text = outputStr
}

ตอนนี้คุณจะเรียกใช้และเล่นแอปได้ตามที่เป็นอยู่ แต่โปรดทราบว่าเมื่อใช้โมเดลก่อนการฝึกที่กว้างกว่านี้

5 ฝึกโมเดลการจัดประเภทเสียงที่กําหนดเองด้วย Model Maker

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

ดังที่กล่าวไปก่อนหน้านี้ คุณจะเชี่ยวชาญในการสร้างรูปแบบสําหรับเสียงนก นี่คือชุดข้อมูลที่มีเสียงนก ดูแลจัดการจากเว็บไซต์ Xeno-canto

Colaboratory

ถัดไปให้ไปที่ Google Colab เพื่อฝึกโมเดลที่กําหนดเอง

การฝึกโมเดลที่กําหนดเองจะใช้เวลาประมาณ 30 นาที

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

6 เพิ่มโมเดล TFLite ที่กําหนดเองลงในแอป Android

เมื่อคุณฝึกโมเดลการแยกประเภทเสียงของคุณเองและบันทึกในเครื่องแล้ว คุณก็ต้องวางลงในโฟลเดอร์เนื้อหาของแอป Android

ขั้นตอนแรกคือย้ายโมเดลที่ดาวน์โหลดจากขั้นตอนก่อนหน้าไปยังโฟลเดอร์เนื้อหาในแอป

  1. ใน Android Studio ให้คลิกขวาที่โฟลเดอร์ "โปรเจ็กต์" ของ Android

7cca2c22ed8cf4c8.png

  1. คุณจะเห็นป๊อปอัปพร้อมรายการตัวเลือก โฟลเดอร์ใดโฟลเดอร์หนึ่งต่อไปนี้จะเปิดโฟลเดอร์ในระบบไฟล์ หาส่วนขยายที่เหมาะสมสําหรับระบบปฏิบัติการของคุณ แล้วเลือกส่วนขยายดังกล่าว สําหรับ Mac จะเป็นแสดงใน Finder สําหรับ Windows จะเป็น Open in Explorer และใน Ubuntu จะเป็น Show in Files

ไฟล์ 95e0eca881d35f6b.png

  1. คัดลอกโมเดลที่ดาวน์โหลดลงในโฟลเดอร์

เมื่อเสร็จแล้ว ให้กลับไปที่ Android Studio แล้วคุณจะเห็นไฟล์ในโฟลเดอร์เนื้อหา

52bda66abe201fe5.png

7 โหลดโมเดลใหม่ในแอปฐาน

แอปฐานใช้โมเดลก่อนการฝึกอยู่แล้ว คุณจะต้องแทนที่ด้วยวิธีที่เพิ่งผ่านการฝึกอบรม

  1. สิ่งที่ต้องทํา 1: หากต้องการโหลดโมเดลใหม่หลังจากเพิ่มลงในโฟลเดอร์ assets ให้เปลี่ยนค่าของตัวแปร modelPath ดังนี้
var modelPath = "my_birds_model.tflite"

โมเดลใหม่จะมีเอาต์พุต 2 แบบ (ส่วนหัว)

  • ในกรณีนี้ เอาต์พุตเดิมที่เป็นแบบทั่วไปมากขึ้นจากรูปแบบฐานที่คุณใช้ ซึ่งในกรณีนี้คือ YAMNet
  • เอาต์พุตลําดับที่ 2 สําหรับนกที่คุณใช้ในการฝึก

ซึ่งเป็นสิ่งที่จําเป็นเนื่องจาก YAMNet เยี่ยมมากในการจดจําหลายชั้นเรียนที่ใช้กันบ่อย เช่น Silence ไม่ต้องกังวลว่าชั้นเรียนอื่นๆ จะไม่ได้เพิ่มลงในชุดข้อมูล

สิ่งที่คุณจะทําในตอนนี้คือ หากการแยกประเภท YAMNet แสดงคะแนนสูงสุดสําหรับนกประเภทนั้น ก็จะตรวจดูได้ว่าเป็นนกที่อยู่ในเอาต์พุตอื่น

37ce1c14e9e2d1b0.png

  1. TODO 2: หากหัวหน้าคนแรกของการจัดประเภทมีความมั่นใจสูงว่าเสียงก้อง จากนั้นคุณสามารถเปลี่ยนการกรองเพื่อกรองสิ่งที่ไม่ใช่นกออกไปด้วย โดยทําดังนี้
val filteredModelOuput = output[0].categories.filter {
   it
.label.contains("Bird") && it.score > .3
}
  1. สิ่งที่ต้องทํา 3: หากส่วนหัวของฐานของโมเดลตรวจพบว่ามีเสียงนกซึ่งมีความเป็นไปได้สูง คุณจะได้เสียงว่าเป็นนกตัวใดในส่วนหัวที่ 2
if (filteredModelOutput.isNotEmpty()) {
   
Log.i("Yamnet", "bird sound detected!")
   filteredModelOutput
= output[1].categories.filter {
       it
.score > probabilityThreshold
   
}
}

แค่นี้ก็เรียบร้อย การเปลี่ยนโมเดลไปใช้โมเดลที่คุณฝึกไปนั้นง่ายนิดเดียว

ขั้นตอนต่อไปคือการทดสอบ

8 ทดสอบแอปด้วยโมเดลใหม่

คุณได้รวมโมเดลการแยกประเภทเสียงเข้ากับแอปแล้ว มาลองทดสอบกันเลย

  1. เชื่อมต่ออุปกรณ์ Android แล้วคลิกเรียกใช้ (png) ในแถบเครื่องมือ Android Studio

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

bec3973388aaf32.png

9 ยินดีด้วย

ใน Codelab นี้ คุณจะได้เรียนรู้วิธีสร้างโมเดลการแยกประเภทเสียงของคุณเองด้วย Model Maker และวิธีใช้รูปแบบดังกล่าวในแอปบนอุปกรณ์เคลื่อนที่โดยใช้ TensorFlow Lite ดูข้อมูลเพิ่มเติมเกี่ยวกับ TFLite ได้ที่ตัวอย่าง TFLite

สิ่งที่เราพูดถึง

  • วิธีเตรียมชุดข้อมูลของคุณเอง
  • วิธีโอนการเรียนรู้สําหรับการจัดประเภทเสียงด้วยโปรแกรมสร้างรูปแบบ
  • วิธีใช้โมเดลของคุณในแอป Android

ขั้นตอนถัดไป

  • ลองใช้ข้อมูลของคุณเอง
  • บอกให้เราทราบถึงสิ่งที่คุณสร้าง

ดูข้อมูลเพิ่มเติม

หากมีข้อสงสัย

รายงานปัญหา