面部标志的检测是检测面部各部位(例如眉毛,眼睛,鼻子,嘴巴和下巴)的过程。有许多使用面部地标检测技术的应用程序。
以前我们使用OpenCV构建人脸识别系统,今天我们将使用带有Raspberry Pi的相同OpenCV进行人脸标志检测。来自dlib库的预训练面部标志检测器模块将用于检测面部关键面部结构的位置,而Python OpenCV将用于可视化检测到的面部部位。
所需组件
硬件部件
- 树莓派3
- Pi相机模组
软件和在线服务
- OpenCV的
- Dlib
- Python3
在继续进行此 Raspberry Pi 3 Facial Landmark Detection之前,首先,我们需要在该项目中安装OpenCV,imutils,dlib,Numpy和其他一些依赖项。OpenCV在这里用于数字图像处理。数字图像处理的最常见应用是对象检测,面部识别和人员计数器。
要了解有关如何将Pi相机与Raspberry Pi进行接口连接的更多信息,请遵循我们之前的教程。
在Raspberry Pi中安装OpenCV
这里,OpenCV库将用于Raspberry Pi QR扫描仪。要安装OpenCV,首先,更新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安装opencv-contrib-python == 4.1.0.25
我们以前将OpenCV与Raspberry pi一起使用,并在其上创建了很多教程。
- 使用CMake在Raspberry Pi上安装OpenCV
- 使用Raspberry Pi和OpenCV进行实时人脸识别
- 使用Raspberry Pi和OpenCV进行车牌识别
- 使用OpenCV和Raspberry Pi进行人群估计
我们还从初学者开始创建了一系列OpenCV教程。
安装 imutils : imutils用于执行一些必要的图像处理功能,例如平移,旋转,调整大小,框架化以及使用OpenCV轻松显示Matplotlib图像。因此,请使用以下命令安装 imutils :
pip3安装imutils
安装dlib: dlib 是现代工具包,其中包含针对实际问题的机器学习算法和工具。使用以下命令安装dlib。
pip3安装dlib
安装 NumPy : NumPy 是科学计算的核心库,其中包含一个功能强大的n维数组对象,提供了用于集成C,C ++等的工具。
Pip3安装numpy
如何使用dlib检测脸部
我们将使用dlib库的预先训练的面部界标检测器来检测映射到面部面部结构的68(x,y)坐标的位置。dlib面部界标预测器在iBUG 300-W数据集上训练。包含68个坐标的索引的图像如下:
编程Raspberry Pi进行面部地标检测
页面末尾提供了使用dlib的预先训练好的面部界标检测器进行面部识别的完整python代码。在这里,我们正在解释代码的一些重要部分,以更好地理解。
因此,像往常一样,通过包含所有必需的库来启动代码。
从imutils导入face_utils导入numpy as np导入argparse导入imutils导入dlib从picamera导入cv2.array从picamera导入PiRGBArray导入PiCamera
然后初始化相机对象,并将分辨率设置为(640,480),帧频设置为30 fps
相机= PiCamera()相机。分辨率=(640,480)相机。帧率= 30
现在,在接下来的几行中,使用参数解析器来提供指向面部界标预测器的路径。
ap = argparse.ArgumentParser()ap.add_argument(“-p”,“ --shape-predictor”,required = True,help =“面部界标预测器路径”)args = vars(ap.parse_args())
在接下来的几行中,初始化基于HOG的dlib的预训练面部检测器,并加载预训练的面部界标预测器。
检测器= dlib.get_frontal_face_detector()预测器= dlib.shape_predictor(args)
然后使用capture_continuous函数开始从Raspberry Pi摄像机捕获帧。
对于camera.capture_continuous(rawCapture,format =“ bgr”,use_video_port = True)中的帧:image = frame.array cv2.imshow(“ Frame”,image)键= cv2.waitKey(1)和0xFF rawCapture.truncate(0 )
使用键盘键“ S”捕获特定的帧。然后调整捕获图像的大小并将其转换为灰度。
如果键== ord(“ s”):图片= imutils.resize(图片,宽度= 400)灰色= cv2.cvtColor(图片,cv2.COLOR_BGR2GRAY)
使用dlib库的检测器功能检测捕获的图像中的面部。
rects =探测器(灰色,1)
拍摄执行面部检测的照片,确定面部标志,然后将68个点转换为NumPy数组。分别循环遍历每个面部区域。
for(i,rect)in enumerate(rects):形状=预测变量(灰色,矩形)shape = face_utils.shape_to_np(shape)
然后,获取原始图像的副本,并将 其用于 循环以在图像上绘制面部的名称。文本颜色将为红色,您可以通过更改RGB值将其更改为另一种颜色。
对于face_utils.FACIAL_LANDMARKS_IDXS.items()中的(名称,(i,j)):clone = image.copy()cv2.putText(clone,name,(10,30),cv2.FONT_HERSHEY_SIMPLEX,0.7,(0,0 ,255),2)
现在,我们将遍历检测到的面部部分,并使用 OpenCV 绘制功能在这些面部部分上绘制圆。您可以按照此OpenCV文档获取有关绘图功能的更多信息。
对于(x,y)形状:cv2.circle(clone,(x,y),1,(0,0,255),-1)
现在,在接下来的几行中,我们将通过计算特定面部部分的坐标的边界框将每个面部部分提取为单独的图像。提取的图像将调整为250像素。
(x,y,w,h)= cv2.boundingRect(np.array(]))roi =图片roi = imutils.resize(roi,宽度= 250,inter = cv2.INTER_CUBIC)
现在,在代码的最后几行中,显示面部部分及其名称和该部分的单独图像。使用ESC键更改面部区域。
cv2.imshow(“ ROI”,roi)cv2.imshow(“ Image”,克隆)cv2.waitKey(0)
测试面部识别器
要测试项目,请创建目录并使用以下命令导航至该目录:
mkdir面部检测器 cd面部检测器
现在,从此链接下载shape_predictor_68_face_landmarks.dat文件,然后提取并复制该库中的shape_predictor_68_face_landmarks.dat文件,然后打开一个名为detect.py的新文件并粘贴下面给出的代码。
现在,使用以下命令启动python代码:
python3 detect.py --shape-predictor shape_predictor_68_face_landmarks.dat
您将看到一个窗口,显示相机实时取景。然后按“ S”键从实时流中选择一个帧。您会在口腔区域看到红点。使用ESC键查看其他面部。
完整的python代码和演示视频如下。