乐趣区

关于人工智能:使用卷积神经网络和openCV预测年龄和性别

作者 |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

要遵循的步骤:

  1. 从 YouTube 获取视频 URL。
  2. 应用 Haar 级联的人脸检测
  3. CNN 的性别辨认
  4. 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)
  1. image:这是输出图像,咱们要先对其进行预处理,而后再通过咱们的深度神经网络进行分类。
  2. scale factor: 在咱们执行平均值减法之后,咱们能够抉择按某个因子缩放图像。这个值默认为 1.0(即没有缩放),但咱们也能够提供另一个值。还要留神的是,比例因子应该是 1 /σ,因为咱们实际上是将输出通道(在平均值减去之后)乘以比例因子。
  3. size: 这里咱们提供卷积神经网络所冀望的空间大小。对于大多数目前最先进的神经网络来说,这可能是 224×224、227×227 或 299×299。
  4. mean: 这些是咱们的均匀减法值。它们能够是 RGB 办法的 3 元组,也能够是单个值,在这种状况下,从图像的每个通道中减去提供的值。如果要执行平均值减法,请确保按(R,G,B)程序提供 3 元组,特地是在应用 swapRB=True 的默认行为时。
  5. 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/

退出移动版