驾驶员监控系统是基于驾驶员面部图像处理来研究驾驶员状态的实时系统。首先挖掘出人在疲劳状态下的表情特征,然后将这些定性的表情特征进行量化,提取出面部特征点及特征指标作为判断依据,再结合实验数据总结出基于这些参数的识别方法,最后输入获取到的状态数据进行识别和判断。
通过一个面向驾驶员的红外摄像头来实时监测头部、眼部、面部、手部等细节,可以从眼睛闭合、眨眼、凝视方向、打哈欠和头部运动等检测驾驶员状态。通常通过检测人脸眼睛和其他脸部特征以及行为,同时跟踪变化,提取症状实现驾驶员疲劳、分神、不规范驾驶检测。
至于为什么采用红外摄像机,是因为系统要求能够在全部工况环境下(包括白天、夜晚、顺光、逆光等)工作,能适应各种光源环境,即视在夜间、逆光等情况下,也能提供高品质的。同时在驾驶员佩戴帽子、眼镜、墨镜、口罩等情况下由于红外特性可以穿透墨镜镜片,被遮挡的眼部信息也能正常成像,很好地解决了驾驶员眼镜反光或佩戴墨镜的问题。
脸部检测:其过程又分为人脸定位、人脸识别和人脸跟踪。人脸定位的作用是在图像中通过识别面部特征点以检测人脸并标记出位置;人脸识别的作用是将在新图像中检测到到的面部数据和已储存的数据进行匹配;人脸跟踪的作用是在每帧图像上跟踪之前图像帧里发现的人脸。
头部特征:由三个姿态角构成,基于CNN设计头部跟踪系统以图像中脸部区域为输入,通过检测出的面部特征点结合默认的头部模型,可以得到大概的头部姿态。通过进一步跟踪已发现的面部特征和寻找到的更多特征,可以获取更多的数据用以添加到头部模型中,进而更新头部的几何特性。系统运行中,此过程不停的循环,从而以三维姿态角持续输出头部的当前姿态。
onnx2rknn.py
import cv2
import numpy as np
from rknn.api import RKNN
import os
if __name__ == '__main__':
platform = 'rk3568'
exp = 'yolov8nseg'
Width = 640
Height = 640
MODEL_PATH = './onnx_models/yolov8n.onnx'
NEED_BUILD_MODEL = True
# NEED_BUILD_MODEL = False
im_file = './bus.jpg'
# Create RKNN object
rknn = RKNN()
OUT_DIR = "rknn_models"
RKNN_MODEL_PATH = './{}/{}_kk.rknn'.format(OUT_DIR,exp+'-'+str(Width)+'-'+str(Height))
if NEED_BUILD_MODEL:
DATASET = './pose.txt'
rknn.config(mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], target_platform="rk3568")
# Load model
print('--> Loading model')
ret = rknn.load_onnx(MODEL_PATH)
if ret != 0:
print('load model failed!')
exit(ret)
print('done')
# Build model
print('--> Building model')
ret = rknn.build(do_quantization=True, dataset=DATASET)
if ret != 0:
print('build model failed.')
exit(ret)
print('done')
# Export rknn model
if not os.path.exists(OUT_DIR):
os.mkdir(OUT_DIR)
print('--> Export RKNN model: {}'.format(RKNN_MODEL_PATH))
ret = rknn.export_rknn(RKNN_MODEL_PATH)
if ret != 0:
print('Export rknn model failed.')
exit(ret)
print('done')
else:
ret = rknn.load_rknn(RKNN_MODEL_PATH)
rknn.release()