Tarihin en güçlü yardımcı pilotu araba kullanırken uyuklarken mi? Python sizi uyandırır

Tam metin 3641 kelime ve beklenen öğrenme süresi 17 dakikadır

Kaynak: unsplash

Binlerce yol var, önce güvenlik! Yorgun sürüş, trafik kazalarının en büyük suçlularından biri olarak tanımlanabilir.ABD'de yapılan bir araştırmaya göre sürücüler 4 saatten az uyurlar ve trafik kazası olasılığı alkollü araç kullanma ile eşdeğerdir.

Yorgun sürüş olgusunu azaltmak için, sürücü yorgunluğu tespiti ortaya çıktı. Bu, sürüş sırasında sürücü yorgunluğunun neden olduğu güvenlik kazalarını önleyebilen bir güvenlik teknolojisidir.

Bu Python ara projesinin amacı, insan gözünün kapalı kaldığı sürenin uzunluğunu tespit etmek için bir sürücü yorgunluğu algılama sistemi kurmaktır. Sürücünün yorgun olduğunu algıladığında, sistem bir uyarı verecektir.

Sürücü yorgunluk algılama sistemi

Bu Python projesi, web kameralarından görüntüler toplamak ve bunları insan gözlerini "açık" veya "kapalı" olarak sınıflandıran "derin öğrenme" modeline girmek için OpenCV'yi kullanacak. Python projesinin benimsediği yaklaşım şu şekildedir:

Adım 1 - Giriş olarak kameradan bir görüntü alın.

Adım 2-Görüntüdeki yüzü tespit edin ve bir ilgi bölgesi (ROI) oluşturun.

Adım 3-ROI'den insan gözünü tespit edin ve sınıflandırıcıya girin.

Adım 4-Sınıflandırıcı, insan gözünü açıp kapatarak sınıflandıracaktır.

Adım 5 - Sürücünün yorgun olup olmadığını belirlemek için puanı hesaplayın.

Önkoşulları, veri setlerini ve model yapısını öğrenmeden önce, acemiyseniz, Python programlama dilinin gerektirdiği tüm kavramları anlamak için Python Ana Sayfasına başvurmanız önerilir.

ön koşullar

Bu Python projesi, görüntüleri yakalamak için bir web kamerası gerektirir. Python'u sisteminize kurmanız (3.6 sürümü önerilir) ve ardından gerekli paketleri kurmak için pip kullanmanız gerekir.

· OpenCV-opencv-python (yüz ve göz algılama) kurmak için pip kullanın.

· TensorFlow-Tensorflow'u kurmak için pip kullanın (keras, arka uç olarak TensorFlow kullanır).

· Keras-Keras'ı kurmak için pip kullanın (bir sınıflandırma modeli oluşturun).

· Pygame-Pygame'i yüklemek için pip kullanın (bir uyarı sesi çalın).

veri seti

Bu model için bir veri seti oluşturmanız gerekiyor. Veri setini oluşturmak için, kameradan insan gözü görüntüsünü yakalamak ve yerel diskte saklamak için bir komut dosyası yazdık İnsan gözü görüntüsü iki türe ayrılır: "açık" veya "kapalı". Verileri manuel olarak temizlemek için görüntülere ihtiyaç vardır.

Veriler, farklı aydınlatma koşulları altında insan gözünün yaklaşık 7000 görüntüsünü içerir. Modeli veri kümesi üzerinde eğittikten sonra, son ağırlık ve model yapısı dosyasını "modeller /cnnCat2.h5" ekledik. Şimdi bu modeli, görüntüleri insan gözünün açık veya kapalı olmasına göre sınıflandırmak için kullanabilirsiniz.

Kaynak: unsplash

Model yapısı

Kullandığımız model, Keras tarafından bir evrişimli sinir ağı (CNN) aracılığıyla oluşturulmuştur. Evrişimli sinir ağı, görüntü sınıflandırmada çok iyi performans gösteren özel bir derin sinir ağı türüdür.

CNN temelde bir giriş katmanından, bir çıktı katmanından ve birden çok katman içerebilen gizli bir katmandan oluşur. Katmanlar ve filtreler üzerinde 2D matris çarpımları gerçekleştiren filtreler aracılığıyla bu katmanlar üzerinde evrişim işlemleri gerçekleştirilir.

CNN model yapısı aşağıdaki katmanları içerir:

· Evrişimli katman; 32 düğüm, çekirdek boyutu 3

· Evrişimli katman; 32 düğüm, çekirdek boyutu 3

· Evrişimli katman; 64 düğüm, çekirdek boyutu 3

Tamamen bağlı katman; 128 düğüm

Son katman ayrıca 2 düğümlü tamamen bağlantılı bir katmandır. Softmax kullanan çıktı katmanı hariç tüm katmanlarda Relu aktivasyon fonksiyonu kullanılır.

Python projesinde sürücü yorgunluğunu algılama adımları

Python proje kaynak kodunu zip'ten indirin ve sistemdeki dosyaları çıkartın: Python proje Zip dosyası.

Zip dizini:

1. "Haar cascade files / cascade files" klasörü, görüntüdeki nesneleri algılamak için gereken xml dosyalarını içerir. Bu durumda insan yüzlerinin ve gözlerinin algılanması gerekir.

2. Model klasörü, evrişimli sinir ağı üzerinde eğitilmiş "cnnCat2.h5" model dosyamızı içerir.

3. Sürücü uykulu olduğunda çalmak için kullanılan sesli bir "alarm.wav" sahibiz.

4. "Model.py" dosyası, veri kümesinin bir sınıflandırma modeli oluşturmak için eğitildiği bir program içerir. Evrişimli sinir ağının uygulanmasını bu dosyadan öğrenebilirsiniz.

5. "Uyuşuklukdeteksiyonu.py" bu projenin ana dosyasıdır. Testi başlatırken bu dosyayı çalıştırmalıyız.

Kaynak: unsplash

Sonraki. Algoritmanın nasıl çalıştığını adım adım anlayalım.

Adım 1 - Giriş olarak kameradan bir görüntü alın

Giriş olarak görüntüleri yakalamak için bir web kamerası kullanın. Web kamerasına erişmek için, her kareyi yakalamak için sonsuz bir döngü gerçekleştirdik. Kameraya erişmek ve yakalama nesnesini (cap) ayarlamak için OpenCV tarafından sağlanan cv2.VideoCapture (0) yöntemini kullanıyoruz. cap.read () her kareyi okur ve görüntüyü çerçeve değişkeninde depolar.

Adım 2 - Görüntüdeki yüzü tespit edin ve bir ilgi bölgesi (ROI) oluşturun

Bir görüntüdeki insan yüzlerini algılamak için, önce görüntü modunun gri tonlamaya dönüştürülmesi gerekir, çünkü nesne algılama için OpenCV algoritması bir giriş gri tonlamalı görüntü gerektirir. Bu nedenle nesne renk bilgisi olmadan tespit edilebilir.

Yüzleri algılamak için haar kademeli sınıflandırıcıyı kullanacağız. Sınıflandırıcıyı face = cv2.CascadeClassifier ('haar cascade xml dosyasına giden yol') ile ayarlayın ve ardından algılama gerçekleştirmek için faces = face.detectMultiScale (gri) kullanın. Ardından x, y koordinatları ve yüksekliği (nesne sınırlama kutusunun genişliği) olan bir algılama dizisi oluşturulur. Şimdi bu yüzleri yineleyebilir ve her yüz için bir sınırlayıcı kutu çizebiliriz.

yüzlerde (x, y, w, h) için: cv2.rectangle (çerçeve, (x, y), (x + w, y + h), (100,100,100), 1)

Adım 3 - ROI'den insan gözünü tespit edin ve sınıflandırıcıya girin

İnsan yüzlerini tespit etme süreci, insan gözlerini tespit etmek için de geçerlidir.

İlk olarak, sırasıyla leye ve reye'deki gözler için kademeli sınıflandırıcılar kurduk ve ardından insan gözlerini tespit etmek için left_eye = leye.detectMultiScale (gri) kullanıyoruz. Şimdi, sadece insan gözü verilerini tam görüntüden çıkarmamız gerekiyor. Bu, gözün sınırlayıcı kutusunun çıkarılmasıyla elde edilebilir ve daha sonra bu kod, çerçeveden göz görüntüsünü çıkarmak için kullanılabilir.

l_eye = çerçeve

l_eye yalnızca sol gözün görüntü verilerini içerir. Bu, gözlerin açık mı yoksa kapalı mı olduğunu tahmin edecek olan CNN sınıflandırıcısına beslenecektir. Benzer şekilde, sağ gözün verilerini r_eye'ye çıkarıyoruz.

Kaynak: unsplash

Adım 4 - Sınıflandırıcı, gözleri açık veya kapalı olarak sınıflandıracaktır. .

Göz durumunu tahmin etmek için CNN sınıflandırıcısını kullanın. Modelin doğru boyuttan başlaması gerektiğinden, görüntü modele girilmeden önce bazı işlemlerin gerçekleştirilmesi gerekir.

Öncelikle, renkli bir görüntüyü gri tonlamalı bir görüntüye dönüştürmek için r_eye = cv2.cvtColor (r_eye, cv2.COLOR_BGR2GRAY) kullanın.

Ardından, model 24 * 24 piksel bir görüntü üzerinde test edildiğinden, görüntünün 24 * 24 piksele ayarlanması gerekir:

cv2.resize (r_eye, (24,24)). Daha iyi yakınsama elde etmek için verileri standartlaştırıyoruz: r_eye = r_eye / 255 (tüm değerler 0-1 arasındadır). Sınıflandırıcıya girdi için boyutları genişletin. Modeli yüklemek için model = load_model (models / cnnCat2.h5) kullanın.

Şimdi, her bir gözün durumunu tahmin etmek için modeli kullanıyoruz: lpred = model.predict_classes (l_eye). Lpred = 1 ise gözler açık, lpred = 0 ise gözler kapalıdır.

Adım 5 - Sürücünün yorgun olup olmadığını belirlemek için puanı hesaplayın

Puan, temelde sürücünün gözlerinin ne kadar kapalı kalacağını belirlemek için kullanılan bir değerdir. Dolayısıyla her iki göz de kapalıysa puan artmaya devam ederken gözler açıkken puan düşecektir. Sürücünün gerçek zamanlı durumunu gösteren ekranda sonucu çizmek için cv2.putText () işlevini kullanın.

cv2.putText (çerçeve, "Açık", (10, yükseklik-20), yazı tipi, 1, (255,255,255), 1, cv2.LINE_AA)

Eşik aşağıdaki yöntemle belirlenir: Örneğin, puan 15'ten büyükse, sürücünün uzun süre gözlerini kapattığı anlamına gelir, eşik 15'tir. Bu noktada, alarmı çalmak için sound.play () kullanacağız.

Kaynak: unsplash

Ana dosyanın kaynak kodu aşağıdaki gibidir:

cv2 içe aktar işletim sistemini içe aktar fromkeras.models importload_model numpy asnp içe aktar pygameimport karıştırıcısından ithalat zamanı mixer.init () ses = mixer.Sound ('alarm.wav') face = cv2.CascadeClassifier ('haar basamaklı dosyaları \ haarcascade_frontalface_alt.xml') leye = cv2.CascadeClassifier ('haar basamaklı dosyaları \ haarcascade_lefteye_2splits.xml') reye = cv2.CascadeClassifier ('haar basamaklı dosyaları \ haarcascade_righteye_2splits.xml') lbl = model = load_model ('modeller / cnncat2.h5') yol = os.getcwd () cap = cv2.VideoCapture (0) font = cv2.FONT_HERSHEY_COMPLEX_SMALL count = 0 skor = 0 thicc = 2 rpred = lpred = while (Doğru): ret, çerçeve = cap.read () yükseklik, genişlik = frame.shape gray = cv2.cvtColor (çerçeve, cv2.COLOR_BGR2GRAY) faces = face.detectMultiScale (gri, minNeighbors = 5, scaleFactor = 1,1, minSize = (25,25)) left_eye = leye.detectMultiScale (gri) right_eye = reye.detectMultiScale (gri) cv2.rectangle (çerçeve, (0, yükseklik-50), (200, yükseklik), (0,0,0), kalınlık = cv2.FILLED) yüzlerde (x, y, w, h) için: cv2.rectangle (çerçeve, (x, y), (x + w, y + h), (100,100,100), 1) (x, y, w, h) için right_eye: r_eye = çerçeve count = count + 1 r_eye = cv2.cvtColor (r_eye, cv2.COLOR_BGR2GRAY) r_eye = cv2.resize (r_eye, (24,24)) r_eye = r_eye / 255 r_eye = r_eye.reshape (24,24, -1) r_eye = np.expand_dims (r_eye, axis = 0) rpred = model.predict_classes (r_eye) eğer (rpred == 1): lbl = 'Aç' eğer (rpred == 0): lbl = 'Kapalı' kırmak left_eye (x, y, w, h) için: l_eye = çerçeve count = count + 1 l_eye = cv2.cvtColor (l_eye, cv2.COLOR_BGR2GRAY) l_eye = cv2.resize (l_eye, (24,24)) l_eye = l_eye / 255 l_eye = l_eye.reshape (24,24, -1) l_eye = np.expand_dims (l_eye, axis = 0) lpred = model.predict_classes (l_eye) eğer (lpred == 1): lbl = 'Aç' eğer (lpred == 0): lbl = 'Kapalı' kırmak eğer (rpred == 0 ve lpred == 0): puan = puan + 1 cv2.putText (çerçeve, "Kapalı", (10, yükseklik-20), yazı tipi, 1, (255,255,255), 1, cv2.LINE_AA) # if (rpred == 1 veya lpred == 1): Başka: skor = skor-1 cv2.putText (çerçeve, "Açık", (10, yükseklik-20), yazı tipi, 1, (255,255,255), 1, cv2.LINE_AA) eğer (puan < 0): skor = 0 cv2.putText (çerçeve, 'Puan:' + str (puan), (100, yükseklik-20), yazı tipi, 1, (255,255,255), 1, cv2.LINE_AA) eğer (puan > 15): #person uykulu hissediyor, bu yüzden alarmı çalıyoruz cv2.imwrite (os.path.join (yol, 'resim.jpg'), çerçeve) Deneyin: sound.play () dışında: # isplaying = False geçmek eğer (thicc < 16): thicc = thicc + 2 Başka: thicc = thicc-2 eğer (thicc < 2): thicc = 2 cv2.rectangle (çerçeve, (0,0), (genişlik, yükseklik), (0,0,255), thicc) cv2.imshow ('çerçeve', çerçeve) cv2.waitKey (1) ve 0xFF == ord ('q') ise: kırmak cap.release () cv2.destroyAllWindows ()

Python proje örneği

Projeyi başlatın ve projenin işleyişini kontrol edin. Projeyi başlatmak için, bir komut istemi açmanız ve "drowsinessdetection.py" ana dosyasının bulunduğu dizine gitmeniz gerekir. Komut dosyasını çalıştırmak için aşağıdaki komutu kullanın.

python "uyuşukluk algılama.py"

Web kamerasını açmak ve algılamayı başlatmak birkaç saniye sürebilir.

Örnek ekran görüntüsü:

Çıktı ekran görüntüsü:

1. Kapalı göz algılama

2. Göz açıklığı algılama

3. Yorgunluk uyarısı

Bu Python projesi, birçok şekilde uygulayabileceğiniz bir sürücü yorgunluğu uyarı sistemi oluşturur. OpenCV kullanarak yüzleri ve gözleri algılamak için Haar kademeli sınıflandırıcısını kullanıyoruz ve ardından durumu CNN modeline göre tahmin ediyoruz.

Sürüşü düzenlemek için hangisi daha iyidir? Python güvenlik görevlisi size yardımcı olur. Kendinizin ve başkalarının güvenliği için lütfen yorulmayın!

Yorum Beğen Takip Et

Yapay zeka öğrenme ve geliştirmenin kuru mallarını paylaşalım

Yeniden yazdırıyorsanız, lütfen arka planda bir mesaj bırakın ve yeniden yazdırma şartnamelerine uyun

Bugün Xinsheng | Teknoloji Tarihe Tanık! Dünyanın dört bir yanından 140 ünlü evde çevrimiçi konserler veriyor
önceki
Bugünün Temel Sesi Universal Mini Programında nihayet bir kedinin "Facebook" u var
Sonraki
Çok fazla öğe! İlham almanıza yardımcı olacak 100 harika API seçin
Utanmayın! Çoğu insan aslında sadece sözde veri bilimcileridir
"Sohbet edemeyen" sohbet robotları: Siri neden bu kadar "aptal"?
Yeni taç ölüm oranı hala yüksek, neden İtalya?
İyi bir programcının uzman olması için kaç tane programlama dili gerekir?
"Makine öğrenimi" ni gerçekten öğreniyor musunuz? "Makine öğrenimi" nasıl öğrenilir?
Moderna yeni taç aşısını iki ayda nasıl geliştirdi?
Yaygın hatalar büyük hatalara yol açar! Bir düzineden fazla tıbbi araştırma "boşa çıktı"
Flutter, Native, React-Native, performans kralı kim?
Salgın sırasında hayat nasıldı? AI yazarlarının çevrimiçi günlük yazmalarını izleyin
Bugünkü Core Voice | Bao Mouming davasıyla ilgili olarak söylemek istediğim şey şirketteki saatli bomba
Salgın sona mı geliyor? Dünyanın en güçlü süper bilgisayarı, koronavirüse karşı savaşa katıldı
To Top