作者|Nagesh Singh Chauhan
编译|Flin
起源|towardsdatascience
越来越多的应用程序与年龄和性别的主动分类相干,特地是自从社交平台和社交媒体衰亡以来。尽管如此,现有的办法在实在图像上的性能依然显著有余,特地是与最近报道的与人脸识别相干的工作在性能上的微小飞跃相比。——应用卷积神经网络进行年龄和性别分类(https://talhassner.github.io/…)
介绍
年龄和性别是人脸的两个重要属性,在社会交往中起着十分根底的作用,使得从单个人脸图像中预计年龄和性别成为智能利用中的一项重要工作,如访问控制、人机交互、执法、营销智能以及视觉监控等。
真实世界用例:
最近我遇到了Quividi,它是一个人工智能软件应用程序,用于依据在线人脸剖析检测通过的用户的年龄和性别,并依据指标受众主动开始播放广告。
另一个例子可能是AgeBot,它是一个Android应用程序,通过人脸识别从照片中确定你的年龄。它能够猜想你的年龄和性别,同时也能够在一张照片中找到多张脸,并预计每张脸的年龄。
受上述用例的启发,咱们将在本文中构建一个简略的年龄和性别检测模型。所以让咱们从咱们的用例开始:
用例——咱们将做一些人脸识别,人脸检测的工作,而且,咱们将应用CNN(卷积神经网络)从youtube视频中预测年龄和性别,只有视频URL是能够用的,你就不须要下载视频。乏味的局部是CNN在视频网址上用于年龄和性别预测。
要求:
pip install OpenCV-python
numpy
pip install pafy
pip install youtube_dl(理解更多对于youtube-dl的信息:https://rg3.github.io/youtube…)
pafy:pafy库用于检索YouTube内容和元数据(如题目、分级、观看次数、持续时间、分级、作者、缩略图、关键字等)。更多无关pafy,点击网址:https://pypi.org/project/pafy/
让咱们查看一个样本:
import pafy
url = 'https://www.youtube.com/watch?v=c07IsbSNqfI&feature=youtu.be'
vPafy = pafy.new(url)
print vPafy.title
print vPafy.rating
print vPafy.viewcount
print vPafy.author
print vPafy.length
print vPafy.description
Testing file uploads with Postman (multipart/form-data)
4.87096786499
11478
Valentin Despa
1688
➡️➡️➡️ ???? Check my online course on Postman. Get it for only $10 (limited supply):
https://www.udemy.com/postman-the-complete-guide/?couponCode=YOUTUBE10
I will show you how to debug an upload script and demonstrate it with a tool that can make requests encoded as "multipart/form-data" so that you can send also a file.
After this, we will go even further and write tests and begin automating the process.
Here is the Git repository containing the files used for this tutorial:
https://github.com/vdespa/postman-testing-file-uploads
要遵循的步骤:
- 从YouTube获取视频URL。
- 应用Haar级联的人脸检测
- CNN的性别辨认
- CNN的年龄辨认
1.从YouTube获取视频网址:
获取Youtube视频URL并尝试应用pafy获取视频的属性,如上所述。
2. 应用Haar级联人脸检测:
这是咱们大多数人至多据说过的一部分。OpenCV/JavaCV提供了间接的办法来导入Haar级联并应用它们来检测人脸。我不会深刻解释这一部分。你们能够参考我之前的文章来理解更多对于应用OpenCV进行人脸检测的信息。
- 文章地址:https://medium.com/analytics-…
3. CNN的性别辨认:
应用OpenCV的fisherfaces
实现的性别辨认十分风行,你们中的一些人可能也尝试过或浏览过它。然而,在这个例子中,我将应用不同的办法来辨认性别。2015年,以色列两名钻研人员Gil Levi和Tal Hassner引入了这种办法。我在这个例子中应用了他们训练的CNN模型。咱们将应用OpenCV的dnn包,它代表“深度神经网络”。
在dnn包中,OpenCV提供了一个名为Net的类,能够用来填充神经网络。此外,这些软件包还反对从出名的深度学习框架(如caffe、tensorflow和torch)导入神经网络模型。我后面提到的钻研人员曾经将他们的CNN模型公布为caffe模型。因而,咱们将应用CaffeImporter将该模型导入到咱们的应用程序中。
4. CNN的年龄辨认
这与性别辨认局部很类似,只是对应的prototxt文件和caffe模型文件是”deploy_agenet.prototxt”和”age_net.caffemodel”. 此外,CNN在该CNN中的输入层(概率层)由8个年龄层的8个值组成(“0-2”、“4-6”、“8-13”、“15-20”、“25-32”、“38-43”、“48-53”和“60-”)
Caffe模型具备2个相干文件,
1. prototxt: 这里是CNN的定义。这个文件定义了神经网络的各个层,每个层的输出、输入和函数。
2. caffemodel: 蕴含训练神经网络(训练模型)的信息。
从这里(https://talhassner.github.io/…) 下载.prtoxt和.caffemodel。
从这里(https://github.com/opencv/ope…) 下载用于人脸检测的haar级联。
让咱们开始编码咱们的模型吧。
源代码:
import cv2
import numpy as np
import pafy
#url of the video to predict Age and gender
url = 'https://www.youtube.com/watch?v=c07IsbSNqfI&feature=youtu.be'
vPafy = pafy.new(url)
play = vPafy.getbest(preftype="mp4")
cap = cv2.VideoCapture(play.url)
cap.set(3, 480) #set width of the frame
cap.set(4, 640) #set height of the frame
MODEL_MEAN_VALUES = (78.4263377603, 87.7689143744, 114.895847746)
age_list = ['(0, 2)', '(4, 6)', '(8, 12)', '(15, 20)', '(25, 32)', '(38, 43)', '(48, 53)', '(60, 100)']
gender_list = ['Male', 'Female']
def load_caffe_models():
age_net = cv2.dnn.readNetFromCaffe('deploy_age.prototxt', 'age_net.caffemodel')
gender_net = cv2.dnn.readNetFromCaffe('deploy_gender.prototxt', 'gender_net.caffemodel')
return(age_net, gender_net)
def video_detector(age_net, gender_net):
font = cv2.FONT_HERSHEY_SIMPLEX
while True:
ret, image = cap.read()
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.1, 5)
if(len(faces)>0):
print("Found {} faces".format(str(len(faces))))
for (x, y, w, h )in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (255, 255, 0), 2)
#Get Face
face_img = image[y:y+h, h:h+w].copy()
blob = cv2.dnn.blobFromImage(face_img, 1, (227, 227), MODEL_MEAN_VALUES, swapRB=False)
#Predict Gender
gender_net.setInput(blob)
gender_preds = gender_net.forward()
gender = gender_list[gender_preds[0].argmax()]
print("Gender : " + gender)
#Predict Age
age_net.setInput(blob)
age_preds = age_net.forward()
age = age_list[age_preds[0].argmax()]
print("Age Range: " + age)
overlay_text = "%s %s" % (gender, age)
cv2.putText(image, overlay_text, (x, y), font, 1, (255, 255, 255), 2, cv2.LINE_AA)
cv2.imshow('frame', image)
#0xFF is a hexadecimal constant which is 11111111 in binary.
if cv2.waitKey(1) & 0xFF == ord('q'):
break
if __name__ == "__main__":
age_net, gender_net = load_caffe_models()
video_detector(age_net, gender_net)
当初让咱们一起来了解代码:
步骤1:导入所有必须的库。
import cv2
import numpy as np
import pafy
步骤2:获取Youtube视频URL并创立一个对象“play”,该对象蕴含webm/mp4格局的视频的最佳分辨率。
url = 'https://www.youtube.com/watch?v=c07IsbSNqfI&feature=youtu.be'
vPafy = pafy.new(url)
play = vPafy.getbest(preftype="mp4")
第三步:通常,咱们必须用相机捕获现场的视频流。OpenCV提供了一个非常简单的接口。咱们能够从相机中捕获视频,将其转换成灰度视频并显示进去。只是一个简略的开始。
要捕捉视频,须要创立视频捕捉对象。它的参数能够是设施索引或视频文件的名称。设施索引只是指定哪个摄像机的数字。通常会连贯一个摄像头(如我的状况)。所以我只传递0(或-1)。能够通过传递1等来抉择第二个摄影机。之后,你能够逐帧捕捉。
cap = cv2.VideoCapture(0) #if you are using webcam
但在我的例子中,我正在读取一个在线视频URL,为此,我将把“play”对象传递给VideoCapture()。
cap = cv2.VideoCapture(play.url)
步骤4:应用set()设置视频帧的高度和宽度。cap.set(propId, value),这里3是宽度的propertyId,4是高度的propertyId。
cap.set(3, 480) #set width of the frame
cap.set(4, 640) #set height of the frame
步骤5:创立3个独自的列表,用于存储Model_Mean_值、年龄和性别。
MODEL_MEAN_VALUES = (78.4263377603, 87.7689143744, 114.895847746)
age_list = ['(0, 2)', '(4, 6)', '(8, 12)', '(15, 20)', '(25, 32)', '(38, 43)', '(48, 53)', '(60, 100)']
gender_list = ['Male', 'Female']
第六步:我定义了一个函数来加载caffemodel和prototxt的年龄和性别检测器,这些基本上都是事后训练好的CNN模型来进行检测。
def load_caffe_models():
age_net = cv2.dnn.readNetFromCaffe('deploy_age.prototxt', 'age_net.caffemodel')
gender_net = cv2.dnn.readNetFromCaffe('deploy_gender.prototxt', 'gender_net.caffemodel')
return(age_net, gender_net)
步骤7:当初咱们将执行人脸检测、年龄检测和性别检测,并为此在你的主函数内创立一个函数video_detector(age_net,gender_net),并将age_net和gender_net作为其参数。
if __name__ == "__main__":
age_net, gender_net = load_caffe_models()
video_detector(age_net, gender_net)
步骤8:读取步骤3中从VideoCapture()创立的cap对象。
cap.read()返回布尔值(True / False)。如果正确读取框架,则它将为True。
所以你能够通过查看这个返回值来查看视频的结尾。
有时,cap可能尚未初始化捕捉。在这种状况下,此代码显示谬误。
你能够通过cap.isOpened()办法查看它是否已初始化. 如果是真的就持续。否则,请应用cap.open()关上它.
ret, image = cap.read()
步骤9:将图像转换为灰度图像,因为OpenCV人脸检测器须要灰度图像。
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
步骤10:加载用于人脸检测的预构建模型。
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
步骤11:当初,咱们如何应用级联分类器从图像中检测人脸?
OpenCV的CascadedClassifier再次使其变得简略,detectMultiScale()能够精确地检测你须要的内容。
detectMultiScale(image, scaleFactor, minNeighbors)
上面是应该传递给detectMultiScale()的参数。
这是一个检测对象的通用函数,在这种状况下,它将检测人脸,因为咱们在人脸级联中调用了此函数。如果找到一个人脸,则返回一个所述人脸的地位列表,格局为“Rect(x,y,w,h)”,如果没有,则返回“None”。
- Image:第一个输出是灰度图像。
- scaleFactor:这个函数弥补当一张脸看起来比另一张脸大时产生的大小谬误感知,因为它更凑近相机。
- minNeighbors:一种应用挪动窗口检测对象的检测算法,它通过定义在以后窗口左近找到多少个对象,而后能力申明找到的人脸。
faces = face_cascade.detectMultiScale(gray, 1.1, 5)
第12步:循环浏览人脸列表并在视频中的人脸上绘制矩形。在这里,咱们基本上是寻找脸孔,合成脸孔,它们的大小,并绘制矩形。
for (x, y, w, h )in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (255, 255, 0), 2)
# Get Face
face_img = image[y:y+h, h:h+w].copy()
步骤13:OpenCV提供了一个函数,能够帮忙对图像进行预处理,以便进行深度学习分类:blobFromImage()。它执行:
均匀减法
缩放比例
和可选的通道替换
所以blobFromImage4维的blob是从图像创立的。可选地调整图像大小并从核心裁剪图像,减去平均值,按比例因子缩放值,替换蓝色和红色通道
blob = cv2.dnn.blobFromImage(image, scalefactor=1.0, size, mean, swapRB=True)
- image:这是输出图像,咱们要先对其进行预处理,而后再通过咱们的深度神经网络进行分类。
- scale factor: 在咱们执行平均值减法之后,咱们能够抉择按某个因子缩放图像。这个值默认为1.0(即没有缩放),但咱们也能够提供另一个值。还要留神的是,比例因子应该是1/σ,因为咱们实际上是将输出通道(在平均值减去之后)乘以比例因子。
- size: 这里咱们提供卷积神经网络所冀望的空间大小。对于大多数目前最先进的神经网络来说,这可能是224×224、227×227或299×299。
- mean:这些是咱们的均匀减法值。它们能够是RGB办法的3元组,也能够是单个值,在这种状况下,从图像的每个通道中减去提供的值。如果要执行平均值减法,请确保按(R,G,B)程序提供3元组,特地是在应用swapRB=True的默认行为时。
- swapRB:OpenCV假如图像是BGR通道程序的;然而,平均值假如咱们应用的是RGB程序。为了解决这个差别,咱们能够通过将这个值设置为True来替换图像中的R和B通道。默认状况下,OpenCV为咱们执行此通道替换。
blob = cv2.dnn.blobFromImage(face_img, 1, (227, 227), MODEL_MEAN_VALUES, swapRB=False)
第14步:预测性别。
#Predict Gender
gender_net.setInput(blob)
gender_preds = gender_net.forward()
gender = gender_list[gender_preds[0].argmax()]
第15步:预测年龄。
#Predict Age
age_net.setInput(blob)
age_preds = age_net.forward()
age = age_list[age_preds[0].argmax()]
第16步:当初咱们必须应用openCV的put text()模块将文本放到输入框架上。
putText()的参数如下:
- 要写入的文本数据
- 搁置地位坐标(即数据开始的左下角)。
- 字体类型(请查看cv2.putText()文档以获取反对的字体)
- 字体比例(指定字体大小)
- 惯例的货色,如色彩,厚度,线型等。为了更好的外观,线型=cv2.LINE_AA是举荐的。
overlay_text = "%s %s" % (gender, age)
cv2.putText(image, overlay_text, (x, y), font, 1, (255, 255, 255), 2, cv2.LINE_AA)
第17步:最初打印你的最终输入。
cv2.imshow('frame', image)
最初咱们有:
if cv2.waitKey(1) & 0xFF == ord('q'):
break
咱们的程序期待用户按下一个键最多1毫秒。而后,它获取读取的键的值,并将其与0xFF
进行比拟,0xFF
删除底部8位以上的任何内容,并将后果与字母q的ASCII码进行比拟,这意味着用户已决定通过按键盘上的q键退出。
输入:视频URL-1:https://www.youtube.com/watch…
视频URL-2:https://www.youtube.com/watch…
很乏味,不是吗?但不太精确。
论断:
正如咱们在本文中看到的,在短短几行代码中,咱们构建了年龄和性别检测模型,从这里开始,你还能够将情感检测和指标检测合并到同一个模型中,并创立一个功能齐全的应用程序。
原文链接:https://towardsdatascience.co…
欢送关注磐创AI博客站:
http://panchuang.net/
sklearn机器学习中文官网文档:
http://sklearn123.com/
欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/
发表回复