- Komponen Diperlukan
- YOLO
- Memasang OpenCV di Raspberry Pi
- Memasang Pakej Yang Diperlukan lain di Raspberry Pi
- Penjelasan Program
- Menguji Projek Pengesan Jarak Sosial
Pada zaman Covid-19, Jarak sosial adalah cara yang berkesan untuk melambatkan penularan virus berjangkit. Orang-orang disarankan untuk meminimumkan hubungan mereka antara satu sama lain untuk meminimumkan risiko penyakit menular melalui kontak langsung. Menjaga jarak yang selamat adalah cabaran bagi banyak tempat seperti kilang, bank, bas atau stesen keretapi, dll.
Oleh itu, sebagai penerusan projek keselamatan Corona kami sebelumnya seperti mesin pembersih automatik dan pemantauan suhu tanpa sentuhan, di sini kita akan membina sistem Pengesan Jarak Sosial menggunakan OpenCV dan Raspberry Pi. Kami akan menggunakan bobot Algoritma Pengesanan Objek YOLO v3 dengan modul Jaringan Neural Dalam.
Raspberry Pi selalu menjadi pilihan yang baik untuk projek pemprosesan Imej kerana ia mempunyai lebih banyak memori dan kelajuan daripada pengawal lain. Kami sebelum ini menggunakan Raspberry Pi untuk beberapa projek pemprosesan gambar yang kompleks seperti pengesanan mercu tanda wajah dan aplikasi Pengecaman wajah.
Komponen Diperlukan
- Raspberry Pi 4
Di sini kita hanya memerlukan RPi 4 dengan OpenCV terpasang di atasnya. OpenCV digunakan di sini untuk pemprosesan gambar digital. Aplikasi Pemprosesan Imej Digital yang paling biasa adalah pengesanan objek, Pengecaman Wajah, dan penghitungan orang.
YOLO
YOLO (You Only Look Once) adalah rangkaian saraf Konvolusi pintar (CNN) untuk Pengesanan Objek masa nyata. YOLOv3, varian terbaru algoritma pengesanan objek, YOLO dapat mengenali 80 objek yang berbeza dalam gambar dan video, dan ia sangat pantas dan mempunyai ketepatan yang sangat baik. Algoritma menerapkan rangkaian neural tunggal ke keseluruhan gambar, kemudian memisahkan gambar menjadi kawasan dan mengira kotak sempadan dan kebarangkalian untuk setiap kawasan. Model Base YOLO dapat memproses gambar dalam masa nyata pada 45 bingkai sesaat. Model YOLO mengatasi semua kaedah pengesanan lain seperti SSD dan R-CNN.
Model YOLOV3 yang akan kita gunakan dalam projek ini boleh dimuat turun dari sini.
Memasang OpenCV di Raspberry Pi
Sebelum memasang OpenCV dan pergantungan lain, Raspberry Pi perlu dikemas kini sepenuhnya. Gunakan arahan di bawah ini untuk mengemas kini Raspberry Pi ke versi terbarunya:
sudo apt-get kemas kini
Kemudian gunakan arahan berikut untuk memasang dependensi yang diperlukan untuk memasang OpenCV pada Raspberry Pi anda.
sudo apt-get install libhdf5-dev -y sudo apt-get install libhdf5-serial-dev -y sudo apt-get install libatlas-base-dev –y sudo apt-get install libjasper-dev -y sudo apt-get install libqtgui4 –Y sudo apt-get install libqt4-test –y
Akhirnya, pasang OpenCV pada Raspberry Pi menggunakan arahan di bawah.
pip3 memasang opencv-contrib-python == 4.1.0.25
Sekiranya anda baru menggunakan OpenCV, periksa tutorial OpenCV kami sebelumnya dengan Raspberry pi:
- Memasang OpenCV pada Raspberry Pi menggunakan CMake
- Pengecaman Muka Masa Nyata dengan Raspberry Pi dan OpenCV
- Pengiktirafan Plat Lesen menggunakan Raspberry Pi dan OpenCV
- Anggaran Ukuran Orang Ramai Menggunakan OpenCV dan Raspberry Pi
Kami juga telah membuat siri tutorial OpenCV bermula dari peringkat pemula.
Memasang Pakej Yang Diperlukan lain di Raspberry Pi
Sebelum memprogramkan pengesan jarak Raspberry Pi untuk Sosial, mari pasang pakej lain yang diperlukan.
Memasang imutil: imutil digunakan untuk membuat fungsi pemprosesan gambar penting seperti terjemahan, putaran, pengubahan ukuran, kerangka, dan menampilkan gambar Matplotlib dengan lebih mudah dengan OpenCV. Gunakan arahan di bawah untuk memasang imutil:
pip3 memasang imutil
Penjelasan Program
Kod lengkap diberikan di hujung halaman. Di sini kami menerangkan bahagian penting kod untuk penjelasan yang lebih baik.
Jadi pada permulaan kod, import semua perpustakaan yang diperlukan yang akan digunakan dalam projek ini.
import numpy sebagai np import cv2 import imutils import os import time
Fungsi Check () digunakan untuk mengira jarak antara dua objek atau dua titik dalam bingkai video. Titik a dan b menunjukkan dua objek dalam bingkai. Kedua-dua titik ini digunakan untuk mengira Jarak Euclidean antara objek.
def Cek (a, b): dist = ((a - b) ** 2 + 550 / ((a + b) / 2) * (a - b) ** 2) ** Kalibrasi 0.5 = (a + b)) / 2 jika 0 <dist <0.25 * penentukuran: kembali Betul lain: kembali False
Fungsi persediaan digunakan untuk menetapkan jalan untuk bobot YOLO, fail cfg, fail nama COCO. Modul os.path digunakan untuk manipulasi nama jalan biasa. Modul os.path.join () adalah sub-modul os.path dan digunakan untuk menggabungkan satu atau lebih komponen jalan dengan cerdas. Kaedah cv2.dnn.readNetFromDarknet () digunakan untuk memuatkan bobot yang disimpan ke dalam rangkaian. Setelah memuatkan bobot, ekstrak senarai semua lapisan yang digunakan dalam rangkaian menggunakan model net.getLayerNames .
def Setup (yolo): global neural_net, ln, LABELS weight = os.path.sep.join () config = os.path.sep.join () labelsPath = os.path.sep.join () LABELS = terbuka (labelPath).read (). strip (). split ("\ n") neural_net = cv2.dnn.readNetFromDarknet (config, weight) ln = neural_net.getLayerNames () ln = - 1] untuk i di neural_net.getUnconnectedOutLayers ()]
Di dalam fungsi pemprosesan gambar, kami mengambil satu bingkai video dan kemudian memprosesnya untuk pengesanan jarak sosial antara setiap orang yang ramai. Pada dua baris pertama fungsi, kami menetapkan dimensi bingkai video (W, H) sebagai (Tiada, Tiada) pada mulanya. Pada baris seterusnya, kami menggunakan kaedah cv2.dnn.blobFromImage () untuk memuat bingkai dalam kumpulan dan menjalankannya melalui rangkaian. Fungsi gumpalan melakukan Pengurangan min, Penskalaan, dan Pertukaran saluran pada bingkai.
(H, W) = (Tiada, Tiada) bingkai = gambar. Salin () jika W Tidak Ada atau H Tidak Ada: (H, W) = bingkai.bentuk gumpalan = cv2.dnn.blobFromImage (bingkai, 1 / 255.0, (416, 416), swRRB = True, crop = False) neural_net.setInput (blob) starttime = time.time () layerOutputs = neural_net.forward (ln)
Keluaran lapisan dari YOLO terdiri daripada sekumpulan nilai. Nilai-nilai ini membantu kita menentukan objek mana yang tergolong dalam kelas mana. Kami memerhatikan setiap output di layerOutputs dan ketika kami mengesan orang, kami menetapkan label kelas sebagai "orang". Dari setiap pengesanan, kami mendapat kotak pembatas yang memberi kami pusat X, pusat Y, Lebar, dan Tinggi kotak untuk pengesanan dalam output:
skor = pengesanan maxi_class = np.argmax (skor) keyakinan = skor jika LABELS == "orang": jika keyakinan> 0.5: kotak = pengesanan * np.array () (centerX, centerY, lebar, tinggi) = box.astype ("int") x = int (tengahX - (lebar / 2)) y = int (tengahY - (tinggi / 2)) garis besar.lampirkan () konfidensi.lampirkan (terapung (keyakinan))
Selepas itu, hitung jarak antara pusat kotak semasa dengan semua kotak lain yang dikesan. Sekiranya kotak pengikat hampir, maka ubah status menjadi benar.
untuk i dalam jarak (len (tengah)): untuk j dalam julat (len (tengah)): tutup = Tandakan (tengah, tengah) jika dekat: pasang.pasang (, tengah]) status = Status benar = Indeks benar = 0
Pada baris seterusnya, lukis sebuah segi empat tepat di sekeliling orang itu menggunakan dimensi kotak yang kami terima dari model, kemudian periksa sama ada kotak itu selamat atau tidak selamat. Sekiranya jarak antara kotak dekat, maka warna kotak akan berwarna merah dan kotak itu akan berwarna hijau.
(x, y) = (garis besar, garis besar) (w, h) = (garis besar, garis besar) jika status == Benar: cv2. segiempat (bingkai, (x, y), (x + w, y + h), (0, 0, 150), 2) status elif == Salah: cv2. segi empat (bingkai, (x, y), (x + w, y + h), (0, 255, 0), 2)
Sekarang di dalam fungsi gelung , kita membaca setiap bingkai video dan kemudian memproses setiap bingkai untuk mengira jarak antara orang tersebut.
ret, frame = cap.read () if not ret: break current_img = frame.copy () current_img = imutils.resize (current_img, width = 480) video = current_img.shape frameno + = 1 if (frameno% 2 == 0) atau frameno == 1): Persediaan (yolo) ImageProcess (current_img) Frame = diprosesImg
Pada baris seterusnya, gunakan fungsi cv2.VideoWriter () untuk menyimpan video output di lokasi yang ditentukan oleh opname yang telah kita tentukan sebelumnya.
jika create is None: fourcc = cv2.VideoWriter_fourcc (* 'XVID') create = cv2.VideoWriter (opname, fourcc, 30, (Frame.shape, Frame.shape), True) create.write (Frame)
Menguji Projek Pengesan Jarak Sosial
Setelah kod anda siap, buka terminal Pi dan arahkan ke direktori projek. Kod, model Yolo, dan video demo harus berada dalam folder yang sama seperti yang ditunjukkan di bawah.
Anda boleh memuat turun direktori YoloV3 dari sini, video dari Pexels dan menyalin kod Python yang diberikan di bawah, dan memasukkannya ke dalam direktori yang sama seperti yang ditunjukkan di atas.
Setelah anda berada di direktori projek, jalankan perintah berikut untuk memulakan kod:
python3 detector.py
Saya mencuba kod ini pada contoh video yang diperoleh dari Pexels. Bagi saya, FPS sangat perlahan dan mengambil masa lebih kurang 10 hingga 11 minit untuk memproses keseluruhan video.
Daripada menggunakan video, anda bahkan dapat menguji kod ini dengan Kamera Raspberry Pi dengan mengganti cv2.VideoCapture (input) dengan cv2.VideoCapture (0) pada baris ke- 98 kod. Ketahui lebih lanjut mengenai penggunaan PiCamera dengan Raspberry Pi dengan mengikuti pautan.
Ini adalah bagaimana anda boleh menggunakan OpenCV dengan Raspberry Pi untuk mengesan pelanggaran jarak sosial. Video dan kod output diberikan di bawah: