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 |
ชื่อ: Red Crossbill | โค้ด: redcro |
ชื่อ: ประแจหัวไม้สีขาว | โค้ด: wbwwre1 |
ชื่อ: Antpitta เป็นเจ้าของเกาลัด | โค้ด: chcant2 |
ชื่อ: Azara's Spinetail | โค้ด: azaspi1 |
ชุดข้อมูลนี้อยู่ในไฟล์ ZIP และเนื้อหามีลักษณะดังนี้
metadata.csv
ที่มีข้อมูลทั้งหมดเกี่ยวกับไฟล์เสียงแต่ละไฟล์ เช่น ผู้ที่บันทึกเสียง สถานที่บันทึกเสียง ใบอนุญาตการใช้ และชื่อนก- โฟลเดอร์การฝึกและการทดสอบ
- ในโฟลเดอร์ฝึก/โฟลเดอร์ทดสอบจะมีโฟลเดอร์สําหรับรหัสนกแต่ละรหัส ในแต่ละหน้าจะมีไฟล์ .wav ทั้งหมดของนกตัวนั้นในการแยกนั้น
ไฟล์เสียงทั้งหมดอยู่ในรูปแบบ Wav และเป็นไปตามข้อกําหนดต่อไปนี้
- อัตราการสุ่มตัวอย่าง 16000 Hz
- ช่องสัญญาณเสียง 1 ช่อง (โมโน)
- อัตรา 16 บิต
ข้อกําหนดนี้เป็นสิ่งสําคัญเนื่องจากคุณจะใช้โมเดลฐานซึ่งคาดหวังข้อมูลในรูปแบบนี้ อ่านข้อมูลเพิ่มเติมเกี่ยวกับบล็อกโพสต์นี้ได้
เพื่อให้ขั้นตอนทั้งหมดง่ายขึ้น คุณไม่จําเป็นต้องดาวน์โหลดชุดข้อมูลในเครื่องของคุณ ใช้ใน 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 ไดเรกทอรี ดังนี้
- เงื่อนไขเริ่มต้น - โค้ดเริ่มต้นที่สร้างขึ้นสําหรับ Codelab นี้
- final - โค้ดเสร็จสมบูรณ์สําหรับแอปตัวอย่างที่เสร็จสมบูรณ์
นําเข้าแอปเริ่มต้น
เริ่มด้วยการนําเข้าแอปเริ่มต้นไปยัง Android Studio โดยทําดังนี้
- เปิด Android Studio และเลือกนําเข้าโปรเจ็กต์ (Gradle, Eclipse ADT ฯลฯ)
- เปิดโฟลเดอร์
starter
(audio_classification/codelab2/android/starter
) จากซอร์สโค้ดที่คุณดาวน์โหลดไว้ก่อนหน้านี้
หากต้องการตรวจสอบว่าทรัพยากร Dependency ทั้งหมดพร้อมใช้งานในแอป คุณควรซิงค์โปรเจ็กต์กับไฟล์ Gradle เมื่อระบบนําเข้าเสร็จแล้ว
- เลือกซิงค์โปรเจ็กต์กับไฟล์ Gradle () จากแถบเครื่องมือ 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
ขั้นตอนแรกคือย้ายโมเดลที่ดาวน์โหลดจากขั้นตอนก่อนหน้าไปยังโฟลเดอร์เนื้อหาในแอป
- ใน Android Studio ให้คลิกขวาที่โฟลเดอร์ "โปรเจ็กต์" ของ Android
- คุณจะเห็นป๊อปอัปพร้อมรายการตัวเลือก โฟลเดอร์ใดโฟลเดอร์หนึ่งต่อไปนี้จะเปิดโฟลเดอร์ในระบบไฟล์ หาส่วนขยายที่เหมาะสมสําหรับระบบปฏิบัติการของคุณ แล้วเลือกส่วนขยายดังกล่าว สําหรับ Mac จะเป็นแสดงใน Finder สําหรับ Windows จะเป็น Open in Explorer และใน Ubuntu จะเป็น Show in Files
- คัดลอกโมเดลที่ดาวน์โหลดลงในโฟลเดอร์
เมื่อเสร็จแล้ว ให้กลับไปที่ Android Studio แล้วคุณจะเห็นไฟล์ในโฟลเดอร์เนื้อหา
7. โหลดโมเดลใหม่ในแอปฐาน
แอปฐานใช้โมเดลก่อนการฝึกอยู่แล้ว คุณจะต้องแทนที่ด้วยวิธีที่เพิ่งผ่านการฝึกอบรม
- สิ่งที่ต้องทํา 1: หากต้องการโหลดโมเดลใหม่หลังจากเพิ่มลงในโฟลเดอร์ assets ให้เปลี่ยนค่าของตัวแปร
modelPath
ดังนี้
var modelPath = "my_birds_model.tflite"
โมเดลใหม่จะมีเอาต์พุต 2 แบบ (ส่วนหัว)
- ในกรณีนี้ เอาต์พุตเดิมที่เป็นแบบทั่วไปมากขึ้นจากรูปแบบฐานที่คุณใช้ ซึ่งในกรณีนี้คือ YAMNet
- เอาต์พุตลําดับที่ 2 สําหรับนกที่คุณใช้ในการฝึก
ซึ่งเป็นสิ่งที่จําเป็นเนื่องจาก YAMNet เยี่ยมมากในการจดจําหลายชั้นเรียนที่ใช้กันบ่อย เช่น Silence ไม่ต้องกังวลว่าชั้นเรียนอื่นๆ จะไม่ได้เพิ่มลงในชุดข้อมูล
สิ่งที่คุณจะทําในตอนนี้คือ หากการแยกประเภท YAMNet แสดงคะแนนสูงสุดสําหรับนกประเภทนั้น ก็จะตรวจดูได้ว่าเป็นนกที่อยู่ในเอาต์พุตอื่น
- TODO 2: หากหัวหน้าคนแรกของการจัดประเภทมีความมั่นใจสูงว่าเสียงก้อง จากนั้นคุณสามารถเปลี่ยนการกรองเพื่อกรองสิ่งที่ไม่ใช่นกออกไปด้วย โดยทําดังนี้
val filteredModelOuput = output[0].categories.filter {
it.label.contains("Bird") && it.score > .3
}
- สิ่งที่ต้องทํา 3: หากส่วนหัวของฐานของโมเดลตรวจพบว่ามีเสียงนกซึ่งมีความเป็นไปได้สูง คุณจะได้เสียงว่าเป็นนกตัวใดในส่วนหัวที่ 2
if (filteredModelOutput.isNotEmpty()) {
Log.i("Yamnet", "bird sound detected!")
filteredModelOutput = output[1].categories.filter {
it.score > probabilityThreshold
}
}
แค่นี้ก็เรียบร้อย การเปลี่ยนโมเดลไปใช้โมเดลที่คุณฝึกไปนั้นง่ายนิดเดียว
ขั้นตอนต่อไปคือการทดสอบ
8. ทดสอบแอปด้วยโมเดลใหม่
คุณได้รวมโมเดลการแยกประเภทเสียงเข้ากับแอปแล้ว มาลองทดสอบกันเลย
- เชื่อมต่ออุปกรณ์ Android แล้วคลิกเรียกใช้ () ในแถบเครื่องมือ Android Studio
แอปควรคาดคะเนเสียงของนกได้ถูกต้อง เพื่อให้การทดสอบง่ายขึ้น โปรดเล่นเสียงจากคอมพิวเตอร์ (จากขั้นตอนก่อนหน้า) และโทรศัพท์ควรตรวจจับได้ ข้อมูลเหล่านี้จะแสดงชื่อนกและความน่าจะเป็นของชื่อในหน้าจอ
9. ยินดีด้วย
ใน Codelab นี้ คุณจะได้เรียนรู้วิธีสร้างโมเดลการแยกประเภทเสียงของคุณเองด้วย Model Maker และวิธีใช้รูปแบบดังกล่าวในแอปบนอุปกรณ์เคลื่อนที่โดยใช้ TensorFlow Lite ดูข้อมูลเพิ่มเติมเกี่ยวกับ TFLite ได้ที่ตัวอย่าง TFLite
สิ่งที่เราพูดถึง
- วิธีเตรียมชุดข้อมูลของคุณเอง
- วิธีโอนการเรียนรู้สําหรับการจัดประเภทเสียงด้วยโปรแกรมสร้างรูปแบบ
- วิธีใช้โมเดลของคุณในแอป Android
ขั้นตอนถัดไป
- ลองใช้ข้อมูลของคุณเอง
- บอกให้เราทราบถึงสิ่งที่คุณสร้าง
ดูข้อมูลเพิ่มเติม
- ลิงก์ไปยังเส้นทางการเรียนรู้
- เอกสารประกอบเกี่ยวกับ TensorFlow Lite
- เอกสารประกอบของโปรแกรมสร้างโมเดล
- เอกสารประกอบเกี่ยวกับ TensorFlow Hub
- แมชชีนเลิร์นนิงในอุปกรณ์ด้วยเทคโนโลยีของ Google