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:
- Membuat Proyek: Langkah 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.
- Pengumpulan Data: Mengumpulkan 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.
- Pra-pemrosesan Data: Setelah mengumpulkan data, Anda mungkin perlu menjalankan pra-pemrosesan pada data tersebut. Ini bisa mencakup normalisasi, pembersihan, atau augmentasi data untuk meningkatkan keberagaman dataset.
- 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.
- Pelatihan Model: Menentukan 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.
- 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.
- 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.
- 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.
- 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
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 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
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 50. Sebelum meng-upload program, pastikan memilih Board dan Port yang benar, centang Show all port, pilih Port yang diikuti tulisan (USB).
Gambar 52. Buka Serial Monitor, lihat alamat IP Camera yang muncul di bagian akhir
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.
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
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".
- #include "thingProperties.h"
- #include <DeteksiObjek2_inferencing.h>
- #include "edge-impulse-sdk/dsp/image/image.hpp"
- #include "esp_camera.h"
- #define PWDN_GPIO_NUM 32
- #define RESET_GPIO_NUM -1
- #define XCLK_GPIO_NUM 0
- #define SIOD_GPIO_NUM 26
- #define SIOC_GPIO_NUM 27
- #define Y9_GPIO_NUM 35
- #define Y8_GPIO_NUM 34
- #define Y7_GPIO_NUM 39
- #define Y6_GPIO_NUM 36
- #define Y5_GPIO_NUM 21
- #define Y4_GPIO_NUM 19
- #define Y3_GPIO_NUM 18
- #define Y2_GPIO_NUM 5
- #define VSYNC_GPIO_NUM 25
- #define HREF_GPIO_NUM 23
- #define PCLK_GPIO_NUM 22
- #define EI_CAMERA_RAW_FRAME_BUFFER_COLS 320
- #define EI_CAMERA_RAW_FRAME_BUFFER_ROWS 240
- #define EI_CAMERA_FRAME_BYTE_SIZE 3
- static bool debug_nn = false;
- static bool is_initialised = false;
- uint8_t *snapshot_buf;
- static camera_config_t camera_config = {
- .pin_pwdn = PWDN_GPIO_NUM,
- .pin_reset = RESET_GPIO_NUM,
- .pin_xclk = XCLK_GPIO_NUM,
- .pin_sscb_sda = SIOD_GPIO_NUM,
- .pin_sscb_scl = SIOC_GPIO_NUM,
- .pin_d7 = Y9_GPIO_NUM,
- .pin_d6 = Y8_GPIO_NUM,
- .pin_d5 = Y7_GPIO_NUM,
- .pin_d4 = Y6_GPIO_NUM,
- .pin_d3 = Y5_GPIO_NUM,
- .pin_d2 = Y4_GPIO_NUM,
- .pin_d1 = Y3_GPIO_NUM,
- .pin_d0 = Y2_GPIO_NUM,
- .pin_vsync = VSYNC_GPIO_NUM,
- .pin_href = HREF_GPIO_NUM,
- .pin_pclk = PCLK_GPIO_NUM,
- .xclk_freq_hz = 20000000,
- .ledc_timer = LEDC_TIMER_0,
- .ledc_channel = LEDC_CHANNEL_0,
- .pixel_format = PIXFORMAT_JPEG,
- .frame_size = FRAMESIZE_QVGA,
- .jpeg_quality = 12,
- .fb_count = 1,
- .fb_location = CAMERA_FB_IN_PSRAM,
- .grab_mode = CAMERA_GRAB_WHEN_EMPTY,
- };
- bool ei_camera_init(void);
- void ei_camera_deinit(void);
- bool ei_camera_capture(uint32_t img_width, uint32_t img_height, uint8_t *out_buf);
- void setup() {
- Serial.begin(115200);
- delay(1500);
- initProperties();
- ArduinoCloud.begin(ArduinoIoTPreferredConnection);
- setDebugMessageLevel(2);
- ArduinoCloud.printDebugInfo();
- Serial.println("Edge Impulse Inferencing Demo");
- if (ei_camera_init() == false) {
- ei_printf("Failed to initialize Camera!\r\n");
- } else {
- ei_printf("Camera initialized\r\n");
- }
- pinMode(4, OUTPUT);
- digitalWrite(4, HIGH);
- ei_printf("\nStarting continious inference in 2 seconds...\n");
- ei_sleep(2000);
- }
- void loop() {
- ArduinoCloud.update();
- if (ei_sleep(100)!= EI_IMPULSE_OK) {
- return;
- }
- snapshot_buf = (uint8_t *)malloc(EI_CAMERA_RAW_FRAME_BUFFER_COLS * EI_CAMERA_RAW_FRAME_BUFFER_ROWS * EI_CAMERA_FRAME_BYTE_SIZE);
- if (snapshot_buf == nullptr) {
- ei_printf("ERR: Failed to allocate snapshot buffer!\n");
- return;
- }
- ei::signal_t signal;
- signal.total_length = EI_CLASSIFIER_INPUT_WIDTH * EI_CLASSIFIER_INPUT_HEIGHT;
- signal.get_data = &ei_camera_get_data;
- if (ei_camera_capture((size_t)EI_CLASSIFIER_INPUT_WIDTH, (size_t)EI_CLASSIFIER_INPUT_HEIGHT, snapshot_buf) == false) {
- ei_printf("Failed to capture image\r\n");
- free(snapshot_buf);
- return;
- }
- ei_impulse_result_t result = { 0 };
- EI_IMPULSE_ERROR err = run_classifier(&signal, &result, debug_nn);
- if (err != EI_IMPULSE_OK) {
- ei_printf("ERR: Failed to run classifier (%d)\n", err);
- return;
- }
- ei_printf("Predictions (DSP: %d ms., Classification: %d ms., Anomaly: %d ms.): \n",
- result.timing.dsp, result.timing.classification, result.timing.anomaly);
- #if EI_CLASSIFIER_OBJECT_DETECTION == 1
- bool bb_found = result.bounding_boxes[0].value > 0;
- for (size_t ix = 0; ix < result.bounding_boxes_count; ix++) {
- auto bb = result.bounding_boxes[ix];
- if (bb.value == 0) {
- continue;
- }
- label = bb.label;
- 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);
- }
- if (!bb_found) {
- label = "kosong";
- ei_printf(" No objects found\n");
- }
- #else
- for (size_t ix = 0; ix < EI_CLASSIFIER_LABEL_COUNT; ix++) {
- ei_printf(" %s: %.5f\n", result.classification[ix].label,
- result.classification[ix].value);
- }
- #endif
- #if EI_CLASSIFIER_HAS_ANOMALY == 1
- ei_printf(" anomaly score: %.3f\n", result.anomaly);
- #endif
- free(snapshot_buf);
- }
- bool ei_camera_init(void) {
- if (is_initialised) return true;
- esp_err_t err = esp_camera_init(&camera_config);
- if (err != ESP_OK) {
- Serial.printf("Camera init failed with error 0x%x\n", err);
- return false;
- }
- sensor_t *s = esp_camera_sensor_get();
- s->set_vflip(s, 1);
- s->set_hmirror(s, 1);
- is_initialised = true;
- return true;
- }
- void ei_camera_deinit(void) {
- esp_err_t err = esp_camera_deinit();
- if (err != ESP_OK) {
- ei_printf("Camera deinit failed\n");
- return;
- }
- is_initialised = false;
- return;
- }
- bool ei_camera_capture(uint32_t img_width, uint32_t img_height, uint8_t *out_buf) {
- bool do_resize = false;
- if (!is_initialised) {
- ei_printf("ERR: Camera is not initialized\r\n");
- return false;
- }
- camera_fb_t *fb = esp_camera_fb_get();
- if (!fb) {
- ei_printf("Camera capture failed\n");
- return false;
- }
- bool converted = fmt2rgb888(fb->buf, fb->len, PIXFORMAT_JPEG, snapshot_buf);
- esp_camera_fb_return(fb);
- if (!converted) {
- ei_printf("Conversion failed\n");
- return false;
- }
- if ((img_width != EI_CAMERA_RAW_FRAME_BUFFER_COLS)
- || (img_height != EI_CAMERA_RAW_FRAME_BUFFER_ROWS)) {
- do_resize = true;
- }
- if (do_resize) {
- ei::image::processing::crop_and_interpolate_rgb888(
- out_buf,
- EI_CAMERA_RAW_FRAME_BUFFER_COLS,
- EI_CAMERA_RAW_FRAME_BUFFER_ROWS,
- out_buf,
- img_width,
- img_height);
- }
- return true;
- }
- static int ei_camera_get_data(size_t offset, size_t length, float *out_ptr) {
- size_t pixel_ix = offset * 3;
- size_t pixels_left = length;
- size_t out_ptr_ix = 0;
- while (pixels_left != 0) {
- out_ptr[out_ptr_ix] = (snapshot_buf[pixel_ix] << 16) + (snapshot_buf[pixel_ix + 1] << 8) + snapshot_buf[pixel_ix + 2];
- out_ptr_ix++;
- pixel_ix += 3;
- pixels_left--;
- }
- return 0;
- }
- #if !defined(EI_CLASSIFIER_SENSOR) || EI_CLASSIFIER_SENSOR != EI_CLASSIFIER_SENSOR_CAMERA
- #error "Invalid model for current sensor"
- #endif
- void onLabelChange(){
- }
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 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