- Komponen Diperlukan
- YOLO
- Menginstal OpenCV di Raspberry Pi
- Menginstal Paket lain yang Diperlukan di Raspberry Pi
- Penjelasan Program
- Menguji Proyek Detektor Jarak Sosial
Di masa Covid-19, social-distancing adalah cara efektif untuk memperlambat penularan virus menular. Masyarakat disarankan untuk meminimalkan kontak satu sama lain untuk meminimalkan risiko penularan penyakit melalui kontak langsung. Menjaga jarak yang aman merupakan tantangan bagi banyak tempat seperti pabrik, bank, bus atau stasiun kereta api, dll.
Jadi sebagai kelanjutan dari proyek keamanan Corona kami sebelumnya seperti mesin pembersih otomatis dan pemantauan suhu tanpa kontak, di sini kami akan membangun sistem Detektor Jarak Sosial menggunakan OpenCV dan Raspberry Pi. Kami akan menggunakan bobot Algoritma Deteksi Objek YOLO v3 dengan modul Jaringan Neural Dalam.
Raspberry Pi selalu merupakan pilihan yang baik untuk proyek pemrosesan gambar karena memiliki lebih banyak memori dan kecepatan daripada pengontrol lainnya. Kami sebelumnya menggunakan Raspberry Pi untuk beberapa proyek pemrosesan gambar yang kompleks seperti deteksi landmark wajah dan aplikasi pengenalan wajah.
Komponen Diperlukan
- Raspberry Pi 4
Di sini kita hanya membutuhkan RPi 4 dengan OpenCV terinstal di atasnya. OpenCV digunakan di sini untuk pemrosesan gambar digital. Aplikasi Pemrosesan Gambar Digital yang paling umum adalah deteksi objek, Pengenalan Wajah, dan penghitung orang.
YOLO
YOLO (You Only Look Once) adalah jaringan saraf konvolusi cerdas (CNN) untuk Deteksi Objek secara real-time. YOLOv3, varian terbaru dari algoritme deteksi objek, YOLO dapat mengenali 80 objek berbeda dalam gambar dan video, dan sangat cepat serta memiliki akurasi yang sangat baik. Algoritme menerapkan jaringan neural tunggal ke seluruh gambar, kemudian memisahkan gambar menjadi beberapa wilayah dan menghitung kotak batas dan probabilitas untuk setiap area. Model dasar YOLO dapat memproses gambar secara real-time dengan kecepatan 45 frame per detik. Model YOLO mengungguli semua metode deteksi lainnya seperti SSD dan R-CNN.
Model YOLOV3 yang akan kami gunakan dalam proyek ini dapat diunduh dari sini.
Menginstal OpenCV di Raspberry Pi
Sebelum menginstal OpenCV dan dependensi lainnya, Raspberry Pi perlu diperbarui sepenuhnya. Gunakan perintah di bawah ini untuk memperbarui Raspberry Pi ke versi terbaru:
sudo apt-get update
Kemudian gunakan perintah berikut untuk menginstal dependensi yang diperlukan untuk menginstal OpenCV di 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
Terakhir, instal OpenCV di Raspberry Pi menggunakan perintah di bawah ini.
pip3 instal opencv-contrib-python == 4.1.0.25
Jika Anda baru mengenal OpenCV, periksa tutorial OpenCV kami sebelumnya dengan Raspberry pi:
- Menginstal OpenCV di Raspberry Pi menggunakan CMake
- Pengenalan Wajah Real-Time dengan Raspberry Pi dan OpenCV
- Pengakuan Plat Lisensi menggunakan Raspberry Pi dan OpenCV
- Estimasi Crowd Size Menggunakan OpenCV dan Raspberry Pi
Kami juga telah membuat serangkaian tutorial OpenCV mulai dari tingkat pemula.
Menginstal Paket lain yang Diperlukan di Raspberry Pi
Sebelum memprogram Raspberry Pi untuk detektor jarak Sosial, mari instal paket lain yang diperlukan.
Memasang imutils: imutils digunakan untuk membuat fungsi pemrosesan gambar penting seperti terjemahan, rotasi, pengubahan ukuran, skeletonization, dan menampilkan gambar Matplotlib lebih mudah dengan OpenCV. Gunakan perintah di bawah ini untuk menginstal imutils:
pip3 instal imutils
Penjelasan Program
Kode lengkap diberikan di akhir halaman. Di sini kami menjelaskan bagian penting dari kode untuk penjelasan yang lebih baik.
Jadi di awal kode, impor semua pustaka yang diperlukan yang akan digunakan dalam proyek ini.
import numpy sebagai np import cv2 import Imutils import os import time
Fungsi Check () digunakan untuk menghitung jarak antara dua objek atau dua titik dalam satu frame video. Titik a dan b menunjukkan dua benda dalam bingkai. Kedua titik ini digunakan untuk menghitung Jarak Euclidean antar objek.
def Periksa (a, b): dist = ((a - b) ** 2 + 550 / ((a + b) / 2) * (a - b) ** 2) ** 0,5 kalibrasi = (a + b) / 2 if 0 <dist <0.25 * calibration: return True else: return False
Fungsi setup digunakan untuk mengatur path untuk bobot YOLO, file cfg, file nama COCO. Modul os.path digunakan untuk manipulasi nama path umum. Modul os.path.join () adalah sub-modul dari os.path dan digunakan untuk menggabungkan satu atau lebih komponen jalur secara cerdas. cv2.dnn.readNetFromDarknet () metode digunakan untuk memuat bobot yang disimpan ke dalam jaringan. Setelah memuat bobot, ekstrak daftar semua lapisan yang digunakan dalam jaringan menggunakan model net.getLayerNames .
def Setup (yolo): global neural_net, ln, LABELS weights = os.path.sep.join () config = os.path.sep.join () labelsPath = os.path.sep.join () LABELS = open (labelsPath).read (). strip (). split ("\ n") neural_net = cv2.dnn.readNetFromDarknet (config, weights) ln = neural_net.getLayerNames () ln = - 1] untuk saya di neural_net.getUnconnectedOutLayers ()]
Di dalam fungsi pemrosesan gambar, kami mengambil satu frame video dan kemudian memprosesnya untuk deteksi jarak sosial antara setiap orang dalam kerumunan. Dalam dua baris pertama dari fungsi tersebut, kami menetapkan dimensi bingkai video (W, H) sebagai (Tidak Ada, Tidak Ada) pada awalnya. Di baris berikutnya, kami menggunakan metode cv2.dnn.blobFromImage () untuk memuat frame dalam batch dan menjalankannya melalui jaringan. Fungsi blob melakukan pengurangan Rata-rata, Penskalaan, dan pertukaran Saluran pada bingkai.
(H, W) = (None, None) frame = image.copy () jika W is None atau H is None: (H, W) = frame.shape blob = cv2.dnn.blobFromImage (frame, 1 / 255.0, (416, 416), swapRB = True, crop = False) neural_net.setInput (blob) starttime = time.time () layerOutputs = neural_net.forward (ln)
Keluaran lapisan dari YOLO terdiri dari sekumpulan nilai. Nilai-nilai ini membantu kita menentukan objek mana yang termasuk dalam kelas mana. Kami mengulang setiap output di layerOutputs dan saat kami mendeteksi orang, kami menetapkan label kelas sebagai "person". Dari setiap deteksi, kami mendapatkan kotak pembatas yang memberi kami pusat X, pusat Y, Lebar, dan Tinggi kotak untuk dideteksi di keluaran:
skor = deteksi maxi_class = np.argmax (skor) keyakinan = skor jika LABELS == "orang": jika keyakinan> 0,5: box = deteksi * np.array () (centerX, centerY, width, height) = box.astype ("int") x = int (centerX - (lebar / 2)) y = int (centerY - (tinggi / 2)) outline.append () confidences.append (float (kepercayaan))
Setelah itu, hitung jarak antara pusat kotak saat ini dengan semua kotak terdeteksi lainnya. Jika kotak pembatas dekat, ubah status menjadi benar.
untuk i dalam rentang (len (tengah)): untuk j dalam rentang (len (tengah)): dekat = Periksa (tengah, tengah) jika dekat: pasang.append (, tengah]) status = status Benar = True index = 0
Pada baris berikutnya, gambar persegi panjang di sekitar orang tersebut menggunakan dimensi kotak yang kami terima dari model, lalu periksa apakah kotak tersebut aman atau tidak. Jika jarak antar kotak berdekatan, maka warna kotak akan diwarnai merah atau kotak akan diwarnai hijau.
(x, y) = (outline, outline) (w, h) = (outline, outline) if status == True: cv2. rectangle (frame, (x, y), (x + w, y + h), (0, 0, 150), 2) status elif == Salah: cv2. rectangle (bingkai, (x, y), (x + w, y + h), (0, 255, 0), 2)
Sekarang di dalam fungsi loop , kita membaca setiap frame video dan kemudian memproses setiap frame untuk menghitung jarak antar orang.
ret, frame = cap.read () jika tidak 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): Setup (yolo) ImageProcess (current_img) Frame = diprosesImg
Di baris berikutnya, gunakan fungsi cv2.VideoWriter () untuk menyimpan video keluaran 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 Proyek Detektor Jarak Sosial
Setelah kode Anda siap, buka terminal Pi dan arahkan ke direktori proyek. Kode, model Yolo, dan video demo harus berada dalam folder yang sama seperti yang ditunjukkan di bawah ini.
Anda dapat mengunduh direktori YoloV3 dari sini, video dari Pexels dan menyalin kode Python yang diberikan di bawah ini, dan meletakkannya di direktori yang sama seperti yang ditunjukkan di atas.
Setelah Anda berada di direktori proyek, jalankan perintah berikut untuk memulai kode:
python3 detector.py
Saya mencoba kode ini pada contoh video yang diperoleh dari Pexels. Bagi saya, FPSnya sangat lambat dan butuh sekitar 10 hingga 11 menit untuk memproses seluruh video.
Alih-alih menggunakan video, Anda bahkan dapat menguji kode ini dengan Raspberry Pi Camera dengan mengganti cv2.VideoCapture (input) dengan cv2.VideoCapture (0) di baris ke- 98 kode. Pelajari lebih lanjut tentang menggunakan PiCamera dengan Raspberry Pi dengan mengikuti tautannya.
Ini adalah bagaimana Anda dapat menggunakan OpenCV dengan Raspberry Pi untuk mendeteksi pelanggaran jarak sosial. Video dan kode keluaran diberikan di bawah ini: