1.dlib.get_frontal_face_detector()  # 获得人脸框位置的检测器, detector(gray, 1) gray表示灰度图,

2.dlib.shape_predictor(args['shape_predictor'])  # 获得人脸关键点检测器, predictor(gray, rect) gray表示输入图片,rect表示人脸框的位置信息

参数说明: args['shape_predoctor]  人脸检测器的权重参数地址

3.cv2.convexHull(shape[i:k]) 绘制array位置的凸包信息

参数说明:shape[i:k]表示输入的数组的位置信息

人脸关键点检测:首先通过人脸检测,检测出人脸框的位置,再使用加载的人脸关键点检测,进行人脸关键点的检测

代码:

第一步:参数设置,设置权重参数和图片的位置

第二步:构造有序的字典,用于标记不同脸部部位对应的序号

第三步:构造人脸检测和人脸关键点检测的检测器

第四步:使用人脸检测器进行人脸的位置检测

第五步:循环人脸检测的位置,使用关键点检测器,检测出人脸的位置信息

第六步:由于人脸检测器的位置信息是封装的,因此构造函数,转换为array格式

第七步:循环有序的字典,在每一个部分画出圆点

第八步:使用cv2.boudingRect(np.array(shape[j:k])) 获得脸部轮廓的位置信息

第九步:使用上面(x, y, w, h)截图原始图片

第十步:进行画图操作

第十一步:构造函数画出所有的部分,对于脸部:使用cv2.line画出直线,对于其他部分,使用cv2.convexHull()获得凸包的轮廓,使用cv2.drawContour画出轮廓

# 导入工具包
from collections import OrderedDict
import numpy as np
import argparse
import dlib
import cv2 # 第一步:参数设置
ap = argparse.ArgumentParser()
ap.add_argument('-p', '--shape-predictor', default='shape_predictor_68_face_landmarks.dat',
help='path to facial landmark predictor')
ap.add_argument('-i', '--image', default='images/liudehua.jpg',
help='path to input image')
args = vars(ap.parse_args()) # 第二步:使用OrderedDict构造脸部循环字典时是有序的
FACIAL_LANDMARKS_68_IDXS = OrderedDict([
('mouth', (48, 68)),
('right_eyebrow', (17, 22)),
('left_eyebrow', (22, 27)),
('right_eye', (36, 42)),
('left_eye', (42, 48)),
('nose', (27, 36)),
('jaw', (0, 17))
]) FACIAL_LANDMARKS_5_IDXS = OrderedDict([
("right_eye", (2, 3)),
("left_eye", (0, 1)),
("nose", (4)),
]) def shape_to_np(shape, dtype='int'):
# 创建68*2用于存放坐标
coords = np.zeros((shape.num_parts, 2), dtype=dtype)
# 遍历每一个关键点
# 得到坐标
for i in range(0, shape.num_parts):
coords[i] = (shape.part(i).x, shape.part(i).y) return coords def visualize_facial_landmarks(image, shape, colors=None, alpha=0.75):
# 创建两个copy
# overlay and one for the final output image
overlay = image.copy()
output = image.copy()
# 设置一些颜色区域
if colors is None:
colors = [(19, 199, 109), (79, 76, 240), (230, 159, 23),
(168, 100, 168), (158, 163, 32),
(163, 38, 32), (180, 42, 220)] for (i, name) in enumerate(FACIAL_LANDMARKS_68_IDXS.keys()):
# 得到每一个点的坐标
(j, k) = FACIAL_LANDMARKS_68_IDXS[name]
pts = shape[j:k]
if name == 'jaw':
# 用线条连起来
for l in range(1, len(pts)):
ptA = tuple(pts[l-1])
ptB = tuple(pts[l])
# 对位置进行连线
cv2.line(overlay, ptA, ptB, colors[i], 2) else:
# 使用cv2.convexHull获得位置的凸包位置
hull = cv2.convexHull(pts)
# 使用cv2.drawContours画出轮廓图
cv2.drawContours(overlay, [hull], -1, colors[i], -1) cv2.addWeighted(overlay, alpha, output, 1-alpha, 0, output)
return output # 第三步:加载人脸检测与关键点定位
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(args['shape_predictor']) # 读取输入数据,预处理,进行图像的维度重构和灰度化
image = cv2.imread(args['image'])
(h, w) = image.shape[:2]
width = 500
r = width / float(w)
dim = (width, int(r*h))
image = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 第四步:进行人脸检测,获得人脸框的位置信息
rects = detector(gray, 1) # 遍历检测到的框
for (i, rect) in enumerate(rects):
#第五步: 对人脸框进行关键点定位
shape = predictor(gray, rect)
#第六步:将检测到的关键点转换为ndarray格式
shape = shape_to_np(shape)
# 第七步:对字典进行循环
for (name, (i, j)) in FACIAL_LANDMARKS_68_IDXS.items():
clone = image.copy()
cv2.putText(clone, name, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.45,
(0, 0, 255), 2)
# 根据位置画点
for (x, y) in shape[i:j]:
cv2.circle(clone, (x, y), 3, (0, 0, 255), -1) #第八步: 使用cv2.boundingRect获得脸部轮廓位置信息
(x, y, w, h) = cv2.boundingRect(np.array([shape[i:j]]))
# 第九步:根据位置提取脸部的图片
roi = image[y:y+h, x:x+w]
(h, w) = roi.shape[:2]
width = 250
r = width / float(w)
dim = (width, int(r*h))
roi = cv2.resize(roi, dim, interpolation=cv2.INTER_AREA) # 第十步:进行画图操作显示每个部分
cv2.imshow('ROI', roi)
cv2.imshow('Image', clone)
cv2.waitKey(0)
# 第十一步: 进行脸部位置的画图,如果是脸部:进行连线操作,如果是其他位置,使用cv2.convexHull()获得凸包的位置信息,进行drawcontour进行画图
output = visualize_facial_landmarks(image, shape)
cv2.imshow('Image', output)
cv2.waitKey(0)

    

效果图展示                                                        所有区域画图

机器学习进阶-人脸关键点检测 1.dlib.get_frontal_face_detector(构建人脸框位置检测器) 2.dlib.shape_predictor(绘制人脸关键点检测器) 3.cv2.convexHull(获得凸包位置信息)的更多相关文章

  1. 机器学习进阶-疲劳检测(眨眼检测) 1.dist.eculidean(计算两个点的欧式距离) 2.dlib.get_frontal_face_detector(脸部位置检测器) 3.dlib.shape_predictor(脸部特征位置检测器) 4.Orderdict(构造有序的字典)

    1.dist.eculidean(A, B) # 求出A和B点的欧式距离 参数说明:A,B表示位置信息 2.dlib.get_frontal_face_detector()表示脸部位置检测器 3.dl ...

  2. 从零玩转人脸识别之RGB人脸活体检测

    从零玩转RGB人脸活体检测 前言 本期教程人脸识别第三方平台为虹软科技,本文章讲解的是人脸识别RGB活体追踪技术,免费的功能很多可以自行搭配,希望在你看完本章课程有所收获. ArcFace 离线SDK ...

  3. dlib人脸关键点检测的模型分析与压缩

    本文系原创,转载请注明出处~ 小喵的博客:https://www.miaoerduo.com 博客原文(排版更精美):https://www.miaoerduo.com/c/dlib人脸关键点检测的模 ...

  4. Python 3 利用 Dlib 19.7 和 sklearn机器学习模型 实现人脸微笑检测

    0.引言  利用机器学习的方法训练微笑检测模型,给一张人脸照片,判断是否微笑:   使用的数据集中69张没笑脸,65张有笑脸,训练结果识别精度在95%附近: 效果: 图1 示例效果 工程利用pytho ...

  5. Python 3 利用 Dlib 和 sklearn 人脸笑脸检测机器学习建模

    0. 引言 利用机器学习的方法训练微笑检测模型,输入一张人脸照片,判断是否微笑: 精度在 95% 左右( 使用的数据集中 69 张没笑脸,65 张有笑脸 ): 图1 测试图像与检测结果 项目实现的笑脸 ...

  6. Opencv与dlib联合进行人脸关键点检测与识别

    前言 依赖库:opencv 2.4.9 /dlib 19.0/libfacedetection 本篇不记录如何配置,重点在实现上.使用libfacedetection实现人脸区域检测,联合dlib标记 ...

  7. opencv+python+dlib人脸关键点检测、实时检测

    安装的是anaconde3.python3.7.3,3.7环境安装dlib太麻烦, 在anaconde3中新建环境python3.6.8, 在3.6环境下安装dlib-19.6.1-cp36-cp36 ...

  8. OpenCV实战:人脸关键点检测(FaceMark)

    Summary:利用OpenCV中的LBF算法进行人脸关键点检测(Facial Landmark Detection) Author:    Amusi Date:       2018-03-20 ...

  9. OpenCV Facial Landmark Detection 人脸关键点检测

    Opencv-Facial-Landmark-Detection 利用OpenCV中的LBF算法进行人脸关键点检测(Facial Landmark Detection) Note: OpenCV3.4 ...

随机推荐

  1. DB2如何将数据库表解锁

    死锁是应用程序争抢资源造成de,把相关应用程序结束掉就可以解除死锁了 先用list application for database yourdatabasename show detail 来看看应 ...

  2. sql server 2008 R2 备份还原到sql 2012

    从sql server 2008 r2备份的在sql server 2012中还原时一直读不到备份文件,然后把2008r2备份文件放到sql 2012的安装路径对应的Backup文件夹后可以读到了,不 ...

  3. Java学习——Applet菜单

    程序功能:在窗口中添加菜单栏,在菜单栏添加菜单项,并添加下拉菜单和 2 级菜单,通过选择菜单项可以执行不同操作,生成如下图所示窗口. package cys; import java.awt.*; i ...

  4. Java学习——上转型与下转型对象

    上转型:重写父类方法才调用子类方法,其他仍用父类的,包括被子类隐藏的父类成员变量,而且不能调用子类新增的成员变量和成员方法. 下转型:只能是转上去的才能转下去.下转型类似于该子类直接继承父类. pac ...

  5. Java-Runoob-高级教程-实例-方法:02. Java 实例 – 输出数组元素

    ylbtech-Java-Runoob-高级教程-实例-方法:02. Java 实例 – 输出数组元素 1.返回顶部 1. Java 实例 - 输出数组元素  Java 实例 以下实例演示了如何通过重 ...

  6. java 泛型 checkcast

    我们来看一段代码 public class Test3 { public static void main(String args[]) throws IllegalAccessException, ...

  7. Mybatis 系列2-配置文件

    [Mybatis 系列10-结合源码解析mybatis 执行流程] [Mybatis 系列9-强大的动态sql 语句] [Mybatis 系列8-结合源码解析select.resultMap的用法] ...

  8. 第5章 IP地址和子网划分(1)_IP格式和子网掩码

    1. 二进制和十进制 (1)二进制与十进制的对应关系 ①128为数轴的中点,最高位为1.其后的数,二进制最高位均为1.其前面的数二进制最高位均为0. ②192为128-255中间的数,最高两位为1.2 ...

  9. C++使用Mysql的详细步骤及各个常用方法的代码演示:select,insert,update,delete

    这几天一直在学习C++下使用Mysql的方法及其中各种的问题,也看了很多Mysql的API函数,当然自己看的还是很基础的.其实对于每种数据库的操作,基本的方法都是非常类似的,大多都是connect,s ...

  10. 用singleton单例模式实现一个模块

    对于具有唯一性的模块(例如,购物车项目中的物品数据,各个页面都要使用它,而且是唯一的数据),用singleton模式. var mySingleton = (function() { var priv ...