- Gerekli Bileşenler
- YOLO
- OpenCV'yi Raspberry Pi'ye Yükleme
- Raspberry Pi'de Diğer Gerekli Paketleri Kurmak
- Program Açıklaması
- Sosyal Mesafe Dedektörü Projesinin Test Edilmesi
Covid-19 zamanında, sosyal mesafe, bulaşıcı virüsün bulaşmasını yavaşlatmanın etkili bir yoludur. Hastalığın doğrudan temas yoluyla bulaşma riskini en aza indirmek için insanlara birbirleriyle temaslarını en aza indirmeleri tavsiye edilir. Güvenli bir mesafeyi korumak, fabrikalar, bankalar, otobüsler veya tren istasyonları gibi birçok yer için zorlu bir iştir.
Bu nedenle, Otomatik dezenfektan makinesi ve temassız sıcaklık izleme gibi önceki Corona güvenlik projelerimizin devamında, burada OpenCV ve Raspberry Pi kullanarak bir Sosyal Uzaklaştırma Dedektörü sistemi oluşturacağız. Derin Sinir Ağı modülü ile YOLO v3 Nesne Algılama Algoritmasının ağırlıklarını kullanacağız.
Raspberry Pi, diğer denetleyicilerden daha fazla belleğe ve hıza sahip olduğu için Görüntü işleme projeleri için her zaman iyi bir seçimdir. Raspberry Pi'yi daha önce yüz işareti algılama ve Yüz tanıma uygulaması gibi bazı karmaşık görüntü işleme projeleri için kullandık.
Gerekli Bileşenler
- Ahududu Pi 4
Burada sadece OpenCV kurulu RPi 4'e ihtiyacımız var. OpenCV, burada dijital görüntü işleme için kullanılır. Dijital Görüntü İşlemenin en yaygın uygulamaları nesne algılama, Yüz Tanıma ve insan sayacıdır.
YOLO
YOLO (Sadece Bir Kez Bakarsınız), gerçek zamanlı Nesne Algılama için akıllı bir Evrişim sinir ağıdır (CNN). Nesne algılama algoritmasının en son çeşidi olan YOLOv3, YOLO görüntülerde ve videolarda 80 farklı nesneyi tanıyabilir ve süper hızlıdır ve mükemmel doğruluğa sahiptir. Algoritma tüm görüntüye tek bir sinir ağı uygular, ardından görüntüyü bölgelere ayırır ve her alan için sınır kutuları ve olasılıkları hesaplar. Temel YOLO modeli, görüntüleri saniyede 45 kare ile gerçek zamanlı olarak işleyebilir. YOLO modeli, SSD ve R-CNN gibi diğer tüm algılama yöntemlerinden daha iyi performans gösterir.
Bu projede kullanacağımız YOLOV3 modelini buradan indirebilirsiniz.
OpenCV'yi Raspberry Pi'ye Yükleme
OpenCV ve diğer bağımlılıkları kurmadan önce, Raspberry Pi'nin tamamen güncellenmesi gerekir. Raspberry Pi'yi en son sürümüne güncellemek için aşağıdaki komutları kullanın:
sudo apt-get güncellemesi
Ardından, OpenCV'yi Raspberry Pi'nize yüklemek için gerekli bağımlılıkları yüklemek için aşağıdaki komutları kullanın.
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-testi -y
Son olarak, aşağıdaki komutları kullanarak OpenCV'yi Raspberry Pi'ye kurun.
pip3 kurulum opencv-katkıda-python == 4.1.0.25
OpenCV'de yeniyseniz, Raspberry pi ile önceki OpenCV öğreticilerimize bakın:
- OpenCV'yi CMake kullanarak Raspberry Pi'ye yükleme
- Raspberry Pi ve OpenCV ile Gerçek Zamanlı Yüz Tanıma
- Raspberry Pi ve OpenCV kullanarak Plaka Tanıma
- OpenCV ve Raspberry Pi Kullanarak Kalabalık Boyutu Tahmini
Başlangıç seviyesinden başlayarak bir dizi OpenCV öğreticisi de oluşturduk.
Raspberry Pi'de Diğer Gerekli Paketleri Kurmak
Raspberry Pi for Social mesafe dedektörünü programlamadan önce, diğer gerekli paketleri kuralım.
İmutils'i yükleme: imutils, OpenCV ile Matplotlib görüntülerini çevirme, döndürme, yeniden boyutlandırma, iskeletleştirme ve görüntüleme gibi temel görüntü işleme işlevlerini kolaylaştırmak için kullanılır. İmutil'leri yüklemek için aşağıdaki komutu kullanın:
pip3 imutils yükle
Program Açıklaması
Tam kod sayfanın sonunda verilmiştir. Daha iyi bir açıklama için burada kodun önemli bölümlerini açıklıyoruz.
Dolayısıyla, kodun başlangıcında, bu projede kullanılacak tüm gerekli kitaplıkları içe aktarın.
numpy'yi np olarak içe aktar cv2 içe aktar imutils içe aktarma işletim sistemi içe aktarma süresi
Ara () işlevi videonun bir çerçeve içinde iki nesne ya da iki nokta arasındaki mesafeyi hesaplamak için kullanılır. A ve b noktaları, çerçevedeki iki nesneyi belirtir. Bu iki nokta, nesneler arasındaki Öklid Mesafesini hesaplamak için kullanılır.
def Kontrol edin (a, b): dist = ((a - b) ** 2 + 550 / ((a + b) / 2) * (a - b) ** 2) ** 0.5 kalibrasyon = (a + b) / 2 eğer 0 <dist <0.25 * kalibrasyon: True else: döndür False
Kurulum işlevi, YOLO ağırlıkları, cfg dosyası, COCO adları dosyası için yolları ayarlamak için kullanılır. os.path modülü, ortak yol adı manipülasyonu için kullanılır. os.path.join () modülü, os.path'in bir alt modülüdür ve bir veya daha fazla yol bileşenini akıllıca birleştirmek için kullanılır. cv2.dnn.readNetFromDarknet () yöntemi, kaydedilen ağırlıkları ağa yüklemek için kullanılır. Ağırlıkları yükledikten sonra, bir net.getLayerNames modeli kullanarak bir ağda kullanılan tüm katmanların listesini çıkarın .
def Kurulum (yolo): global neural_net, ln, LABELS ağırlıkları = 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] i in neural_net.getUnconnectedOutLayers ()]
Görüntü işleme işlevinin içinde, tek bir video karesi alırız ve ardından bunu kalabalıktaki herkes arasında sosyal mesafe tespiti için işleriz. Fonksiyonun ilk iki satırında, başlangıçta video karesinin (G, Y) boyutlarını (Yok, Yok) olarak ayarladık. Sonraki satırda, çerçeveleri bir toplu iş olarak yüklemek ve ağ üzerinden çalıştırmak için cv2.dnn.blobFromImage () yöntemini kullandık. Blob işlevi, bir çerçeve üzerinde Ortalama çıkarma, Ölçeklendirme ve Kanal değiştirme gerçekleştirir.
(Y, G) = (Yok, Yok) kare = resim. Copy (), eğer W Yok veya H Yok ise: (Y, W) = frame.shape blob = cv2.dnn.blobFromImage (çerçeve, 1 / 255.0, (416, 416), swapRB = True, crop = False) neural_net.setInput (blob) starttime = time.time () layerOutputs = neural_net.forward (ln)
YOLO'nun katman çıktıları bir dizi değerden oluşur. Bu değerler, hangi nesnenin hangi sınıfa ait olduğunu belirlememize yardımcı olur. LayerOutputs'taki her çıktı üzerinde döngü yapıyoruz ve insanları tespit ederken sınıf etiketini "person" olarak ayarlıyoruz. Her algılamadan, çıktıda algılama için bize X merkezini, Y merkezini, Genişliğini ve Yüksekliğini veren bir sınırlayıcı kutu elde ederiz:
puanlar = algılama maxi_class = np.argmax (puanlar) güven = LABELS == "kişi" ise puanlar: güven> 0,5 ise: kutu = algılama * np.array () (centerX, centerY, width, height) = box.astype ("int") x = int (merkezX - (genişlik / 2)) y = int (merkezY - (yükseklik / 2)) anahat.append () confidences.append (float (güven))
Bundan sonra, mevcut kutunun merkezi ile diğer algılanan kutular arasındaki mesafeyi hesaplayın. Sınırlayıcı kutular yakınsa, durumu doğru olarak değiştirin.
aralıktaki i için (uzunluk (merkez)): aralıktaki j için (uzunluk (merkez)): kapat = Kontrol et (merkez, merkez) eğer yakınsa: çiftler.append (, merkez]) durum = Doğru durum = Gerçek indeks = 0
Sonraki satırlarda, modelden aldığımız kutu boyutlarını kullanarak kişinin etrafına bir dikdörtgen çizin, ardından kutunun güvenli olup olmadığını kontrol edin. Kutular arası mesafe yakın ise kutu rengi kırmızı, aksi takdirde kutu yeşil renkte olacaktır.
(x, y) = (anahat, anahat) (w, h) = (anahat, anahat) eğer durum == Doğru: cv2.rectangle (çerçeve, (x, y), (x + w, y + h), (0, 0, 150), 2) elif durumu == Yanlış: cv2.rectangle (çerçeve, (x, y), (x + w, y + h), (0, 255, 0), 2)
Şimdi döngü işlevinin içinde, videonun her karesini okuyoruz ve ardından kişiler arasındaki mesafeyi hesaplamak için her kareyi işliyoruz.
ret, çerçeve = cap.read () eğer ret değilse: break current_img = frame.copy () current_img = imutils.resize (current_img, width = 480) video = current_img.shape frameno + = 1 if (frameno% 2 == 0 veya frameno == 1): Kurulum (yolo) ImageProcess (current_img) Frame = processingImg
Sonraki satırlarda, çıktı videosunu daha önce tanımladığımız opname ile belirtilen konumda saklamak için cv2.VideoWriter () işlevini kullanın.
create None ise: fourcc = cv2.VideoWriter_fourcc (* 'XVID') create = cv2.VideoWriter (opname, fourcc, 30, (Frame.shape, Frame.shape), True) create.write (Frame)
Sosyal Mesafe Dedektörü Projesinin Test Edilmesi
Kodunuz hazır olduğunda, bir Pi terminali açın ve proje dizinine gidin. Kod, Yolo modeli ve demo videosu aşağıda gösterildiği gibi aynı klasörde olmalıdır.
Buradan YoloV3 dizinini, videoları Pexels'den indirebilir ve aşağıda verilen Python kodunu kopyalayıp yukarıda gösterildiği gibi aynı dizine koyabilirsiniz.
Proje dizinindeyken, kodu başlatmak için aşağıdaki komutu yürütün:
python3 detector.py
Bu kodu Pexels'den alınan bir video örneğinde denedim. Benim için FPS çok yavaştı ve videonun tamamını işlemek yaklaşık 10 ila 11 dakika sürdü.
Bunun yerine bir video kullanmak yerine, hatta değiştirerek Ahududu Pi Kamera ile bu kodu test edebilirsiniz cv2.VideoCapture (giriş) ile cv2.VideoCapture (0) 98 ' inci kod satırını. Bağlantıyı takip ederek Raspberry Pi ile PiCamera'yı kullanma hakkında daha fazla bilgi edinin.
Sosyal mesafe ihlallerini tespit etmek için OpenCV'yi Raspberry Pi ile bu şekilde kullanabilirsiniz. Çıkış videosu ve kodu aşağıda verilmiştir: