深度學習疲勞檢測 駕駛行為檢測 - python opencv cnn 計算機競賽

文章目錄

  • 0 前言
  • 1 課題背景
  • 2 相關技術
    • 2.1 Dlib人臉識別庫
    • 2.2 疲勞檢測算法
    • 2.3 YOLOV5算法
  • 3 效果展示
    • 3.1 眨眼
    • 3.2 打哈欠
    • 3.3 使用手機檢測
    • 3.4 抽煙檢測
    • 3.5 喝水檢測
  • 4 最后

0 前言

🔥 優質競賽項目系列,今天要分享的是

🚩 **基于深度學習加駕駛疲勞與行為檢測 **

該項目較為新穎,適合作為競賽課題方向,學長非常推薦!

🥇學長這里給一個題目綜合評分(每項滿分5分)

  • 難度系數:4分
  • 工作量:3分
  • 創新點:5分

🧿 更多資料, 項目分享:

https://gitee.com/dancheng-senior/postgraduate

1 課題背景

為了有效監測駕駛員是否疲勞駕駛、避免交通事故的發?,本項目利??臉特征點進?實時疲勞駕駛檢測的新?法。對駕駛員駕駛時的?部圖像進?實時監控,?先檢測?臉,并利?ERT算法定位?臉特征點;然后根據?臉眼睛區域的特征點坐標信息計算眼睛縱橫?EAR來描述眼睛張開程度,根據合適的EAR閾值可判斷睜眼或閉眼狀態;最后基于EAR實測值和EAR閾值對監控視頻計算閉眼時間?例(PERCLOS)值度量駕駛員主觀疲勞程度,將其與設定的疲勞度閾值進??較即可判定是否疲勞駕駛。

2 相關技術

2.1 Dlib人臉識別庫

簡歷
Dlib是一個基于c++開發的開源數據工具庫,其中包含了不少的機器學習的成熟算法與模型,相對于tensorflow和PyTorch,它用于圖像處理以及人臉面部特征提取、分類及對比這幾個方面比較具有通用性和優越性,因此,Dlib正在越來越廣泛地應用在人臉識別技術領域。
Dlib具有獨立使用的可移植代碼。Dlib中的代碼使用c++語言進行開發而成,使用獨立封裝,在不借助第三方數據庫的情況下,可以直接移植到自己所需要設計的項目中進行使用。

Dlib優點

  • Dlib擁有全面的文檔說明。作為一個開源的人臉數據庫訓練集,Dlib中有很多功能齊全的程序和文件,從人性化的角度而言的,Dlib在這一點上做的是非常不錯的,因為它為每一個程序文檔和文件都做了相對應的注釋,這樣開發者就可以迅速準確的調集程序文檔來完成自己所需要的項目功能。

  • Dlib涵蓋了支持功能完備的深度學習以及圖像處理的各類算法。Dlib為開發者提供了機器深度學習的各類成熟的完備算法,并且在圖像處理方面也為開發者帶來了能夠

相關代碼

?

import` `matplotlib.pyplot as plt
import` `dlib
import` `numpy as np
import` `glob
import` `re#正臉檢測器
detector``=``dlib.get_frontal_face_detector()
#臉部關鍵形態檢測器
sp``=``dlib.shape_predictor(r``"D:LBJAVAscriptshape_predictor_68_face_landmarks.dat"``)
#人臉識別模型
facerec ``=` `dlib.face_recognition_model_v1(r``"D:LBJAVAscriptdlib_face_recognition_resnet_model_v1.dat"``)#候選人臉部描述向量集
descriptors``=``[]photo_locations``=``[]for` `photo ``in` `glob.glob(r``'D:LBJAVAscriptfaces*.jpg'``):``photo_locations.append(photo)``img``=``plt.imread(photo)``img``=``np.array(img)``#開始檢測人臉``dets``=``detector(img,``1``)``for` `k,d ``in` `enumerate``(dets):``#檢測每張照片中人臉的特征``shape``=``sp(img,d)``face_descriptor``=``facerec.compute_face_descriptor(img,shape)``v``=``np.array(face_descriptor)``descriptors.append(v)#輸入的待識別的人臉處理方法相同
img``=``plt.imread(r``'D:test_photo10.jpg'``)
img``=``np.array(img)
dets``=``detector(img,``1``)
#計算輸入人臉和已有人臉之間的差異程度(比如用歐式距離來衡量)
differences``=``[]
for` `k,d ``in` `enumerate``(dets):``shape``=``sp(img,d)``face_descriptor``=``facerec.compute_face_descriptor(img,shape)``d_test``=``np.array(face_descriptor)``#計算輸入人臉和所有已有人臉描述向量的歐氏距離``for` `i ``in` `descriptors:``distance``=``np.linalg.norm(i``-``d_test)``differences.append(distance)#按歐式距離排序 歐式距離最小的就是匹配的人臉
candidate_count``=``len``(photo_locations)
candidates_dict``=``dict``(``zip``(photo_locations,differences))
candidates_dict_sorted``=``sorted``(candidates_dict.items(),key``=``lambda` `x:x[``1``])#matplotlib要正確顯示中文需要設置
plt.rcParams[``'font.family'``] ``=` `[``'sans-serif'``]
plt.rcParams[``'font.sans-serif'``] ``=` `[``'SimHei'``]plt.rcParams[``'figure.figsize'``] ``=` `(``20.0``, ``70.0``)ax``=``plt.subplot(candidate_count``+``1``,``4``,``1``)
ax.set_title(``"輸入的人臉"``)
ax.imshow(img)for` `i,(photo,distance) ``in` `enumerate``(candidates_dict_sorted):``img``=``plt.imread(photo)``face_name``=``""``photo_name``=``re.search(r``'([^\]*).jpg$'``,photo)``if` `photo_name:``face_name``=``photo_name[``1``]``ax``=``plt.subplot(candidate_count``+``1``,``4``,i``+``2``)``ax.set_xticks([])``ax.set_yticks([])``ax.spines[``'top'``].set_visible(``False``)``ax.spines[``'right'``].set_visible(``False``)``ax.spines[``'bottom'``].set_visible(``False``)``ax.spines[``'left'``].set_visible(``False``)``if` `i``=``=``0``:``ax.set_title(``"最匹配的人臉nn"``+``face_name``+``"nn差異度:"``+``str``(distance))``else``:``ax.set_title(face_name``+``"nn差異度:"``+``str``(distance))``ax.imshow(img)plt.show()

2.2 疲勞檢測算法

該系統采用Dlib庫中人臉68個關鍵點檢測shape_predictor_68_face_landmarks.dat的dat模型庫及視頻中的人臉,之后返回人臉特征點坐標、人臉框及人臉角度等。本系統利用這68個關鍵點對駕駛員的疲勞狀態進行檢測,算法如下:

  1. 初始化Dlib的人臉檢測器(HOG),然后創建面部標志物預測;
  2. 使用dlib.get_frontal_face_detector() 獲得臉部位置檢測器;
  3. 使用dlib.shape_predictor獲得臉部特征位置檢測器;
  4. 分別獲取左、右眼面部標志的索引;
  5. 打開cv2本地攝像頭。

Dlib庫68個特征點模型如圖所示:

眼睛檢測算法

基于EAR算法的眨眼檢測,當人眼睜開時,EAR在某個值域范圍內波動,當人眼閉合時,EAR迅速下降,理論上接近于0。當EAR低于某個閾值時,眼睛處于閉合狀態;當EAR由某個值迅速下降至小于該閾值,再迅速上升至大于該閾值,則
在這里插入圖片描述
EAR計算公式如下:
在這里插入圖片描述
當后幀眼睛寬高比與前一幀差值的絕對值(EAR)大于0.2時,認為駕駛員在疲勞駕駛。(68點landmark中可以看到37-42為左眼,43-48為右眼)
在這里插入圖片描述
右眼開合度可以通過以下公式:
在這里插入圖片描述
眼睛睜開度從大到小為進入閉眼期,從小到大為進入睜眼期,計算最長閉眼時間(可用幀數來代替)。閉眼次數為進入閉眼、進入睜眼的次數。通過設定單位時間內閉眼次數、閉眼時間的閾值判斷人是否已經疲勞了。

相關代碼:

?

# 疲勞檢測,檢測眼睛和嘴巴的開合程度from scipy.spatial import distance as dist
from imutils.video import FileVideoStream
from imutils.video import VideoStream
from imutils import face_utils
import numpy as np  # 數據處理的庫 numpy
import argparse
import imutils
import time
import dlib
import cv2
import math
import time
from threading import Threaddef eye_aspect_ratio(eye):# 垂直眼標志(X,Y)坐標A = dist.euclidean(eye[1], eye[5])  # 計算兩個集合之間的歐式距離B = dist.euclidean(eye[2], eye[4])# 計算水平之間的歐幾里得距離# 水平眼標志(X,Y)坐標C = dist.euclidean(eye[0], eye[3])# 眼睛長寬比的計算ear = (A + B) / (2.0 * C)# 返回眼睛的長寬比return ear

打哈欠檢測算法

基于MAR算法的哈欠檢測,利用Dlib提取嘴部的6個特征點,通過這6個特征點的坐標(51、59、53、57的縱坐標和49、55的橫坐標)來計算打哈欠時嘴巴的張開程度。當一個人說話時,點51、59、53、57的縱坐標差值增大,從而使MAR值迅速增大,反之,當一個人閉上嘴巴時,MAR值迅速減小。

嘴部主要取六個參考點,如下圖:
在這里插入圖片描述
計算公式:
在這里插入圖片描述
通過公式計算MAR來判斷是否張嘴及張嘴時間,從而確定駕駛員是否在打哈欠。閾值應經過大量實驗,能夠與正常說話或哼歌區分開來。為提高判斷的準確度,采用雙閾值法進行哈欠檢測,即對內輪廓進行檢測:結合張口度與張口時間進行判斷。Yawn為打哈欠的幀數,N為1
min內總幀數,設雙閾值法哈欠檢測的閾值為10%,當打哈欠頻率Freq>10%時,則認為駕駛員打了1個深度哈欠或者至少連續2個淺哈欠,此時系統進行疲勞提醒。

相關代碼:

?

# 疲勞檢測,檢測眼睛和嘴巴的開合程度from scipy.spatial import distance as dist
from imutils.video import FileVideoStream
from imutils.video import VideoStream
from imutils import face_utils
import numpy as np  # 數據處理的庫 numpy
import argparse
import imutils
import time
import dlib
import cv2
import math
import time
from threading import Threaddef mouth_aspect_ratio(mouth):  # 嘴部A = np.linalg.norm(mouth[2] - mouth[10])  # 51, 59B = np.linalg.norm(mouth[4] - mouth[8])  # 53, 57C = np.linalg.norm(mouth[0] - mouth[6])  # 49, 55mar = (A + B) / (2.0 * C)return mar

?

點頭檢測算法

基于HPE算法的點頭檢測:算法步驟:2D人臉關鍵點檢測,3D人臉模型匹配,求解3D點和對應2D點的轉換關系,根據旋轉矩陣求解歐拉角。檢測過程中需要使用世界坐標系(UVW)、相機坐標系(XYZ)、圖像中心坐標系(uv)和像素坐標系(xy)。一個物體相對于相機的姿態可以使用旋轉矩陣和平移矩陣來表示。

  • 平移矩陣:物體相對于相機的空間位置關系矩陣,用T表示。
  • 旋轉矩陣:物體相對于相機的空間姿態關系矩陣,用R表示。

因此必然少不了坐標系轉換。如圖所示:
在這里插入圖片描述
于是世界坐標系(UVW)、相機坐標系(XYZ)、圖像中心坐標系(uv)和像素坐標系(xy)四兄弟閃亮登場。相對關系如:
世界坐標系轉換到相機坐標:在這里插入圖片描述
相機坐標系轉換到像素坐標系:
在這里插入圖片描述
像素坐標系與世界坐標系的關系為:
在這里插入圖片描述
圖像中心坐標系轉換到像素坐標系:
在這里插入圖片描述

得到旋轉矩陣后,求歐拉角:
在這里插入圖片描述
設定參數閾值為0.3,在一個時間段,如10
s內,當低頭歐拉角|Pitch|≥20°或者頭部傾斜歐拉角|Roll|≥20°的時間比例超過0.3時,則認為駕駛員處于瞌睡狀態,發出預警。

2.3 YOLOV5算法

簡介
我們選擇當下YOLO最新的卷積神經網絡YOLOv5來進行檢測是否存在玩手機、抽

目標檢測架構分為兩種,一種是two-stage,一種是one-stage,區別就在于 two-stage 有region
proposal過程,類似于一種海選過程,網絡會根據候選區域生成位置和類別,而one-stage直接從圖片生成位置和類別。今天提到的 YOLO就是一種
one-stage方法。YOLO是You Only Look Once的縮寫,意思是神經網絡只需要看一次圖片,就能輸出結果。YOLO
一共發布了五個版本,其中 YOLOv1 奠定了整個系列的基礎,后面的系列就是在第一版基礎上的改進,為的是提升性能。

YOLOv5有4個版本性能如圖所示:
在這里插入圖片描述
網絡架構圖
在這里插入圖片描述

3 效果展示

3.1 眨眼

在這里插入圖片描述

3.2 打哈欠

在這里插入圖片描述

3.3 使用手機檢測

在這里插入圖片描述

3.4 抽煙檢測

在這里插入圖片描述

3.5 喝水檢測

在這里插入圖片描述

4 最后

🧿 更多資料, 項目分享:

https://gitee.com/dancheng-senior/postgraduate

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/206930.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/206930.shtml
英文地址,請注明出處:http://en.pswp.cn/news/206930.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

遠程服務器QEMU+Ubuntu+GRUB+VNC最佳實踐

遠程服務器QEMUUbuntuGRUBVNC最佳實踐 1. 準備2. QEMU啟動安裝Ubuntu2.1 服務器端2.2 本地端 3. 從服務器終端控制虛擬機GRUB與虛擬機終端 這段時間參與大量內核切換測試工作,實體機需要硬件自檢太過笨重,因此主要通過QEMU驗證正確性。有一個很大的問題是…

JavaSE基礎50題:11. 輸出一個整數的每一位

概述 輸出一個整數的每一位。 如:1234的每一位是4,3,2,1 。 個位:1234 % 10 4 十位:1234 / 10 123 123 % 10 3 百位:123 / 10 12 12 % 10 2 千位: 12 / 10 1 代碼 ublic sta…

ResourceBundle使用詳解

ResourceBundle使用詳解 這個類主要用來解決國際化和本地化問題。國際化和本地化可不是兩個概念,兩者都是一起出現的。可以說,國際化的目的就是為了實現本地化。比如對于“取消”,中文中我們使用“取消”來表示,而英文中我們使用…

【小白專用】MySQL入門(詳細總結)

3. 創建數據庫 使用 create database 數據庫名; 創建數據庫。 create database MyDB_one; create database DBAliTest; 創建數據庫成功后,數據庫的數量變成了6個,多了剛才創建的 dbalitest 。 4. 創建數據庫時設置字符編碼 使用 create database 數據…

YouTube網紅營銷:出海品牌擴大影響力的關鍵

隨著數字媒體的興起,社交媒體已成為品牌與消費者之間建立聯系的重要橋梁。其中,YouTube作為全球最大的視頻分享平臺,不僅擁有龐大的用戶群體,還聚集了眾多有影響力的網紅。這些網紅在各自的領域內擁有強大的話語權和號召力&#x…

MySQL數據庫,初學SQL知識點引入

數據庫的相關概念: DB:數據庫(Database): 即存儲數據的倉庫,其本質是一個文件系統。保存了一系列有組織的數據。 DBMS:數據庫管理系統(Database Management System)&…

董明珠:格力從制造商到自主創新企業的轉變之路

中國制造業的崛起是近幾十年來全球經濟舞臺上最顯著的事件之一,而格力電器作為中國制造業的代表之一,其漫長而堅定的自主創新之路,將其從一家傳統的制造商轉變為一個自主創新的企業,是中國制造業發展歷程中的一個亮點。本文將探討…

虛擬化之指令的Trap和仿真

有時,虛擬機監控程序需要在虛擬機(VM)中模擬操作。例如,VM內的軟件可能嘗試配置與功耗管理或緩存一致性相關的低級處理器控件。通常,您不希望將VM直接訪問這些控件,因為它們可能被用于突破隔離,或影響系統中的其他VM。 trap在執行給定操作(例如讀取寄存器)時引發異常…

2023年全國職業院校技能大賽-大數據應用開發-數據可視化

可視化題目與以往相同,做法類似,我這里展示得到語句后處理優化以后的代碼,以函數式來寫可視化,比以前400-500多行代碼簡潔到100多行。其他題目見本欄目,那里面的代碼都是沒有優化后的,這次主要以效率和精簡…

IDEA版SSM入門到實戰(Maven+MyBatis+Spring+SpringMVC) -Mybatis查詢中返回值四種情況

第一章 Mybatis查詢中返回值四種情況 1.1 查詢單行數據返回單個對象 /*** 通過id獲取員工信息*/ public Employee selectEmpById(int empId);<select id"selectEmpById" resultType"employee">SELECTid,last_name,email,salaryFROMtbl_employeeWHE…

Backend - Django JsonResponse HttpResponse

目錄 一、關系 二、使用 &#xff08;一&#xff09;data 字典傳值 1. HttpResponse &#xff08;1&#xff09;寫法 &#xff08;2&#xff09;前端接收 HttpResponse 回傳的值 2. JsonResponse &#xff08;1&#xff09;寫法 &#xff08;2&#xff09;前端接收 Js…

如何解壓沒有密碼的7-zip文件?

7z壓縮包設置了密碼&#xff0c;解壓的時候就需要輸入正確對密碼才能順利解壓出文件&#xff0c;正常當我們解壓文件或者刪除密碼的時候&#xff0c;雖然方法多&#xff0c;但是都需要輸入正確的密碼才能完成。忘記密碼就無法進行操作。 那么&#xff0c;忘記了7z壓縮包的密碼…

文件重命名大師:批量修改名稱的終極指南

在處理大量文件時&#xff0c;我們往往需要修改它們的名稱。無論是為了整理、歸檔還是為了滿足某種特定需求&#xff0c;重命名文件都是一項常見的任務。然而&#xff0c;手動一個一個地修改文件名無疑是一項耗時且容易出錯的工作。幸運的是&#xff0c;我們可以借助一些強大的…

Python---類的綜合案例

1、需求分析 設計一個Game類 屬性&#xff1a; 定義一個類屬性top_score記錄游戲的歷史最高分 定義一個實例屬性player_name記錄當前游戲的玩家姓名 方法&#xff1a; 靜態方法show_help顯示游戲幫助信息 類方法show_top_score顯示歷史最高分 實例方法start_game開始當前…

13、pytest為失敗的斷言定義自己的解釋

官方實例 # content of ocnftest.py from test_foocompare import Foodef pytest_assertrepr_compare(op, left, right):if isinstance(left, Foo) and isinstance(right, Foo) and op "":return["Comparing Foo instances:",f" vals:{left.val} !…

震坤行走進中國移動電商平臺業務推介啟動會助力政企采購升級

震坤行走進中國移動電商平臺業務推介啟動會助力政企采購升級 7月19日&#xff0c;震坤行受邀參與中國移動供應鏈管理中心在北京舉辦的“和悅彩同行 創供贏未來”主題活動&#xff0c;走入客戶一線面對面溝通&#xff0c;依托MRO領域服務能力為客戶提供專業解決方案&#xff0c…

node后端接口無法插入數據為emoji的表情的問題

原因 emoji的表情一般是這樣的\xF0\x9F\x98\x80或者是\xF0\x9F\x98 &#xff0c;事實上 一般數據庫的utf8的編碼類型都是能保存\xF0\x9F\x98 但是不能保存\xF0\x9F\x98\x80這種樣的emoji&#xff0c;要將數據庫編碼格式為utf8mb4 也就是utf8的超集 另外&#xff0c;除了 數據庫…

angular狀態管理方案(ngrx)

完全基于redux的ngrx方案&#xff0c;我們看看在angular中如何實現。通過一個簡單的計數器例子梳理下整個流程 一 安裝 &#xff1a;npm i ngrx/store 這里特別要注意一點&#xff1a;安裝 ngrx/store的時候會出現和angular版本不一致的問題 所以檢查一下angular/core的版本…

使用 HPA 和 TopologySpreadConstraints 實現可用區間等比擴容

1. 原理介紹 設置 HPA 每次最小擴容 Pod 數為可用區數量&#xff0c;以期可用區間 Pod 同步擴容設置 TopologySpreadConstraints 可用區分散 maxSkew 為 1&#xff0c;以盡可能可用區間 Pod 均勻分布 2. 實驗驗證 2.1. 準備 Kind 集群 準備如下配置文件&#xff0c;命名為 …

軟件測試面試題及答案解析

在軟件測試領域&#xff0c;面試是求職者進入這個行業的重要途徑。為了幫助大家更好地應對軟件測試面試&#xff0c;本文將為大家提供一些常見的軟件測試面試題及答案解析。 請簡要介紹一下軟件測試的目的和重要性。 答&#xff1a;軟件測試的目的是確保軟件產品的質量&#…