Aplikasi#6. Deteksi Objek Edge Impulse

Daftar Isi:

=========================================================================================


Sangat menyenangkan bisa bermain dengan kamera yang bisa mengenali objek di depannya. Begitu ada orang lewat di depannya, langsung tahu nama orang tersebut, atau apabila ada benda di depannya, bisa memberikan informasi benda apakah itu. Wah, tentunya kamera tersebut bukan sembarang kamera. Ya, benar sekali, kamera tersebut adalah kamera pintar, yang memiliki kecerdasan buatan. 

Menariknya, kamera tersebut bisa cukup murah harganya (saya beli baru-baru ini, kurang dari 100 ribu, sudah termasuk dengan USB programmernya). Berikut ini penampakan dari kamera yang saya beli tersebut.

Gambar 1. AI Thinker ESP32-Cam dengan MB USB Programmer

Benar sekali, kamera yang saya gunakan adalah AI Thinker ESP32-Cam yang murah meriah. Untuk membuat kamera ini menjadi kamera pintar, ternyata tidaklah sulit, hal ini dikarenakan banyak orang baik yang genius di internet, yang sudah membuat software yang sangat bagus untuk pengolahan data gambar dengan kecerdasan buatan dan tentu saja, software-nya itu gratis.

Untuk membuat kamera yang murah menjadi pintar ini, kita bisa menggunakan aplikasi online yang cukup populer, yaitu Edge Impulse. Apa itu Edge Impulse? Mengutip ChatGPT, Edge Impulse adalah platform yang dapat digunakan untuk membuat, melatih, dan menerapkan model pembelajaran mesin (machine learning, bagian dari kecerdasan buatan) pada perangkat edge (seperti mikrokontroler) untuk mendeteksi objek atau menjalankan tugas-tugas pembelajaran mesin lainnya. Berikut adalah tahapan umum dalam menggunakan Edge Impulse untuk mendeteksi objek:
  1. Membuat ProyekLangkah pertama adalah membuat proyek di platform Edge Impulse. Proyek ini akan menjadi lingkungan kerja Anda di mana Anda akan melakukan semua tahap pengembangan dan pelatihan model.
  2. Pengumpulan DataMengumpulkan data pelatihan untuk model Anda. Data ini harus mencakup contoh-contoh objek yang ingin Anda deteksi. Anda dapat mengimpor data gambar atau data sensor dari perangkat keras tertentu.
  3. Pra-pemrosesan DataSetelah mengumpulkan data, Anda mungkin perlu menjalankan pra-pemrosesan pada data tersebut. Ini bisa mencakup normalisasi, pembersihan, atau augmentasi data untuk meningkatkan keberagaman dataset.
  4. Desain Model: Memilih atau merancang arsitektur model pembelajaran mesin yang akan digunakan. Edge Impulse menyediakan antarmuka pengguna grafis untuk membantu Anda merancang modelnya. Anda dapat memilih dari berbagai arsitektur model, termasuk yang dioptimalkan untuk perangkat edge.
  5. Pelatihan ModelMenentukan parameter dan melatih model pada dataset yang telah Anda kumpulkan. Edge Impulse menyediakan kemampuan pelatihan model secara online dengan mengoptimalkan parameter-model menggunakan dataset Anda.
  6. Evaluasi Model: Setelah pelatihan, Anda perlu mengevaluasi performa model Anda menggunakan dataset validasi atau pengujian yang terpisah. Ini membantu memastikan bahwa model Anda dapat mendeteksi objek dengan baik dan tidak mengalami overfitting.
  7. Kompilasi Model: Setelah puas dengan performa model, Anda perlu mengompilasi model untuk menjadikannya siap untuk diimplementasikan pada perangkat edge. Edge Impulse menyediakan opsi untuk mengunduh model dan file pendukungnya.
  8. Implementasi pada Perangkat Edge: Mendeploy model ke perangkat edge atau mikrokontroler. Edge Impulse mendukung banyak perangkat, termasuk Arduino, Raspberry Pi, dan sebagainya. Anda dapat mengikuti panduan implementasi yang tersedia untuk perangkat spesifik.
  9. Pemantauan dan Pemeliharaan: Setelah implementasi, perlu untuk memantau kinerja model pada perangkat edge dan memastikan bahwa model tetap efektif seiring waktu. Jika diperlukan, Anda mungkin perlu memperbarui model dengan data yang baru.
Baiklah, agar tulisan ini tidak terlalu panjang, kita langsung saja menerapkan tahapan pembuatan di atas. Bagi rekan-rekan yang belum memiliki ESP-32 Cam, rekan-rekan tetap dapat menggunakan Edge Impulse ini, yaitu dengan menggunakan Handphone. Jadi dalam penerapan di sini, akan dibagi menjadi 2 bagian. Bagian pertama untuk perangkat Handphone, sedangkan bagian kedua untuk perangkat ESP32-Cam. Bagi rekan-rekan yang belum memiliki ESP32 Cam, silahkan mengikuti Bagian 1.



=========================================================================================



###### BAGIAN 1: EDGE IMPULSE + HP ######

Deteksi Objek dengan Edge Impulse & Handphone


Berikut langkah-langkahnya:
1. Pembuatan Proyek

Gambar 1. buka https://edgeimpulse.com/, klik Login

Gambar 2. Klik Sign up untuk membuat akun

Gambar 3. Isi data dan klik Sign up

Gambar 4. Sign up berhasil

Gambar 5. Halaman projek Edge Impulse terbuka, klik Let's build...

Gambar 6. Muncul jendela Responding to your voice, klik Quit the wizard

Gambar 7. Pilih Yes, quit, karena yang akan dibuat adalah pendeteksi bentuk objek, bukan suara


2. Pengumpulan Data lewat foto

Gambar 8. Di daftar menu di kolom kiri, pilih Devices

Gambar 9. Di kotak Your devices, klik + Connect a new device
  
Gambar 10. Muncul jendela Collect new data

  
(a)                                         (b)                                        (c)
Gambar 11. (a) Dengan aplikasi QR & Barcode Scanner di Handphone, tangkap QR code, (b) klik pada link URL yang muncul, (c) tunggu hingga muncul tanda centang, klik Collecting images

    
(a)                                         (b)                                        (c)
Gambar 12. (a) Klik pada Give access to the camera, (b) Muncul gambar objek, sebelum meng-klik Capture, klik label untuk mengganti label (c) Dii kotak Enter a label, isi kolom label dengan nama objek, dalam contoh di sini, nama objek adalah Wonder woman

  
(a)                                         (b)                                        (c)
Gambar 13. (a) Terlihat nama label telah ganti sesuai dengan nama objek, (b) klik Capture, lakukan minimal 20 kali, setiap kali mengambil gambar, ubah sedikit posisi pengambilan gambar (c) Setelah lebih dari 30, berikutnya ganti objek, dan pastikan sebelum menekan Capture, ubah dulu label agar sesuai dengan nama objeknya, dalam hal ini nama objek aalalah Bajak laut

   
(a)                                         (b)                                        (c)
Gambar 14. (a) Terlihat label sekarang sudah menjadi Bajak laut, (b) klik Capture, lakukan minimal 20 kali, setiap kali mengambil gambar, ubah sedikit posisi pengambilan gambar, (c) Setelah selesai, objek yang terakhir adalah background, ambil objek, dan foto background objek, lakukan hingga minimal 5 kali, dan isi labelnya dengan nama kosong

Gambar 15. Kembali ke komputer, klik tombol Get Started

Gambar 16. Terlihat daftar nama device Handphone, dari sini diketahui bahwa untuk pengumpulan gambar ini bisa dilakukan dengan lebih dari 1 device/Handphone

Gambar 17. Muncul pertanyaan apakah membuat projek deteksi objek, pilih Yes


3. Pra-proses: Lokalisasi dan Pelabelan

Gambar 18. Setelah pengumpulan gambar selesai, berikutnya klik pada menu Data acquisition di menu di kolom kiri, kemudian klik pada Labeling queue untuk memberi label pada setiap gambar

Catatan: Apabila tulisan Labeling queue di atas tidak muncul, maka untuk memunculkannya, klik pada Dashboard di menu di kolom kiri, cari tulisan Labeling method di kolom kanan, pilih Bounding boxex (object detection), seperti ditunjukkan gambar 19 berikut ini.

Gambar 19. Apabila tulisan Labeling queue tidak muncul, pilih Boinding boxes (object detection) di bagian Labeling method, di menu Dashboard

Gambar 20. Ketika Labeling queue diklik, maka muncul halaman gambar objek, gerakkan mouse sambil meng-klik tombol mouse, tarik membentuk garis kotak yang sesuai dengan ukuran gambar

Gambar 21 Setelah selesai, lepas tombol mouse, muncul kotak untuk memasukkan nama label, isi kolom label dengan nama objek, dalam contoh di sini, isi dengan Wonder woman

Gambar 22. Berikutnya klik Save labels. Ketika save berhasil, gambar berikutnya akan muncul secara otomatis, dengan garis kotak di luarnya, atur ukuran garis kotak, setelah itu klik Save labels, ulangi hingga semua gambar objek Wonder woman diberi label dan dilokalisasi posisinya

Gambar 23. Ketika gambar telah berbeda objek, pastikan untuk tidak terburu-buru menekan Save labels, tetapi tekan pada tulisan label di atas garis kotak, sehinga muncul kotak Enter new label, beri nama label objek yang baru ini, sebagai contoh di sini, nama objek kedua ini adalah Bajak laut

Gambar 24. Ulangi hal yang sama dengan objek Bajak laut ini, yaitu membuat garis kotak sesuai dengan ukuran gambar, klik Save labels, ulangi hingga semua gambar objek Bajal laut selesai diberi label dan dilokalisasi posisinya

Gambar 25. Berikutnya untuk gambar objek Background, hilangkan nama label dan garis kotak, sehingga kosong seperti gambar di atas, kemudian tekan tombol Save labels, ulangi untuk semua Background - jadi untuk Background, tidak diberi label


4. Pra-proses: Pengaturan ukuran gambar

Gambar 26. Setelah semua gambar objek dikumpulkan, diberi label dan dilokalisasi posisi gambarnya, langkah berikutnya adalah mengolah gambar agar siap untuk dimodelkan, untuk itu klik pada Create impulse di menu di kolom kiri

Gambar 27. Di Create impulse, pilih Resize mode = Fit shortest axis

Gambar 28. Berikutnya, klik kotak Add a processing block, di jendela yang muncul, klik tombol Add

Gambar 29. Berikutnya, klik kotak Add a learning block, di jendela yang muncul, pilih Object Detection (images) dari Edge Impulse, klik tombol Add di sampingnya

Gambar 30. Setelah semua tahapan yang diperlukan untuk menciptakan Impulse sudah terbangun seperti gambar di atas, klik tombol Save Impulse


5. Pra-proses: Pengaturan kedalaman gambar

Gambar 31. Berikutnya, klik Image di menu di kolom kiri, atur Color depth = RGB, klik tombol Save parameters


6. Desain Model

Gambar 32. Muncul halaman pembuatan model, klik tombol Generate Features

Gambar 33. Tunggu beberapa saat, maka akan muncul gambar fitur atau pola kedekatan antar gambar pada model masing-masing objek


7. Pelatihan dan Evaluasi Model

Gambar 34. Berikutnya, klik pada Object Detection, di menu di kolom kiri, kemudian isi Number of training cycles = 30 dan Learning rate = 0.005, kemudian klik tombol Start training

Gambar 35. Tunggu hingga muncul tulisan Job completed di kolom Training output

Gambar 36. Apabila hasil Training adalah kotak berwarna hijau di setiap objek (tidak ada kotak warna merah) dengan F1 score 100%, maka hasil pelatihan dan evaluasi model bisa dinyatakan sangat baik

Catatan: Apabila hasil penilaian tidak mencapai 100%, atau ada pendeteksian objek yang salah sehingga muncul kotak merah di salah satu kolom, maka silahkan menambahkan lebih banyak gambar, khususnya untuk objek yang mendapat nilai kurang atau yang kotaknya berwarna merah.

8. Deploy Model ke HP.

Gambar 37. Langkah terakhir adalah Deployment, klik pada Deployment di kolom kiri, maka muncul QR code di kolom kanan. Gunakan aplikasi QR & Barcode Scanner di Handphone untuk menscan gambar QR code tersebut, maka aplikasi pendeteksian objek telah berhasil dibuat. Arahkan HP pada objek yang telah dipilih, maka harusnya akan tampil label pada objek tersebut.

Gambar 38. Hasil aplikasi: objek Wonder woman dikenali

Gambar 39. Hasil aplikasi: objek Bajak laut dikenali

Gambar 40. Hasil aplikasi: Objek Bajak Laut dan Wonder woman dikenali keduanya

Untuk lebih jelasnya, berikut ini video pembuatan penggunaan Edge Impulse dan Handphone untuk pendeteksian objek. 

Video pembuatan pendeteksian objek dengan Edge Impulse dan HP



=========================================================================================



###### BAGIAN 2: EDGE IMPULSE + ESP32-CAM ######

Deteksi Objek dengan Edge Impulse & ESP32-Cam


Video aplikasi pendeteksian objek dengan Edge Impulse & ESP32-Cam 

Berikut langkah-langkah pembuatannya:
1. Pembuatan Proyek

Gambar 41. Buka halaman Edge Impulse, klik pada lingkaran kecil di pojok kanan atas, pilih Create new project

Gambar 42. beri nama project yang baru, dalam contoh di sini namanya DeteksiObjek2, klik Create new project


2. Pengumpulan Data lewat file, Lokalisasi dan Pelabelan Data

Gambar 43. Berikutnya, apabila di bagian 1 di atas, pengambilan gambar dikirimkan langsung dari HP, maka untuk penggunaan ESP32 Cam, pengambilan gambar disimpan dulu dalam file, baru kemudian file tersebut diupload ke Edge Impulse

Gambar 44. Agar pengambilan gambar bisa dilakukan oleh ESP32 Cam, maka buka software IDE Arduino, klik pada kolom nama board, cari nama AI Thinker ESP32-Cam

Gambar 45. Pilihan Board = AI Thinker ESP32-Cam, klik OK

Catatan: Apabila rekan-rekan tidak dapat menemukan board AI Thinker ESP32-Cam, maka bisa jadi dikarenakan Board ESP32 belum terpasang. Untuk itu, buka menu File, pilih Preferences, di jendela Preferences, isi di kolom Additional Boards = https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json, seperti ditunjukkan gambar berikut ini. 

Gambar 46. Apabila pilihan board AI Thinker ESP32-Cam tidak ditemukan, buka menu File, pilih Preferences, di jendela Preferences, di kolom Additional Boards, isi link URL seperti gambar di atas

Gambar 47. Berikutnya, buka Board Manager, ketik di kolom pencarian: esp32, kemudian di daftar board esp32, pilih "esp32 by Espressif Systems", klik Install. Setelah board esp32 terinstal, seharusnya pilihan board AI Thinker ESP32-Cam telah tersedia

Gambar 48. Berikutnya buka menu File, pilih Examples, pilih ESP32, pilih Camera, pilih CameraWebServer

Gambar 49. Di kode program CameraWebServer, uncomment #define Camera_Model_AI_Thinker, dan isi ssid dan password Wi-Fi yang digunakan, setelah itu Upload ke ESP32-Cam

Gambar 50. Sebelum meng-upload program, pastikan memilih Board dan Port yang benar, centang Show all port, pilih Port yang diikuti tulisan (USB).

Gambar 51. Upload program telah berhasil

Gambar 52. Buka Serial Monitor, lihat alamat IP Camera yang muncul di bagian akhir

Gambar 53. Tempatkan sebuah objek di depan ESP32-Cam

Gambar 54. Buka alamat IP Camera tersebut, maka seharusnya muncul tampilan seperti di atas, klik tombol Start Stream di bagian bawah untuk menampilkan gambar objek, juga geser Slider LED Intensity ke posisi maksimum agar LED di ESP32 Cam menyala terang

Gambar 55. Seharusnya muncul gambar objek seperti di atas

Gambar 56. Atur Resolution = 240x240, klik tombol Save untuk menyimpan gambar ke dalam file

Gambar 57. Ubah sedikit posisi objek, tekan tombol Save, ulangi hingga minimal ada 30 gambar (semakin banyak gambar semakin bagus hasil pelatihannya)

Gambar 58. Terlihat file gambar objek yang telah dihasilkan, simpan dalam sebuah folder

Gambar 59. Berikutnya, ganti objek, lakukan pengambilan gambar sama seperti objek sebelumnya, minimal 30 gambar, simpan dalam folder yang berbeda

Gambar 60. Kembali ke Edge Impulse, tekan tombol Upload Data

Gambar 61. Di jendela yang muncul, pilih Select a folder, kemudian tekan tombol Choose Files, arahkan ke salah satu folder objek, tekan Upload

Gambar 62. Klik Upload

Gambar 63. Muncul daftar nama file, klik Yes untuk pertanyaan tentang project

Gambar 64. Klik Back

Gambar 65. Terlihat daftar nama file gambar objek, klik Labeling queue

Gambar 66. Tarik mouse membentuk kotak atau Bounding Box yang sesuai dengan ukuran objek

Gambar 67. Beri label sesuai nama objek

Gambar 68. Klik Save labels, maka muncul gambar objek berikutnya, ulangi hingga semua objek diberi Bounding Box dan label

Gambar 69. Klik tombol Uplaod data

Gambar 70. Di jendela yang muncul, pilih Select a folder, klik Choose Files, arahkan ke folder file gambar objek kedua, klik Upload

Gambar 71. Klik Upload

Gambar 72. Muncul daftar nama file, klik Back

Gambar 73. Klik Labeling queue

Gambar 74. Tarik mouse membentuk kotak atau Bonding Box sesuai ukuran objek

Gambar 75. Isi label sesuai nama objek

Gambar 76. Klik tombol Save labels, ulangi hingga semua objek telah diberi Bounding Box dan Label

Gambar 77. Untuk keperluan pengolahan data, selain gambar kedua objek, diperlukan juga gambar Background, untuk itu ambil gambar Background sebanyak minimal 5 buah

Gambar 78. Tempatkan di folder, kemudian ambil file gambar Background ini sama seperti pengambilan file pada kedua objek, yaitu pilih Upload data, pilih Select a folder, klik Choose Files, pilih folder Background, klik Upload

Gambar 79. Klik Upload

Gambar 80. Muncul daftar nama file Background, klik Back 

Gambar 81. Terlihat daftar nama file Background pada Dataset, biarkan saja tanpa label, tidak perlu meng-klik Labeling queue, karena file Background ini tidak perlu diberi Bounding Box dan Label, sampai di sini, pengumpulan data lewat file, lokalisasi dan pelabelan data telah selesai


3. Pra-proses: Penyiapan gambar

Gambar 82. Klik Create Impulse di menu di kolom kiri, atur ukuran lebar dan tinggi gambar menjadi 48x48, sedangkan Resize modenya biarkan Fit shortest axis, klik Add a processing block

Gambar 83. Klik Add untuk menambahkan block processing

Gambar 84. Klik Add a Learning Block, klik Add pada daftar yang paling atas (deteksi objek dengan Edge Impulse)

Gambar 85. Klik Save Impulse


4. Pra-proses: Pengaturan kedalaman gambar

Gambar 86. Klik Image di menu di kolom kiri, ganti Color depth dari RGB menjadi Grayscale, klik Save parameters


5. Pembangkitan Model

Gambar 87. Klik Generate Features untuk membangkitkan model objek

Gambar 88. Tunggu beberapa saat, maka akan muncul fitur model dari kedua objek, fitur yang baik apabila kedua jenis objek dapat dipisahkan, di mana gambar-gambar dari satu objek yang sama akan mendekat, sedangkan gambar-gambar dari objek yang berbeda akan menjauh.

Catatan: Apabila fitur yang dibangkitkan memperlihatkan kedua objek masih bercampur, maka solusi untuk mengatasi hal ini adalah dengan memperbanyak pengumpulan data gambar. Semakin banyak gambar yang dikumpulkan, akan semakin memperlebar jarak dari gambar-gambar objek yang berbeda, dan mendekatkan jarak dari gambar-gambar objek yang sama.


6. Pelatihan dan Evaluasi Model

Gambar 89. Klik pada Object detection di menu di kolom kiri, Klik Target, pilih Espressif ESP-EYE (ESP32 240 MHz), klik Set Target Device

Gambar 90. Isi Number of training cycles = 30, Learning rate = 0.005

Gambar 91. Tidak perlu mengubah Model, gunakan default Model, klik Start Training

Gambar 92. Tunggu beberapa saat, maka akan muncul hasil pelatihan dan evaluasinya. Hasil pelatihan yang baik adalah apabila semua kotak berwarna hijau dan F1 Score mendekati 100%

Catatan: Apabila hasil pelatihan dan evaluasinya bernilai kurang dari 100%, dan muncul kotak merah, maka solusinya adalah, tambahkan data gambar sebanyak mungkin, khususnya untuk gambar objek yang memperoleh kotak merah.


7. Deploy Model ke ESP32-Cam.

Gambar 93. Klik Deployment, klik Search Deployment Options, pilih Arduino library

Gambar 94. Klik Build

Gambar 95. Maka library Arduino akan dibangkitkan dan diunduh secara otomatis


8. Menghubungkan hasil deteksi objek dengan Arduino IoT Cloud

Gambar 96. Agar data hasil pendeteksian objek dapat diteruskan ke berbagai perangkat di mana saja dan kapan saja, maka cara paling mudah adalah dengan menghubungkannya ke Arduino IoT Cloud, buka Arduino IoT Cloud

Gambar 97. Di halaman Thing, klik Create Thing

Gambar 98. Rename Untitled menjadi nama yang menarik

Gambar 99. Dalam contoh di sini, diberi nama DeteksiObjek2

Gambar 100. Klik Add untuk menambahkan Variabel Cloud di halaman Thing

Gambar 101. Beri nama Label, pilih tipe data = Character String

Gambar 101. Permission = Read Only, Update = On change, klik Add Variable

Gambar 102. Berikutnya klik Select Device

Gambar 103. Pilih Set Up New Device

Gambar 104. Pilih Third Party Device

Gambar 105. Berikutnya, klik ESP32, pilih AI Thinker ESP32-Cam

Gambar 106. Biarkan namanya seperti yang diberikan, klik Next

Gambar 107. Klik download the PDF untuk mengunduh kode secret key

Gambar 108. Beri centang pada I saved ..., klik Continue

Gambar 109. Pengaturan device telah selesai

Gambar 110. Seharusnya di halaman Thing muncul nama dan jenis Device, hanya statusnya masih Offline

Gambar 111. Klik Configure pada bagian Network

Gambar 112. Isi nama dan password Wi-Fi, serta secret key, ambil kode secret key ini dari file download the PDF

Gambar 113. Setelah penambahan variabel Cloud, pemilihan Device dan pengaturan Network selesai, maka langkah berikutnya, program Device dengan kode yang dibangkitkan, klik pada Tab Sketch

Gambar 114. Di halaman Sketch, agar lebih mudah menambahkan library, buka Arduino Editor Online dengan cara klik Open Full Editor

Gambar 115. Muncul nama Sketch sesuai nama Thing, dengan nama variabel Cloud = label (huruf di awal huruf kecil) dengan tipe data String

Gambar 116. Berikutnya tambahkan library yang telah dibangkitkan oleh Edge Impulse, dengan meng-klik menu Libraries, klik tombol Import

Gambar 117. Arahkan ke lokasi file library yang dihasilkan oleh Edge Impulse 

Gambar 118. Tunggu beberapa saat hingga proses import library selesai

Gambar 119. Terlihat library dari Edge Impulse telah berhasil ditambahkan, perhatikan nama library tersebut (ditandai angka 2), nama library tersebut akan ditambahkan pada Sketch sebelumnya yang dibangkitkan oleh Arduino IoT Cloud (lihat Gambar 115).

Catatan: Untuk mempersingkat langkah pembuatan, maka silahkan rekan-rekan menggunakan kode program berikut ini. Mula-mula hapus semua kode program yang ada di Sketch sebelumnya yang  dibangkitkan oleh Arduino IoT Cloud, dan ganti dengan kode program berikut ini. Jangan lupa untuk menyesuaikan nama library yang dihasilkan Edge Impulse di baris 2, dan juga nama variabel Cloud di baris 108 dan 112. Dalam contoh di sini, nama library dari Edge Impulse adalah DeteksiObjek2_inferencing.h, sedangkan nama variabel Cloud yang dibuat di sini adalah "label". 
  1. #include "thingProperties.h"
  2. #include <DeteksiObjek2_inferencing.h>
  3. #include "edge-impulse-sdk/dsp/image/image.hpp"
  4. #include "esp_camera.h"
  5. #define PWDN_GPIO_NUM 32
  6. #define RESET_GPIO_NUM -1
  7. #define XCLK_GPIO_NUM 0
  8. #define SIOD_GPIO_NUM 26
  9. #define SIOC_GPIO_NUM 27
  10. #define Y9_GPIO_NUM 35
  11. #define Y8_GPIO_NUM 34
  12. #define Y7_GPIO_NUM 39
  13. #define Y6_GPIO_NUM 36
  14. #define Y5_GPIO_NUM 21
  15. #define Y4_GPIO_NUM 19
  16. #define Y3_GPIO_NUM 18
  17. #define Y2_GPIO_NUM 5
  18. #define VSYNC_GPIO_NUM 25
  19. #define HREF_GPIO_NUM 23
  20. #define PCLK_GPIO_NUM 22
  21. #define EI_CAMERA_RAW_FRAME_BUFFER_COLS 320
  22. #define EI_CAMERA_RAW_FRAME_BUFFER_ROWS 240
  23. #define EI_CAMERA_FRAME_BYTE_SIZE 3
  24. static bool debug_nn = false;
  25. static bool is_initialised = false;
  26. uint8_t *snapshot_buf;
  27. static camera_config_t camera_config = {
  28.   .pin_pwdn = PWDN_GPIO_NUM,
  29.   .pin_reset = RESET_GPIO_NUM,
  30.   .pin_xclk = XCLK_GPIO_NUM,
  31.   .pin_sscb_sda = SIOD_GPIO_NUM,
  32.   .pin_sscb_scl = SIOC_GPIO_NUM,
  33.   .pin_d7 = Y9_GPIO_NUM,
  34.   .pin_d6 = Y8_GPIO_NUM,
  35.   .pin_d5 = Y7_GPIO_NUM,
  36.   .pin_d4 = Y6_GPIO_NUM,
  37.   .pin_d3 = Y5_GPIO_NUM,
  38.   .pin_d2 = Y4_GPIO_NUM,
  39.   .pin_d1 = Y3_GPIO_NUM,
  40.   .pin_d0 = Y2_GPIO_NUM,
  41.   .pin_vsync = VSYNC_GPIO_NUM,
  42.   .pin_href = HREF_GPIO_NUM,
  43.   .pin_pclk = PCLK_GPIO_NUM,
  44.   .xclk_freq_hz = 20000000,
  45.   .ledc_timer = LEDC_TIMER_0,
  46.   .ledc_channel = LEDC_CHANNEL_0,
  47.   .pixel_format = PIXFORMAT_JPEG,
  48.   .frame_size = FRAMESIZE_QVGA,
  49.   .jpeg_quality = 12,
  50.   .fb_count = 1,
  51.   .fb_location = CAMERA_FB_IN_PSRAM,
  52.   .grab_mode = CAMERA_GRAB_WHEN_EMPTY,
  53. };
  54. bool ei_camera_init(void);
  55. void ei_camera_deinit(void);
  56. bool ei_camera_capture(uint32_t img_width, uint32_t img_height, uint8_t *out_buf);
  57. void setup() {
  58.   Serial.begin(115200);
  59.   delay(1500);
  60.   initProperties();
  61.   ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  62.   setDebugMessageLevel(2);
  63.   ArduinoCloud.printDebugInfo();
  64.   Serial.println("Edge Impulse Inferencing Demo");
  65.   if (ei_camera_init() == false) {
  66.     ei_printf("Failed to initialize Camera!\r\n");
  67.   } else {
  68.     ei_printf("Camera initialized\r\n");
  69.   }
  70.   pinMode(4, OUTPUT);
  71.   digitalWrite(4, HIGH);
  72.   ei_printf("\nStarting continious inference in 2 seconds...\n");
  73.   ei_sleep(2000);
  74. }
  75. void loop() {
  76.   ArduinoCloud.update();
  77.   if (ei_sleep(100)!= EI_IMPULSE_OK) {
  78.     return;
  79.   }
  80.   snapshot_buf = (uint8_t *)malloc(EI_CAMERA_RAW_FRAME_BUFFER_COLS * EI_CAMERA_RAW_FRAME_BUFFER_ROWS * EI_CAMERA_FRAME_BYTE_SIZE);
  81.   if (snapshot_buf == nullptr) {
  82.     ei_printf("ERR: Failed to allocate snapshot buffer!\n");
  83.     return;
  84.   }
  85.   ei::signal_t signal;
  86.   signal.total_length = EI_CLASSIFIER_INPUT_WIDTH * EI_CLASSIFIER_INPUT_HEIGHT;
  87.   signal.get_data = &ei_camera_get_data;
  88.   if (ei_camera_capture((size_t)EI_CLASSIFIER_INPUT_WIDTH, (size_t)EI_CLASSIFIER_INPUT_HEIGHT, snapshot_buf) == false) {
  89.     ei_printf("Failed to capture image\r\n");
  90.     free(snapshot_buf);
  91.     return;
  92.   }
  93.   ei_impulse_result_t result = { 0 };
  94.   EI_IMPULSE_ERROR err = run_classifier(&signal, &result, debug_nn);
  95.   if (err != EI_IMPULSE_OK) {
  96.     ei_printf("ERR: Failed to run classifier (%d)\n", err);
  97.     return;
  98.   }
  99.   ei_printf("Predictions (DSP: %d ms., Classification: %d ms., Anomaly: %d ms.): \n",
  100.             result.timing.dsp, result.timing.classification, result.timing.anomaly);
  101. #if EI_CLASSIFIER_OBJECT_DETECTION == 1
  102.   bool bb_found = result.bounding_boxes[0].value > 0;
  103.   for (size_t ix = 0; ix < result.bounding_boxes_count; ix++) {
  104.     auto bb = result.bounding_boxes[ix];
  105.     if (bb.value == 0) {
  106.       continue;
  107.     }
  108.     label = bb.label;
  109.     ei_printf("    %s (%f) [ x: %u, y: %u, width: %u, height: %u ]\n", bb.label, bb.value, bb.x, bb.y, bb.width, bb.height);
  110.   }
  111.   if (!bb_found) {
  112.     label = "kosong";
  113.     ei_printf("    No objects found\n");
  114.   }
  115. #else
  116.   for (size_t ix = 0; ix < EI_CLASSIFIER_LABEL_COUNT; ix++) {
  117.     ei_printf("    %s: %.5f\n", result.classification[ix].label,
  118.               result.classification[ix].value);
  119.   }
  120. #endif
  121. #if EI_CLASSIFIER_HAS_ANOMALY == 1
  122.   ei_printf("    anomaly score: %.3f\n", result.anomaly);
  123. #endif
  124.   free(snapshot_buf);
  125. }
  126. bool ei_camera_init(void) {
  127.   if (is_initialised) return true;
  128.   esp_err_t err = esp_camera_init(&camera_config);
  129.   if (err != ESP_OK) {
  130.     Serial.printf("Camera init failed with error 0x%x\n", err);
  131.     return false;
  132.   }
  133.   sensor_t *s = esp_camera_sensor_get();
  134.   s->set_vflip(s, 1);
  135.   s->set_hmirror(s, 1);
  136.   is_initialised = true;
  137.   return true;
  138. }
  139. void ei_camera_deinit(void) {
  140.   esp_err_t err = esp_camera_deinit();
  141.   if (err != ESP_OK) {
  142.     ei_printf("Camera deinit failed\n");
  143.     return;
  144.   }
  145.   is_initialised = false;
  146.   return;
  147. }
  148. bool ei_camera_capture(uint32_t img_width, uint32_t img_height, uint8_t *out_buf) {
  149.   bool do_resize = false;
  150.   if (!is_initialised) {
  151.     ei_printf("ERR: Camera is not initialized\r\n");
  152.     return false;
  153.   }
  154.   camera_fb_t *fb = esp_camera_fb_get();
  155.   if (!fb) {
  156.     ei_printf("Camera capture failed\n");
  157.     return false;
  158.   }
  159.   bool converted = fmt2rgb888(fb->buf, fb->len, PIXFORMAT_JPEG, snapshot_buf);
  160.   esp_camera_fb_return(fb);
  161.   if (!converted) {
  162.     ei_printf("Conversion failed\n");
  163.     return false;
  164.   }
  165.   if ((img_width != EI_CAMERA_RAW_FRAME_BUFFER_COLS)
  166.       || (img_height != EI_CAMERA_RAW_FRAME_BUFFER_ROWS)) {
  167.     do_resize = true;
  168.   }
  169.   if (do_resize) {
  170.     ei::image::processing::crop_and_interpolate_rgb888(
  171.       out_buf,
  172.       EI_CAMERA_RAW_FRAME_BUFFER_COLS,
  173.       EI_CAMERA_RAW_FRAME_BUFFER_ROWS,
  174.       out_buf,
  175.       img_width,
  176.       img_height);
  177.   }
  178.   return true;
  179. }
  180. static int ei_camera_get_data(size_t offset, size_t length, float *out_ptr) {
  181.   size_t pixel_ix = offset * 3;
  182.   size_t pixels_left = length;
  183.   size_t out_ptr_ix = 0;
  184.   while (pixels_left != 0) {
  185.     out_ptr[out_ptr_ix] = (snapshot_buf[pixel_ix] << 16) + (snapshot_buf[pixel_ix + 1] << 8) + snapshot_buf[pixel_ix + 2];
  186.     out_ptr_ix++;
  187.     pixel_ix += 3;
  188.     pixels_left--;
  189.   }
  190.   return 0;
  191. }
  192. #if !defined(EI_CLASSIFIER_SENSOR) || EI_CLASSIFIER_SENSOR != EI_CLASSIFIER_SENSOR_CAMERA
  193. #error "Invalid model for current sensor"
  194. #endif
  195. void onLabelChange(){
  196. }

Catatan: Kode program di atas dapat diunduh di bagian akhir dari tulisan ini, dengan nama file: kodeProgramDeteksiObjek2.ino. Untuk mempersingkat baris program, maka pilihan untuk ESP32-EYE saya hilangkan. Jadi kode program di atas hanya khusus untuk ESP32-Cam saja.

Gambar 120. Hapus isi Sketch semula, ganti dengan kode program di atas (194 baris), Upload kode program tersebut ke ESP32-Cam, pilih Board = AI Thinker ESP32-Cam, dan atur Port yang sesuai

Gambar 121. Setelah Upload berhasil, buka halaman Thing, seharusnya Status Device sudah menjadi Online, apabila sudah Online, letakkan salah satu objek di depan ESP32-Cam, maka nama objek tersebut akan muncul di halaman Thing

Gambar 122. Ganti dengan objek kedua, seharusnya nama objek kedua akan muncul

Gambar 123. Buat agar tidak ada objek di depan ESP32-Cam, maka harusnya muncul tulisan "kosong"

Gambar 124. Agar hasil deteksi objek ini dapat dikirimkan ke berbagai perangkat di mana saja dan kapan saja, maka cara paling mudah adalah dengan menggunakan Sinkronisasi yang dimiliki Arduino IoT Cloud, Edit variabel Cloud

Gambar 125. Di jendela Edit, klik pada Sync with other Things

Gambar 126. Karena saya sudah membuat Thing sebelumnya (lihat Aplikasi#5: https://bermainarduinoiotcloud.blogspot.com/p/aplikasi-5-tampil-data-di-blogspot.html), di mana memiliki variabel Cloud Pesan yang juga bertipe String, yang kebetulan Device-nya adalah LCD I2C, maka dengan sinkronisasi ini, isi dari variabel Label akan menjadi isi Pesan, sehingga bisa ditampilkan di LCD I2C

Gambar 127. Simpan seting Sinkronisasi variabel antar 2 Thing ini

Gambar 128. Agar data juga bisa ditampilkan di Dashboard, buka Dashboard yang telah dibuat di Aplikasi#5

Gambar 129. Tambahkan widget Messenger, beri link variabel ke variabel Label di Thing DeteksiObjek2

Gambar 130. Terlihat Dashboard dengan 6 buah widget: 5 buah widget dari Thing Aplikasi5, 1 buah widget dari Thing DeteksiObjek2

Gambar 131. Terlihat hasil pendeteksian objek Angry Bird ditampilkan di LCD I2C

Gambar 132. Terlihat hasil pendeteksian objek Olaf ditampilkan di LCD I2C

Gambar 133. Ketika tidak ada objek di depan ESP32-Cam, tulisan kosong ditampilkan di LCD I2C

Sampai di sini pembuatan deteksi objek dengan software aplikasi online gratis Edge Impulse dan dengan perangkat Handphone dan ESP32-Cam selesai dibuat. Dengan ketiga perangkat tersebut telah dihasilkan aplikasi pendeteksian objek yang cukup baik dan mudah. Dalam contoh di sini hanya menggunakan 2 objek saja. Rekan-rekan dapat mengembangkannya untuk objek yang lebih banyak. Agar lebih jelas, berikut ini video pembuatan Aplikasi#6 ini.

Video pembuatan pendeteksian objek dengan Edge Impulse, ESP32-Cam dan Arduino IoT Cloud


Berikut ini file program yang digunakan dalam pembuatan aplikasi ini. Semoga bermanfaat dan terima kasih atas kunjungannya.

Link Unduhan: File yang digunakan

No comments:

Post a Comment