学习Python3 Dlib19.7进行人脸面部识别


Posted in Python onJanuary 24, 2018

0.引言

自己在下载dlib官网给的example代码时,一开始不知道怎么使用,在一番摸索之后弄明白怎么使用了;

现分享下 face_detector.py 和 face_landmark_detection.py 这两个py的使用方法;

1.简介

python:

3.6.3

dlib:

  19.7

利用dlib的特征提取器,进行人脸 矩形框 的特征提取:

dets = dlib.get_frontal_face_detector(img)

利用dlib的68点特征预测器,进行人脸 68点 特征提取:

predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
shape = predictor(img, dets[0])

效果:

学习Python3 Dlib19.7进行人脸面部识别

学习Python3 Dlib19.7进行人脸面部识别

(a) face_detector.py

b) face_landmark_detection.py

2.py文件功能介绍

face_detector.py :

识别出图片文件中一张或多张人脸,并用矩形框框出标识出人脸;

link: http://dlib.net/cnn_face_detector.py.html

face_landmark_detection.py :在face_detector.py的识别人脸基础上,识别出人脸部的具体特征部位:下巴轮廓、眉毛、眼睛、嘴巴,同样用标记标识出面部特征;

link: http://dlib.net/face_landmark_detection.py.html

2.1. face_detector.py

官网给的face_detector.py

#!/usr/bin/python
# The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt
#
#  This example program shows how to find frontal human faces in an image. In
#  particular, it shows how you can take a list of images from the command
#  line and display each on the screen with red boxes overlaid on each human
#  face.
#
#  The examples/faces folder contains some jpg images of people. You can run
#  this program on them and see the detections by executing the
#  following command:
#    ./face_detector.py ../examples/faces/*.jpg
#
#  This face detector is made using the now classic Histogram of Oriented
#  Gradients (HOG) feature combined with a linear classifier, an image
#  pyramid, and sliding window detection scheme. This type of object detector
#  is fairly general and capable of detecting many types of semi-rigid objects
#  in addition to human faces. Therefore, if you are interested in making
#  your own object detectors then read the train_object_detector.py example
#  program. 
#
#
# COMPILING/INSTALLING THE DLIB PYTHON INTERFACE
#  You can install dlib using the command:
#    pip install dlib
#
#  Alternatively, if you want to compile dlib yourself then go into the dlib
#  root folder and run:
#    python setup.py install
#  or
#    python setup.py install --yes USE_AVX_INSTRUCTIONS
#  if you have a CPU that supports AVX instructions, since this makes some
#  things run faster. 
#
#  Compiling dlib should work on any operating system so long as you have
#  CMake and boost-python installed. On Ubuntu, this can be done easily by
#  running the command:
#    sudo apt-get install libboost-python-dev cmake
#
#  Also note that this example requires scikit-image which can be installed
#  via the command:
#    pip install scikit-image
#  Or downloaded from http://scikit-image.org/download.html. 
import sys
import dlib
from skimage import io
detector = dlib.get_frontal_face_detector()
win = dlib.image_window()
for f in sys.argv[1:]:
  print("Processing file: {}".format(f))
  img = io.imread(f)
  # The 1 in the second argument indicates that we should upsample the image
  # 1 time. This will make everything bigger and allow us to detect more
  # faces.
  dets = detector(img, 1)
  print("Number of faces detected: {}".format(len(dets)))
  for i, d in enumerate(dets):
    print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
      i, d.left(), d.top(), d.right(), d.bottom()))
  win.clear_overlay()
  win.set_image(img)
  win.add_overlay(dets)
  dlib.hit_enter_to_continue()
# Finally, if you really want to you can ask the detector to tell you the score
# for each detection. The score is bigger for more confident detections.
# The third argument to run is an optional adjustment to the detection threshold,
# where a negative value will return more detections and a positive value fewer.
# Also, the idx tells you which of the face sub-detectors matched. This can be
# used to broadly identify faces in different orientations.
if (len(sys.argv[1:]) > 0):
  img = io.imread(sys.argv[1])
  dets, scores, idx = detector.run(img, 1, -1)
  for i, d in enumerate(dets):
    print("Detection {}, score: {}, face_type:{}".format(
      d, scores[i], idx[i]))
为了方便理解,修改增加注释之后的 face_detector.py
import dlib
from skimage import io
# 使用特征提取器frontal_face_detector
detector = dlib.get_frontal_face_detector()
# path是图片所在路径
path = "F:/code/python/P_dlib_face/pic/"
img = io.imread(path+"1.jpg")
# 特征提取器的实例化
dets = detector(img)
print("人脸数:", len(dets))
# 输出人脸矩形的四个坐标点
for i, d in enumerate(dets):
  print("第", i, "个人脸d的坐标:",
     "left:", d.left(),
     "right:", d.right(),
     "top:", d.top(),
     "bottom:", d.bottom())
# 绘制图片
win = dlib.image_window()
# 清除覆盖
#win.clear_overlay()
win.set_image(img)
# 将生成的矩阵覆盖上
win.add_overlay(dets)
# 保持图像
dlib.hit_enter_to_continue()

对test.jpg进行人脸检测: 

结果:

图片窗口结果:

学习Python3 Dlib19.7进行人脸面部识别

输出结果:

 

人脸数: 1
第 0 个人脸: left: 79 right: 154 top: 47 bottom: 121
Hit enter to continue

对于多个人脸的检测结果:

学习Python3 Dlib19.7进行人脸面部识别

2.2 face_landmark_detection.py

官网给的 face_detector.py

#!/usr/bin/python
# The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt
#
#  This example program shows how to find frontal human faces in an image and
#  estimate their pose. The pose takes the form of 68 landmarks. These are
#  points on the face such as the corners of the mouth, along the eyebrows, on
#  the eyes, and so forth.
#
#  The face detector we use is made using the classic Histogram of Oriented
#  Gradients (HOG) feature combined with a linear classifier, an image pyramid,
#  and sliding window detection scheme. The pose estimator was created by
#  using dlib's implementation of the paper:
#   One Millisecond Face Alignment with an Ensemble of Regression Trees by
#   Vahid Kazemi and Josephine Sullivan, CVPR 2014
#  and was trained on the iBUG 300-W face landmark dataset (see
#  https://ibug.doc.ic.ac.uk/resources/facial-point-annotations/): 
#   C. Sagonas, E. Antonakos, G, Tzimiropoulos, S. Zafeiriou, M. Pantic. 
#   300 faces In-the-wild challenge: Database and results. 
#   Image and Vision Computing (IMAVIS), Special Issue on Facial Landmark Localisation "In-The-Wild". 2016.
#  You can get the trained model file from:
#  http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2.
#  Note that the license for the iBUG 300-W dataset excludes commercial use.
#  So you should contact Imperial College London to find out if it's OK for
#  you to use this model file in a commercial product.
#
#
#  Also, note that you can train your own models using dlib's machine learning
#  tools. See train_shape_predictor.py to see an example.
#
#
# COMPILING/INSTALLING THE DLIB PYTHON INTERFACE
#  You can install dlib using the command:
#    pip install dlib
#
#  Alternatively, if you want to compile dlib yourself then go into the dlib
#  root folder and run:
#    python setup.py install
#  or
#    python setup.py install --yes USE_AVX_INSTRUCTIONS
#  if you have a CPU that supports AVX instructions, since this makes some
#  things run faster. 
#
#  Compiling dlib should work on any operating system so long as you have
#  CMake and boost-python installed. On Ubuntu, this can be done easily by
#  running the command:
#    sudo apt-get install libboost-python-dev cmake
#
#  Also note that this example requires scikit-image which can be installed
#  via the command:
#    pip install scikit-image
#  Or downloaded from http://scikit-image.org/download.html. 
import sys
import os
import dlib
import glob
from skimage import io
if len(sys.argv) != 3:
  print(
    "Give the path to the trained shape predictor model as the first "
    "argument and then the directory containing the facial images.\n"
    "For example, if you are in the python_examples folder then "
    "execute this program by running:\n"
    "  ./face_landmark_detection.py shape_predictor_68_face_landmarks.dat ../examples/faces\n"
    "You can download a trained facial shape predictor from:\n"
    "  http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2")
  exit()
predictor_path = sys.argv[1]
faces_folder_path = sys.argv[2]
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(predictor_path)
win = dlib.image_window()

for f in glob.glob(os.path.join(faces_folder_path, "*.jpg")):
  print("Processing file: {}".format(f))
  img = io.imread(f)

  win.clear_overlay()
  win.set_image(img)

  # Ask the detector to find the bounding boxes of each face. The 1 in the
  # second argument indicates that we should upsample the image 1 time. This
  # will make everything bigger and allow us to detect more faces.
  dets = detector(img, 1)
  print("Number of faces detected: {}".format(len(dets)))
  for k, d in enumerate(dets):
    print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
      k, d.left(), d.top(), d.right(), d.bottom()))
    # Get the landmarks/parts for the face in box d.
    shape = predictor(img, d)
    print("Part 0: {}, Part 1: {} ...".format(shape.part(0),                shape.part(1)))
    # Draw the face landmarks on the screen.
    win.add_overlay(shape)
  win.add_overlay(dets)
  dlib.hit_enter_to_continue()

修改:

绘制两个overlay,矩阵框 和 面部特征

import dlib
from skimage import io
# 使用特征提取器frontal_face_detector
detector = dlib.get_frontal_face_detector()
# dlib的68点模型
path_pre = "F:/code/python/P_dlib_face/"
predictor = dlib.shape_predictor(path_pre+"shape_predictor_68_face_landmarks.dat")
# 图片所在路径
path_pic = "F:/code/python/P_dlib_face/pic/"
img = io.imread(path_pic+"1.jpg")
# 生成dlib的图像窗口
win = dlib.image_window()
win.clear_overlay()
win.set_image(img)
# 特征提取器的实例化
dets = detector(img, 1)
print("人脸数:", len(dets))
for k, d in enumerate(dets):
    print("第", k, "个人脸d的坐标:",
       "left:", d.left(),
       "right:", d.right(),
       "top:", d.top(),
       "bottom:", d.bottom())
    # 利用预测器预测
    shape = predictor(img, d)
    # 绘制面部轮廓
    win.add_overlay(shape)
# 绘制矩阵轮廓
win.add_overlay(dets)
# 保持图像
dlib.hit_enter_to_continue()

结果:

人脸数: 1
第 0 个人脸d的坐标: left: 79 right: 154 top: 47 bottom: 121

图片窗口结果:

蓝色的是绘制的win.add_overlay(shape)
红色的是绘制的
win.add_overlay(dets)

学习Python3 Dlib19.7进行人脸面部识别

对于多张人脸的检测结果:

学习Python3 Dlib19.7进行人脸面部识别

官网例程中是利用sys.argv[]读取命令行输入,其实为了方便我把文件路径写好了,如果对于sys.argv[]有疑惑,可以参照下面的总结: 

* 关于sys.argv[]的使用:

( 如果对于代码中 sys.argv[] 的使用不了解可以参考这里 )

用来获取cmd命令行参数,例如 获取cmd命令输入“python test.py XXXXX” 的XXXXX参数,可以用于cmd下读取用户输入的文件路径;

如果不明白可以在python代码内直接 img = imread("F:/*****/test.jpg") 代替 img = imread(sys.argv[1]) 读取图片;

用代码实例来帮助理解:

1.(sys.argv[0],指的是代码文件本身在的路径)

test1.py:

import sys
a=sys.argv[0]
print(a)

cmd input:

python test1.py

cmd output:

test1.py

2.(sys.argv[1],cmd输入获取的参数字符串中,第一个字符)

test2.py:

import sys
a=sys.argv[1]
print(a)

cmd input:

python test2.py what is your name

cmd output: 

what

(sys.argv[1:],cmd输入获取的参数字符串中,从第一个字符开始到结束)

test3.py:

import sys
a=sys.argv[1:]
print(a)

cmd input: 

python test3.py what is your name

cmd output: 

[“what”,“is”,“your”,“name”]

 

3.(sys.argv[2],cmd输入获取的参数字符串中,第二个字符)

test4.py:

import sys
a=sys.argv[2]
print(a)

cmd input:

python test4.py what is your name

cmd output:

"is"
Python 相关文章推荐
Python实现多线程抓取妹子图
Aug 08 Python
Python执行时间的计算方法小结
Mar 17 Python
Python自然语言处理之词干,词形与最大匹配算法代码详解
Nov 16 Python
pandas带有重复索引操作方法
Jun 08 Python
python print输出延时,让其立刻输出的方法
Jan 07 Python
python对文件目录的操作方法实例总结
Jun 24 Python
教你如何编写、保存与运行Python程序的方法
Jul 12 Python
Django REST framework 视图和路由详解
Jul 19 Python
Python-接口开发入门解析
Aug 01 Python
python同步两个文件夹下的内容
Aug 29 Python
Python hmac模块使用实例解析
Dec 24 Python
解决Django响应JsonResponse返回json格式数据报错问题
Aug 09 Python
Python实现的生成格雷码功能示例
Jan 24 #Python
Python使用requests及BeautifulSoup构建爬虫实例代码
Jan 24 #Python
Python3结合Dlib实现人脸识别和剪切
Jan 24 #Python
深入浅析Python中的yield关键字
Jan 24 #Python
Python3.6安装及引入Requests库的实现方法
Jan 24 #Python
pycharm+django创建一个搜索网页实例代码
Jan 24 #Python
Python数据类型中的“冒号“[::]——分片与步长操作示例
Jan 24 #Python
You might like
第八节 访问方式 [8]
2006/10/09 PHP
真正的ZIP文件操作类(php)
2007/07/21 PHP
PHP定时自动生成静态HTML的实现代码
2010/06/20 PHP
PHP gbk环境下json_dencode传送来的汉字
2012/11/13 PHP
PHP快速生成各种信息提示框的方法
2016/02/03 PHP
PHP使用curl_multi_select解决curl_multi网页假死问题的方法
2018/08/15 PHP
javascript jQuery $.post $.ajax用法
2008/07/09 Javascript
js form action动态修改方法
2008/11/04 Javascript
让网页根据不同IE版本显示不同的内容
2009/02/08 Javascript
js constructor的实际作用分析
2011/11/15 Javascript
Node.js中require的工作原理浅析
2014/06/24 Javascript
中文输入法不触发onkeyup事件的解决办法
2014/07/09 Javascript
jQuery模拟新浪微博首页滚动效果的方法
2015/03/11 Javascript
nodejs爬虫抓取数据之编码问题
2015/07/03 NodeJs
浅析javascript的return语句
2015/12/15 Javascript
js获取浏览器的各种属性
2017/04/27 Javascript
layui获取多选框中的值方法
2018/08/15 Javascript
[01:44]剑指西雅图 展望TI之CIS战队专访
2014/06/25 DOTA
Python2.x版本中基本的中文编码问题解决
2015/10/12 Python
python实现发送和获取手机短信验证码
2016/01/15 Python
Python函数参数操作详解
2018/08/03 Python
python读写csv文件方法详细总结
2019/07/05 Python
Python+appium框架原生代码实现App自动化测试详解
2020/03/06 Python
Python 使用生成器代替线程的方法
2020/08/04 Python
使用HTML5和CSS3表单验证功能
2017/05/05 HTML / CSS
html5中 media(播放器)的api使用指南
2014/12/26 HTML / CSS
网站性能延迟加载图像的五种技巧(小结)
2020/08/13 HTML / CSS
英格兰橄榄球商店:England Rugby Store
2016/12/17 全球购物
俄罗斯设计师家具购物网站:The Furnish
2019/12/01 全球购物
中医药大学毕业生自荐信
2013/11/08 职场文书
六十岁生日答谢词
2014/01/10 职场文书
2014年师德承诺书
2014/05/23 职场文书
电工实训报告总结
2014/11/05 职场文书
继承Win10缺点!教你关闭Win11烦人的网络搜索
2021/11/23 数码科技
Python利用Turtle绘制哆啦A梦和小猪佩奇
2022/04/04 Python
Consul在linux环境的集群部署
2022/04/08 Servers