UCloud發力AI線上服務 UAI-SERVICE“零基礎”實現人臉表情識別

UCloud技术發表於2018-11-15

最近幾年,人工智慧(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

  • 前者是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
# 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/
專欄二維碼

相關文章