学习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并发编程协程(Coroutine)之Gevent详解
Dec 27 Python
快速解决pandas.read_csv()乱码的问题
Jun 15 Python
python 用下标截取字符串的实例
Dec 25 Python
对python多线程中Lock()与RLock()锁详解
Jan 11 Python
Pycharm之快速定位到某行快捷键的方法
Jan 20 Python
Python Numpy数组扩展repeat和tile使用实例解析
Dec 09 Python
Python利用Scrapy框架爬取豆瓣电影示例
Jan 17 Python
TensorFlow 读取CSV数据的实例
Feb 05 Python
Python基于codecs模块实现文件读写案例解析
May 11 Python
基于tensorflow for循环 while循环案例
Jun 30 Python
django使用channels实现通信的示例
Oct 19 Python
python程序的组织结构详解
Dec 06 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
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
2007/09/30 PHP
php addslashes和mysql_real_escape_string
2010/01/24 PHP
利用PHP实现短域名互转
2013/07/05 PHP
php面向对象中的魔术方法中文说明
2014/03/04 PHP
CodeIgniter输出中文乱码的两种解决办法
2014/06/12 PHP
jQuery学习笔记 操作jQuery对象 属性处理
2012/09/19 Javascript
浅析Js中的单引号与双引号问题
2013/11/06 Javascript
js/jQuery简单实现选项卡功能
2014/01/02 Javascript
jQuery提交多个表单的小技巧
2014/07/27 Javascript
简单的jQuery banner图片轮播实例代码
2016/03/04 Javascript
javascript简单链式调用案例分析
2017/05/10 Javascript
Vue ElementUI之Form表单验证遇到的问题
2017/08/21 Javascript
vue页面切换项目实现转场动画的方法
2019/11/12 Javascript
详解JS深拷贝与浅拷贝
2020/08/04 Javascript
Python中获取对象信息的方法
2015/04/27 Python
解决Linux系统中python matplotlib画图的中文显示问题
2017/06/15 Python
Python图片裁剪实例代码(如头像裁剪)
2017/06/21 Python
详解python 中in 的 用法
2019/12/12 Python
基于Python绘制美观动态圆环图、饼图
2020/06/03 Python
基于K.image_data_format() == 'channels_first' 的理解
2020/06/29 Python
Shopty西班牙:缝纫机在线销售
2018/01/26 全球购物
英国最受欢迎的价格比较网站之一:MoneySuperMarket
2018/12/19 全球购物
教育英语专业毕业生的求职信
2014/03/13 职场文书
促销活动计划书
2014/05/02 职场文书
2014年学校国庆主题活动方案
2014/09/16 职场文书
2014年领导班子专项整治整改方案
2014/09/28 职场文书
卖房协议书样本
2014/10/30 职场文书
2014-2015学年工作总结
2014/11/27 职场文书
2015年校长新年寄语
2014/12/08 职场文书
公司保洁员岗位职责
2015/02/13 职场文书
2015年家长学校工作总结
2015/04/22 职场文书
2015年党风建设工作总结
2015/04/29 职场文书
运动会宣传稿50字
2015/07/23 职场文书
劳务派遣管理制度(样本)
2019/08/23 职场文书
用Python进行栅格数据的分区统计和批量提取
2021/05/27 Python
Mysql binlog日志文件过大的解决
2021/10/05 MySQL