Spisu treści:

System ostrzegania o senności: 3 kroki
System ostrzegania o senności: 3 kroki

Wideo: System ostrzegania o senności: 3 kroki

Wideo: System ostrzegania o senności: 3 kroki
Wideo: [PL] Asystent awaryjnego zatrzymania (Emergency Assist) w samochodzie Skoda Superb :: [1001cars] 2024, Lipiec
Anonim
System ostrzegania o senności
System ostrzegania o senności

Każdego roku wiele osób traci życie w wyniku śmiertelnych wypadków drogowych na całym świecie, a senna jazda jest jedną z głównych przyczyn wypadków drogowych i śmierci. Zmęczenie i mikrosen za sterami jazdy są często główną przyczyną poważnych wypadków. Jednak wstępne oznaki zmęczenia można wykryć jeszcze przed wystąpieniem krytycznej sytuacji, dlatego wykrywanie zmęczenia kierowcy i jego wskazywanie jest ciągłym tematem badawczym. Większość tradycyjnych metod wykrywania senności opiera się na aspektach behawioralnych, podczas gdy niektóre są nachalne i mogą rozpraszać kierowców, a niektóre wymagają drogich czujników. Dlatego w niniejszym artykule opracowano i zaimplementowano lekki system wykrywania senności kierowcy w czasie rzeczywistym na aplikacji Android. System rejestruje filmy i wykrywa twarz kierowcy w każdej klatce, wykorzystując techniki przetwarzania obrazu. System jest w stanie wykrywać punkty orientacyjne twarzy, oblicza współczynnik kształtu oczu (EAR) i współczynnik zamknięcia oczu (ECR), aby wykryć senność kierowcy na podstawie progu adaptacyjnego. Do przetestowania skuteczności proponowanego podejścia wykorzystano algorytmy uczenia maszynowego. Wyniki empiryczne pokazują, że proponowany model jest w stanie osiągnąć dokładność 84% przy użyciu losowego klasyfikatora lasu.

Krok 1: Rzeczy, których potrzebujesz

1. MALINOWY PI

2. KAMERA INTERNETOWA (KAMERA INTERNETOWA C270 HD DLA LEPSZYCH WYNIKÓW)

Wersja na PC może wymagać pewnych zmian w kodzie

Krok 2: Kod Pythona z zestawem danych predyktora kształtu oczu (wersja na komputery PC)

aby skutecznie wykrywać oczy w wideo w czasie rzeczywistym, możemy użyć poniższego pliku.dat.

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

Pobierz plik.dat z powyższego linku i uruchom poniższy kod Pythona

Kod w Pythonie

ze scipy.spatial importuj odległośćz imutils importuj face_utils importuj imutils importuj dlib importuj cv2

def proporcja_oczu (oko):

A = odległość.euklidesowa(oko[1], oko[5]) B = odległość.euklidesowa(oko[2], oko[4]) C = odległość.euklidesowa(oko[0], oko[3]) ucho = (A + B) / (2,0 * C) return ear thresh = 0,25 frame_check = 20 detect = dlib.get_frontal_face_detector() predict = dlib.shape_predictor(".\shape_predictor_68_face_landmarks.dat")# Plik Dat jest sednem kodu

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

(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, gray = cv2.cvtColor(ramka, cv2. COLOR_BGR2GRAY) przedmioty = wykryj(szary, 0) dla przedmiotu w przedmiotach: shape = przewidywaj(szary, przedmiot) shape = face_utils.shape_to_np(shape)#konwertowanie do 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) rightEyeHull2 drawContours(ramka, [leftEyeHull], -1, (0, 255, 0), 1) cv2.drawContours(ramka, [rightEyeHull], -1, (0, 255, 0), 1) if ear = frame_check: cv2.putText(ramka, "********************UWAGA!******************", (10, 30), cv2. FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) cv2.putText(ramka, "****************UWAGA!*********** *****", (10, 325), cv2. FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) #drukuj ("Dro wsy") else: flag = 0 cv2.imshow("Ramka", ramka) key = cv2.waitKey(1) & 0xFF if key == ord("q"): break cv2.destroyAllWindows() cap.stop()

Krok 3: Wersja Raspberry Pi

Wersja Raspberry Pi
Wersja Raspberry Pi
Wersja Raspberry Pi
Wersja Raspberry Pi

gdy osoba zamknie oczy, wtedy Raspberry Pi da ci ostrzeżenie

PODŁĄCZ brzęczyk do pinu 23 (patrz zdjęcie)

z odległości importu scipy.spatial

importuj RPi. GPIO jako GPIO

od czasu importuj sen

GPIO.setwarnings (Fałsz)

GPIO.setmode(GPIO. BCM)

z imutils importuj face_utils

importuj imutils importuj dlib importuj cv2

brzęczyk=23

GPIO.setup(brzęczyk, GPIO. OUT)

def proporcja_oczu (oko):

A = odległość.euklidesowa(oko[1], oko[5]) B = odległość.euklidesowa(oko[2], oko[4]) C = odległość.euklidesowa(oko[0], oko[3]) ucho = (A + B) / (2,0 * C) return ear thresh = 0,25 frame_check = 20 detect = dlib.get_frontal_face_detector() predict = dlib.shape_predictor(".\shape_predictor_68_face_landmarks.dat")# Plik Dat jest sednem kodu

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

(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, gray = cv2.cvtColor(ramka, cv2. COLOR_BGR2GRAY) przedmioty = wykryj(szary, 0) dla przedmiotu w przedmiotach: shape = przewidywaj(szary, przedmiot) shape = face_utils.shape_to_np(shape)#konwertowanie do 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) rightEyeHull2 drawContours(ramka, [leftEyeHull], -1, (0, 255, 0), 1) cv2.drawContours(ramka, [rightEyeHull], -1, (0, 255, 0), 1) if ear = frame_check: cv2.putText(ramka, "********************UWAGA!******************", (10, 30), cv2. FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) cv2.putText(ramka, "****************UWAGA!*********** *****", (10, 325), cv2. FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) #drukuj ("Dro wysy")

GPIO.output(brzęczyk, GPIO. HIGH)

w przeciwnym razie: flaga = 0

GPIO.output(brzęczyk, GPIO. LOW)

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

Zalecana: