前言:所使用图片并无盈利等目的,如有侵犯他人肖像权请联系删除。

当当当当,第三期来廖!接上一期在线会议中人脸面部轮廓图像提取(二)——HOG人脸面部轮廓图像特征提取,介绍完HOG特征提取我们继续学习Dlib库提取特征叭!

1、人脸轮廓图像提取原理

在我们检测到人脸区域之后,接下来要研究的问题是获取到不同的脸部的特征,以区分不同人脸,即人脸特征检测(facial feature detection)。它也被称为人脸特征点检测(facial landmark detection)。
人脸特征点通常会标识出脸部的下列数个区域:

  • 右眼眉毛(Right eyebrow)
  • 左眼眉毛(Left eyebrow)
  • 右眼(Right eye)
  • 左眼(Left eye)
  • 嘴巴(Mouth)
  • 鼻子(Nose)
  • 下巴(Jaw)

检测人脸特征点,分为如下两步:

  1. 第一步:定位图像中人脸区域;
  2. 这一步我们可以使用之前学到过的 OpenCV中Harr检测器 或者 Dlib中HOG加SVM的检测器。

第一步:在人脸区域内检测出人脸关键特征;
对于第二步,我们使用Dlib中的特征点检测。
Dlib中使用的人脸特征检测的原理来自2014年,由Vahid KazemiJosephine Sullivan在论文 《One Millisecond Face Alignment with an Ensemble of Regression Trees》中提出的人脸特征点评估的方法。
论文中方法的主要思想是:

使用级联回归树(ensemble of regression trees,
ERT),即使用级联回归因子基于梯度提高学习的回归树方法。该方法首先需要使用一系列标定好的人脸图片作为训练集,然后会生成一个模型。使机器学习模型能够找出任何脸上的这些特征点。

简要的分为以下三步:

  1. 定义一张脸上的68个具体的特征点(landmarks);
  2. 标记面部特征点,获得带标记的训练数据。需要手动标记图像上的面部特征点,标签指定围绕每个面部结构的区域;
  3. 给定训练数据,训练回归树的集合,直接从像素强度本身估计面部界标位置,得到模型。

2、模型算法实现

Dlib提供两种人脸检测模型:

  • shape_predictor_5_face_landmarks.dat:
    检测5个人脸特征关键点,即双眼的眼头及眼尾以及鼻头这五个位置。因为只检测五个点,所以执行速度很快。如图:

    5点人脸特征图
  • shape_predictor_68_face_landmarks.dat:
    检测68个人脸特征关键点。如图:

68点人脸特征图

3、具体实践步骤

  1. 利用Dlib的正向人脸检测器 get_frontal_face_detector(),进行人脸检测,提取人脸外部矩形框:
detector = dlib.get_frontal_face_detector()
faces = detector(image, 1)

返回的faces为识别出的脸部数组。

  1. 利用训练好的人脸68点特征检测器,进行人脸面部轮廓特征提取:
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
shape = predictor(image, face)
  1. 源码示例与解析:
import cv2
import dlib
# 读取图片
img_path = "C.jpg"
img = cv2.imread(img_path)
n = 2
img = cv2.resize(img, (0, 0), fx=1/n, fy=1/n, interpolation=cv2.INTER_NEAREST)
# 转换为灰阶图片
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 正向人脸检测器将图像
detector = dlib.get_frontal_face_detector()
# 使用训练好的68个特征点模型
predictor_path = "shape_predictor_68_face_landmarks.dat"
predictor = dlib.shape_predictor(predictor_path)
# 使用检测器来检测图像中的人脸
faces = detector(gray, 1)
# 打印结果
print("人脸数: ", len(faces))
for i, face in enumerate(faces):print("第", i+1, "个人脸的矩形框坐标:\n","left:", face.left(), "right:", face.right(), "top:", face.top(), "bottom:", face.bottom())# 获取人脸特征点shape = predictor(img, face)print("第", i+1, '个人脸特征点:')print(shape.parts())

结果:

人脸数:  1
第 1 个人脸的矩形框坐标:
left: 82 right: 349 top: 142 bottom: 409
第 1 个人脸特征点:
points[(94, 238), (98, 271), (105, 303), (113, 334), (125, 362), (144, 385), (168, 405), (195, 420), (225, 426), (256, 421), (284, 406), (308, 386), (328, 362), (340, 333), (348, 302), (354, 271), (360, 238), (115, 206), (130, 184), (154, 172), (182, 170), (208, 174), (251, 174), (277, 169), (304, 171), (327, 182), (341, 203), (229, 207), (229, 220), (229, 234), (228, 248), (204, 275), (216, 277), (228, 279), (240, 278), (251, 276), (147, 221), (162, 212), (179, 210), (194, 218), (179, 222), (162, 224), (263, 218), (278, 209), (295, 211), (308, 220), (295, 223), (278, 222), (187, 332), (202, 315), (219, 306), (228, 309), (238, 307), (255, 319), (271, 335), (255, 350), (239, 356), (227, 357), (217, 355), (202, 348), (197, 332), (218, 321), (228, 321), (238, 321), (262, 334), (238, 338), (228, 339), (218, 337)]

  1. Dlib 绘制人脸轮廓图
    在识别出人脸特征点之后,绘制对应的特征点能可视化特征效果。Dlib本身提供了绘制特征点的方法,主要分为以下几步:
    (1)使用image_window()新建图像窗口:

    win = dlib.image_window()
    

    (2)指定窗口图片:

    win.clear_overlay()
    win.set_image(img)
    

    (3)绘制面部轮廓:

    # 使用predictor来计算面部轮廓
    shape = predictor(img, faces[i])
    # 绘制面部轮廓
    win.add_overlay(shape)
    # 绘制面部轮廓
    win.add_overlay(shape)
    

    (4) 绘制人脸区域矩阵:

    # 绘制矩阵轮廓
    win.add_overlay(faces)
    

    经过以上这些步骤后,可成功计算出人脸面部特征并画出轮廓图。
    运行结果:

人脸数: 1
第 1 个人脸的矩形框坐标: left: 97 right: 283 top: 118 bottom: 304
Hit enter to continue

可能是因为肤色和清晰度问题、面部姿势会稍微有点小误差:

人脸数: 5
第 1 个人脸的矩形框坐标: left: 833 right: 895 top: 135 bottom: 198
第 2 个人脸的矩形框坐标: left: 135 right: 197 top: 149 bottom: 211
第 3 个人脸的矩形框坐标: left: 487 right: 550 top: 73 bottom: 135
第 4 个人脸的矩形框坐标: left: 229 right: 303 top: 96 bottom: 171
第 5 个人脸的矩形框坐标: left: 626 right: 688 top: 87 bottom: 149
Hit enter to continue

人脸数: 1
第 1 个人脸的矩形框坐标: left: 262 right: 448 top: 98 bottom: 284
Hit enter to continue

源码与解析:

import dlib
import cv2
# 使用 Dlib 的正面人脸检测器 frontal_face_detector
detector = dlib.get_frontal_face_detector()
# Dlib 的 68点模型
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
# 读取图片
img = cv2.imread("R.jpg")
n = 1#缩放
img = cv2.resize(img, (0, 0), fx=1/n, fy=1/n, interpolation=cv2.INTER_NEAREST)
# 生成 Dlib 的图像窗口
win = dlib.image_window()
win.set_image(img)
# 使用 detector 检测器来检测图像中的人脸
faces = detector(img, 1)
print("人脸数:", len(faces))
for i, d in enumerate(faces):print("第", i+1, "个人脸的矩形框坐标:","left:", d.left(), "right:", d.right(), "top:", d.top(), "bottom:", d.bottom())# 使用predictor来计算面部轮廓shape = predictor(img, faces[i])# 绘制面部轮廓win.add_overlay(shape)
# 绘制矩阵轮廓
win.add_overlay(faces)
dlib.hit_enter_to_continue()

一些学习到的有趣的转化:

  • RGB转HSV:



源码与解释:

#encoding:utf-8import numpy as np
import cv2image = cv2.imread("R.jpg")
n = 1
image = cv2.resize(image, (0, 0), fx=1/n, fy=1/n, interpolation=cv2.INTER_NEAREST)
cv2.imshow("Original",image)
# cv2.waitKey(0)#HSV空间
hsv = cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
cv2.imshow("HSV",hsv)
cv2.waitKey(0)
  • RGB转LAB:


    源码与解释:
#encoding:utf-8import numpy as np
import cv2image = cv2.imread("R.jpg")
n = 1
image = cv2.resize(image, (0, 0), fx=1/n, fy=1/n, interpolation=cv2.INTER_NEAREST)
cv2.imshow("Original",image)
# cv2.waitKey(0)#lab空间
lab = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)
cv2.imshow("L*A*B*", lab)
cv2.waitKey(0)

4、最后

以上有一些知识还是挺有趣的,大家有兴趣的话可以去搜索学习一下奥。所使用的素材与源码等之后会同一整理打包上传。
创作不易,感谢您的三连嘻嘻,下期更加精彩,敬请期待窝!

在线会议中人脸面部轮廓图像提取(三)——Dlib库人脸面部轮廓图像特征提取相关推荐

  1. 在线会议中人脸面部轮廓图像提取(二)——HOG人脸面部轮廓图像特征提取

    前言:所使用图片并无盈利等目的,如有侵犯他人肖像权请联系删除. 1. 模型介绍 HOG简介 Histogram of Oriented Gridients,缩写为HOG,是目前计算机视觉.模式识别领域 ...

  2. AliSSR 语音超分算法:让在线会议语音更明亮更自然

    超分让在线会议语音更明亮,在线会议已成为日常工作中较为普遍的沟通交流方式,接入会议的方式也呈现多样化,比如电脑入会.手机入会又或是电话入会. 雪雅.曜辰|作者 众所周知,高采样率且高带宽的音频信号富含 ...

  3. 批量将四通道PNG图像转为三通道图像

    PNG图像为四通道时:RGBA,第四通道表示透明度,图像位数为32位. PNG图像为三通道时:RGB,图像位数为24位. from PIL import Image import ospath = & ...

  4. 快速指南:使用OpenCV预处理神经网络中的面部图像

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本期将介绍脸部检测.眼睛检测:图像拉直.裁剪.调整大小.归一化等内 ...

  5. 论文笔记--网络新闻图像中人脸标注技术的研究-2011

    论文信息: 硕士论文-网络新闻图像中人脸标注技术的研究-2011-哈尔滨工业大学-刘胜宇 文末附人脸标注相关论文下载地址 文章目录 摘要 技术 数据集 实验结果 结论 参考文献(部分) 关于图像标注 ...

  6. matlab截视频人脸,一种视频图像中人脸图像截取方法与流程

    本发明涉及人工智能领域,具体涉及一种提高人脸比对性能的视频图像中人脸图片截取方法. 背景技术: 人脸图像比对需要对人脸图像提取特征数据,用于人脸对比的人脸特征提取,主要是对经人脸检测过程截取到的视频图 ...

  7. 【利用OpenCV-Python在图像中选择ROI区域并提取ROI坐标信息】

    [利用OpenCV-Python在图像中选择ROI区域并提取ROI坐标信息] 文前白话 代码: 效果: 文前白话 在图像中选定ROI区域进行进一步的功能开发,就需要提取到相应的ROI区域坐标,对于多边 ...

  8. 使用matlab对图像轮廓进行提取

    原图 首先将图片导入matlab工作区 图片将会被转换为一个二维矩阵存=存放 然后我们输入指令可以看到原图 然后转为二值图像使用bwperim()函数进行轮廓提取 同样我们可以借助edge()函数进行 ...

  9. OpenCV之imgproc 模块. 图像处理(5)在图像中寻找轮廓 计算物体的凸包 创建包围轮廓的矩形和圆形边界框 为轮廓创建可倾斜的边界框和椭圆 轮廓矩 多边形测试

    在图像中寻找轮廓 目标 在这个教程中你将学到如何: 使用OpenCV函数 findContours 使用OpenCV函数 drawContours 原理 例程 教程的代码在下面给出. 你也可以从 这里 ...

最新文章

  1. 我的Rails笔记(1)
  2. 如何使用 ABAP 把多个文件打成一个 zip包 -利用 ABAP 标准工具类 cl_abap_zip
  3. 派生类构造的时候一定要调用_为什么骑车的时候一定要带手套?
  4. tcp 服务端如何判断客户端断开连接
  5. Apache Spark开发介绍
  6. 一款不错的SpringCloud 脚手架项目
  7. 昇腾万里·让AI无所不及!DevRun开发者沙龙在武汉成功举办
  8. 用递归的方式处理数组 把递归方法方法定义到数组的原型上 (这是一次脑洞大开的神奇尝试)...
  9. 通达信资金净流入公式_通达信当天净流入公式,通达信资金净流入公式
  10. 大学计算机网络实训目的,计算机专业大学生毕业实习目的
  11. Python打包成exe.文件教程分享
  12. Unity Fingers Gesture手势插件教程(新)
  13. Log4j使用配置总结
  14. 成都工业学院(成都无机校/电子机械高等专科学校)百年校庆之行记
  15. html 通知页面,消息通知页面.html
  16. iOS开发-Please sign in with an app-specific password. You can create one at appleid.apple.com
  17. [软件更新]SRS Audio Sandbox v1.9.0.4 汉化版
  18. matlab ecu代码,嵌入式代码生成 - 汽车 ECU 产品级代码 - MATLAB Simulink
  19. 查询当前日期是一年中的第多少周
  20. Java入门123:一个老鸟的Java学习心得(二维码版)

热门文章

  1. C/C++ | 23-12 用指针的方法,将字符串“ABCD1234efgh”前后对调显示
  2. 从面试官的角度谈谈后端面试
  3. STM32分别实现温湿度的采集和OLED显示屏显示数据
  4. 【iMessage苹果推群发】苹果相册推它由pushchatkey.pem和pushchatcert.pem作为单独的文件使用
  5. 怎么把备忘录中的视频导到手机相册里
  6. 细节很重要 - 平安信用卡的注销
  7. Codeforces Round #439 (Div. 2) E. The Untended Antiquity 二维线段树||二维树状数组
  8. 如何构建超现实元宇宙空间
  9. Win7与Win10在局域网内共享打印机
  10. 王者荣耀战力查询小程序源码下载-支持安卓ios微信和QQ战力查询支持打包成APP