人工智能opencv使用深度学习对人脸进行实时视频的性别检测

图片人脸性别检测

抖音的美颜功能强大到能把男人变成伪娘,甚至还有年轻小伙刷礼物,疯狂追求,殊不知,你追求的大美女在生活中却是一个油腻大叔。本期文章带你如何使用人工智能技术打假抖音伪娘

人脸年龄的检测步骤

0、打开摄像头,获取图片数据

1、对图片进行人脸的检测,需要人脸检测模型

2、把检测到的人脸数据给性别检测模型去检测,需要性别检测模型

3、把检测结果实时呈现到图片上

import numpy as np
import time
import cv2
import os
def predict_gender(frame, faceNet, ageNet):
	genderList = ['Male', 'Female']
	results = []
	(h, w) = frame.shape[:2]
	blob = cv2.dnn.blobFromImage(frame, 1.0, (300, 300),	(104.0, 177.0, 123.0))
	faceNet.setInput(blob)
	detections = faceNet.forward()
	for i in range(0, detections.shape[2]):
		confidence = detections[0, 0, i, 2]
		if confidence > 0.5:
			box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
			(startX, startY, endX, endY) = box.astype("int")
			face = frame[startY:endY, startX:endX]
			if face.shape[0] < 20 or face.shape[1] < 20:
				continue
			faceBlob = cv2.dnn.blobFromImage(face, 1.0, (227, 227),(78.4263377603, 87.7689143744, 114.895847746),	swapRB=False)
			genderNet.setInput(faceBlob)
			preds = genderNet.forward()
			i = preds[0].argmax()
			gender = genderList[i]
			genderConfidence = preds[0][i]
			d = {	"loc": (startX, startY, endX, endY),	"gender": (gender, genderConfidence)}
			results.append(d)
	return results

首先导入需要的第三方库,主要使用opencv 与性别检测模型

传入从摄像头中读取的图片

image.shape来获取图片的尺寸

cv2.dnn.blobFromImage来计算图片的blob值

blob = cv2.dnn.blobFromImage(image, scalefactor=1.0, size, mean, swapRB=True,crop=False,ddepth = CV_32F )

1.image,这是传入的,需要进行处理的图像。

2.scalefactor,执行完减均值后,需要缩放图像,默认是1,需要注意,scalefactor = 1 / \sigma,这是真正乘上的值。

3.size,这是神经网络,真正支持输入的值。

4.mean,这是我们要减去的均值,可以是R,G,B均值三元组,或者是一个值,每个通道都减这值。如果执行减均值,通道顺序是R、G、B。 如果,输入图像通道顺序是B、G、R,那么请确保swapRB = True,交换通道。

5.swapRB,OpenCV认为图像 通道顺序是B、G、R,而减均值时顺序是R、G、B,为了解决这个矛盾,设置swapRB=True即可。

6.crop,如果crop裁剪为真,则调整输入图像的大小,使调整大小后的一侧等于相应的尺寸,另一侧等于或大于。然后,从中心进行裁剪。如果“裁剪”为“假”,则直接调整大小而不进行裁剪并保留纵横比。

7.ddepth, 输出blob的深度,选择CV_32F or CV_8U

cv2.dnn.blobFromImage这个函数执行:

1.减均值

2.缩放

3.通道交换

等工作,主要对图片进行预处理,以便神经网络的学习分类

最后把图片的blob值放入神经网络,进行人脸的预测

detections.shape[2]来存放神经网络检测到的人脸,通过遍历这个list

来获取每个人脸的置信度,当置信度大于0.5时,我们认为是一个合格的人脸

startX, startY, endX, endY来获取人脸在图片中的坐标

有了人脸的坐标就可以把人脸这部分单独提出来来计算人脸图片的blob值

把人脸blob值放入性别检测模型中进行人脸性别的检测preds

preds[0].argmax把性别的每个概率进行对比,并提取最大概率的性别的index

gender = genderList[i]获取性别

genderConfidence = preds[0][i]获取性别概率

最后把检测到的数据呈现到图片上并显示图片

通过以上我们建立了性别检测的函数,接下来需要传入函数需要的模型与图片

加载模型

prototxtFacePath =  "model/deploy.prototxt"
weightsFacePath = "model/res10_300x300_ssd_iter_140000.caffemodel"
faceNet = cv2.dnn.readNet(prototxtFacePath, weightsFacePath)
prototxtGenderPath = "model/deploy_gender.prototxt"
weightsGenderPath = "model/gender_net.caffemodel"
genderNet = cv2.dnn.readNet(prototxtGenderPath, weightsGenderPath)

分别加载人脸检测模型与人脸性别检测模型

打开摄像头进行图片读取与检测

capture = cv2.VideoCapture(0)
time.sleep(2.0)
while True:
	ret, frame = capture.read()
	#frame = cv2.resize(frame, (600,400))
	results = predict_gender(frame, faceNet, genderNet)
	for r in results:
		text = "{}: {:.2f}%".format(r["gender"][0], r["gender"][1] * 100)
		(startX, startY, endX, endY) = r["loc"]
		y = startY - 10 if startY - 10 > 10 else startY + 10
		cv2.rectangle(frame, (startX, startY), (endX, endY),(0, 0, 255), 2)
		cv2.putText(frame, text, (startX, y),cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)
	cv2.imshow("Frame", frame)
	key = cv2.waitKey(1) & 0xFF
	if key == ord("q"):
		break
cv2.stop()
cv2.destroyAllWindows()

capture = cv2.VideoCapture(0)打开默认的笔记本摄像头

time.sleep(2.0)延时为了摄像头的热启动

使用capture.read()来读取每个视频帧中的图片,然后传入性别检测模型,当获取检测结果后,实时显示到视频上。