Daftar Isi:
2025 Pengarang: John Day | [email protected]. Terakhir diubah: 2025-01-13 06:57
Sebagai kelanjutan dari artikel saya sebelumnya tentang pengenalan gambar dengan Sipeed MaiX Boards, saya memutuskan untuk menulis tutorial lain, dengan fokus pada deteksi objek. Ada beberapa perangkat keras menarik yang bermunculan baru-baru ini dengan chip Kendryte K210, termasuk Seeed AI Hat untuk Edge Computing, M5StickV M5 stack dan HuskyLens DFRobot (walaupun yang satu ini memiliki firmware berpemilik dan lebih ditargetkan untuk pemula). Karena harganya yang murah, Kendryte K210 telah menarik orang-orang yang ingin menambahkan visi komputer ke proyek mereka. Tetapi seperti biasa dengan produk perangkat keras China, dukungan teknisnya kurang dan ini adalah sesuatu yang saya coba perbaiki dengan artikel dan video saya. Namun perlu diingat, bahwa saya tidak tergabung dalam tim pengembang Kendryte atau Sipeed dan tidak dapat menjawab semua pertanyaan terkait produk mereka.
Dengan mengingat hal itu, mari kita mulai! Kami akan mulai dengan gambaran singkat (dan disederhanakan) tentang cara kerja model CNN pengenalan objek.
PEMBARUAN MEI 2020: Melihat bagaimana artikel dan video saya di Object Detection dengan papan K210 masih sangat populer dan di antara hasil teratas di YouTube dan Google, saya memutuskan untuk memperbarui artikel untuk memasukkan informasi tentang aXeleRate, kerangka kerja berbasis Keras untuk AI di Ujung saya kembangkan. aXeleRate, pada dasarnya, didasarkan pada kumpulan skrip yang saya gunakan untuk melatih model pengenalan gambar/deteksi objek - digabungkan menjadi satu kerangka kerja dan dioptimalkan untuk alur kerja di Google Colab. Lebih nyaman digunakan dan lebih mutakhir.
Untuk artikel versi lama masih bisa dilihat di steemit.com.
Langkah 1: Arsitektur Model Deteksi Objek Dijelaskan
Model pengenalan gambar (atau klasifikasi gambar) mengambil seluruh gambar sebagai input dan output daftar probabilitas untuk setiap kelas yang kami coba kenali. Ini sangat berguna jika objek yang kita minati menempati sebagian besar gambar dan kita tidak terlalu peduli dengan lokasinya. Tetapi bagaimana jika proyek kita (misalnya, kamera pelacak wajah) mengharuskan kita tidak hanya memiliki pengetahuan tentang jenis objek dalam gambar, tetapi juga koordinatnya. Dan bagaimana dengan proyek yang membutuhkan pendeteksian banyak objek (misalnya untuk menghitung)?
Di sinilah Model Deteksi Objek berguna. Dalam artikel ini kita akan menggunakan arsitektur YOLO (Anda hanya melihat sekali) dan memfokuskan penjelasannya pada mekanika internal dari arsitektur khusus ini.
Kami mencoba menentukan objek apa yang ada dalam gambar dan apa koordinatnya. Karena pembelajaran mesin bukanlah keajaiban dan bukan "mesin berpikir", tetapi hanya sebuah algoritma yang menggunakan statistik untuk mengoptimalkan fungsi (jaringan saraf) untuk memecahkan masalah tertentu dengan lebih baik. Kita perlu memparafrasekan masalah ini agar lebih "dapat dioptimalkan". Pendekatan naif di sini adalah membuat algoritma meminimalkan kerugian (perbedaan) antara prediksinya dan koordinat objek yang benar. Itu akan bekerja cukup baik, selama kita hanya memiliki satu objek dalam gambar. Untuk beberapa objek, kami mengambil pendekatan yang berbeda - kami menambahkan kisi dan membuat jaringan kami memprediksi ada (atau tidak adanya) objek di setiap kisi. Kedengarannya bagus, tetapi masih menyisakan terlalu banyak ketidakpastian untuk jaringan - bagaimana cara menampilkan prediksi dan apa yang harus dilakukan ketika ada banyak objek dengan pusat di dalam satu sel kisi? Kita perlu menambahkan satu kendala lagi - yang disebut jangkar. Jangkar adalah ukuran awal (lebar, tinggi) beberapa di antaranya (paling dekat dengan ukuran objek) akan diubah ukurannya menjadi ukuran objek - menggunakan beberapa output dari jaringan saraf (peta fitur akhir).
Jadi, inilah tampilan tingkat atas tentang apa yang terjadi ketika jaringan saraf arsitektur YOLO melakukan deteksi objek pada gambar. Menurut fitur yang dideteksi oleh jaringan ekstraktor fitur, untuk setiap sel grid satu set prediksi dibuat, yang mencakup offset jangkar, probabilitas jangkar, dan kelas jangkar. Kemudian kami membuang prediksi dengan probabilitas rendah dan voila!
Langkah 2: Siapkan Lingkungan
aXeleRate didasarkan pada proyek luar biasa oleh penny4860, detektor digit yolo-v2 SVHN. aXeleRate membawa implementasi detektor YOLO di Keras ini ke tingkat berikutnya dan menggunakan sistem konfigurasinya yang nyaman untuk melakukan pelatihan dan konversi pengenalan gambar/deteksi objek dan jaringan segmentasi gambar dengan berbagai backend.
Ada dua cara untuk menggunakan aXeleRate: berjalan secara lokal di mesin Ubuntu atau di Google Colab. Untuk menjalankan di Google Colab, lihat contoh ini:
Notebook Colab Deteksi Objek PASCAL-VOC
Melatih model Anda secara lokal dan mengekspornya untuk digunakan dengan akselerasi perangkat keras juga jauh lebih mudah sekarang. Saya sangat menyarankan Anda menginstal semua dependensi yang diperlukan di lingkungan Anaconda untuk menjaga proyek Anda terpisah dari yang lain dan menghindari konflik.
Unduh penginstal di sini.
Setelah instalasi selesai, buat lingkungan baru:
conda create -n yolo python=3.7
Ayo aktifkan lingkungan baru
conda aktifkan yolo
Awalan sebelum bash shell Anda akan muncul dengan nama lingkungan, yang menunjukkan bahwa Anda bekerja sekarang di lingkungan itu.
Instal aXeleRate di mesin lokal Anda dengan
pip install git+https://github.com/AIWintermuteAI/aXeleRate
Dan kemudian jalankan ini untuk mengunduh skrip yang Anda perlukan untuk pelatihan dan inferensi:
git clone
Anda dapat menjalankan tes cepat dengan test_training.py di folder aXeleRate. Ini akan menjalankan pelatihan dan inferensi untuk setiap jenis model, menyimpan dan mengonversi model terlatih. Karena ini hanya pelatihan untuk 5 epoch dan dataset sangat kecil, Anda tidak akan bisa mendapatkan model yang berguna, tetapi skrip ini hanya dimaksudkan untuk memeriksa tidak adanya kesalahan.
Langkah 3: Latih Model Deteksi Objek Dengan Keras
Sekarang kita dapat menjalankan skrip pelatihan dengan file konfigurasi. Karena implementasi Keras dari detektor objek YOLO cukup rumit, alih-alih menjelaskan setiap bagian kode yang relevan, saya akan menjelaskan cara mengkonfigurasi pelatihan dan juga menjelaskan modul yang relevan, jika Anda ingin membuat beberapa perubahan sendiri.
Mari kita mulai dengan contoh mainan dan melatih detektor rakun. Ada file konfigurasi di dalam folder /config, raccoon_detector.json. Kami memilih MobileNet7_5 sebagai arsitektur (di mana 7_5 adalah parameter alfa dari implementasi Mobilenet asli, mengontrol lebar jaringan) dan 224x224 sebagai ukuran input. Mari kita lihat parameter terpenting dalam konfigurasi:
Tipe adalah model frontend - Classifier, Detector atau SegnetArchitecture adalah model backend (feature extractor)
- Yolo Penuh - Yolo Kecil - MobileNet1_0 - MobileNet7_5 - MobileNet5_0 - MobileNet2_5 - SqueezeNet - VGG16 - ResNet50
Untuk informasi lebih lanjut tentang jangkar, silakan baca di sini
Label adalah label yang ada dalam kumpulan data Anda. PENTING: Harap cantumkan semua label yang ada dalam kumpulan data.
object_scale menentukan berapa banyak untuk menghukum prediksi yang salah dari kepercayaan prediktor objek
no_object_scale menentukan berapa banyak untuk menghukum prediksi yang salah dari kepercayaan prediktor non-objek
coord_scale menentukan berapa banyak untuk menghukum prediksi posisi dan ukuran yang salah (x, y, w, h)
class_scale menentukan berapa banyak untuk menghukum prediksi kelas yang salah
augumentasi - pembesaran gambar, pengubahan ukuran, pergeseran dan pengaburan gambar untuk mencegah overfitting dan memiliki variasi yang lebih besar dalam kumpulan data.
train_times, validation_times - berapa kali mengulang dataset. Berguna jika Anda memiliki augumentasi
diaktifkan
first_trainable_layer - memungkinkan Anda untuk membekukan lapisan tertentu jika Anda menggunakan jaringan fitur yang telah dilatih sebelumnya
Sekarang kita perlu mengunduh kumpulan data, yang saya bagikan di Google Drive saya (dataset asli), yang merupakan kumpulan data pendeteksi racoon, berisi 150 gambar beranotasi.
Pastikan untuk mengubah baris dalam file konfigurasi (train_image_folder, train_annot_folder) yang sesuai dan kemudian mulai pelatihan dengan perintah berikut:
python axelerate/train.py -c configs/raccoon_detector.json
train.py membaca konfigurasi dari file.json dan melatih model dengan skrip axelerate/networks/yolo/yolo_frontend.py. yolo/backend/loss.py adalah tempat fungsi kerugian kustom diimplementasikan dan yolo/backend/network.py adalah tempat model dibuat (input, ekstraktor fitur, dan lapisan deteksi disatukan). axelerate/networks/common_utils/fit.py adalah skrip yang mengimplementasikan proses pelatihan dan axelerate/networks/common_utils/feature.py berisi ekstraktor fitur. Jika Anda ingin menggunakan model terlatih dengan chip K210 dan firmware Micropython, karena keterbatasan memori, Anda dapat memilih antara MobileNet(2_5, 5_0 dan 7_5) dan TinyYolo, tetapi menurut saya MobileNet memberikan akurasi deteksi yang lebih baik.
Karena ini adalah contoh mainan dan hanya berisi 150 gambar rakun, proses pelatihannya seharusnya cukup cepat, bahkan tanpa GPU, meskipun akurasinya akan jauh dari bintang. Untuk proyek yang berhubungan dengan pekerjaan, saya telah melatih pendeteksi rambu lalu lintas dan pendeteksi angka, kedua kumpulan data menyertakan lebih dari beberapa ribu contoh pelatihan.
Langkah 4: Ubah ke Format.kmodel
Dengan aXeleRate, konversi model dilakukan secara otomatis - ini mungkin perbedaan terbesar dari skrip pelatihan versi lama! Plus Anda mendapatkan file model dan grafik pelatihan disimpan dengan rapi di folder proyek. Saya juga menemukan bahwa akurasi vaiidasi terkadang gagal memberikan estimasi pada model kinerja nyata untuk deteksi objek dan inilah mengapa saya menambahkan mAP sebagai metrik validasi untuk model deteksi objek. Anda dapat membaca lebih lanjut tentang mAP di sini.
Jika mAP, rata-rata presisi (metrik validasi kami) tidak meningkat selama 20 epoch, pelatihan akan berhenti sebelum waktunya. Setiap kali mAP membaik, model disimpan di folder proyek. Setelah pelatihan selesai, aXeleRate secara otomatis mengonversi model terbaik ke format tertentu - Anda dapat memilih, "tflite", "k210" atau "edgetpu" mulai sekarang.
Sekarang ke langkah terakhir, benar-benar menjalankan model kami pada perangkat keras Sipeed!
Langkah 5: Jalankan di Micropython Firmware
Dimungkinkan untuk menjalankan inferensi dengan model deteksi objek kami dengan kode C, tetapi demi kenyamanan kami akan menggunakan firmware Micropython dan MaixPy IDE sebagai gantinya.
Unduh MaixPy IDE dari sini dan firmware micropython dari sini. Anda dapat menggunakan skrip python kflash.py untuk membakar firmware atau mengunduh alat flash GUI terpisah di sini.
Salin model.kmodel ke akar kartu SD dan masukkan kartu SD ke Sipeed Maix Bit (atau perangkat K210 lainnya). Atau Anda dapat membakar.kmodel ke memori flash perangkat. Contoh skrip saya membaca.kmodel dari memori flash. Jika Anda menggunakan kartu SD, harap ubah baris ini
tugas = kpu.load (0x200000)
ke
tugas = kpu.load("/sd/model.kmodel")
Buka MaixPy IDE dan tekan tombol sambungkan. Buka skrip raccoon_detector.py dari folder example_scripts/k210/detector dan tekan tombol Start. Anda seharusnya melihat streaming langsung dari kamera dengan kotak pembatas di sekitar … yah, rakun. Anda dapat meningkatkan akurasi model dengan memberikan lebih banyak contoh pelatihan, tetapi perlu diingat bahwa ini adalah model kecil peri (1,9 M) dan akan mengalami masalah dalam mendeteksi objek kecil (karena resolusi rendah).
Salah satu pertanyaan yang saya terima dalam komentar pada artikel saya sebelumnya tentang pengenalan gambar adalah bagaimana cara mengirim hasil deteksi melalui UART/I2C ke perangkat lain yang terhubung ke papan pengembangan Sipeed. Di repositori github saya, Anda akan dapat menemukan skrip contoh lain, raccoon_detector_uart.py, yang (Anda dapat menebaknya) mendeteksi rakun dan mengirimkan koordinat kotak pembatas melalui UART. Perlu diingat, bahwa pin yang digunakan untuk komunikasi UART berbeda dari papan yang berbeda, ini adalah sesuatu yang perlu Anda periksa sendiri dalam dokumentasi.
Langkah 6: Ringkasan
Kendryte K210 adalah chip yang solid untuk visi komputer, fleksibel, meskipun dengan memori yang tersedia terbatas. Sejauh ini, dalam tutorial saya, kami telah membahas menggunakannya untuk mengenali objek kustom, mendeteksi objek kustom, dan menjalankan beberapa tugas visi komputer berbasis OpenMV. Saya tahu pasti bahwa ini juga cocok untuk pengenalan wajah dan dengan sedikit mengutak-atik seharusnya dimungkinkan untuk melakukan deteksi pose dan segmentasi gambar (Anda dapat menggunakan aXeleRate untuk melatih model segmentasi semantik, tetapi saya belum menerapkan inferensi dengan K210). Jangan ragu untuk melihat masalah repositori aXeleRate dan buat PR jika menurut Anda ada beberapa peningkatan yang dapat Anda sumbangkan!
Berikut adalah beberapa artikel yang saya gunakan dalam menulis tutorial ini, lihat jika Anda ingin mempelajari lebih lanjut tentang deteksi objek dengan jaringan saraf:
Detektor objek kotak pembatas: memahami YOLO, Anda Hanya Melihat Sekali
Memahami YOLO (lebih banyak matematika)
Panduan lembut tentang cara kerja Lokalisasi Objek YOLO dengan Keras (Bagian 2)
Deteksi Objek Real-time dengan YOLO, YOLOv2 dan sekarang YOLOv3
Semoga Anda dapat menggunakan pengetahuan yang Anda miliki sekarang untuk membangun beberapa proyek luar biasa dengan visi mesin! Anda dapat membeli papan Sipeed di sini, ini adalah salah satu opsi termurah yang tersedia untuk ML pada sistem tertanam.
Tambahkan saya di LinkedIn jika Anda memiliki pertanyaan dan berlangganan saluran YouTube saya untuk mendapatkan pemberitahuan tentang lebih banyak proyek menarik yang melibatkan pembelajaran mesin dan robotika.