Menambahkan Teknologi AI ke IP Camera rumah

Sejak memakai bel rumah yang tidak perlu batere, kami sudah berhasil menyelesaikan masalah lupa mengganti batere bel wireless di pagar. Tapi ada masalah baru: tukang paket sering memakai motor dan malas turun dari motor untuk menekan bel rumah. Mereka biasanya akan membunyikan klakson, menunggu kami keluar.

Paket!!!

Saya sering tidak mendengar tukang paket, apalagi kalau sedang di kamar atas . Risna juga sering tidak dengar jika sedang memasak. Jadi kadang tukang paketnya perlu nelpon agar kami keluar.

Khusus untuk Pos dari Thailand Post Office, mereka tidak pernah menelpon mereka punya opsi kalau kami tidak di rumah: menaruh surat agar kami mengambil di kantor pos, atau dititipkan ke tetangga. Kalau kami tahu ada paket hari itu (dari statusnya yang delivered), maka kami perlu tanya ke tetangga.

IP Camera

Sejak sebelum mudik Juli lalu, saya sudah memasang kamera yang memakai WIFI dan bisa dilihat dari ponsel ataupun komputer. Kamera jaman sekarang sudah cukup pintar, bisa mendeteksi gerakan, mengirimkan alert dsb. Tapi tetap saja tidak cukup pintar buat saya.

Kamera saya tidak bisa membedakan gerakan burung, anjing, atau orang lewat depan rumah. Kamera juga tidak bisa diset agar memberi notifikasi hanya jika ada orang/motor/mobil di depan rumah selama lebih dari 5 detik.

Jadi solusi yang terpikir adalah: membuat program yang memonitor kamera, lalu memberi notifikasi berikut gambarnya via telegram jika ada yang di depan rumah lebih dari 5 detik. Setelah bereksperiman, ada beberapa kriteria lain untuk mengurangi false positive: hanya wilayah tertentu yang perlu dicek, dan objek tertentu bisa diignore.

Mengambil gambar dari kamera

Bagian pertama yang perlu dilakukan adalah mengambil gambar dari kamera. Kamera yang saya pakai menggunakan standard ONVIF (seperti kebanyakan kamera di pasaran). Ada banyak library yang bisa dipakai untuk ini, tapi sebenarnya tidak perlu library khusus kaerna mengakses satu gambar dari kamera hanya butuh 1 request HTTP. Tiap device URLnya berbeda dan urlnya bisa didapatkan melalui tool cli python-onvif.

Range kamera cukup luas, tapi pemrosesan hanya akan dilakukan pada area pagar

Karena saya tidak butuh pengenalan objek realtime, saya mengambil satu gambar dari kamera tiap detik lalu memproses gambarnya. Saya tidak ingin CPU bekerja terlalu keras karena akan menambah penggunaan daya listrik.

Object detection

Saat ini sudah ada banyak model AI untuk object detection. Dulu saya sering membandingkan berbagai model object detection untuk mencari mana yang paling efisien (dari segi komputasi) dan akura. Sekarang saya memilih cara termudah saja: cari di github yang paling populer saat ini. Saat ini yang populer adalah adalah yolov5, pengembangan YOLO (You Only Look Once) yang tidak lagi dikembangkan oleh pencipta aslinya.

saat ini repository object detection paling populer adalah yolov5

Dulu saya pernah belajar teori dan implementasi Yolo dari course Convolutional Neural Networks di Coursera, jadi sudah tahu teori cara kerjanya serta keterbatasannya. Tapi tanpa paham teorinya sekalipun, library ini sangat mudah dipakai, hanya butuh beberapa baris kode saja untuk bagian object detection.

Saya membuat skrip python yang melakukan hal berikut:

  • mengambil gambar dari kamera
  • melakukan object detection
  • memastikan pada hasilnya tidak ada area yang 90% overlap, kadang satu benda dianggap sebagai dua benda berbeda (misalnya satu mobil dianggap ada car dan truck di lokasi yang hampir persis sama)
  • memfilter benda-benda yang tidak mungkin muncul (misal fire hydrant) yang kadang terdeteksi
  • mengingat apakah benda sudah ada selama 5 detik terakhir, jika ada mobil yang sekedar lewat maka notifikasi tidak akan dikirim
  • jika objek memenuhi syarat (ada di kamera lebih dari 5 detik, bukan overlap, dan bukan objek yang tidak mungkin), maka tuliskan ke file

Perlu dicatat bahwa kadang ada hal-hal yang tertangkap kamera yang tidak biasa. Misalnya di musim dingin, di Thailand sebagian anjing diberi baju dan salah terdeteksi jadi binatang lain.

Pasti Yolo tidak ditraining dengan anjing berbaju

Contoh lain adalah burung yang muncul dekat kamera.

Tidak selalu benar, burung kok dikira jerapah

Kirim ke Telegram

Dari sejak tahun 2015 saya sudah membuat tulisan tentang membuat bot telegram secara manual (tanpa library). Membuat bot dan mengirim pesan sebenarnya mudah, tapi agar lebih mudah lagi, saya memakai tool telegram send. Andaikan saya ingin mengubah pengiriman ke media lain (email, WhatsApp, slack), saya hanya perlu mengganti skrip ini dengan yang lain.

Skrip telegram-send bisa digabung dengan inotifywait untuk menunggu sampai gambar dituliskan ke direktori tertentu (oleh skrip Python). Setelah terkirim, gambar diarsipkan di direktori tertentu.

Deployment

Awalnya saya memakai Mini PC yang tidak saya pakai untuk menjalankan skrip ini. Mini PC ini tidak punya GPU, dan juga terlalu tua prosessornya tidak didukung oleh OpenVINO, jadi pemakaian CPUnya cukup tinggi (artinya penggunaan dayanya juga akan lumayan jika on terus 24 jam).

Saya teringat di salah satu proyek saya, saya memakai Single Board Computer NVidia Jetson Nano. Sudah setahun lebih Jetson Nano-nya tidak saya pakai, tapi masih berjalan dengan baik. Setelah mengupdate softwarenya, saya akhirnya memindahkan program saya ke Jetson Nano. Jetson Nano memiliki GPU jadi proses inferensi bisa lebih cepat (kurang dari 40 ms), pemakaian CPU sangat kecil dan penggunaan dayanya kecil (rata-rata kurang dari 3 Watt).

Hasil

Selama seminggu pertama, saya hanya mengumpulkan gambar dan hasil deteksi. Ada beberapa asumsi yang saya buat ternyata tidak benar, misalnya saya asumsikan bahwa jika ada tukang paket akan terdeteksi orang dan motor. Ternyata kadang hanya terdeteksi motor saja jika posisi berhenti tepat di tengah pagar.

Area deteksi juga akhirnya disesuaikan karena tetangga depan rumah kadang mobilnya terdeteksi. Ketika malam, Yolo sering “berhalusinasi” melihat “baseball bat”, “fire hydrant”, dsb. Karena malas melakukan training ulang, saya filer saja jika hasilnya adalah benda-benda yang tidak mungkin.

Tiap pagi jalan keluar rumah

Tadinya saya hanya akan mengirimkan pesan ke telegram untuk event: “ada orang di depan pagar”. Tapi akhirnya saya membuat dua group telegram: satu group untuk menerima foto semua orang, hewan dan kendaraan yang lewat (diset agar group Telegramnya tidak mengirimkan notifikasi, jadi sekedar arsip). Satu group lagi akan menerima foto jika ada orang/motor/mobil di depan pagar agak lama.

Sekarang sistemnya sudah cukup reliable. Tiap pagi ketika keluar untuk jalan-jalan, kami akan mendapatkan notifikasi, jadi bisa tahu bahwa sistemnya masih berjalan. Ketika malam, kami bisa mereview orang-orang yang lewat depan rumah. Ini jauh lebih cepat daripada mereview rekaman video kamera rumah.

Penutup

Dengan coding singkat, memakai tools yang ada, dan library AI, sekarang kamera di rumah jadi lebih berguna. Mungkin artikel ini bisa menginspirasi Anda untuk lebih mendayagunakan kamera rumah, misalnya mengirim notifikasi jika ada orang berusaha mendekati daerah tertentu, tapi mengabaikan jika binatang di area tersebut.

Saat ini semakin banyak microcontroller dan SOC yang memiliki Neural Accelerator/Neural Processing Unit (contohnya saya pernah menulis ini). Di masa depan, object recognition ini kemungkinan akan jadi bagian kamera murahan sehingga tidak perlu repot coding seperti sekarang (berbagai kamera mahal sudah punya fitur ini).

Tinggalkan Balasan

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses.