낮과 밤에화물과 무거운 물건을 장거리로 운반하는 트럭 운전사들은 종종 수면 부족에 시달립니다. 피로와 졸음은 고속도로에서 주요 사고의 주요 원인 중 일부입니다. 자동차 산업은 졸음을 감지하고 운전자에게 경고 할 수있는 몇 가지 기술을 연구하고 있습니다.
이 프로젝트에서는 Raspberry Pi, OpenCV 및 Pi 카메라 모듈을 사용하여 운전자를위한 수면 감지 및 경고 시스템 을 구축 할 것 입니다. 이 시스템의 기본 목적은 운전자의 안면 상태와 눈의 움직임을 추적하는 것이며 운전자가 졸리면 경고 메시지가 표시됩니다. 이것은 이전 얼굴 랜드 마크 감지 및 얼굴 인식 애플리케이션의 확장입니다.
필요한 구성 요소
하드웨어 구성 요소
- 라즈베리 파이 3
- Pi 카메라 모듈
- 마이크로 USB 케이블
- 부저
소프트웨어 및 온라인 서비스
- OpenCV
- Dlib
- Python3
이 드라이버 졸음 감지 프로젝트를 진행하기 전에 먼저이 프로젝트 에 OpenCV, imutils, dlib, Numpy 및 기타 종속성을 설치해야합니다. OpenCV는 여기에서 디지털 이미지 처리에 사용됩니다. 디지털 이미지 처리의 가장 일반적인 응용 분야는 물체 감지, 얼굴 인식 및 인원 계수기입니다.
여기에서는이 수면 감지 시스템을 구축하기 위해 Raspberry Pi, Pi 카메라 및 버저 만 사용합니다.
Raspberry Pi에 OpenCV 설치
OpenCV 및 기타 종속성을 설치하기 전에 Raspberry Pi를 완전히 업데이트해야합니다. 아래 명령을 사용하여 Raspberry Pi를 최신 버전으로 업데이트하십시오.
sudo apt-get 업데이트
그런 다음 다음 명령을 사용하여 Raspberry Pi에 OpenCV를 설치하는 데 필요한 종속성을 설치합니다.
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 설치 libqt4-test –y
마지막으로 아래 명령을 사용하여 Raspberry Pi에 OpenCV를 설치합니다.
pip3 install opencv-contrib-python == 4.1.0.25
OpenCV를 처음 사용하는 경우 Raspberry pi로 이전 OpenCV 자습서를 확인하십시오.
- CMake를 사용하여 Raspberry Pi에 OpenCV 설치
- Raspberry Pi 및 OpenCV를 사용한 실시간 얼굴 인식
- Raspberry Pi 및 OpenCV를 사용한 번호판 인식
- OpenCV 및 Raspberry Pi를 사용한 군중 크기 추정
우리는 또한 초급 레벨부터 시작하는 일련의 OpenCV 튜토리얼을 만들었습니다.
기타 필수 패키지 설치
Raspberry Pi for Drowsiness Detector를 프로그래밍하기 전에 다른 필수 패키지를 설치해 보겠습니다.
dlib 설치: dlib는 기계 학습 알고리즘과 실제 문제에 대한 도구를 포함하는 최신 툴킷입니다. 아래 명령을 사용하여 dlib를 설치하십시오.
pip3 dlib 설치
NumPy 설치: NumPy는 강력한 n 차원 배열 객체를 포함하고 C, C ++ 등을 통합하기위한 도구를 제공하는 과학 컴퓨팅을위한 핵심 라이브러리입니다.
pip3 설치 numpy
face_recognition 모듈 설치: 이 라이브러리는 Python 또는 명령 줄에서 얼굴을 인식하고 조작하는 데 사용됩니다. 아래 명령을 사용하여 얼굴 인식 라이브러리를 설치하십시오.
Pip3 설치 face_recognition
마지막으로 아래 명령을 사용하여 eye_game 라이브러리를 설치합니다.
pip3 설치 눈 게임
Raspberry Pi 프로그래밍
OpenCV를 사용 하는 운전자 졸음 감지기의 전체 코드 는 페이지 끝에 제공됩니다. 여기에서는 더 나은 이해를 위해 코드의 몇 가지 중요한 부분을 설명합니다.
따라서 평소와 같이 필요한 모든 라이브러리를 포함하여 코드를 시작합니다.
import face_recognition import cv2 import numpy as np import time import cv2 import RPi.GPIO as GPIO import eye_game
그런 다음 인스턴스를 만들어 파이 카메라에서 비디오 피드를 가져옵니다. 둘 이상의 카메라를 사용하는 경우 cv2.VideoCapture (0) 함수 에서 0을 1로 바꿉니다 .
video_capture = cv2.VideoCapture (0)
이제 다음 줄에 파일 이름과 파일 경로를 입력합니다. 제 경우에는 코드와 파일이 모두 같은 폴더에 있습니다. 그런 다음 얼굴 인코딩을 사용하여 사진에서 얼굴 위치를 가져옵니다.
img_image = face_recognition.load_image_file ("img.jpg") img_face_encoding = face_recognition.face_encodings (img_image)
그런 다음 두 개의 배열을 만들어 얼굴과 이름을 저장합니다. 하나의 이미지 만 사용하고 있습니다. 코드에 더 많은 이미지와 경로를 추가 할 수 있습니다.
알려진 _ 얼굴 _ 인코딩 = 알려진 _ 얼굴 _ 이름 =
그런 다음 일부 변수를 생성하여 얼굴 부분 위치, 얼굴 이름 및 인코딩을 저장합니다.
face_locations = face_encodings = face_names = process_this_frame = True
while 기능 내에서 스트리밍에서 비디오 프레임을 캡처하고 프레임 크기를 더 작은 크기로 조정하고 캡처 한 프레임을 얼굴 인식을 위해 RGB 색상으로 변환합니다.
ret, frame = video_capture.read () small_frame = cv2.resize (frame, (0, 0), fx = 0.25, fy = 0.25) rgb_small_frame = small_frame
그런 다음 얼굴 인식 프로세스를 실행하여 비디오의 얼굴을 이미지와 비교합니다. 또한 얼굴 부분 위치를 가져옵니다.
if process_this_frame: face_locations = face_recognition.face_locations (rgb_small_frame) face_encodings = face_recognition.face_encodings (rgb_small_frame, face_locations) cv2.imwrite (file, small_frame)
인식 된 얼굴이 이미지의 얼굴과 일치하면 eyegame 함수 를 호출 하여 눈의 움직임을 추적합니다. 코드는 눈과 안구의 위치를 반복적으로 추적합니다.
face_distances = face_recognition.face_distance (known_face_encodings, face_encoding) best_match_index = np.argmin (face_distances) if match: name = known_face_names direction = eye_game.get_eyeball_direction (file) print (direction)
코드가 10 초 동안 눈의 움직임을 감지하지 못하면 알람이 울려 사람을 깨 웁니다.
else: count = 1 + count print (count) if (count> = 10): GPIO.output (BUZZER, GPIO.HIGH) time.sleep (2) GPIO.output (BUZZER, GPIO.LOW) print ("Alert! ! 경보 !! 운전자 졸음 감지 ")
그런 다음 OpenCV 함수를 사용하여 얼굴 주위에 사각형을 그리고 그 위에 텍스트를 넣습니다. 또한 cv2.imshow 함수를 사용하여 비디오 프레임을 표시합니다.
cv2.rectangle (frame, (왼쪽, 위쪽), (오른쪽, 아래쪽), (0, 255, 0), 2) cv2.rectangle (frame, (왼쪽, 아래쪽-35), (오른쪽, 아래쪽), (0, 255, 0), cv2.FILLED) font = cv2.FONT_HERSHEY_DUPLEX cv2.putText (frame, name, (left + 6, bottom-6), font, 1.0, (0, 0, 255), 1) cv2.imshow ('비디오', 프레임) 코드를 중지하려면 키 'S'를 설정합니다. cv2.waitKey (1) & 0xFF == ord ('s'): 중단
운전자 졸음 감지 시스템 테스트
코드가 준비되면 Pi 카메라와 버저를 Raspberry Pi에 연결하고 코드를 실행합니다. 약 10 초 후 Raspberry Pi 카메라의 라이브 스트리밍 창이 나타납니다. 장치가 얼굴을 인식하면 프레임에 이름이 인쇄되고 눈의 움직임을 추적하기 시작합니다. 이제 알람을 테스트하기 위해 7 ~ 8 초 동안 눈을 감으십시오. 카운트가 10 개 이상이되면 경보가 발생하여 상황을 알려줍니다.
OpenCV 및 Raspberry Pi를 사용하여 졸음 감지기를 빌드하는 방법 입니다. 작동하는 비디오와 코드를 보려면 아래로 스크롤하십시오.