“零基础”实现人脸表情识别

前言

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

UCloud推出了AI as a Service平台,该平台基于UCloud丰富的计算资源与分布式系统实践经验,致力于提供廉价、高可靠、高弹性、高易用性的AI在线服务,将客户从繁杂的平台系统开发和运维工作中解放出来。 以在线人脸表情识别为例,说明如何借助UAI-Service以及开源算法,轻松实现在线服务,“零基础”入门使用AI。另外还对AI在线服务的性能进行了评估,将其与GPU性能进行比对,使用户更直观的了解AI在线服务性能优势。

实现步骤

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

Step1 模型训练

Step1.0 安装TensorFlow 1.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

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

训练模型文件如下:

Step2 部署在线服务

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

按照官方文档的提示(AI在线服务 UAI-Service),在线部署的主要步骤如下(因个人喜好,本次选择用命令行部署,官方也给出了使用Console部署的操作说明)。

Step2.0 安装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),提供了部署在线服务的命令行工具。

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

代码如下:

python

# ferinference.pyimport numpy as np

import tensorflow as tf


from PIL import Image

from inceptionv3 import *

from uai.arch.tfmodel 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 打包上传需要的模型及代码文件

文件目录结构:

打包目录

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

打包上传文件:

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)做了比对。(关于本地测试的方法官网有介绍,有兴趣的可以戳TensorFlow 本地代码测试方法

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

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

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

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

本文由UCloud应用创新部原创,转载请私聊大U君~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容