前期的文章我们分享了人脸的识别以及如何进行人脸数据的训练,本期文章我们结合人脸识别的
模型进行人脸性别的检测
人脸性别的检测步骤
1、首先需要进行人脸的检测
2、把检测到的人脸数据给性别检测模型去检测
3、把检测结果呈现到图片上
import numpy as np import cv2 import os genderList = [&39;, &39;] prototxtFacePath = &34; weightsFacePath = &34; faceNet = cv2.dnn.readNet(prototxtFacePath, weightsFacePath) prototxtGenderPath = &34; weightsGenderPath = &34; genderNet = cv2.dnn.readNet(prototxtGenderPath, weightsGenderPath)初始化模型性别,当然你也可以使用大量的数据,进行更准确的模型训练
然后cv2.dnn.readNet加载人脸识别的模型,可参考往期文章
顺便在这里介绍一下由人工智能研究所出品的专栏,人工智能目标检测与目标追踪
有兴趣的小伙伴们可以一起探讨学习
最后cv2.dnn.readNet加载人脸年龄的模型
image = cv2.imread(&34;) (h, w) = image.shape[:2] blob = cv2.dnn.blobFromImage(image, 1.0, (300, 300), (104.0, 177.0, 123.0)) faceNet.setInput(blob) detections = faceNet.forward()使用cv2.imread来读取要检测的图片
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值放入神经网络,进行人脸性别的预测
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(&34;) face = image[startY:endY, startX:endX] 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] text = &34;.format(gender, genderConfidence * 100) y = startY - 10 if startY - 10 > 10 else startY + 10 cv2.rectangle(image, (startX, startY), (endX, endY),(0, 0, 255), 2) cv2.putText(image, text, (startX, y),cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)detections.shape[2]来存放神经网络检测到的人脸,通过遍历这个list
来获取每个人脸的置信度,当置信度大于0.5时,我们认为是一个合格的人脸
startX, startY, endX, endY来获取人脸在图片中的坐标
有了人脸的坐标就可以把人脸这部分单独提出来来计算人脸图片的blob值
把人脸blob值放入性别检测模型中进行人脸性别的检测preds
preds[0].argmax把性别每个概率进行对比,并提取最大概率的性别的index
gender = genderList[i]便可以得到我们检测的人脸性别
genderConfidence = preds[0][i] 人脸性别的检测置信度
最后把检测到的数据呈现到图片上并显示图片
cv2.imshow(&34;, image) cv2.waitKey(0)
本站所发布的文字与图片素材为非商业目的改编或整理,版权归原作者所有,如侵权或涉及违法,请联系我们删除
热门信息
阅读 ()
1 注册微信号怎么注册第二个阅读 ()
2 怎么把照片变成卡通头像阅读 ()
3 手机越充越少电怎么解决