UCloud发力AI在线服务 UAI-SERVICE“零基础”实现人脸表情识别

最近几年,人工智能(AI)技术不断发展,从新闻智能推荐到听歌识曲,再到被广泛应用的人脸识别技术,处处可见人工智能的身影。不得不说,人工智能已经逐渐渗透大众日常生活,成为不可或缺的一部分。那么如何从“零”开始去实现一个AI功能?让UCloud来帮您。

UCloud推出了AI as a Service平台,该平台基于UCloud丰富的计算资源与分布式系统实践经验,致力于提供廉价、高可靠、高弹性、高易用性的AI在线服务,将客户从繁杂的平台系统开发和运维工作中解放出来。

以在线人脸表情识别为例,说明如何借助UAI-Service以及开源算法,轻松实现在线服务,“零基础”入门使用AI。另外还对AI在线服务的性能进行了评估,将其与GPU性能进行比对,使用户更直观的了解AI在线服务性能优势。

实现步骤

整个实现过程主要由两部分组成,首先利用tensorflow1.1.0训练所需的模型文件,其次按照UAI-SERVICE的使用说明部署在线服务。具体步骤如下:

Step 1:模型训练

Step1.0 安装tensorflow1.1.0

安装环境为ubuntu14.04.5, python版本为2.7.6,直接借助pip安装tensorflow,指令如下:

bash
pip install tensorflow=1.1.0

Step1.1 选择合适的数据库

UCloud选择使用目前较大的人脸表情识别公开数据库fer2013,共包含35887张人脸图片,其中训练集28709张、验证集3589张、测试集3589张。数据库中各个样本在年龄、面部方向等有比较大的差异性,具有一定的实际意义,也使表情识别更具挑战性。

同时,数据库中的图片均为灰度图片,大小为48*48像素,样本被分为生气、厌恶、恐惧、开心、中性、伤心、惊讶七类,各种类型分布基本均匀。(该数据库实际为kaggle一个比赛项目提供的数据,官方给出的文件格式为csv,手动将其转换成了图片格式。)

Step1.2 数据预处理

实际选用了tensorflow提供的TF-Slim实验库。具体参见TF_Slim官方文档说明

TF-Slim是一个用于tensorflow定义、训练和评估复杂模型的新型轻量级API,它提供了集中广泛使用的卷积神经网络图像分类模型代码以及预训练模型,同时还包含了运行脚本,借助它可以快速入门,既可以从头开始训练模型,也可以对已经训练好的网络权重进行微调。

TF-Slim提供了将数据集转换成tfrecord格式的代码,对代码进行调整后可以将所用的数据集fer2013转成tfrecord格式。

数据形式如下所示,其中labels.txt中包含了类别的映射

Step1.3 训练

本次训练选用了较大的模型inception_v3,对官方给出的预训练模型进行微调。由于训练模型的目的仅在于尝试一下在线服务,因而该训练过程并未过多涉及调参。

调用指令示例如下:

bash
TRAIN_DIR=./train_log
DATASET_DIR=./fer2013
PRETRAINED_CHECKPOINT_DIR=./pretrain_model

python train_image_classifier.py \
--train_dir=${TRAIN_DIR} \
--dataset_name=fer2013 \
--dataset_split_name=train \
--dataset_dir=${DATASET_DIR} \
--model_name=inception_v3 \
--checkpoint_path=${PRETRAINED_CHECKPOINT_DIR}/inception_v3.ckpt \
--checkpoint_exclude_scopes=InceptionV3/Logits,InceptionV3/AuxLogits \
--trainable_scopes=InceptionV3/Logits,InceptionV3/AuxLogits \
--max_number_of_steps=1000 \
--batch_size=32 \
--learning_rate=0.01 \
--learning_rate_decay_type=fixed \
--save_interval_secs=60 \
--save_summaries_secs=60 \
--log_every_n_steps=100 \
--optimizer=rmsprop \
--weight_decay=0.00004

进行模型微调时,系统自动保留最新的五个生成模型,如果发生中断,过后会在最新模型基础上继续微调。

训练模型文件如下:

Step 2:部署在线服务

模型训练完成之后,就准备上手部署!

按照官方文档的提示(https://docs.ucloud.cn/analysis/uai-service/index),在线部署的主要步骤如下(因个人喜好,本次选择用命令行部署,官方也给出了使用Console部署的操作说明)。

Step2.0 安装UCloud UFile SDK以及UAI SDK

Step2.1 依据SDK工具包内的代码框架编写inference代码

代码如下:

python
# fer_inference.py
import numpy as np
import tensorflow as tf
from PIL import Image
from inception_v3 import *
from uai.arch.tf_model import TFAiUCloudModel


class FerModel(TFAiUCloudModel):
def __init__(self, conf):
super(FerModel, self).__init__(conf)
def load_model(self):
sess = tf.Session()
input_tensor = tf.placeholder(tf.float32, [None, 299, 299, 3])
arg_scope = inception_v3_arg_scope()
with slim.arg_scope(arg_scope):
logits, end_points = inception_v3(input_tensor,
is_training=False,
num_classes=7)

saver = tf.train.Saver()
params_file = tf.train.latest_checkpoint(self.model_dir)
saver.restore(sess, params_file)

self.output['sess'] = sess
self.output['input_tensor'] = input_tensor
self.output['logits'] = logits
self.output['end_points'] = end_points

def execute(self, data, batch_size):
sess = self.output['sess']
input_tensor = self.output['input_tensor']
logits = self.output['logits']
end_points = self.output['end_points']

ims = []

for i in range(batch_size):
im = Image.open(data[i]).resize((299, 299))
im = np.array(im) / 255.0
im = im.reshape(299, 299, 3)
ims.append(im)
ims = np.array(ims)

predict_values, logit_values = sess.run(
[end_points['Predictions'], logits], feed_dict={input_tensor: ims})

ret = []

for val in predict_values:
ret_val = np.array_str(np.argmax(val)) + '\n'
ret.append(ret_val)


return ret

Step2.2 打包上传需要的模型及代码文件

  • 文件目录结构:

打包目录

模型文件目录(checkpointdir目录下)

  • 打包上传文件:

bash
python tf_deploy.py pack --public_key=MY_PUBLIC_KEY --private_key=MY_PRIVATE_KEY --bucket=MY_BUCKET --pack_file_path=/Users/littleape1022/Desktop/fer_uaiservice --main_file=fer_inference --main_class=FerModel --model_dir=checkpoint_dir --code_files=fer_inference.py,inception_v3.py,inception_utils.py --upload_name=fer_uaiservice.tar --ai_arch_v=tensorflow-1.1.0

Step2.3 创建服务

  • 创建服务:

bash
python tf_deploy.py create  --public_key=MY_PUBLIC_KEY --private_key=MY_PRIVATE_KEY --service_name=fer_uaiservice --cpu=8 --memory=8

  • 创建服务后返回如下:

Step2.4 部署服务

  • 部署服务:

bash
python tf_deploy.py deploy --service_id=uaiservice-av4p1c --public_key=MY_PUBLIC_KEY --private_key=MY_PRIVATE_KEY --ai_arch_v=tensorflow-1.1.0 --ufile_url="MY_UFILE_URL" --pip=pillow

  • 部署成功后返回如下:

可以看到已经返回服务的URL了,但注意到状态是“ToStart”,启动之后就可以借助URL来访问服务。

Step2.5 启动服务

  • 启动服务:

bash
python tf_deploy.py start --public_key=MY_PUBLIC_KEY --private_key=MY_PRIVATE_KEY --service_name=fer_uaiservice --service_version=SERVICE_VERSION --paas_id=Srv_PAAS_ID

  • 启动成功后返回如下:

测试

上述步骤完成之后,表明人脸表情识别在线服务已经部署成功,可以实现在线人脸表情识别!

URL测试

通过云主机即可访问该URL,具体情况如下:

上述结果表明,通过UAI部署在线服务后给出的URL是通的,可以借助它对输入图片进行情感分类。

图中将输入图片“happy.jpg”分成了类别“4”,对应“neutral”类,说明模型的识别率有待提升(^_^)。

在线服务性能测试

借助ab测试评估了服务的性能,并与本地测试以及GPU(K80)做了比对。(关于本地测试的方法官网有介绍,有兴趣的可以戳 https://docs.ucloud.cn/analysis/uai-service/guide/tensorflow/test 

测试结果如下,可以发现:

1)在并发数增加到8时,AI在线服务的性能基本和GPU性能接近,即UAI-Service 8个节点的性能相当于一块K80单核的性能。

2)在有并发的前提下,AI在线服务的性能普遍高于8核8G云主机的性能。

人工智能(AI)将是UCloud“CBA”战略的重要一环。使用UCloud推出的AI as a Service平台,可以助力人工智能公司快速将人工智能算法产品化,同时也在资源管理、资源调度方面提供了全方位保障。

UCloud技术
UCloud技术

分享UCloud的技术创新、架构设计、实践总结,内容同步于微信公众号“UCloud技术公告牌”

https://www.ucloud.cn/
专栏二维码
工程情感识别生成模型图像分类数据库CNN人脸识别
2
相关数据
权重技术

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

调度技术

调度在计算机中是分配工作所需资源的方法。资源可以指虚拟的计算资源,如线程、进程或数据流;也可以指硬件资源,如处理器、网络连接或扩展卡。 进行调度工作的程序叫做调度器。调度器通常的实现使得所有计算资源都处于忙碌状态,允许多位用户有效地同时共享系统资源,或达到指定的服务质量。 see planning for more details

人工智能技术

在学术研究领域,人工智能通常指能够感知周围环境并采取行动以实现最优的可能结果的智能体(intelligent agent)

人脸识别技术

广义的人脸识别实际包括构建人脸识别系统的一系列相关技术,包括人脸图像采集、人脸定位、人脸识别预处理、身份确认以及身份查找等;而狭义的人脸识别特指通过人脸进行身份确认或者身份查找的技术或系统。 人脸识别是一项热门的计算机技术研究领域,它属于生物特征识别技术,是对生物体(一般特指人)本身的生物特征来区分生物体个体。

验证集技术

验证数据集是用于调整分类器超参数(即模型结构)的一组数据集,它有时也被称为开发集(dev set)。

数据库技术

数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。 所谓“数据库”系以一定方式储存在一起、能予多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。

卷积神经网络技术

卷积神经网路(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。卷积神经网路由一个或多个卷积层和顶端的全连通层(对应经典的神经网路)组成,同时也包括关联权重和池化层(pooling layer)。这一结构使得卷积神经网路能够利用输入数据的二维结构。与其他深度学习结构相比,卷积神经网路在图像和语音识别方面能够给出更好的结果。这一模型也可以使用反向传播算法进行训练。相比较其他深度、前馈神经网路,卷积神经网路需要考量的参数更少,使之成为一种颇具吸引力的深度学习结构。 卷积网络是一种专门用于处理具有已知的、网格状拓扑的数据的神经网络。例如时间序列数据,它可以被认为是以一定时间间隔采样的一维网格,又如图像数据,其可以被认为是二维像素网格。

映射技术

映射指的是具有某种特殊结构的函数,或泛指类函数思想的范畴论中的态射。 逻辑和图论中也有一些不太常规的用法。其数学定义为:两个非空集合A与B间存在着对应关系f,而且对于A中的每一个元素x,B中总有有唯一的一个元素y与它对应,就这种对应为从A到B的映射,记作f:A→B。其中,y称为元素x在映射f下的象,记作:y=f(x)。x称为y关于映射f的原象*。*集合A中所有元素的象的集合称为映射f的值域,记作f(A)。同样的,在机器学习中,映射就是输入与输出之间的对应关系。

生成模型技术

在概率统计理论中, 生成模型是指能够随机生成观测数据的模型,尤其是在给定某些隐含参数的条件下。 它给观测值和标注数据序列指定一个联合概率分布。 在机器学习中,生成模型可以用来直接对数据建模(例如根据某个变量的概率密度函数进行数据采样),也可以用来建立变量间的条件概率分布。

图像分类技术

图像分类,根据各自在图像信息中所反映的不同特征,把不同类别的目标区分开来的图像处理方法。它利用计算机对图像进行定量分析,把图像或图像中的每个像元或区域划归为若干个类别中的某一种,以代替人的视觉判读。

推荐文章
暂无评论
暂无评论~