一、前言
最近几年,人工智能(AI)技术不断发展,从新闻智能推荐到听歌识曲,再到被广泛应用的人脸识别技术,处处可见人工智能的身影。不得不说,人工智能已经逐渐渗透大众日常生活,成为不可或缺的一部分。那么,如何从“零”开始去实现一个AI功能?让UCloud来帮您。
UCloud推出了AI as a Service平台,该平台基于UCloud丰富的计算资源与分布式系统实践经验,致力于提供廉价、高可靠、高弹性、高易用性的AI在线服务,将客户从繁杂的平台系统开发和运维工作中解放出来。 以在线人脸表情识别为例,说明如何借助UAI-Service以及开源算法,轻松实现在线服务,“零基础”入门使用AI。另外还对AI在线服务的性能进行了评估,将其与GPU性能进行比对,使用户更直观的了解AI在线服务性能优势。
二、实现步骤
整个实现过程主要由两部分组成,首先利用tensorflow1.1.0训练所需的模型文件,其次按照UAI-SERVICE的使用说明部署在线服务。具体步骤如下:
1. 模型训练
(1) 安装TensorFlow 1.1.0
安装环境为ubuntu14.04.5, python版本为2.7.6,直接借助pip安装tensorflow,指令如下:
- bash
- pip install tensorflow=1.1.0
(2) 选择合适的数据库
UCloud选择使用目前较大的人脸表情识别公开数据库fer2013,共包含35887张人脸图片,其中训练集28709张、验证集3589张、测试集3589张。数据库中各个样本在年龄、面部方向等有比较大的差异性,具有一定的实际意义,也使表情识别更具挑战性。
同时,数据库中的图片均为灰度图片,大小为48*48像素,样本被分为生气、厌恶、恐惧、开心、中性、伤心、惊讶七类,各种类型分布基本均匀。(该数据库实际为kaggle一个比赛项目提供的数据,官方给出的文件格式为csv,手动将其转换成了图片格式。)
(3) 数据预处理
实际选用了tensorflow提供的TF-Slim实验库。具体参见TF_Slim官方文档说明。
TF-Slim是一个用于tensorflow定义、训练和评估复杂模型的新型轻量级API,它提供了集中广泛使用的卷积神经网络图像分类模型代码以及预训练模型,同时还包含了运行脚本,借助它可以快速入门,既可以从头开始训练模型,也可以对已经训练好的网络权重进行微调。
TF-Slim提供了将数据集转换成tfrecord格式的代码,对代码进行调整后可以将所用的数据集fer2013转成tfrecord格式。
数据形式如下所示,其中labels.txt中包含了类别的映射:
(4) 训练
本次训练选用了较大的模型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
进行模型微调时,系统自动保留***的五个生成模型,如果发生中断,过后会在***模型基础上继续微调。
训练模型文件如下:
2. 部署在线服务
模型训练完成之后,就准备上手部署!
按照官方文档的提示(AI在线服务 UAI-Service),在线部署的主要步骤如下(因个人喜好,本次选择用命令行部署,官方也给出了使用Console部署的操作说明)。
(1) 安装UCloud UFile SDK以及UAI SDK
- 前者是UCloud对象存储的SDK(http://sdk.ufile.ucloud.com.cn/python_sdk.tar.gz),主要用于将部署服务需要的模型和代码文件上传到UCloud的对象存储空间中,这就涉及到首先创建一个属于自己的私有空间,具体步骤在此不赘述。
- 后者是UAI在线服务的SDK(https://gitlab.ucloudadmin.com/uai-service/uai-sdk/tree/master),提供了部署在线服务的命令行工具。
(2) 依据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
- imim = 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
(3) 打包上传需要的模型及代码文件
文件目录结构:
打包上传文件:
- 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
(4) 创建署服务
创建服务:
- bash
- python tf_deploy.py create --public_key=MY_PUBLIC_KEY --private_key=MY_PRIVATE_KEY --service_name=fer_uaiservice --cpu=8 --memory=8
创建服务后返回如下:
(5) 部署服务
部署服务:
- 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来访问服务。
(6) 启动服务
启动服务:
- 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
启动成功后返回如下:
三、测试
上述步骤完成之后,表明人脸表情识别在线服务已经部署成功,可以实现在线人脸表情识别!
1. URL测试
通过云主机即可访问该URL,具体情况如下:
上述结果表明,通过UAI部署在线服务后给出的URL是通的,可以借助它对输入图片进行情感分类。
图中将输入图片“happy.jpg”分成了类别“4”,对应“neutral”类,说明模型的识别率有待提升。
2. 在线服务性能测试
借助ab测试评估了服务的性能,并与本地测试以及GPU(K80)做了比对。(关于本地测试的方法官网有介绍,有兴趣的可以戳 TensorFlow 本地代码测试方法 )
测试结果如下,观察可以发现:
- 在并发数增加到8时,AI在线服务的性能基本和GPU性能接近,即UAI-Service 8个节点的性能相当于一块K80单核的性能。
- 在有并发的前提下,AI在线服务的性能普遍高于8核8G云主机的性能。
人工智能(AI)将是UCloud“CBA”战略的重要一环。使用UCloud推出的AI as a Service平台,可以助力人工智能公司快速将人工智能算法产品化,同时也在资源管理、资源调度方面提供了全方位保障。
【本文是51CTO专栏机构作者“大U的技术课堂”的原创文章,转载请通过微信公众号(ucloud2012)联系作者】