Python3结合Dlib实现人脸识别和剪切 !

用Retinaface_pytorch项目检测人脸+ Python 3 剪切人脸图片并保存 概述 因为我的项目中缺一不可的一部分是提取人脸特征,因为以前并没有接触过人脸的项目,所以想把自己每次的一点点进步和学习都记录下来,这次是记录我学习切割人脸图片并保存,以及将人脸检测框和五个特征点坐标信息保存在.txt文件中。 这篇文档的方法要稍微复杂一点点,我结合Retinaface_pytorch项目中的detect.py(检测单张图片)来检测人脸,并通过以下方法成功的剪切出人脸,并保存特征点信... 阅读详情

0. 引言

利用 Python 开发,借助 Dlib 库进行人脸检测 / face detection 和剪切;

 Python资源共享群:484031800

1. crop_faces_show.py :

将检测到的人脸剪切下来,依次排序平铺显示在新的图像上;

实现的效果如 图1 所示,将 图1 原图中的 6 张人脸检测出来,然后剪切下来,在图像窗口中依次输出显示人脸;

2. crop_faces_save.py :

将检测到的人脸存储为单个人脸图像;

 

 

 

 

 

 

图 1 原图 和 crop_faces_show.py 处理后得到的平铺人脸图像窗口

 

 

 

 

 

 

 

图 2 crop_faces_save.py 处理后得到的多个单张人脸图像文件

 

源码上传到了我的 Github;

如果对您有帮助或者感兴趣,欢迎 Star 支持下: https://github.com/coneypo/Dlib_face_cut

 

1. 开发环境

Python: 3.6.3

Dlib: 19.7

OpenCv, NumPy

import dlib                 # 人脸检测的库 Dlib
import numpy as np         # 数据处理的库 numpy
import cv2                  # 图像处理的库 OpenCv

 

2. 实现过程

工作内容主要以下两大块:Dlib 人脸检测 和 处理检测到的人脸图像

2.1 Dlib 人脸检测

利用已经训练好的 Dlib 正向人脸检测器 detector = dlib.get_frontal_face_detector() 进行人脸检测;

可以得到人脸外接矩形的坐标,用来之后进行裁剪;

具体 Dlib 的使用,请参考我另一篇博客;

( link: Python 3 利用 Dlib 19.7 进行人脸检测);

 

 

 

 

 

 1 # Dlib 检测器
 2  detector = dlib.get_frontal_face_detector()
 3   
 4  # 读取图像
 5  path = "/***/image_path/"
 6  img = cv2.imread(path+"test_faces.jpg")
 7  # print("img/shape:", img.shape)
 8   
 9  # Dlib 检测
10  faces = detector(img, 1)
11  
12  print("人脸数:", len(faces))

 

 

 

 

 

 

 

2.2 绘制新图像

如果你想让检测出来的人脸并排显示的话,需要遍历两次( for k, d in enumerate (faces) ):

 第一次遍历:记录下我们需要生成的图像窗口的大小,因为需要将多张照片显示在一张图像上,所以需要知道每张人脸照片的大小;

第二次遍历:根据之前得到的图像尺寸新建空白图像,然后开始用人脸矩形填充图像;

 

2.2.1 确定空白图像尺寸

( 这部分首先要根据检测到的人脸数和人脸大小,来确定绘制图像所需要的尺寸)

第一次遍历:多张人脸要输出到一行,所以先进行一次人脸的遍历j记下每张人脸的大小,记每张人脸的尺寸为 [ 高度 height * 宽度 width ](高度和宽度说明见 图 3 ):

 

 

 

 

 

图 3 图像尺寸说明

 

我取的生成空白图像的尺寸:height_max(最大高度)和 width_sum(宽度之和),然后根据尺寸大小来新建空白图像:

img_blank = np.zeros((height_max, width_sum, 3), np.uint8)

 

 

 

 

 

 

图 4 图像尺寸 height_max 和 width_sum

 

2.2.2 图像填充

第二次遍历:多根据之前得到的图像尺寸新建空白图像,然后开始用人脸矩形填充图像,每次 width 方向从 blank_start 位置开始,每次填完一张之后记得更新起始位置:( blank_start += width ):

for i in range(height):
    for j in range(width):
        img_blank[i][blank_start + j] = img[d.top() + i][d.left() + j]

 

如果想访问图像的某点像素,可以利用 img [height] [width]:

存储像素其实是一个三维数组,先高度 height,然后宽度 width;

返回的是一个颜色数组( 0-255,0-255,0-255 ),按照( B, G, R )的顺序;

比如 蓝色 就是(255,0,0),红色 是(0,0,255);

 

3. 源码

3.1 crop_faces_show.py

 

 

 

 

 

# created at 2018-01-22
# updated at 2018-09-29
# Author:   coneypo
# Blog:     http://www.cnblogs.com/AdaminXie
# GitHub:   https://github.com/coneypo/Dlib_face_cut
import dlib         # 人脸识别的库dlib
import numpy as np  # 数据处理的库numpy
import cv2          # 图像处理的库OpenCv
# Dlib 检测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
# 读取图像
path = "faces_for_test/"
img = cv2.imread(path+"test_faces_1.jpg")
# Dlib 检测
dets = detector(img, 1)
print("人脸数:", len(dets), "\n")
# 记录人脸矩阵大小
height_max = 0
width_sum = 0
# 计算要生成的图像 img_blank 大小
for k, d in enumerate(dets):
    # 计算矩形大小
    # (x,y), (宽度width, 高度height)
    pos_start = tuple([d.left(), d.top()])
    pos_end = tuple([d.right(), d.bottom()])
    # 计算矩形框大小
    height = d.bottom()-d.top()
    width = d.right()-d.left()
    # 处理宽度
    width_sum += width
    # 处理高度
    if height > height_max:
        height_max = height
    else:
        height_max = height_max
# 绘制用来显示人脸的图像的大小
print("窗口大小:"
      , '\n', "高度 / height:", height_max
      , '\n', "宽度 / width: ", width_sum)
# 生成用来显示的图像
img_blank = np.zeros((height_max, width_sum, 3), np.uint8)
# 记录每次开始写入人脸像素的宽度位置
blank_start = 0
# 将人脸填充到img_blank
for k, d in enumerate(dets):
    height = d.bottom()-d.top()
    width = d.right()-d.left()
    # 填充
    for i in range(height):
        for j in range(width):
                img_blank[i][blank_start+j] = img[d.top()+i][d.left()+j]
    # 调整图像
    blank_start += width
cv2.namedWindow("img_faces")#, 2)
cv2.imshow("img_faces", img_blank)
cv2.waitKey(0

 

 

 

 

 

 

 

实现效果:

 

 

 

 

 

图 5 原图和处理后得到的图像窗口

 

3.2 crop_faces_save.py

如果你想将识别出来的人脸保存成单个的图像,方便之后处理用,只需将上述代码进行略微修改;

只需一次遍历,根据每次检测到的人脸尺寸,新建空白图像后写入,然后利用 cv2.imwrite 写入到本地:

crop_faces_save.py:

 

 

 

 

 

 1 # created at 2018-01-22
 2 # updated at 2018-09-29
 3 
 4 # Author:   coneypo
 5 # Blog:     http://www.cnblogs.com/AdaminXie
 6 # GitHub:   https://github.com/coneypo/Dlib_face_cut
 7 
 8 import dlib         # 人脸识别的库dlib
 9 import numpy as np  # 数据处理的库numpy
10 import cv2          # 图像处理的库OpenCv
11 import os
12 
13 # 读取图像的路径
14 path_read = "faces_for_test/"
15 img = cv2.imread(path_read+"test_faces_3.jpg")
16 
17 # 用来存储生成的单张人脸的路径
18 path_save = "faces_separated/"
19 
20 
21 # Delete old images
22 def clear_images():
23     imgs = os.listdir(path_save)
24 
25     for img in imgs:
26         os.remove(path_save + img)
27 
28     print("clean finish", '\n')
29 
30 
31 clear_images()
32 
33 
34 # Dlib 预测器
35 detector = dlib.get_frontal_face_detector()
36 predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
37 
38 
39 # Dlib 检测
40 faces = detector(img, 1)
41 
42 print("人脸数:", len(faces), '\n')
43 
44 for k, d in enumerate(faces):
45 
46     # 计算矩形大小
47     # (x,y), (宽度width, 高度height)
48     pos_start = tuple([d.left(), d.top()])
49     pos_end = tuple([d.right(), d.bottom()])
50 
51     # 计算矩形框大小
52     height = d.bottom()-d.top()
53     width = d.right()-d.left()
54 
55     # 根据人脸大小生成空的图像
56     img_blank = np.zeros((height, width, 3), np.uint8)
57 
58     for i in range(height):
59         for j in range(width):
60                 img_blank[i][j] = img[d.top()+i][d.left()+j]
61 
62     # cv2.imshow("face_"+str(k+1), img_blank)
63 
64     # 存在本地
65     print("Save to:", path_save+"img_face_"+str(k+1)+".jpg")
66     cv2.imwrite(path_save+"img_face_"+str(k+1)+".jpg", img_blank)

 

 

 

 

 

 

 

 

 

 

 

 

图 6 生成的单个人脸图像文件

pytorch实现人脸识别包括人脸检测(opencv、dlib、CNN三种方法融合)人脸对齐和vgg-face人脸特征提取 博客地址:https://blog.youkuaiyun.com/wen_fei/article/details/80261047 人脸识别源代码,包括使用opencv、dlib和cnn实现的人脸检测、opencv实现的人脸对齐以及vgg-face的人脸特征提取等,最后余弦函数计算相似度,并提供flask部署代码,可以放在服务器上远程调用 立即下载

相关推荐

dlib剪切人脸照片

用Python+dlib,剪切出目标文件夹中人脸大头照以及坐标点文档;用Python+dlib,剪切出目标文件夹中人脸大头照以及坐标点文档

python 识别图片中的人脸,并裁人脸,将图片转化成指定大小,并将图片再原文件名保存。

因工作的原因,每年11月都要处理很多(1000张以上)的照片,并而要把照片处理成一寸大小。因为传统的方式一张一张处理,很费时间,只要是学过计算机都不可能一张一张处理的,之前我都是用软件的批理处理实现的,但是总会有照片,会被裁剪没有耳朵,或者没有头发。早就听说python语言语可以实现人工智能,那思路很简单。让python自动识别人脸,然后裁剪出指定大小,不就可以了吗。 说干就干先百度一下,找到了下面的文章, import cv2 import os import glob ...

weinm的专栏 6998

Python-autocrop批量从照片自动裁剪人脸

autocrop - 批量从照片自动裁剪人脸

通过Dlib和opencv实现人脸识别和活体检测

通过Dlib和opencv实现人脸识别并做活体检测

qq_54875519的博客 7345

python图片剪裁代码(图片按四个点坐标剪裁)

用了两种方法保存图片,opencv和Image,实践证明opencv非常快 from PIL import Image import os import cv2 import time import matplotlib.pyplot as plt def label2picture(cropImg,framenum,tracker): pathnew ="E:\\img2\\" # cv2.imshow("image", cropImg) # cv2.waitKey(1) if (os.path.exists(pathnew + tracker)): cv2.imw

Python3结合Dlib实现人脸识别和剪切

0.引言 利用python开发,借助Dlib库进行人脸识别,然后将检测到的人脸剪切下来,依次排序显示在新的图像上; 实现的效果如下图所示,将图1原图中的6张人脸检测出来,然后剪切下来,在图像窗口中依次输出显示人脸; 实现比较简单,代码量也比较少,适合入门或者兴趣学习。 图1 原图和处理后得到的图像窗口 1.开发环境 python:  3.6.3 dlib:    19.7 OpenCv, numpy import dlib # 人脸识别的库dlib import numpy as np # 数据处理的库numpy import cv2 # 图像处理的库OpenCv 2.设计流程 工作

Python使用opencv人脸识别剪裁图片

#-*-coding:utf8-*- import os import cv2 import time import shutil def getAllPath(dirpath, *suffix): PathArray = [] for r, ds, fs in os.walk(dirpath): for fn in fs: if os....

风火纶回 3995

Fast-LIO2代码解析 古月居

FAST-LIO,FAST-LIO2与FASTER-LIO - 古月居FAST-LIO2代码解析(一) - 古月居FAST-LIO2代码解析(二) - 古月居FAST-LIO2代码解析(三) - 古月居FAST-LIO2代码解析(四) - 古月居FAST-LIO2代码解析(五) - 古月居FAST-LIO2代码解析(六) - 古月居

li4692625的博客 2785

python人脸识别门禁_用Python做人脸识别

之前用facenet做了一个人脸识别的Demo,所以在此记录一下。但因为我的水平十分有限,疏漏之处请多见谅。1,这个流程大致是先用mtcnn检测人脸位置,得到一个人脸的bounding box。2,然后用opencv根据上一个bounding box把人脸裁剪出来,并对齐,因为实际裁剪出来的人脸,大的大,小的小(比如由于远近造成的人脸图片大小不一),但神经网络的输入是要统一大小的,比如96*96的...

weixin_39720807的博客 1033

思科模拟器Cisco Packet Tracer交换机的管理配置

一、交换机的管理方式:带内管理和带外管理 通过交换机的 Console 端口管理交换机属于带外管理;这种管理方式不占用交换机的网络端口,第一次配置交换机必须利用 Console 端口进行配置。 通过 Telnet、拨号等方式属于带内管理。 二、控制台配置思科交换机 1.新建拓扑图 新建拓扑,选择console线连接交换机和PC,一端接交换机的console口,一端接PC的RS 232 口(...

qq_37992321的博客 2万+

微信小程序 | 小程序开发

事实上,目前小程序在我们生活中已经随处可见(特别是这次疫情的推动,不管是什么岗位、什么年龄阶段的人,到哪都需要打开健康码)WePY是由腾讯开源的,一款让小程序支持组件化开发的框架,通过预编译的手段让开发者可以选择自己喜欢的开发风格去开发小程序。Mpvue是一个使用Vue开发小程序的前端框架,也是 支持 微信小程序、百度智能小程序,头条小程序 和 支付宝小程序;微信小程序、支付宝小程序、淘宝小程序、抖音小程序、头条小程序、QQ小程序、美团小程序等。,其他平台的小程序往往是平台本身的一些公司或者顺手开发的。

CoderHing的博客~ 1万+

python3图像识别_Python3结合Dlib实现人脸识别和剪切

0.引言利用python开发,借助Dlib库进行人脸识别,然后将检测到的人脸剪切下来,依次排序显示在新的图像上;实现的效果如下图所示,将图1原图中的6张人脸检测出来,然后剪切下来,在图像窗口中依次输出显示人脸;实现比较简单,代码量也比较少,适合入门或者兴趣学习。图1 原图和处理后得到的图像窗口1.开发环境python:  3.6.3dlib:    19.7OpenCv, numpyimport ...

weixin_39612554的博客 370

傅里叶红外(FT-IR):Origin数据处理、光谱绘图、曲线优化、图形美化

双击 X 轴,选择“轴线和刻度线”,设置粗细为“2”(较常用的粗细度),主刻度和次刻度为“朝内”,然后在此对话框内选择左轴,设置粗细为“2”,主刻度和次刻度为“无”,上轴和右轴同左轴。(4)在第二个图层基础上新建第三个图层,针对第二组数据重复上述中(1)和(2)的操作,再添加第三组数据的折线图,并重复上述中(3)的操作。FTIR 光谱上的峰只有相对的强弱,因此只分析一个光谱上的一个峰的强度大小并无意义,一般分析两个光谱在同一位置的峰强相对大小,或者分析同一光谱不同位置的峰强相对大小并与另一光谱进行比较。

qiushireader的博客 3932

python dlib人脸识别_Python3结合Dlib实现人脸识别和剪切

0.引言利用python开发,借助Dlib库进行人脸识别,然后将检测到的人脸剪切下来,依次排序显示在新的图像上;实现的效果如下图所示,将图1原图中的6张人脸检测出来,然后剪切下来,在图像窗口中依次输出显示人脸;实现比较简单,代码量也比较少,适合入门或者兴趣学习。图1 原图和处理后得到的图像窗口1.开发环境python:  3.6.3dlib:    19.7OpenCv, numpyimport ...

weixin_39984098的博客 302

Windows下Anaconda换清华镜像源最全指南(含常见问题解决)

本文提供了一份详尽的Windows系统下Anaconda配置清华镜像源的完整指南。针对网络下载缓慢的痛点,文章详细对比了命令行添加与直接编辑配置文件两种主流方法,并重点解决了配置过程中常见的文件缺失、安装失败、环境求解缓慢等疑难问题,帮助用户一劳永逸地提升包管理效率。

brandy的博客 337

战舰V3移植CANopenNode并驱动电机全流程

第三部分是电机的对象字典(也就是节点的OD)中的索引,长度2个字节。索引发送的是小段模式,比如这一部分为0X40 0X60,实际操作的索引地址为0X6040。第一部分是COB-ID,长度1个字节,电机的node-ID默认为0x01,所以报文ID一直是601。第五部分是要写入的数据,数据发送的时候是小端模式,低字节数据先发送,长度由第二部分决定。配置定时器6,时间为1ms,根据公式计算得到参数PSC取72-1,ARR取1000-1。第二部分是CMD,长度1个字节,其实就是数据部分的长度,

qq_50526837的博客 3045

python dlib人脸检测_Python 3 利用 Dlib 实现人脸检测和剪切

0. 引言利用 Python 开发,借助 Dlib 库进行人脸检测 / face detection 和剪切;将检测到的人脸剪切下来,依次排序平铺显示在新的图像上;实现的效果如 图1 所示,将 图1 原图中的 6 张人脸检测出来,然后剪切下来,在图像窗口中依次输出显示人脸;将检测到的人脸存储为单个人脸图像;图 1 原图 和crop_faces_show.py处理后得到的平铺人脸图像窗口图 2 ...

weixin_36016076的博客 457

delphi android发送与接收广播

在发送广播时,使用`SendBroadcast`函数,并传入广播的Action。在接收广播时,创建一个继承自`TAndroidBroadcastReceiver`的类,并在`onReceive`方法中处理接收到的广播。然后,使用`RegisterBroadcastReceiver`函数注册广播接收器,并在`UnregisterBroadcastReceiver`函数中取消注册。请注意替换示例代码中的`YOUR_ACTION`为实际的广播Action。// 处理接收到的广播。

GuoGuoABC 1207

Python 3 利用 Dlib 19.7 实现人脸检测和剪切

点击有惊喜 0.引言    利用python开发,借助Dlib库进行人脸检测/face detection;    1. dlib_cut_faces.py :      将检测到的人脸剪切下来,依次排序显示在新的图像上;     实现的效果如图1所示,将图1原图中的6张人脸检测出来,然后剪切下来,在图像窗口中依次输出显示人脸;    2. 

weixin_40674835的博客 3375

一个 ABAP 工具,能打印系统里某个用户对 BSP 应用的浏览历史记录

只要一个用户在 SAP ABAP 系统里浏览过 BSP 页面,会留下浏览历史记录。本工具会解析出这些记录,打印出该用户浏览的历史事件,和浏览过的页面名称。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 546

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Dlib实现人脸检测,并剪切人脸照

一、Dlib的安装: 如果你的Python版本是3.6,那么安装dlib要简单很多,直接 pip install dlib==19.7.0 如果上面安装失败,就用博主附带的.whl文件进行安装吧。(如果你的Python版本不是3.6,又或者你想安装dlib其他的版本,博主爱莫能助,但是你可以在这里找到合适的版本和方法。) –------------------------------------...

zzZ_CMing的博客 4511

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Dlib实现人脸检测和剪切

参考:https://www.cnblogs.com/AdaminXie/p/8339863.html 代码: # -*- coding: UTF-8 -*- """ 将指定目录下的所有图片的人脸抠出 """ import dlib # 人脸识别的库dlib import numpy as np # 数据处理的库numpy import cv2 # 图像处...

24小时的程序员 3017

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

linux下c 和dlib实现人脸识别,Python 3 利用 Dlib 19.7 实现人脸识别和剪切

# 2018-01-22# By TimeStamp# #cnblogs: http://www.cnblogs.com/AdaminXie/import dlib # 人脸识别的库dlibimport numpy as np # 数据处理的库numpyimport cv2 # 图像处理的库OpenCv# dlib预测器detector = dlib.get_fr...

weixin_39796855的博客 113

python实现面部特效_Python 3 利用 Dlib 实现摄像头实时人脸检测和平铺显示

Python 3 利用 Dlib 实现摄像头实时人脸检测和平铺显示1. 引言在某些场景下,我们不仅需要进行实时人脸检测追踪,还要进行再加工;这里进行摄像头实时人脸检测,并对于实时检测的人脸进行初步提取;学习Python中有不明白推荐加入交流群号:864573496群里有志同道合的小伙伴,互帮互助,群里有不错的视频学习教程和PDF!每晚8:00群里直播单个/多个人脸检测,并依次在摄像头窗口,实时平铺...

weixin_39556891的博客 385
上一篇: Python开发植物大战僵尸游戏,能不能通关我说了算!
下一篇: Python 手写线性回归算法竟如此简单
普通网友
博客等级 码龄7年 438粉丝 263原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值