目录

介绍

什么是CNN?

设计CNN

实现CNN

训练CNN

下一步?


  • 下载源8.4 KB

介绍

如果您看过《少数派报告》电影,您可能还记得汤姆·克鲁斯(Tom Cruise)走进一家Gap商店的场景。视网膜扫描仪读取他的眼睛,并为他播放定制的广告。好吧,这是2020年。我们不需要视网膜扫描仪,因为我们拥有人工智能(AI)和机器学习(ML)!

在本系列中,我们将向您展示如何使用深度学习进行面部识别,然后基于被识别的面部,使用神经网络语音合成(TTS)引擎播放自定义广告。

我们假设您熟悉AI/ML的基本概念,并且可以找到使用Python的方法。

在本文中,我们将讨论CNN,然后设计一个并使用Keras在Python中实现它。

什么是CNN?

CNN是一种神经网络(NN),通常用于图像分类任务(例如人脸识别)以及任何其他输入具有网格状拓扑的问题。在CNN中,并非每个节点都连接到下一层的所有节点。换句话说,它们不是完全连接的NN。这有助于防止完全连接的NN中出现过拟合问题,更不用说由NN中的过多连接导致的超慢收敛。

CNN的概念依赖于称为卷积的数学运算,这在数字信号处理领域非常普遍。卷积被定义为两个函数(第三个函数)的乘积,表示前两个函数之间的重叠量。在CNN区域,通过在图像中滑动过滤器(即内核)来实现卷积。

在人脸识别中,卷积操作使我们能够检测图像中的不同特征。不同的过滤器可以检测垂直和水平边缘、纹理、曲线和其他图像特征。这就是为什么任何CNN中的第一层都是卷积层的原因。

CNN中另一个常见的层是池化层。池化用于减小图像表示的大小,这意味着减少了参数数量,并最终减少了计算量。最常见的池化类型是“max”,它使用滑动窗口(类似于卷积操作中的窗口)在每个位置从匹配的单元格组中获取最大值。最后,它根据收获的最大值构建图像的新表示形式。

最常见的CNN架构通常从卷积层开始,然后是激活层,然后是池化层,最后以传统的全连接网络(例如多层NN)结束。这种层次化的模型称为顺序模型。为什么最后要建立全连接网络?要学习变换图像中特征的非线性组合(在卷积和合并之后)。

设计CNN

这是我们将在CNN中实现的架构:

  • 输入层——NumPy数组(img_width,img_height,1);“ 1” 因为我们正在处理灰度图像;对于RGB图像,应该是(img_width,img_height,3)
  • Conv2D层——32个过滤器,过滤器大小为3
  • 激活层——必须使用非线性函数进行学习,在这种情况下,该函数为ReLU
  • Conv2D层——32个过滤器,过滤器大小为3,步幅为3
  • 使用ReLU功能的激活层
  • MaxPooling2D层——应用(2,2)合并窗口
  • 25%的DropOut层——通过从前一层中随机删除一些值(将它们设置为0)来防止过度拟合;又名稀释技术
  • Conv2D层——64个过滤器,过滤器大小为3
  • 使用ReLU功能的激活层
  • Conv2D层——64个过滤器,过滤器大小为3,步幅为3
  • 使用ReLU功能的激活层
  • MaxPooling2D层——应用(2,2)合并窗口
  • DropOut层,占25%
  • 展平层——转换要在下一层使用的数据
  • 致密层——代表完全连接的传统NN
  • 使用ReLU功能的激活层
  • DropOut层,占25%
  • 密集层,节点数与问题中的类数匹配——Yale数据集为15
  • 使用ReLU功能的激活层

上面的架构很常见;层参数已通过实验进行了微调。

实现CNN

现在,让我们在代码中实现我们的CNN架构-我们选择的一组图层。为了创建易于扩展的解决方案,我们将ML模型与一组抽象方法结合使用:

class MLModel(metaclass=abc.ABCMeta):def __init__(self, dataSet=None):if dataSet is not None:self.objects = dataSet.objectsself.labels = dataSet.labelsself.obj_validation = dataSet.obj_validationself.labels_validation = dataSet.labels_validationself.number_labels = dataSet.number_labelsself.n_classes = dataSet.n_classesself.init_model()@abstractmethoddef init_model(self):pass@abstractmethoddef train(self):pass@abstractmethoddef predict(self, object):pass@abstractmethoddef evaluate(self):score = self.get_model().evaluate(self.obj_validation, self.labels_validation, verbose=0)print("%s: %.2f%%" % (self.get_model().metrics_names[1], score[1] * 100))@abstractmethoddef get_model(self):pass

在我们的例子中,dataset是本系列上一篇文章中描述的FaceDataSet类的实例。ConvolutionalModel类,它从MLModel中继承和实现其所有的抽象方法,是一个将包含我们的CNN架构的类。这里是:

class ConvolutionalModel(MLModel):def __init__(self, dataSet=None):if dataSet is None:raise Exception("DataSet is required in this model")self.shape = numpy.array([constant.IMG_WIDTH, constant.IMG_HEIGHT, 1])super().__init__(dataSet)self.cnn.compile(loss=constant.LOSS_FUNCTION,optimizer=Common.get_sgd_optimizer(),metrics=[constant.METRIC_ACCURACY])def init_model(self):self.cnn = Sequential()self.cnn.add(Convolution2D(32, 3, padding=constant.PADDING_SAME, input_shape=self.shape))self.cnn.add(Activation(constant.RELU_ACTIVATION_FUNCTION))self.cnn.add(Convolution2D(32, 3, 3))self.cnn.add(Activation(constant.RELU_ACTIVATION_FUNCTION))self.cnn.add(MaxPooling2D(pool_size=(2, 2)))self.cnn.add(Dropout(constant.DROP_OUT_O_25))self.cnn.add(Convolution2D(64, 3, padding=constant.PADDING_SAME))self.cnn.add(Activation(constant.RELU_ACTIVATION_FUNCTION))self.cnn.add(Convolution2D(64, 3, 3))self.cnn.add(Activation(constant.RELU_ACTIVATION_FUNCTION))self.cnn.add(MaxPooling2D(pool_size=(2, 2)))self.cnn.add(Dropout(constant.DROP_OUT_O_25))self.cnn.add(Flatten())self.cnn.add(Dense(constant.NUMBER_FULLY_CONNECTED))self.cnn.add(Activation(constant.RELU_ACTIVATION_FUNCTION))self.cnn.add(Dropout(constant.DROP_OUT_0_50))self.cnn.add(Dense(self.n_classes))self.cnn.add(Activation(constant.SOFTMAX_ACTIVATION_FUNCTION))self.cnn.summary()def train(self, n_epochs=20, batch=32):self.cnn.fit(self.objects, self.labels,batch_size=batch,epochs=n_epochs, shuffle=True)def get_model(self):return self.cnndef predict(self, image):image = Common.to_float(image)result = self.cnn.predict(image)print(result)def evaluate(self):super(ConvolutionalModel, self).evaluate()

在构造函数中,我们设置self.shape变量,该变量定义输入层的形状。在我们的例子中,对于Yale数据集,图像高度为320像素,宽度为243像素,self.shape =(320, 243, 1)。

然后,我们调用super()从父构造函数获取所有与数据集相关的变量集,并调用init_model()初始化模型的方法。

最后,我们调用compile方法,该方法配置用于训练的模型并设置要在loss参数中使用的目标函数。在训练过程中,目标功能得到了优化(最小化或最大化)。accuracy参数定义在训练中评估模型的度量。optimizer参数定义权重的计算方式。最常见的优化器是“梯度下降”。

我们的CNN模型定义为顺序的,并根据体系结构的要求添加所有层。train()方法使用表示层排列的sequential类的fit方法来训练CNN。此方法接收训练CNN的数据作为输入,该数据的正确分类以及一些可选参数,例如要运行的时期数。

训练CNN

现在,代码已经准备就绪,该开始训练我们的CNN了。让我们实例化ConvolutionalModel类,在Yale数据集上进行训练,然后调用评估方法。

cnn = ConvolutionalModel(dataSet)
cnn.train(n_epochs=50)
cnn.evaluate()

在进行了50个时期的训练后,我们在测试图像上的准确性达到了近85%。

这意味着我们的CNN现在将以85%的概率识别出数据集中15个主题中的每个主题。简短的练习还不错吧?

现在,我们已经训练了CNN,如果我们想预测新的传入数据(意味着来自图像的新面孔),则可以使用之前详细介绍的ConvolutionalModel类中的predict(image)方法来进行。如何运作?该调用看起来像下一个调用,它应符合某些假设。

cnn.predict(np.expand_dims(image, axis=0))

首先,输入图像必须具有与先前训练的CNN输入层相同的尺寸或形状。其次,在我们归一化数据的predict()方法中,它应该是相同类型的输入,即像素值矩阵,因此无需提供归一化的图像像素矩阵。第三,我们可能需要为输入的面部图像添加一个维度,因为在经过训练的CNN中,我们考虑了数据集中样本数量的第4个维度。这可以使用numpy的expand_dims()方法来实现。第四,假定将提供面部图像,在较大图片的情况下,先前文章中提供的面部检测方法可证明是有用的。

最后,predict()方法的输出可以在上图中看到。此方法将输出脸部属于每个可能类别或个人的概率(对于训练后的数据集为15)。在这种情况下,我们可以看到类别4的可能性最高,这正是输入的面部图像所指的类别或人物。

下一步?

现在我们知道了如何从头开始构建自己的CNN。在下一篇文章中,我们将研究一种替代方法——利用预先训练的模型。我们将使用一个经过训练的CNN来对具有数百万个图像的数据集进行人脸识别训练,并对其进行调整以解决我们的问题。敬请关注!

使用Keras和CNN进行自定义AI人脸识别相关推荐

  1. Python+OpenCv实现AI人脸识别身份认证系统(2)——人脸数据采集、存储

    原 Python+OpenCv实现AI人脸识别身份认证系统(2)--人脸数据采集.存储 2019年07月02日 08:47:52 不脱发的程序猿 阅读数 602更多 所属专栏: 人脸识别身份认证系统设 ...

  2. AI人脸识别真的成熟了吗?读完这篇你就懂了

    作者 |  于曦 AI 成为新基建风口模式下的一个重要选题,让人们对于 AI 的热情空前高涨.从一开始的烧钱阶段到今天的确定性发展,AI 一直渗透着人们的生活,从自动驾驶到人脸识别都是如此.其中,人脸 ...

  3. 连Python都不熟也能跑通AI人脸识别?“隐藏Boss”竟是它!

    摘要:先把AI人脸识别跑起来,然后研究它是如何实现的,整个过程中确实收获不少.所谓先跟着做,再跟着学,实践与理论结合,自己感觉有理解了一些基础概念入个门,在此分享一下自己的捣鼓经验. 1.买台小&qu ...

  4. Python+OpenCv实现AI人脸识别身份认证系统(3)——训练人脸识别模型

    目录 案例引入 本节项目 最近有小伙伴们一直在催本项目的进度,好吧,今晚熬夜加班编写,在上一节中,实现了人脸数据的采集,在本节中将对采集的人脸数据进行训练,生成识别模型. 案例引入 首先简要讲解数据集 ...

  5. 门前异动监控、AI 人脸识别!360 发布新型智能门铃

    10 月 29 日,360 举行了主题为"硬核新视界"的智能硬件新品发布会.会上,360 发布了一款全新产品--360 智能门铃.360 智能门铃以"门前异动监控&quo ...

  6. 基于人脸识别的课堂签到管理系统(三)---实时时间显示以及百度AI人脸识别

    基于人脸识别的课堂签到管理系统(三)---实时时间显示以及百度AI人脸识别 一.前言概述 二.实时时间显示 三.百度AI人脸识别 3.1 获取access_token 3.2 发送请求,通过网络请求方 ...

  7. 这家金融巨头,要让AI人脸识别大规模应用在银行领域

    脑海中想象这样一个画面:当一位VIP客户走进银行大厅办理业务时,人脸识别技术能在极短时间内帮助客户经理实现快速.准确定位其身份信息,并显示该客户在银行的理财记录等,这时客户经理将为其匹配针对性的服务, ...

  8. Android自定义人脸识别框,android自定义虹软人脸识别框/人脸抓拍框/人脸追踪框...

    有一两个月没有更新博客了,最近一直在忙人脸识别的项目,先将项目中更改虹软人脸框的方法抽取出来,希望对大家有所帮助. 尊重原创,转载请注明出处: http://blog..net/qq137722697 ...

  9. android 人脸识别边框_android自定义Arcface人脸识别框/人脸抓拍框/人脸追踪框

    为什么要改? 先来看看sdk demo中提供的人脸框样式,这个框看上去并不是非常美观(个人觉得) 在这里插入图片描述 再看看下面这个框是不是就要顺眼一点 在这里插入图片描述 怎么换? 先来看看原始的画 ...

最新文章

  1. 蓝牙4.0BLE抓包(二) – 广播包解析
  2. 蓝桥杯-区间k大数查询(java)
  3. nginx之Geoip读取地域信息模块
  4. 阿里数据库内核月报:2016年03月
  5. Android Nine-patch
  6. python按列读取txt文件_如何使用pandas读取txt文件中指定的列(有无标题)
  7. c1和c2语言水平,为什么驾校不建议考C2,驾驶证C1和C2的区别
  8. 1067 mysql,mysql免安装版1067错误终极解决办法图文教程
  9. 建立一个端口为8189的服务器,它无限期等待直到有客户连接这个端口。若客户在网上发送正确的请求连接了这个端口,则服务器与客户之间就建立了一个可靠的连接。
  10. 用友java打不开_用友8.52的版本打不开UFO报表 显示UFOS MFC Application 已停止正常工作 重装软件也没用...
  11. 三调数据库标注插件v1.2
  12. DirectShow笔记
  13. [书籍精读]《移动WEB前端高级开发实践》精读笔记分享
  14. JavaScript:分支流程控制switch语句详解
  15. design contains shelved or modified (but not repoured) polygons. the result....继续铺铜还是报警,解决方案如下:
  16. 计算机使用技巧大全 书,总算明白电脑使用技巧大全
  17. 苏黎世投机定律 读书笔记2
  18. 洛谷2002 消息扩散
  19. 互联网之父等83位专家联名炮轰美国互联网政策
  20. 斐讯N1保姆级教程 电视盒 debian centos7 三合一

热门文章

  1. html表白特效源代码_程序员如何在七夕节表白
  2. linux 定时器_通过linux源码分析nodejs的keep-alive
  3. pythonfor循环例句_Python for 循环语句
  4. 深度学习数据集制作_深度学习时代的数据驱动建模之探讨
  5. 计算机考研854都有哪些学校,哈尔滨工业大学计算机考研854计算机基础参考书汇总...
  6. apache缓存php页面不改变,Apache服务器禁止静态文件缓存的实现方法
  7. 云计算是互联网和计算机技术发展的产物,云计算是网络技术和电脑融合在一起产物...
  8. 配置的android版本,Android SDK配置(V3.0.0及以上版本)
  9. python中的常量是指_python入门教程04-01(python语法入门之变量)
  10. ASN.1编解码:asn1c的基本使用