【年龄估计系列 三】keras实现网络照相机的实时性别/年龄预测

目录

1、简介

2、工作流程

(1)输入图像

(2)人脸检测

(3)人脸分割

(4)特征提取和年龄性别检测

3、深入理解

4、延伸阅读


1、简介

你是否曾经有过这样的时刻:猜测另一个人的年纪?下面这个简单的神经网络模型也许可以帮助你。

下面这个你即将运行的demo将会从网络照相机中获取动态的视频流,并给获取到的人脸打上年龄和性别的标签。想象一下,如果我们把一个这样的网络照相机放在你的门口,检测每一个经过的人的性别和年纪,是不是很酷?

我的运行环境是:windows,python3.5。当然,其他操作系统也是可以的。

 

2、工作流程

如下是整个工作的流程。

(1)输入图像

首先,通过cv2模块,从网络视频流中获取照片

# 0 means the default video capture device in OS
video_capture = cv2.VideoCapture(0)
# infinite loop, break by key ESC
while True:
    if not video_capture.isOpened():
        sleep(5)
    # Capture frame-by-frame
    ret, frame = video_capture.read()

 

(2)人脸检测

灰度化,再用cv2模块「CascadeClassifier」获取人脸

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(
    gray,
    scaleFactor=1.2,
    minNeighbors=10,
    minSize=(self.face_size, self.face_size)
)

人脸检测的结果:一系列人脸的坐标[x, y, w, h]

 

(3)人脸分割

由于人脸检测可能不一定的框住整张脸,因此将人脸加上40%的周边,从而帮助获取整个脸部。

# placeholder for cropped faces
face_imgs = np.empty((len(faces), self.face_size, self.face_size, 3))
for i, face in enumerate(faces):
    face_img, cropped = self.crop_face(frame, face, margin=40, size=self.face_size)
    (x, y, w, h) = cropped
    cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 200, 0), 2)
    face_imgs[i,:,:,:] = face_img

我们把分割后的人脸输入到模型,接下来就是预测predict了。

 

(4)特征提取和年龄性别检测

对于年龄预测,模型的输出是101个值,年龄从0~100的概率预测值,这101个值的和为1。

所以,我们把概率乘以对应的年龄值再相加,就得到最后预测的年龄。

if len(face_imgs) > 0:
    # predict ages and genders of the detected faces
    results = self.model.predict(face_imgs)
    predicted_genders = results[0]
    ages = np.arange(0, 101).reshape(101, 1)
    predicted_ages = results[1].dot(ages).flatten()

最后,我们画一下结果图。

性别预测是一个二分类问题。模型的输出是1个范围在0~1的值,值越大,表示模型认为是「男性」的概率越大。

# draw results
for i, face in enumerate(faces):
    label = "{}, {}".format(int(predicted_ages[i]),
                            "F" if predicted_genders[i][0] > 0.5 else "M")
    self.draw_label(frame, (face[0], face[1]), label)
cv2.imshow('Keras Faces', frame)
if cv2.waitKey(5) == 27:  # ESC key press
    break

完整的代码和预训练的模型参数见Github:https://github.com/Tony607/Keras_age_gender

 

3、深入理解

对于那些不满足于demo,想要知道更多关于模型如何建立和训练的同学,这部分可以满足你的要求。

数据集「IMDB-WIKI-500Kfaceimages」:https://data.vision.ee.ethz.ch/cvl/rrothe/imdb-wiki/

我们输入模型的每一张图片,都进行了上述的预处理:人脸检测和补充周边

神经网络的特征提取使用的是Wide Residual Networks精简版的WideResNet结构。使用CNN学习人脸特征,从不太抽象的边缘、角落特征到更加抽象的眼睛、嘴巴等特征。WideResNet更独特的地方在于,作者减少了原始residual模型的深度,增加了宽度,所以训练的速度快了几倍。具体论文:https://arxiv.org/abs/1605.07146

 

4、延伸阅读

模型的可能性是无穷尽的,它的输出很大程度上依赖于你给的输入。比如你给的输入是很多标注为很有吸引力的照片,那么,你就会教会模型从网络实时视频流中辨别一个人的魅力指数。

以下是一系列相关的项目,数据集:

Age/Gender detection in Tensorflow

IMDB-WIKI — 500k+ face images with age and gender labels

Data: Unfiltered faces for gender and age classification
Github: keras-vggface

Selfai: A Method for Understanding Beauty in Selfies

 

翻译自:https://medium.com/@chengweizhang2012/easy-real-time-gender-age-prediction-from-webcam-video-with-keras-8b12dc7c1543

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
首先,我们需要准备好数据集。假设我们有一组交通流量的时间序列数据,每个时间点的数据包括一段时间内通过某个路段的车辆数。我们可以按照时间顺序将数据集划分为训练集和测试集,然后对数据进行归一化处理,使其在0~1之间。 接下来,我们可以开始搭建LSTM模型。在Keras中,LSTM模型的搭建可以分为四个步骤: 1.导入所需的库和模块,包括Keras、numpy等。 2.准备训练数据和测试数据,对数据进行归一化处理。 3.定义LSTM模型的结构。在这里,我们可以设置LSTM层的神经元数量、输入数据的形状、输出层的激活函数等。 4.编译和训练模型。在编译模型时,我们可以设置损失函数、优化器和评估指标。在训练模型时,我们可以设置批量大小、迭代次数等参数。 下面是一个简单的Keras代码示例,用于构建LSTM模型并预测短时交通流量: ```python from keras.models import Sequential from keras.layers import LSTM, Dense import numpy as np # 准备训练数据和测试数据 # ... # 定义模型结构 model = Sequential() model.add(LSTM(64, input_shape=(input_shape, 1))) model.add(Dense(1, activation='linear')) # 编译模型 model.compile(loss='mse', optimizer='adam', metrics=['mse']) # 训练模型 model.fit(train_X, train_y, epochs=100, batch_size=32) # 预测测试数据 y_pred = model.predict(test_X) ``` 在这个代码示例中,我们首先导入所需的库和模块。接着,我们准备训练数据和测试数据,并对数据进行归一化处理。然后,我们定义LSTM模型的结构,包括一个LSTM层和一个全连接层。在模型的编译和训练过程中,我们设置了损失函数、优化器和评估指标。最后,我们用训练好的模型预测测试数据。 需要注意的是,LSTM模型是非常灵活的,可以根据具体的问题进行调整。例如,我们可以添加多个LSTM层、调整LSTM层的神经元数量、调整全连接层的激活函数等。此外,我们还可以尝试使用其他类型的循环神经网络,例如GRU。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值