python dlib学习(一):人脸检测

来源:互联网 发布:js 获取table tr td 编辑:程序博客网 时间:2024/05/21 05:21

前言

dlib毕竟是一个很有名的库了,有c++、Python的接口。使用dlib可以大大简化开发,比如人脸识别,特征点检测之类的工作都可以很轻松实现。同时也有很多基于dlib开发的应用和开源库,比如face_recogintion库(应用一个基于Python的开源人脸识别库,face_recognition)等等。

环境安装

不算复杂,我只在Linux和win下跑过。安装配置不算难,直接贴链接了。
Linux下的安装在这篇博客中介绍了(应用一个基于Python的开源人脸识别库,face_recognition),不做赘述。
win下安装教程:
python 安装dlib和boost
Windows环境 安装dlib(python) 总结

程序

注:程序中使用了python-opencv、dlib,使用前请配置好环境。
程序中已有注释。

# -*- coding: utf-8 -*-import sysimport dlibimport cv2detector = dlib.get_frontal_face_detector() #获取人脸分类器# 传入的命令行参数for f in sys.argv[1:]:    # opencv 读取图片,并显示    img = cv2.imread(f, cv2.IMREAD_COLOR)    # 摘自官方文档:    # image is a numpy ndarray containing either an 8bit grayscale or RGB image.    # opencv读入的图片默认是bgr格式,我们需要将其转换为rgb格式;都是numpy的ndarray类。    b, g, r = cv2.split(img)    # 分离三个颜色通道    img2 = cv2.merge([r, g, b])   # 融合三个颜色通道生成新图片    dets = detector(img, 1) #使用detector进行人脸检测 dets为返回的结果    print("Number of faces detected: {}".format(len(dets)))  # 打印识别到的人脸个数    # enumerate是一个Python的内置方法,用于遍历索引    # index是序号;face是dets中取出的dlib.rectangle类的对象,包含了人脸的区域等信息    # left()、top()、right()、bottom()都是dlib.rectangle类的方法,对应矩形四条边的位置    for index, face in enumerate(dets):        print('face {}; left {}; top {}; right {}; bottom {}'.format(index, face.left(), face.top(), face.right(), face.bottom()))        # 在图片中标注人脸,并显示        left = face.left()        top = face.top()        right = face.right()        bottom = face.bottom()        cv2.rectangle(img, (left, top), (right, bottom), (0, 255, 0), 3)        cv2.namedWindow(f, cv2.WINDOW_AUTOSIZE)        cv2.imshow(f, img)# 等待按键,随后退出,销毁窗口k = cv2.waitKey(0)cv2.destroyAllWindows()

运行结果

运行程序,后缀是图片的名称。
这里写图片描述

这里写图片描述

官方例程:

最后附上官方程序:

#!/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 sysimport dlibfrom skimage import iodetector = 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]))
原创粉丝点击