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

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

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

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

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

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

รายงานปัญหา