具有预先训练模型的AI人脸识别

目录

介绍

为什么要使用别人的CNN?

实现VGG16

应用于Yale数据集

下一步?


  • 下载源8.4 KB

介绍

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

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

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

为什么要使用别人的CNN

到目前为止,我们已经完成了设计、实现和训练自己的CNN以进行人脸识别所需的一切。在本文中,我们将探讨另一种方法——使用预先训练的VGG(牛津大学的Visual Geometry Group)模型。这些CNN已针对大型数据集进行了设计和训练,并取得了出色的效果。

为什么我们要重用别人为数据集设计和训练的CNN,这显然不同于我们的数据集?好吧,主要原因是有人花了大量的CPU/GPU时间在庞大的数据集上训练这些模型。我们可以充分利用这项训练。在另一种模型中重用一个已经训练好的CNN的想法被称为迁移学习

VGG16VGG19ResNet50InceptionV3Xception是一些著名的VGG模型。它们具有不同的体系结构,并且都可以在Keras中使用。这些模型均在包含约120万幅图像的ImageNet数据集上进行了训练。

在本文中,我们将改编VGG16模型

VGG16架构图显示此CNN的输入定义为(2242243)。因此,如果要使此CNN适应我们的问题,我们有两种选择。我们可以剪裁和调整我们的图像到224 X 224,或者,我们可以将VGG16的输入层更改为彩色图像(RGB)的(our_img_widthour_img_height3)或灰度图像的(our_img_widthour_img_height1)。

请注意,VGG16的输出层包含1,000个类。由于我们的问题没有太多可能的类,因此我们必须更改输出层的形状。

实现VGG16

我们将使用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的末尾添加了以下几层:FlattenDenseMaxPoolingDense。我们附加到VGG末端的“mini-CNN”的目的是连接其block5_pool,并使其以正确的类数适合我们的问题。

另外,我们将添加的图层的layer.trainable属性设置为False。这样,我们就可以通过额外的训练来保持原始模型的权重,我们必须进行这些训练才能适应新的图层。您可以通过调用self.vgg.summary()以获得修改后的模型的完整描述。

我们在类的构造函数中使用以下lossoptimizer函数:

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])

应用于Yale数据集

现在,将VGGNet模型应用于Yale Face数据集。哇:我们仅在三个时代就达到了93%以上的准确率!

只是提醒您:我们从头开始开发的CNN在经过50个纪元后,为我们提供了约85%的准确性。因此,使用预训练模型已大大改善了算法的收敛性。

下一步?

就是这样:我们已经完成了面部识别部分。下一篇文章——本系列的最后一篇——将重点介绍使用深度学习的文本到语音转换。我们将应用TTS来选择一条消息播放给我们刚刚认出其面孔的人。敬请关注!

你可能感兴趣的:(python,人工智能,AI,人脸识别,python)