Taula de continguts:

Sistema d'alerta de somnolència: 3 passos
Sistema d'alerta de somnolència: 3 passos

Vídeo: Sistema d'alerta de somnolència: 3 passos

Vídeo: Sistema d'alerta de somnolència: 3 passos
Vídeo: Беслан. Помни / Beslan. Remember (english & español subs) 2024, De novembre
Anonim
Sistema d'alerta de somnolència
Sistema d'alerta de somnolència

Cada any moltes persones perden la vida a causa d’accidents de carretera mortals a tot el món i la conducció adormida és una de les principals causes d’accidents de trànsit i de mort. La fatiga i el micro son als controls de conducció solen ser la causa fonamental d’accidents greus. No obstant això, es poden detectar signes inicials de fatiga abans que es produeixi una situació crítica i, per tant, la detecció de la fatiga del conductor i la seva indicació són un tema d’investigació en curs. La majoria dels mètodes tradicionals per detectar somnolència es basen en aspectes conductuals, mentre que alguns són intrusius i poden distreure els conductors, mentre que alguns requereixen uns sensors costosos. Per tant, en aquest document es desenvolupa i s’implementa un sistema de detecció de somnolència del conductor en temps real i lleuger en aplicacions per a Android. El sistema registra els vídeos i detecta la cara del conductor en tots els fotogrames mitjançant l’ús de tècniques de processament d’imatges. El sistema és capaç de detectar fites facials, calcula la proporció d’aspecte ocular (EAR) i la proporció de tancament ocular (ECR) per detectar la somnolència del conductor en funció del llindar adaptatiu. S'han emprat algoritmes d'aprenentatge automàtic per comprovar l'eficàcia de l'enfocament proposat. Els resultats empírics demostren que el model proposat és capaç d’aconseguir una precisió del 84% mitjançant un classificador forestal aleatori.

Pas 1: coses que necessiteu

1. PI FRASSA

2. WEBCAM (CAM WEB C270 HD PER MILLORS RESULTATS)

És possible que la versió de PC necessiti alguns canvis al codi

Pas 2: Codi de Python amb conjunt de dades del predictor de forma d'ulls (versió de PC)

per detectar els ulls de manera molt efectiva en un vídeo en temps real, podem utilitzar aquest fitxer.dat següent.

drive.google.com/open?id=1UiSHe72L4TeN14VK…

Descarregueu el fitxer.dat des de l'enllaç superior i executeu el codi python següent

Codi Python

des de la importació scipy.spatial importació d'imutils importació face_utils importació d'imutils importació dlib importació cv2

def eye_aspect_ratio (ull):

A = distància.euclidiana (ull [1], ull [5]) B = distància.euclidiana (ull [2], ull [4]) C = distància.euclidiana (ull [0], ull [3]) orella = (A + B) / (2.0 * C) retorn de l'oïda = 0,25 frame_check = 20 detect = dlib.get_frontal_face_detector () predict = dlib.shape_predictor (". / Shape_predictor_68_face_landmarks.dat") # El fitxer Dat és el quid del codi

(lStart, lEnd) = face_utils. FACIAL_LANDMARKS_68_IDXS ["left_eye"]

(rStart, rEnd) = face_utils. FACIAL_LANDMARKS_68_IDXS ["right_eye"] cap = cv2. VideoCapture (0) flag = 0 while True: ret, frame = cap.read () frame = imutils.resize (frame, width = 450) gris = cv2.cvtColor (marc, cv2. COLOR_BGR2GRAY) subjectes = detectar (gris, 0) per a subjectes en subjectes: forma = predir (gris, subjecte) shape = face_utils.shape_to_np (forma) #converting to NumPy Array leftEye = shape [lStart: lEnd] rightEye = shape [rStart: rEnd] leftEAR = eye_aspect_ratio (leftEye) rightEAR = eye_aspect_ratio (rightEye) ear = (leftEAR + rightEAR) / 2.0 leftEyeHull = cv2.convexHull (leftEye) rightEyeHull = cv2.convexHull. drawContours (frame, [LeftEyeHull], -1, (0, 255, 0), 1) cv2.drawContours (frame, [RightEyeHull], -1, (0, 255, 0), 1) if ear = frame_check: cv2.putText (marc, "**************** ALERTA! ****************", (10, 30), cv2. FONT_HERSHEY_SIMPLEX, 0,7, (0, 0, 255), 2) cv2.putText (marc, "***************** ALERTA! *********** ***** ", (10, 325), cv2. FONT_HERSHEY_SIMPLEX, 0,7, (0, 0, 255), 2) #print (" Dro wsy ") else: flag = 0 cv2.imshow (" Frame ", frame) key = cv2.waitKey (1) & 0xFF if key == ord (" q "): break cv2.destroyAllWindows () cap.stop ()

Pas 3: versió de Raspberry Pi

Versió de Raspberry Pi
Versió de Raspberry Pi
Versió de Raspberry Pi
Versió de Raspberry Pi

quan les persones tanquen els ulls, el raspberry pi us donarà l'alerta

CONNECTEU el vostre timbre al pin 23 (veure la imatge)

des de la distància d’importació scipy.spatial

importar RPi. GPIO com a GPIO

a partir del temps importació de son

GPIO.setwarnings (fals)

GPIO.setmode (GPIO. BCM)

des d'imutils importeu face_utils

importar imutils importar dlib importar cv2

zumbador = 23

GPIO.setup (brunzidor, GPIO. OUT)

def eye_aspect_ratio (ull):

A = distància.euclidiana (ull [1], ull [5]) B = distància.euclidiana (ull [2], ull [4]) C = distància.euclidiana (ull [0], ull [3]) orella = (A + B) / (2.0 * C) retorn de l'oïda = 0,25 frame_check = 20 detect = dlib.get_frontal_face_detector () predict = dlib.shape_predictor (". / Shape_predictor_68_face_landmarks.dat") # El fitxer Dat és el quid del codi

(lStart, lEnd) = face_utils. FACIAL_LANDMARKS_68_IDXS ["left_eye"]

(rStart, rEnd) = face_utils. FACIAL_LANDMARKS_68_IDXS ["right_eye"] cap = cv2. VideoCapture (0) flag = 0 while True: ret, frame = cap.read () frame = imutils.resize (frame, width = 450) gris = cv2.cvtColor (marc, cv2. COLOR_BGR2GRAY) subjectes = detectar (gris, 0) per a subjectes en subjectes: forma = predir (gris, subjecte) shape = face_utils.shape_to_np (forma) #converting to NumPy Array leftEye = shape [lStart: lEnd] rightEye = shape [rStart: rEnd] leftEAR = eye_aspect_ratio (leftEye) rightEAR = eye_aspect_ratio (rightEye) ear = (leftEAR + rightEAR) / 2.0 leftEyeHull = cv2.convexHull (leftEye) rightEyeHull = cv2.convexHull. drawContours (frame, [LeftEyeHull], -1, (0, 255, 0), 1) cv2.drawContours (frame, [RightEyeHull], -1, (0, 255, 0), 1) if ear = frame_check: cv2.putText (marc, "**************** ALERTA! ****************", (10, 30), cv2. FONT_HERSHEY_SIMPLEX, 0,7, (0, 0, 255), 2) cv2.putText (marc, "***************** ALERTA! *********** ***** ", (10, 325), cv2. FONT_HERSHEY_SIMPLEX, 0,7, (0, 0, 255), 2) #print (" Dro wsy ")

Sortida GPIO (brunzidor, GPIO. HIGH)

else: flag = 0

GPIO.output (brunzidor, GPIO. LOW)

cv2.imshow ("Frame", frame) key = cv2.waitKey (1) & 0xFF if key == ord ("q"): break cv2.destroyAllWindows () cap.stop ()

Recomanat: