首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >人脸图像识别实例:使用Keras-MXNet在MXNet模型服务器上部署“笑脸检测器”

人脸图像识别实例:使用Keras-MXNet在MXNet模型服务器上部署“笑脸检测器”

作者头像
AiTechYun
发布2018-07-27 14:43:45
3.4K0
发布2018-07-27 14:43:45
举报
文章被收录于专栏:ATYUN订阅号ATYUN订阅号

编译:yxy

出品:ATYUN订阅号

AWS最近宣布发布了针对Keras 2的Apache MXNet后端,与使用多GPU的默认后端相比,它可以为你提供高达3倍的速度提升。它可以改进训练和推理性能。在这个版本中,你现在能够将经过训练的Keras(使用MXNet后端)模型导出为本地MXNet模型,而不必依赖于特定的语言绑定。这种新的导出模型功能允许你使用各种工具(这些工具属于MXNet生态系统的一部分)。

在本文中,我们将在MXNet模型服务器上演示Keras-MXNet模型的用法。我们训练模型以检测图像中的笑脸,然后使用MXNet模型服务器通过Web API将其托管以进行在线推理。MXNet模型服务器是一种提供深度学习模型的工具,支持MXNet和ONNX(Open Neural Network Exchange)模型,并处理产品中模型服务的各个方面,包括HTTP端点,可扩展性,实时度量等。

第1部分 – 使用Keras-MXNet训练模型

如上所述,我们将训练模型来检测笑脸。我们将按照这个由McCyle McDonald编写的SmileCNN开源存储库中提到的步骤来训练我们的模型。

链接:https://github.com/kylemcdonald/SmileCNN

首先,我们通过安装必要的软件包来设置环境。如果你基于CPU的机器运行:

pip install mxnet
pip install keras-mxnet

对于安装了cuda 9.0的基于GPU的机器,运行“pip install mxnet-cu90”

注:可在此处访问Keras-MXNet上的详细安装说明。有GPU的计算机(例如AWS P或G实例类型)可提供更好的训练性能。这可以通过启动AWS Deep Learning AMIs来实现

安装说明:https://github.com/awslabs/keras-apache-mxnet/blob/master/docs/mxnet_backend/installation.md

AWS Deep Learning AMIs:https://aws.amazon.com/machine-learning/amis/

接下来,我们创建了一个SmileCNN存储库的分支,修改了笔记本并将它们转换为python文件,以适应我们现有的使用MXNet模型服务器进行推断的用例,。可以通过拷贝以下内容来访问修改后的文件:

git clone https://github.com/kalyc/SmileCNN
 cd SmileCNN

该存储库包含三个python文件 – 数据集准备,训练和评估。

首先,我们使用以下命令为这些包安装所需的依赖项:

sudo python setup.py install

然后,我们通过运行数据集准备的文件来准备训练数据。

python datasetprep.py

链接:https://github.com/kalyc/SmileCNN/blob/master/datasetprep.py

运行此文件会下载训练数据集。该数据集是近40MB的非笑脸和笑脸的实例。数据集有一个包含每个正面和反面训练图像的文件夹。此脚本获取这些图像并将其大小从64 x 64调整到32 x 32像素。然后它将它们转换为numpy数组并更新其格式,以便Keras-MXNet使用。

数据准备好后,我们使用训练文件训练模型。目前,Keras-MXNet中的保存模型仅支持channels_first数据格式,根据Keras-MXNet性能指南,已知这种格式会有更好的性能。所以,需要更新Keras配置以使用channels_first图像数据格式:

可以在$ HOME / .keras / keras.json访问Keras配置文件

{
“backend”:“mxnet”,
“image_data_format”:“channels_first”
}

接下来,我们使用to_channels_first()函数讲输入数据转换为channels_first格式(下方链接脚本24行)。

链接:https://github.com/kalyc/SmileCNN/blob/master/train.py#L24

import keras as k
X= k.utils.to_channels_first(X)

我们修改原始训练脚本以保存模型,第64行:

# Save the trained Keras Model as MXNet Model
keras.models.save_mxnet_model(model=model, prefix='smileCNN_model')

更新配置后,我们运行训练脚本。

python train.py

训练网络基于mnist_cnn示例构建。根据你的硬件配置,训练此模型需要不同的时长。在本例中,我们在基础深度学习AMI的p2.16xlarge上训练这个模型100个周期。花了大约3分钟。P实例附带GPU,从而加快了训练时间。在基于CPU的硬件上,训练可能需要更长时间。

Test accuracy:0.9638663504942575

训练完成后,save_mxnet_model()函数将返回以下输出:

MXNet Backend: Successfully exported the model as MXNet model!
MXNet symbolfile -  smileCNN_model-symbol.json
MXNet paramsfile -  smileCNN_model-0000.params
Modelinput data_namesand data_shapes are:
data_names :  ['/conv2d_1_input1']
data_shapes :  [DataDesc[/conv2d_1_input1,(4L,1L,32L,32L),float32,NCHW]]

注意:在上面的data_shapes中,第一个维度表示用于模型训练的batch_size。你可以根据你推理的batch_size,更改绑定模块的batch_size。

该save_mxnet_model()函数创建smileCNN_model-symbol和smileCNN_model-0000.params一旦成功保存模型文件。这些文件定义网络的结构和相关的权重。它们基本上定义了训练完成的MXNet模型。输入符号为/ conv2d_1_input1,形状为(4L,1,32,32)。

smileCNN_model-symbol.json和smileCNN_model-0000.params文件是在根目录生成的。

我们可以使用评估脚本测试模型的准确性。

python evaluation.py

如果一切设置正确,模型应该能够获取一个numpy数组并将结果预测为笑脸。

评估图像

('non-smiling','------------------------###-','smiling')

上面的结果清楚地表明图像被正确分类。评估脚本使用用Keras-MXNet保存的模型,并加载它以用于预测。

第2部分 – 使用MXNet模型服务器进行推理

接下来,让我们看看如何使用MXNet模型服务器(MMS)来提供此模型。

按照MMS快速入门指南,我们在我们的机器上设置MXNet模型服务器。

指南:https://github.com/awslabs/mxnet-model-server

在ubuntu上运行:

sudo apt-get install protobuf-compiler libprotoc-dev
pip install mxnet-model-server

在mac上运行:

conda install-c
conda-forge protobuf pip install mxnet-model-server

我们在SmileCNN存储库中创建了一个名为keras-mms的模型存档目录。我们将保存的训练模型的符号和参数文件移动到keras-mms目录中,该目录用于在MXNet模型服务器上托管模型推理。

cp smileCNN_model- * ./keras-mms/
cd keras-mms/

注意:以下部分介绍了创建keras-mms目录中已存在的文件的过程。

模型存档目录(keras-mms)包含以下文件:

-  signature.json
-  synset.txt
-  smileCNN_model-symbol.json
-  smileCNN_model-0000.params
-  custom_service.py

为了让MMS知道使用哪个输入符号和什么形状进行推理,我们使用save_mxnet_model()函数的输出,并将signature.json文件设置在同一目录中,如下所示:

{
    "inputs": [
        {
           "data_name":"/conv2d_1_input1",
           "data_shape": [0,1,32,32]
        }
    ],
    "input_type":"image/jpeg",
    "outputs": [
        {
           "data_name":"softmax",
           "data_shape": [0,1]
        }
    ],
    "output_type":"application/json"
}

签名(signature)指定推理所需的输入是JPEG图像。输出类型是JSON。输出数据形状在0和1之间变化,因为模型仅预测笑脸和非笑脸2个类。

我们将必要的synset.txt文件添加到列表标签中 – 每行一个标签,如MXNet-Model Server导出说明中所述。这个文件根据数据集的不同而不同,它包含一个模型可以预测的类的列表。

对于笑脸检测示例,类标签是:

non-smiling
smiling

然后,我们编写一个custom_service.py文件,该文件定义了自定义了预处理和后处理的推理。

"""CustomService defines a MXNet base vision service"""
from mms.model_service.mxnet_model_serviceimport MXNetBaseService
from mms.utils.mxnetimport image, ndarray
class CustomService(MXNetBaseService):
"""
CustomService defines a custom service for image classification task. In preprocess,
input image buffer is read to NDArray and resized respect to input shape in signature.
In post process, top-2 labels are returned.
"""
 def _preprocess(self, data):
  img_list= []
   for idx, imgin enumerate(data):
    input_shape= self.signature['inputs'][idx]['data_shape'] #Input shape is NCHW
    [h, w]= input_shape[2:]
    img_arr= image.read(img,0)#Set flag to 0 for reading grayscale images
    img_arr= image.resize(img_arr, w, h)
    img_arr= image.transform_shape(img_arr)
    img_list.append(img_arr)
  return img_list
 def _postprocess(self, data):
  assert hasattr(self,'labels'), \
  "Can't find labels attribute. Did you put synset.txt file into " \
            "model archive or manually load class label file in __init__?"
  return [ndarray.top_probability(d,self.labels, top=2)for din data]

然后,我们使用keras-mms目录中的文件使用以下命令生成MMS .model文件:

mxnet-model-export--model-name smileCNN--model-path。--service-file-path custom_service.py

这会生成smileCNN.model文件。简而言之,此文件包含将我们的模型作为带有MMS的Web服务运行所需的所有依赖项的东西。

最后,我们运行此命令来启动服务器:

mxnet-model-server--models smileCNN= smileCNN.model

现在模型服务器已启动并可以使用!是时候测试模型了!

注意:下面的所有图像都已按比例放大,以便查看

测试图像

测试1.JPG

curl-X POST http://127.0.0.1:8080/smileCNN/predict-F"/conv2d_1_input1=@test-1.jpg"

得出的预测:

{
    "prediction": [
        [
            {
                "class":"smiling",
                "probability":1.0
            },
            {
                "class":"non-smiling",
                "probability":0.0
            }
        ]
    ]
}

这就是使用Keras和MXNet后端训练模型并通过MXNet模型服务器进行推理的过程。

由于MXNet模型服务器对其进行舍入(round)时,模型的推断概率可能会出现偏差。

为了进一步评估模型,我们使用不同的示例对其进行测试。

测试2.JPG

curl-X POST http://127.0.0.1:8080/smileCNN/predict-F“/conv2d_1_input1=@test-2.jpg”

得出的预测

{
    "prediction": [
        [
            {
                "class":"non-smiling",
                "probability":1.0
            },
            {
                "class":"smiling",
                "probability":0.0
            }
        ]
    ]
}

我们可以看到这个简单的CNN模型所做的预测已经非常好了!

这是只是个做来玩的模型,但它是可以有实际应用的应用程序。例如,为了确保你的同事在进入办公室时总是面带微笑,你可以在办公室前门上方添加一个网络摄像头,需要笑脸才能进入大楼!:)(我认为,需要面带微笑才能离开大楼比较现实)

了解更多

Keras-MXNet的最新版本使用户以更高的速度训练大型模型,并以MXNet原生格式导出经过训练的模型,允许在多个平台上进行推理,包括MXNet模型服务。要了解更多相关信息,请访问下方链接。

https://github.com/awslabs/keras-apache-mxnet

https://github.com/awslabs/mxnet-model-server

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-07-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ATYUN订阅号 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第1部分 – 使用Keras-MXNet训练模型
  • 第2部分 – 使用MXNet模型服务器进行推理
  • 了解更多
相关产品与服务
图像识别
腾讯云图像识别基于深度学习等人工智能技术,提供车辆,物体及场景等检测和识别服务, 已上线产品子功能包含车辆识别,商品识别,宠物识别,文件封识别等,更多功能接口敬请期待。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档