dlib 配置及使用方法

配置

py3.6+dlib:目前window这么配置不会报错。dlib去官网或者python包网(https://pypi.org/simple/dlib/ )都能下载,下载到本地,然后pip直接安装就好。

使用

准备工作

dlib之所以能识别脸部关键点是因为他是深度学习模型,在使用前,需要去下载模型:http://dlib.net/files/,看下图,主要是这些模型。

我这里选择shape_predictor_68_face_landmarks.dat.bz2 ,然后解压,能检测出来68个点。下图为关键点的位置

例子 1 

下面为识别一个图片的例子


import cv2
import dlib
 
path = "img/meinv.png"
img = cv2.imread(path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 
#人脸分类器
detector = dlib.get_frontal_face_detector()
# 获取人脸检测器
predictor = dlib.shape_predictor(
    "C:\\Python36\\Lib\\site-packages\\dlib-data\\shape_predictor_68_face_landmarks.dat"
)
 
dets = detector(gray, 1)
for face in dets:
    shape = predictor(img, face)  # 寻找人脸的68个标定点
    # 遍历所有点,打印出其坐标,并圈出来
    for pt in shape.parts():
        pt_pos = (pt.x, pt.y)
        cv2.circle(img, pt_pos, 2, (0, 255, 0), 1)
    cv2.imshow("image", img)
 
cv2.waitKey(0)
cv2.destroyAllWindows()

例子2

这个是活体检测,用的是判断人眼的眨动。

\l =[(a-b)+(c-d)]/2\times (l_{1}-l_{2})

参数的含义看示意图

 

# USAGE
# python detect_blinks.py --shape-predictor shape_predictor_68_face_landmarks.dat --video blink_detection_demo.mp4
# python detect_blinks.py --shape-predictor shape_predictor_68_face_landmarks.dat

# import the necessary packages
from scipy.spatial import distance as dist
from imutils.video import FileVideoStream
from imutils.video import VideoStream
from imutils import face_utils
import numpy as np
import argparse
import imutils
import time
import dlib
import cv2

def eye_aspect_ratio(eye):
	# compute the euclidean distances between the two sets of
	# vertical eye landmarks (x, y)-coordinates 欧氏距离
	A = dist.euclidean(eye[1], eye[5])
	B = dist.euclidean(eye[2], eye[4])

	# compute the euclidean distance between the horizontal
	# eye landmark (x, y)-coordinates
	C = dist.euclidean(eye[0], eye[3])
	'''
		[1]	[2]
	[0]			[3]
		[5]	[4]
	'''
	# compute the eye aspect ratio
	ear = (A + B) / (2.0 * C)

	# return the eye aspect ratio
	return ear



# # 我注释掉的 construct the argument parse and parse the arguments
# ap = argparse.ArgumentParser()
# ap.add_argument("-p", "--shape-predictor", required=True,
# 	help="path to facial landmark predictor")
# ap.add_argument("-v", "--video", type=str, default="",
# 	help="path to input video file")
# args = vars(ap.parse_args())

p = 'shape_predictor_68_face_landmarks.dat'
v = "blink_detection_demo.mp4"

# define two constants, one for the eye aspect ratio to indicate
# blink and then a second constant for the number of consecutive
# frames the eye must be below the threshold
EYE_AR_THRESH = 0.3
EYE_AR_CONSEC_FRAMES = 3

# initialize the frame counters and the total number of blinks
COUNTER = 0
TOTAL = 0

# 初始化dlib's face detector (HOG-based),然后创建“面部标志预测器”facial landmark predictor
print("[INFO] loading facial landmark predictor...")
detector = dlib.get_frontal_face_detector() # 创建识别器
'''
print("detector:",help(detector))
This object represents a sliding window histogram-of-oriented-gradients based object detector.
此对象表示基于定向梯度的对象检测器的滑动窗口直方图。
'''

# predictor = dlib.shape_predictor(args["shape_predictor"])
predictor = dlib.shape_predictor(p) # 读取训练好的模型
"""
print("predictor",help(predictor))
This object is a tool that takes in an image region containing some 
object and outputs a set of point locations that define the pose of the object. 
The classic example of this is human face pose prediction, where you take 
an image of a human face as input and are expected to identify the locations of 
important facial landmarks such as the corners of the mouth and eyes, tip of the nose, and so forth。
此对象是一个工具,它接受包含某些对象的图像区域,并输出一组定义对象姿势的点位置。
这方面的经典例子是人脸姿势预测,在这里,您可以将人脸的图像作为输入,
并期望识别重要面部标志的位置,如嘴角和眼睛、鼻尖等。
"""

# 分别地抓取人脸的左眼和右眼的坐标 respectively
(lStart, lEnd) = face_utils.FACIAL_LANDMARKS_IDXS["left_eye"]
(rStart, rEnd) = face_utils.FACIAL_LANDMARKS_IDXS["right_eye"]
# face_utils.FACIAL_LANDMARKS_IDXS:Dictionary that remembers insertion order
# 开始读取视频流
print("[INFO] starting video stream thread...")
# vs = FileVideoStream(args["video"]).start()
vs = FileVideoStream(v).start()  # 开始读取
fileStream = True
# vs = VideoStream(src=0).start()
# vs = VideoStream(usePiCamera=True).start()
# fileStream = False
time.sleep(1.0)



# 从视频流循环帧
while True:
	# if this is a file video stream, then we need to check if
	# there any more frames left in the buffer to process
	if fileStream and not vs.more():  # vs.more() 当vs存在时返回True,否则返回False
		break

	# grab the frame from the threaded video file stream, resize
	# it, and convert it to grayscale
	# channels)
	frame = vs.read() # 读取一针
	frame = imutils.resize(frame, width=450) # 设置宽度  ·450
	gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

	# 创建灰度图识别器  进行识别加快速度
	rects = detector(gray, 0)

	# loop over the face detections
	for rect in rects:
		# determine the facial landmarks for the face region, then
		# convert the facial landmark (x, y)-coordinates to a NumPy
		# array
		shape = predictor(gray, rect) # 进行预测 返回值包括眼睛鼻子嘴的坐标
		shape = face_utils.shape_to_np(shape)

		# extract the left and right eye coordinates, then use the
		# coordinates to compute the eye aspect ratio for both eyes
		leftEye = shape[lStart:lEnd]
		rightEye = shape[rStart:rEnd]
		leftEAR = eye_aspect_ratio(leftEye)
		rightEAR = eye_aspect_ratio(rightEye)

		# average the eye aspect ratio together for both eyes
		ear = (leftEAR + rightEAR) / 2.0

		# compute the convex hull for the left and right eye, then
		# visualize each of the eyes
		leftEyeHull = cv2.convexHull(leftEye)
		rightEyeHull = cv2.convexHull(rightEye)
		cv2.drawContours(frame, [leftEyeHull], -1, (0, 255, 0), 1)
		cv2.drawContours(frame, [rightEyeHull], -1, (0, 255, 0), 1)

		# check to see if the eye aspect ratio is below the blink
		# threshold, and if so, increment the blink frame counter
		if ear < EYE_AR_THRESH:
			COUNTER += 1

		# otherwise, the eye aspect ratio is not below the blink
		# threshold
		else:
			# if the eyes were closed for a sufficient number of
			# then increment the total number of blinks
			if COUNTER >= EYE_AR_CONSEC_FRAMES:
				TOTAL += 1

			# reset the eye frame counter
			COUNTER = 0

		# draw the total number of blinks on the frame along with
		# the computed eye aspect ratio for the frame
		cv2.putText(frame, "Blinks: {}".format(TOTAL), (10, 30),
			cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
		cv2.putText(frame, "EAR: {:.2f}".format(ear), (300, 30),
			cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
 
	# show the frame
	cv2.imshow("Frame", frame)
	key = cv2.waitKey(1) & 0xFF
 
	# if the `q` key was pressed, break from the loop
	if key == ord("q"):
		break

# do a bit of cleanup
cv2.destroyAllWindows()
vs.stop()

同理你也可以判断嘴巴的张合。不过用到的公司需要修改下。要用到52-58-49-55,63--67--61--65。公式见下面,里面考虑了一个问题,就是后唇和薄唇带的来的闭合不明显。

IF (P_{52}-P_{58})/(P_{49}-P_{55}) or (P_{63}-P_{67})/(P_{61}-P_{65}): True , ELSE: Fasle

 

例子3 

由于某些原因不停工这个代码,说出自己想法。抖音上换脸的玩法都知道霸,可以通过关键点来实现,有电脑都。

例子4

某游戏可以通过拍照人脸来捏游戏人物角色的脸,也是用关键点实现的。

 

 

 

  • 5
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
要在Spyder中配置dlib,您可以按照以下步骤进行操作: 1. 首先,确保您已经在Windows 11环境下配置好了dlib的相关依赖。如果缺少VC的相关路径配置,可以参考[1]中提到的使用whl文件安装方法。 2. 打开Spyder,并创建一个新的Python项目。 3. 在项目中创建一个新的Python脚本。 4. 在脚本中,使用pip命令安装dlib。您可以使用Anaconda Prompt或者Spyder内置的终端来执行此命令。在终端中输入以下命令: ```python pip install dlib ``` 5. 安装完成后,您可以在脚本中导入dlib,并开始使用它。例如,您可以使用以下代码导入dlib和其他相关: ```python import dlib import cv2 ``` 6. 接下来,您可以使用dlib中的功能来实现人脸识别的项目。 请注意,配置dlib可能会涉及到其他依赖安装配置。您可以根据项目需要,按照需要安装配置这些依赖。 希望以上步骤对于在Spyder中配置dlib有所帮助。如果需要更详细的指导,请参考中提到的将Spyder配置为Matlab或者Spyder的用法说明。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [人脸识别系统 Windows操作系统下 Anaconda+Pycharm+python3.8 安装dlib以及face_recognition](https://blog.csdn.net/qq_52416885/article/details/120347207)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [将pycharm配置为matlab或者spyder的用法说明](https://download.csdn.net/download/weixin_38726712/12851263)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颐水风华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值