天骄战纪,仅用几行编码,搭建年纪性別检验建模!,大卫

现在,跟着交际渠道以及交际媒体的鼓起,年岁与性别主动分类开端与越来越多的运用相关联。可是,尤其是与近来在人脸辨认使命中获得的快速发展比较,运用现有办法辨认实在图画的成果并不尽善尽美。

比方……

其实,年岁与性别作为面部的两个要害特点,在交际互动中发挥着底子效果。因而,对人脸图画进行年岁性别评价在一些智能运用,如拜访权限、人机交互、法律、营销情报和视觉监控等范畴具有重要意义。

实践运用


1. 一款名为Quividi的人工智能运用软件,可经过在线面部剖析估测用户年岁与性别,并依据剖析成果为方针受众主动播放广告。

2. 安卓运用程序AgeBot,可对用户相片进行面部辨认然后估测其年岁。该运用不光支撑单人天骄战纪,仅用几行编码,树立年岁性別查验建模!,大卫年岁和性别估测,一起还能辨认多人相片中的不同人脸并估测相应年岁。

受上述用例启示,本篇文章将具体介绍构建一个简略的年岁性别检测模型的相关进程。那么就从用例开端介绍吧:

用例

人脸辨认、人脸检测、以及运用CNN(卷积神经网络)对youtube视频里人物进行年岁与性别猜测,视频无需下载,仅需保存网址链接(URL)。在此,运用CNN来猜测视频URLs中的人物年岁性别,这一进程将非常风趣。

准备作业

Pip install OpenCV-python

numpy

pip install pafy

pip install youtube精灵王纪传_dl(以了解youtube_dl更多相关信息)

pafy

Pafy库用于检索YouTube内容和元数据(包含标题、分级、点击率、持时长、评分、作者、缩略图、要害词等)。要了解更多有关pafy的信息,天骄战纪,仅用几行编码,树立年岁性別查验建模!,大卫咱们来看看一个样本:

importpafy

url='https://www.youtube.com/watch?v=c07IsbSNqfI&feature=youtu.be'

vPafy= pafy.new(url)

printvPafy.title

printvPafy.rating

printvPafy.viewcount

printvPafy.author

printvPafy.length

printvPafy.description


输出

请在Postman上下载测验文件 (multipart/form-data)

4.87096786499

11478

瓦伦汀德斯帕(Valentin Despa)

1688


以下是包含本教程所用文件的Git库房:

http景长华s://github.com/vdespa/postman-testing-file-uploads


演示进程

1. 从YouTube获取视频网址

获取Youtube视频网址天骄战纪,仅用几行编码,树立年岁性別查验建模!,大卫,并如上所述用pafy获取decline视频的特点。

2. 运用Haar cascades检测人脸

大多数人至少对这一部分内容有所耳闻。OpenCV / JavaCV供给了导入Haar-cascades并将其用来检测面部的直接办法。

3. 运用CNN辨认性别

运用OpenCV的fisherfaces来辨认性别非常盛行,有人或许现已测验此办法或阅读过相关文章。但本文将采纳另一种辨认性其他办法。这一办法最早在2015年由两位以色列研究人员Gil Levi和Tal Hassner初次运用。本文所用CNN模型就是由这二人所创立。一起,还会用到OpenCV的dnn程序包,dnn代表“深度神经网络”(DeepNatural Networks)。

在dnn程序包中,OpenCV供给了一个名为Net的类,用于填充神经网络。此外,这些软件包支撑从众所周知的深度学习结构(如caffe,tensorflow和torch)导入神经网络模型。上文说到的研究员现已发布了他们的CNN caffe模型。因而,川崎400在此能够运用CaffeImporter将该模型导入到运用程序中。

4. 运用CNN辨认年岁

与性别辨认简直共同,仅仅将相应的prototxt文件和caffe模型文件改为“deploy_agenet.prototxt”和“age_net.caffemodel”。此外,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 - 包含经过练习的神经网络(练习模型)信息。

下载.prtotxt和.caffemodel:https://talhassner.github.io/home/publication/2015_CVPR


下载用于人脸检测的haar cascade:https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml


接下来开端编写模型。


源代码


importcv2

importnumpy as np

importpafy

#urlof 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 thcone frame

cap.set(4,64天骄战纪,仅用几行编码,树立年岁性別查验建模!,大卫0) #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']

defload_caffe_models():

age_net =cv2.dnn.readNetFromCa天骄战纪,仅用几行编码,树立年岁性別查验建模!,大卫ffe('deploy_age.prototxt', 'age_net.caffemodel')

gender_net= cv2.dnn.readNetFromCaffe('deploy_gender.锐步prototxt', 'gender_net.caffemodel')

return(age_net,gender_net)

defvideo_detector(age_net, gender_net):

font = cv2.FONT_HERSHEY_SIMPLEX

whileTrue:

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)

#GetFace

face_img = image[y:y+h, h:h+w].copy()

blob = cv2.dnn.blobFromImage(face_img, 1,(227, 227), MODEL_MEAN_VALUES, swapRB=False)

#PredictGender

gender_net.setInput(blob)

gender_preds = gender_net.forward()

gender =gender_list孙思邈[gender_preds[0].argmax()]

print("Gender : " + gender)

#PredictAge

age_net.setIn侠盗猎车手6put(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)

#0xFFis a hexadecimal constant which is 11111111 in binary.

ifcv2.waitKey(1) & 0xFF == ord('q'):

break

if__name__ == "__main__":

age_net,gender_net = load_caffe_models()

video_detector(age_net,gender_net)


下白云苍狗面剖析一下源代码:

第1步: 导入悉数所需库

importcv2

importnumpy as np

importpafy


第2步:获取Youtube视频URL,并创立目标‘play’包含webm/mp4格局下视频最佳分辨率。

url='https://www.youtube.com/watchv=c07IsbSNqfI&feature=youtu.be'

vPafy= pafy.new(url)

play= vPafy.getbest(preftype="mp4")


第3步:通常情况下必须用摄相机捕捉直播。OpenCV为此供给了一个非常简略的接口。从摄相机捕获到的视频双氯芬酸钠肠溶片能够转换为灰度视频来显现。操作起来也很简略。

捕获视频需求先创立视频捕获目标。参数能够是设备索引或视频文件名称。设备索引经过数字指定衔接的摄像头。通常会衔接一台摄像机(如本文所示)。因而,只用输入0(或-1)。也能够经过输入1来挑选第二个摄像机,依此类推。如此一来,便能够逐帧捕获。

cap= cv2.VideoCapture(0) #if you are using webcam


但本文所示事例运用的是在线视频网址,因而要在VideoCapture()函数中输入目标'play'。

cap= cv2.VideoCapture(play.url)


第4步:运用set()设置视频的帧高和帧宽。cap.set(propId,value),代码中的3代表帧宽,4代表帧高。

cap.set(3,480) #set width of the frame

cap.set(4,640) #set height of the frame


第5步:创立3个独自列表别离存储Model_Mean_Values,Age和Gender数据。

MODEL_MEAN_VALUES=(78.4263377603,87.76欧诗漫89143744,114.895847746)

age_list= ['(0,2)','(4,6)','(8,12)','(15,20)','(25,32)',''(38,43)' ,'(48,53)','(60,100固安)']

gender_list= ['男','女']


第6步:界说一个函数来加载年岁和性别检测器的caffe 模型和prototxt文件,它们都是根底的CNN预先练习模型,将进行检测作业。

defload_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.read()会回来运算(True / False)。假如读取到当时帧,则显现True。

#因而能够经过承认回来值来查看视频结束。

#有时,cap函数或许没有敞开捕获,因而代码会显现过错。

#运用cap.isOpened()来查看是否已敞开。假如成果为True则已开,否则用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步:接下来,怎么运用CascadeClassifier从图画中检测人脸?

OpenCV的级联分类器操作非常简略,凭借detectMultiScale()函数便可准确检测所需内容。

detectMultiScale(image,scaleFactor,minNeighbors)


以下是detectMultiScale()函数参数。

作为一魁个检测目标的常用函数,在此它能够结合CascadeClassifier中的人脸,如检测到人脸,将以“Rect(x,y,w,h)”的方法回来上述人脸列表,假如没有,则回来“None”。

Image:首要输入人脸灰度图。

scaleF天骄战纪,仅用几行编码,树立年岁性別查验建模!,大卫actor:缩放图画以削减因为目标与摄像头间隔纷歧而导致人脸尺度不同带来的检测差错。

minNeighbors:运用移动窗口来检测目标的算法,用来界说当时辨认人脸邻近还能辨认到的人脸个数。

faces =face_cascade.detectMultiScale(灰色,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(). 运转方法为:

均值消减

缩放

并挑选性频道交流

blobFromImage可依据图画创立四维数组。可挑选从中心调整巨细和裁剪图画,减去平均值,经过scalfactor缩放值,交流蓝色和赤色通道。

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


1. image:指经过深度神经网络进行分类之前想要预处理的输入图画。

2.scale factor:在减去均值之后,能够挑选按份额缩放图画。该值默以为1.0(即没有缩放),但也能够设置其他值。此处还要留意,缩放份额应该是1 /,实践上输入通道(均值消减之后)将会乘以份额因子。

3.size:指运用卷积神经网络适用的图画尺度。当时大多数先进神经网所用尺度为224224、227227或299299。

4. mean:指均值消减。既能够减去RGB均值三元组,也能够从图画的各个通道中减去所供给的单个平均值。进行均值消减时,要留意保证三元组次序(依次是R,G,B),尤其是在履行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步:猜测性别

#PredictGender

gender_net.setInput(blob)

gender_preds= gender_net.forward()

gender= gender_list[gender_preds[0].argmax()]


第15步:猜测年岁

#PredictAge

age_net.setInput(blob)

age_preds= age_net.forward()

age= age_list[age_preds[0].argmax()]


第16步:运用openCV的putText()函数在输出结构上放置文本。

cv2.putText()的参数包含:

要写入的文本数据

数据放置的方位坐标(即数据开端的左下角)。

字体类型(承认cv2.putText()文件夹所支撑字体)

字体份额(指定字体巨细)

如色彩,粗细,线型等字体惯例设置。为了漂亮,引荐使天骄战纪,仅用几行编码,树立年岁性別查验建模!,大卫用lineType = cv2.LINE_AA。

overlay_text= "%s %s" % (gender, ag灰色e)

cv2.putText(image,overlay_text, (x, y), font, 1, (255, 255, 255), 2, cv2.LINE_AA)


第17步:终究输出

cv2.imshow('frame',image)


最终一行:

ifcv2.waitKey(1) & 0xFF == ord('q'):

break


此程序仅需用户等候1毫秒。用户按下键盘按键后,程序会结合0xFF进行AND运算,删去底部一切8位以上的内容,并将其成果与ASCII代码进行比较,其间字母q代表用户可按下键盘中的q键(quit)来退出。

输出:



Video URL-1: https://www.youtube.com/watch?v=iH1ZJVqJO3Y


Video URL-2:https://www.youtube.com/watch?v=qLNhVC296YI


是不是很风趣呢?虽然成果并不那么准确。

评论(0)