热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

人脸识别(4)--Python3.6+dlib19.4识别实例

生成方形框识别人脸关键线识别人脸前提条件:确保python+dlib环境已经搭建成功。

    • 生成方形框识别人脸
    • 关键线识别人脸

前提条件:
确保python+dlib环境已经搭建成功。搭建步骤可以参考上一篇博客:http://blog.csdn.net/u012842255/article/details/70194609

生成方形框识别人脸

官网代码:

#!/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 THE DLIB PYTHON INTERFACE
# Dlib comes with a compiled python interface for python 2.7 on MS Windows. If
# you are using another python version or operating system then you need to
# compile the dlib python interface before you can use this file. To do this,
# run compile_dlib_python_module.bat. This 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 -U scikit-image
# Or downloaded from http://scikit-image.org/download.html.
import sysimport dlib
from skimage import io
detector = dlib.get_frontal_face_detector()
win = dlib.image_window()print("a");
for f in sys.argv[1:]:
print("a");
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.
# 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)
for i, d in enumerate(dets):
print("Detection {}, score: {}, face_type:{}"
.format(d, scores[i], idx[i]))

简略总结:

# -*- coding: utf-8 -*-
import sysimport dlib
from skimage import io
#使用dlib自带的frontal_face_detector作为我们的特征提取器
detector = dlib.get_frontal_face_detector()

#使用dlib提供的图片窗口
win = dlib.image_window()
#sys.argv[]是用来获取命令行参数的,sys.argv[0]表示代码本身文件路径,所以参数从1开始向后依次获取图片路径
for f in sys.argv[1:]:
#输出目前处理的图片地址
print("Processing file: {}".format(f))
#使用skimage的io读取图片
img = io.imread(f)
#使用detector进行人脸检测 dets为返回的结果
dets = detector(img, 1)
#dets的元素个数即为脸的个数
print("Number of faces detected: {}".format(len(dets)))
#使用enumerate 函数遍历序列中的元素以及它们的下标
#下标i即为人脸序号
#left:人脸左边距离图片左边界的距离 ;right:人脸右边距离图片左边界的距离
#top:人脸上边距离图片上边界的距离 ;bottom:人脸下边距离图片上边界的距离
for i, d in enumerate(dets):print("dets{}".format(d))
print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}"
.format( i, d.left(), d.top(), d.right(), d.bottom()))
#也可以获取比较全面的信息,如获取人脸与detector的匹配程度
dets, scores, idx = detector.run(img, 1)
for i, d in enumerate(dets):
print("Detection {}, dets{},score: {}, face_type:{}".format( i, d, scores[i], idx[i]))

#绘制图片(dlib的ui库可以直接绘制dets)
win.set_image(img)
win.add_overlay(dets)
#等待点击
dlib.hit_enter_to_continue()

实例效果:
)):
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()

简化代码:

# -*- coding: utf-8 -*-
import dlib
import numpyfrom skimage
import io
#源程序是用sys.argv从命令行参数去获取训练模型,精简版我直接把路径写在程序中了
predictor_path = "./data/shape_predictor_68_face_landmarks.dat"

#源程序是用sys.argv从命令行参数去获取文件夹路径,再处理文件夹里的所有图片
#这里我直接把图片路径写在程序里了,每运行一次就只提取一张图片的关键点
faces_path = "./data/3.jpg"

#与人脸检测相同,使用dlib自带的frontal_face_detector作为人脸检测器
detector = dlib.get_frontal_face_detector()

#使用官方提供的模型构建特征提取器
predictor = dlib.shape_predictor(predictor_path)

#使用dlib提供的图片窗口
win = dlib.image_window()
#使用skimage的io读取图片
img = io.imread(faces_path)
#绘制图片
win.clear_overlay()
win.set_image(img)
#与人脸检测程序相同,使用detector进行人脸检测 dets为返回的结果
dets = detector(img, 1)
#dets的元素个数即为脸的个数
print("Number of faces detected: {}".format(len(dets)))
#使用enumerate 函数遍历序列中的元素以及它们的下标
#下标k即为人脸序号
#left:人脸左边距离图片左边界的距离 ;right:人脸右边距离图片左边界的距离
#top:人脸上边距离图片上边界的距离 ;bottom:人脸下边距离图片上边界的距离
for k, d in enumerate(dets):
print("dets{}".format(d))
print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
k, d.left(), d.top(), d.right(), d.bottom()))
#使用predictor进行人脸关键点识别 shape为返回的结果
shape = predictor(img, d)
#获取第一个和第二个点的坐标(相对于图片而不是框出来的人脸)
print("Part 0: {}, Part 1: {} ...".format(shape.part(0), shape.part(1)))
#绘制特征点
win.add_overlay(shape)
#绘制人脸框
win.add_overlay(dets)
#也可以这样来获取(以一张脸的情况为例)
#get_landmarks()函数会将一个图像转化成numpy数组,并返回一个68 x2元素矩阵,输入图像的每个特征点对应每行的一个x,y坐标。
def get_landmarks(im):
rects = detector(im, 1)
return numpy.matrix([[p.x, p.y] for p in predictor(im, rects[0]).parts()])

#多张脸使用的一个例子
def get_landmarks_m(im):
dets = detector(im, 1)
#脸的个数
print("Number of faces detected: {}".format(len(dets)))
for i in range(len(dets)):facepoint = np.array([[p.x, p.y]
for p in predictor(im, dets[i]).parts()])for i in range(68):
#标记点
im[facepoint[i][1]][facepoint[i][0]] = [232,28,8]
return im

#打印关键点矩阵
print("face_landmark:")
print(get_landmarks(img))
#等待点击
dlib.hit_enter_to_continue()

效果实例:
这里写图片描述

参考文档:http://www.th7.cn/Program/Python/201511/706515.shtml


推荐阅读
author-avatar
mmmmGi_626
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有