Metode khusus untuk menentukan apakah ada orang di ruangan atau tidak dapat dikembangkan dengan menggabungkan Raspberry Pi, kamera termal, dan model pembelajaran mesin yang memanfaatkan TensorFlow. Banyak geek dan automator DIY telah lama bercita-cita untuk dapat memicu peristiwa berdasarkan kehadiran orang di sebuah ruangan. Aplikasi yang menarik, misalnya, adalah membuat rumah Anda secara otomatis menyalakan dan mematikan lampu saat Anda masuk atau keluar dari tempat tinggal Anda. kamar.
Sebagian besar solusi untuk masalah ini, seperti sensor Philips Hue, hanya mendeteksi gerakan dan bukan kehadiran manusia yang sebenarnya. Alhasil, lampu akan mati saat Anda berbaring di sofa seperti orang malas. Akibat wajar yang menarik adalah kemampuan untuk mematikan musik atau televisi saat Anda meninggalkan ruangan dan pergi ke kamar tidur tanpa harus mematikan setiap button. Aplikasi lain yang menarik adalah kemampuan untuk melihat apakah ada orang di kamar Anda saat Anda tidak ada.
Contents
Raspberry Pi, Kamera Termal, dan Pembelajaran Mesin
Menggabungkan kamera termal dengan jaringan syaraf dalam adalah metode yang jauh lebih kuat untuk benar-benar mendeteksi keberadaan manusia. Mereka dapat mendeteksi keberadaan orang bahkan ketika mereka tidak bergerak, tidak seperti sensor gerak. Selain itu, tidak seperti kamera optik, mereka mendeteksi tubuh dengan mengukur panas yang mereka pancarkan dalam bentuk radiasi infra merah. Hasilnya, mereka jauh lebih kuat karena sensitivitasnya tidak terpengaruh oleh kondisi pencahayaan, posisi target, atau warna. Saya mencoba beberapa saat untuk membangun model yang menggunakan gambar optik dari webcam standar daripada gambar termal sebelum melihat ke dalam solusi kamera termal. dalam satu hari, sementara model optik dilatih pada lebih dari 10.000 640480 gambar yang diambil selama seminggu dalam berbagai kondisi pencahayaan.
Model termal akan mencapai akurasi sekitar 99% dalam satu fase pelatihan dari jaringan saraf yang lebih sederhana, sedangkan model optik tidak akan mencapai akurasi di atas 91% dalam mendeteksi keberadaan orang bahkan dengan arsitektur jaringan yang lebih kompleks. Ada beberapa penelitian tentang subjek ini (sebagian besar makalah penelitian dapat ditemukan dengan mencari “kamera termal pendeteksi orang”) dan beberapa produk canggih dan mahal untuk pengawasan profesional, meskipun potensinya tinggi. Saya memutuskan untuk melakukan tugas saya dan bangun solusi saya sendiri karena tidak ada opsi siap pakai untuk rumah saya. Saya memastikan itu dapat dengan mudah ditiru oleh siapa pun.
Perangkat Keras
- Biaya RaspberryPi: kira-kira $35). Menggunakan RaspberryPi Zero single-core untuk tugas pembelajaran mesin mungkin bukan ide yang baik karena tugas itu sendiri tidak terlalu mahal (kami hanya akan menggunakan Raspberry untuk melakukan prediksi pada model terlatih, bukan untuk melatih model), tetapi mungkin masih mengalami beberapa latensi pada Zero. Namun, secara teori, model apa pun harus berfungsi. Model apa pun dengan kinerja yang lebih baik harus melakukan pekerjaan dengan baik.
- termometer.Saya menggunakan kamera breakout MLX90640 Pimoroni untuk proyek ini, yang berharga:$55) karena biayanya yang rendah, pemasangan yang sederhana, dan hasil yang memuaskan.Versi standar (55°) dan sudut lebar (110°) dari kamera ini adalah tersedia. Saya telah menggunakan model titik lebar karena kamera menampilkan ruang tamu yang besar, tetapi pertimbangkan bahwa keduanya memiliki tujuan yang sama (32×24 piksel), jadi titik yang lebih luas disertai dengan biaya tujuan spasial yang lebih rendah. Ada tidak banyak yang perlu Anda ubah jika ingin menggunakan kamera termal yang berbeda; yang perlu Anda lakukan hanyalah memastikan bahwa itu kompatibel dengan Platypush dan dilengkapi dengan antarmuka perangkat lunak yang kompatibel dengan RaspberryPi.
- Memasang kamera breakout pada sesuatu seperti Breakout Garden, yang harganya: $10-14), karena mudah dipasang tanpa perlu menyolder tepat di atas RaspberryPi Anda.
Jika Anda memiliki Breakout Garden, menyiapkan MLX90640 di RaspberryPi Anda sangat mudah. Pasang Breakout Garden di bagian atas Raspberry Pi. Tempatkan breakout kamera di slot untuk I2C. Jalankan Raspberry Pi. Selesai.
Perangkat Lunak
Saya menguji kode saya di Raspbian, tetapi, dengan sedikit modifikasi, seharusnya dapat dengan mudah disesuaikan dengan distribusi apa pun yang dipasang di RaspberryPi.
Dukungan perangkat lunak untuk kamera termal membutuhkan sedikit kerja. MLX90640 tidak datang (belum) dengan antarmuka siap pakai Python, tetapi driver sumber terbuka C++ disediakan untuk itu. Petunjuk untuk menginstalnya :
# Install the dependencies
apt-get install libi2c-dev
# Enable the I2C interface echo dtparam=i2c_arm=on | sudo tee -a /boot/config.txt
# It's advised to configure the SPI bus baud rate to
# 400kHz to support the higher throughput of the sensor
echo dtparam=i2c1_baudrate=400000 | sudo tee -a /boot/config.txt
# A reboot is required here if you didn't have the # options above enabled in your /boot/config.txt
# Clone the driver's codebase git clone https://github.com/pimoroni/mlx90640-library cd mlx90640-library
# Compile the rawrgb example make clean make I2C_MODE=LINUX examples/rawrgb
Di bawah direktori contoh, Anda akan melihat sebuah executable dengan nama rawrgb jika semuanya berjalan dengan baik. Jika Anda menjalankannya, Anda akan melihat banyak data biner, yang merupakan representasi biner mentah dari frame. Karena itu adalah executable yang Platypush akan digunakan untuk berinteraksi dengan modul kamera, mengingat di mana letaknya atau memindahkannya ke folder tempat sampah khusus. Artikel ini mengasumsikan bahwa Anda telah menginstal dan mengonfigurasi platypush di sistem Anda. Jika tidak, kunjungi wiki, readthedocs, halaman GitHub, atau postingan saya tentang memulai dengan Platypush.
Anda juga memerlukan dependensi Python berikut pada RaspberryPi :
# For machine learning image predictions pip install opencv opencv-contrib-python
# For image manipulation in the MLX90640 plugin pip install Pillow
Dalam contoh ini, kami akan menggunakan mesin yang lebih bertenaga untuk fase pelatihan dan RaspberryPi untuk fase penangkapan dan prediksi. Ketergantungan mesin berikut akan diperlukan untuk melatih model Anda :
# For image manipulation pip install opencv
# Install Jupyter notebook to run the training code pip install jupyterlab # Then follow the instructions at https://jupyter.org/install
# Tensorflow framework for machine learning and utilities pip install tensorflow numpy matplotlib
# Clone my repository with the image and training utilities # and the Jupyter notebooks that we'll use for training git clone https://github.com/BlackLight/imgdetect-utils
Fase Penangkapan
Saatnya untuk mulai mengambil gambar dengan kamera Anda dan menggunakannya untuk melatih model Anda sekarang setelah Anda memiliki semua perangkat keras dan perangkat lunak yang diperlukan. Pertama-tama, rancang modul MLX90640 dalam catatan penyiapan platipus Anda :
camera.ir.mlx90640: fps: 16 # Frames per second rotate: 270 # Can be 0, 90, 180, 270 rawrgb_path: /path/to/your/rawrgb
Mulai Platypush lagi. Anda dapat memeriksa apakah Anda dapat mengambil gambar jika backend HTTP diaktifkan :
curl -XPOST -H 'Content-Type: application/json' -d '{"type":"request", "action":"camera.ir.mlx90640.capture", "args": {"output_file":"~/snap.png", "scale_factor":20}}' http://localhost:8008/execute?token=...
Gambar termal harus disimpan di /snap.png. Saat saya berdiri di depan sensor, situasi saya terlihat seperti ini :
Perhatikan kemilau di sudut kanan bawah itu benar-benar intensitas dari prosesor pusat RaspberryPi 4 saya. Itu muncul di setiap gambar yang saya ambil, dan jika Anda memasang kamera di atas Raspberry itu sendiri, Anda mungkin mendapatkan hasil yang serupa. Namun, ini seharusnya tidak menjadi masalah untuk pelatihan model Anda.
Anda juga dapat menggunakan ikon matahari untuk membuka tab baru di panel web (http://host-anda:8008) untuk melihat status kamera Anda dari antarmuka web.
Gambar akan disimpan di bawah http://your-host:8008/camera/ir/mlx90640/stream?rotate=270&scale_factor=20.
Sekarang, di konfigurasi Platypush Anda, tambahkan cronjob untuk mengambil snapshot setiap menit :
cron.ThermalCameraSnapshotCron: cron_expression: '* * * * *' actions: - action: camera.ir.mlx90640.capture args: - output_file: "${__import__('datetime').datetime.now().strftime('/img/folder/%Y-%m-%d_%H-%M-%S.jpg')}" - grayscale: true
Kita hanya membutuhkan gambar kecil untuk melatih model kita, jadi tidak ada faktor skala yang digunakan. Selain itu, kita akan mengonversi gambar menjadi skala abu-abu, yang akan membuat jaringan saraf menjadi lebih ringan dan sebenarnya lebih akurat karena hanya bergantung pada satu variabel per piksel daripada tertipu oleh kombinasi RGB.
Mulai ulang Platypush dan pastikan gambar baru dibuat setiap menit di direktori gambar Anda. Sampai Anda puas dengan jumlah sampel, biarkan berjalan selama beberapa jam atau hari. Cobalah untuk mencakup skenario sebanyak mungkin, termasuk duduk, berdiri, dan posisi lain di dalam ruangan, dengan menyeimbangkan jumlah gambar dengan dan tanpa kehadiran orang. Seperti yang saya sebutkan sebelumnya, saya hanya membutuhkan kurang dari 1000 gambar dengan variasi yang cukup untuk mencapai tingkat akurasi di atas 99 persen dalam kasus saya.
Tahap Pelabelan
Salin gambar ke mesin yang akan Anda gunakan untuk melatih model Anda setelah Anda puas dengan jumlah sampel yang Anda ambil (semuanya harus berupa file JPEG kecil dengan masing-masing kurang dari 500 byte). Masukkan ke dalam folder di mana Anda mengkloning komputer saya imgdetect-utils :
BASEDIR=~/git_tree/imgdetect-utils
# This directory will contain your raw images IMGDIR=$BASEDIR/datasets/ir/images
# This directory will contain the raw numpy training # data parsed from the images DATADIR=$BASEDIR/datasets/ir/data
mkdir -p $IMGDIR mkdir -p $DATADIR
# Copy the images scp pi@raspberry:/img/folder/*.jpg $IMGDIR
# Create the labels for the images. Each label is a # directory under $IMGDIR mkdir $IMGDIR/negative mkdir $IMGDIR/positive
Jalankan skrip label.py yang disediakan di repositori untuk memberi label gambar secara interaktif setelah disalin dan direktori untuk label telah dibuat :
cd $BASEDIR
python utils/label.py -d $IMGDIR [--scale-factor 20]
Setiap gambar akan terbuka di jendela baru dan Anda dapat memberi label dengan mengetik 1 (negatif) atau 2 (positif) :
Anda seharusnya dapat mengetahuinya dengan melihat stempel waktu atau dengan melihat gambar-gambar kecil lagipula, itu adalah sekumpulan 2432 gambar dari kamera termal kecil jika ada orang di dalam ruangan biasanya diwakili oleh area yang lebih terang atau tidak. Direktori negatif dan positif di bawah direktori gambar seharusnya sudah diisi pada akhir prosedur.
Fase Pelatihan
Setelah kita memiliki semua gambar berlabel, waktunya untuk melatih model kita. Notebook train.ipynb Jupyter disediakan di bawah notebooks/ir, dan seharusnya cukup jelas.
Akan ada file di models/ir/tensorflow dengan nama ir.pb jika Anda berhasil mengeksekusi notebook secara keseluruhan. Sekarang setelah Anda memiliki file models/ir/tensorflow, Anda dapat mentransfernya ke Raspberry Pi dan menggunakannya untuk membuat prediksi :
scp $BASEDIR/models/ir/tensorflow/ir.pb pi@raspberry:/home/pi/models
Mendeteksi Orang di Ruangan
Menggunakan plugin platypush MlCv, ganti konten ThermalCameraSnapshotCron dengan logika yang mengambil gambar pada interval yang telah ditentukan dan menggunakan model yang baru saja kami latih untuk memprediksi apakah ada orang di dalam ruangan atau tidak.
Dalam procedure.people_detected dan procedure.no_people_detected, Anda dapat menggunakan logika apa pun yang Anda inginkan.Ketika sesuatu telah berubah sejak pengamatan sebelumnya, prosedur ini hanya akan digunakan.Misalnya, metode langsung untuk menentukan kapan menyalakan atau mematikan lampu Anda adalah sebagai berikut :
procedure.sync.people_detected: - action: light.hue.on
procedure.sync.no_people_detected: - action: light.hue.off
Apa Berikutnya?
Itu keputusan Anda!Gunakan plugin media platypush untuk bereksperimen dengan aturan yang lebih rumit, seperti mengubah status musik atau video yang diputar di ruangan saat seseorang masuk. Atau, saat Anda pertama kali memasuki ruangan di pagi hari, kirim teks yang dipersonalisasi untuk mengatakan “selamat pagi.” , Anda dapat membangun sistem yang bahkan lebih kuat dengan menggabungkannya dengan sensor aliran optik, sensor jarak, sensor jangkauan laser, atau kamera optik (platypush menawarkan plugin untuk beberapa komponen ini).