赞
踩
目录
如果您看过《少数派报告》电影,您可能还记得汤姆·克鲁斯(Tom Cruise)走进一家Gap商店的场景。视网膜扫描仪读取他的眼睛,并为他播放定制的广告。好吧,这是2020年。我们不需要视网膜扫描仪,因为我们拥有人工智能(AI)和机器学习(ML)!
在本系列中,我们将向您展示如何使用深度学习进行面部识别,然后基于被识别的面部,使用神经网络语音合成(TTS)引擎播放自定义广告。
我们假设您熟悉AI/ML的基本概念,并且可以找到使用Python的方法。
到目前为止,我们已经完成了设计、实现和训练自己的CNN以进行人脸识别所需的一切。在本文中,我们将探讨另一种方法——使用预先训练的VGG(牛津大学的Visual Geometry Group)模型。这些CNN已针对大型数据集进行了设计和训练,并取得了出色的效果。
为什么我们要重用别人为数据集设计和训练的CNN,这显然不同于我们的数据集?好吧,主要原因是有人花了大量的CPU/GPU时间在庞大的数据集上训练这些模型。我们可以充分利用这项训练。在另一种模型中重用一个已经训练好的CNN的想法被称为“迁移学习”。
VGG16,VGG19,ResNet50,InceptionV3和Xception是一些著名的VGG模型。它们具有不同的体系结构,并且都可以在Keras中使用。这些模型均在包含约120万幅图像的ImageNet数据集上进行了训练。
在本文中,我们将改编VGG16模型。
VGG16架构图显示此CNN的输入定义为(224、224、3)。因此,如果要使此CNN适应我们的问题,我们有两种选择。我们可以剪裁和调整我们的图像到224 X 224,或者,我们可以将VGG16的输入层更改为彩色图像(RGB)的(our_img_width,our_img_height,3)或灰度图像的(our_img_width,our_img_height,1)。
请注意,VGG16的输出层包含1,000个类。由于我们的问题没有太多可能的类,因此我们必须更改输出层的形状。
我们将使用VGG16作为基本模型,并从中得出新的CNN – VGGNet。这个新的CNN将具有VGG16的层和权重,并在输入层(以使其适应我们的图像宽度、高度和配色方案)以及输出层(以使其适应我们的分类数量)进行一些修改。
为了实现我们的自定义VGGNet模型,让我们创建一个从MLModel继承的类,就像在本系列上一篇文章中所做的一样。在名为VggModel的类中,除了init_model()以外的所有方法都将具有与我们的ConvolutionalModel类相同的实现。代码如下所示:
- def init_model(self):
- base_model = VGG16(weights=constant.IMAGENET, include_top=False,
- input_tensor=Input(shape=(constant.IMG_WIDTH,
- constant.IMG_HEIGHT, 3)), pooling='max', classes=15)
-
- base_model.summary()
-
- for layer in base_model.layers:
- layer.trainable = False
-
- x = base_model.get_layer('block5_pool').output
- # Stacking a new simple convolutional network on top of it
- x = Convolution2D(64, 3)(x)
- x = MaxPooling2D(pool_size=(2, 2))(x)
- x = Flatten()(x)
- x = Dense(constant.NUMBER_FULLY_CONNECTED, activation=constant.RELU_ACTIVATION_FUNCTION)(x)
- x = Dense(self.n_classes, activation=constant.SOFTMAX_ACTIVATION_FUNCTION)(x)
-
- self.vgg = Model(inputs=base_model.input, outputs=x)
- self.vgg.summary()
请注意,我们在CNN的末尾添加了以下几层:Flatten,Dense,MaxPooling和Dense。我们附加到VGG末端的“mini-CNN”的目的是连接其block5_pool,并使其以正确的类数适合我们的问题。
另外,我们将添加的图层的layer.trainable属性设置为False。这样,我们就可以通过额外的训练来保持原始模型的权重,我们必须进行这些训练才能适应新的图层。您可以通过调用self.vgg.summary()以获得修改后的模型的完整描述。
我们在类的构造函数中使用以下loss和optimizer函数:
- def __init__(self, dataSet=None):
- super().__init__(dataSet)
- opt = keras.optimizers.Adam(learning_rate=0.001)
- self.vgg.compile(loss=keras.losses.binary_crossentropy,
- optimizer=opt,
- metrics=[constant.METRIC_ACCURACY])
'运行
现在,将VGGNet模型应用于Yale Face数据集。哇:我们仅在三个时代就达到了93%以上的准确率!
只是提醒您:我们从头开始开发的CNN在经过50个纪元后,为我们提供了约85%的准确性。因此,使用预训练模型已大大改善了算法的收敛性。
就是这样:我们已经完成了面部识别部分。下一篇文章——本系列的最后一篇——将重点介绍使用深度学习的文本到语音转换。我们将应用TTS来选择一条消息播放给我们刚刚认出其面孔的人。敬请关注!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。