参考:
重磅!头部姿态估计「原理详解 + 实战代码」来啦!-阿里云开发者社区 (aliyun.com)
Dlib模型之驾驶员疲劳检测三(瞌睡点头)_疲劳检测 点头-CSDN博客
python毕业设计 深度学习疲劳检测 驾驶行为检测 - opencv cnn_疲劳驾驶算法-CSDN博客
1.数据集使用什么?
使用开源的人脸数据库训练集模型dlib
该系统采用Dlib库中人脸68个关键点检测shape_predictor_68_face_landmarks.dat的dat模型库及视频中的人脸,之后返回人脸特征点坐标、人脸框及人脸角度等。
2.dlib有什么好处?
- 每一个类每一个函数都有详细的文档,并提供了大量的示例代码。
- 提供简单的可移植的线程API
- 提供很多图像模型算法和图像处理算法Dlib模型人脸特征检测的原理是什么?
Dlib的人脸检测原理?
1.录取数据集(若干64*64大小的图片),改变图片的亮度和对比度。
output_dir = 'D:/myworkspace/JupyterNotebook/People/person/person1'
size = 64
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 改变图片的亮度与对比度
def relight(img, light=1, bias=0):
w = img.shape[1]
h = img.shape[0]
#image = []
for i in range(0,w):
for j in range(0,h):
for c in range(3):
tmp = int(img[j,i,c]*light + bias)
if tmp > 255:
tmp = 255
elif tmp < 0:
tmp = 0
img[j,i,c] = tmp
return img
#使用dlib自带的frontal_face_detector作为我们的特征提取器
detector = dlib.get_frontal_face_detector()
# 打开摄像头 参数为输入流,可以为摄像头或视频文件
camera = cv2.VideoCapture(0)
2.提取人脸特征点
predictor_path="E:/shape_predictor_68_face_landmarks.dat"#人脸检测模型
predicator = dlib.shape_predictor(predictor_path)#标记关键点,返回关键点预测器
lanmarks=[p.x,p.y] for p in predicator(img1,d).parts()]
#定位人脸关键点,返回68个人脸关键点的位置
3.获取特征数据集写入csv
- OpenCV也可以进行人脸识别,但是效果不如Dlib好
- 是一种基于HOG(方向梯度直方图Histogram of Oriented Gradient, HOG)特征描述方法和SVM,将图像中有用信息提取,无用信息删去。
- 是CPU上最快的检测方法
- 重量轻的模型
3.系统的核心功能?
- 随着计算机视觉检测技术在汽车驾驶安全领域的广泛应用,驾驶员疲劳特征识别需要突破传统小部分特征识别上的局限性和单一性。
- 为此,设计了一种基于OpenCV的驾驶员疲劳特征识别系统。
- 该识别系统以树莓派为处理核心,利用摄像头获取所需的检测数据,综合分析驾驶员眼动,嘴型及头部姿势特征,进行疲劳判断。
- 若处于疲劳驾驶状态,则用语音播放方式发出警告。
- 该系统通过多次调试验证,实时监测驾驶员的驾驶状态,能更加全面,高效识别驾驶员是否属于疲劳驾驶。
4.疲劳驾驶预警系统的核心功能?
- 识别出驾驶员姓名
- 分别通过Blinks,Yawning,Nod来表示驾驶员的眨眼,打哈欠,点头数
- 正常的睁眼闭眼不会被计入,疲劳状态的半睁半闭Blinks+1
- 左右查看车况,抬头不会误计入
- 当连续低头超过2s,或者当连续闭眼超过2会自动报警,并存入抓拍图片。
5.68个关键点来识别人脸,关键点主要部位?
眉毛轮廓,双眼轮廓,鼻子轮廓,嘴巴轮廓,脸颊轮廓
6.如何检测眨眼、打哈欠?
- 闭眼检测,提取人眼部分的点。通过论文提出的眼睛纵横比EAR(EyeAspectRatio)值。EAR越大,睁眼;EAR越小,闭眼。左右眼的平均值作为EAR值。
- 计算视频中每一帧的眼睛纵横比EAR值,当EAR值小于0.2并且连续3帧时,计一次blink
- 类似方法计算哈欠数,嘴巴纵横比,Yawn为打哈欠的帧数,N为1 min内总帧数,设双阈值法哈欠检测的阈值为10%,当打哈欠频率Freq>10%时,则认为驾驶员打了1个深度哈欠或者至少连续2个浅哈欠,此时系统进行疲劳提醒。
7.如何检测瞌睡点头?
基于HPE(Head Pose Estimation)算法的点头检测算法步骤:
- 2D人脸关键点检测:加载人脸检测和姿势模型估计
- 3D人脸模型匹配:目的是得到世界坐标系中人的点,通过算法对不同的人脸拟合出不同的3D人脸模型,3DMM,不同的3D人脸模型有不同的中心位置。
- 求解3D点和对应2D点的转换关系:世界坐标系通过旋转平移到相机坐标系,相机坐标系通过透视投影转换到图像坐标系,3D转换到2D,最后图像坐标系转换为像素坐标系。
- 判断是否点头:主要是判断旋转角,由于瞌睡时主要考虑pitch俯仰角和roll旋转角,在一个时间段内10s内,当 IPitchI≥20° 或者 |Rolll≥20° 的时间比例超过0.3时,就认为驾驶员处于打瞌睡的状态,发出预警。
8.pytorch和OpenCV有什么区别?
- OpenCV是计算机视觉库,用于处理大量图像数据和视频数据;pytorch是深度学习框架,需要对深度学习原理有一定的了解从而构建和训练神经网络模型。
- pytorch适合于构建和训练神经网络模型而OpenCV适合于视频处理和图像处理。
- OpenCV主要用于实时场景:如视频处理,人脸识别等,而pytorch主要用于离线场景:比如数据分析,模型构建等。
- 都是很好的工具,要根据不同的需求选用。