「零基礎」實現人臉表情識別
前言
最近幾年,人工智慧(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,指令如下:
bashnpip install tensorflow=1.1.0n
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,對官方給出的預訓練模型進行微調。由於訓練模型的目的僅在於嘗試一下在線服務,因而該訓練過程並未過多涉及調參。
調用指令示例如下:
bashnTRAIN_DIR=./train_lognDATASET_DIR=./fer2013nPRETRAINED_CHECKPOINT_DIR=./pretrain_modelnnpython train_image_classifier.py n --train_dir=${TRAIN_DIR} n --dataset_name=fer2013 n --dataset_split_name=train n --dataset_dir=${DATASET_DIR} n --model_name=inception_v3 n --checkpoint_path=${PRETRAINED_CHECKPOINT_DIR}/inception_v3.ckpt n --checkpoint_exclude_scopes=InceptionV3/Logits,InceptionV3/AuxLogits n --trainable_scopes=InceptionV3/Logits,InceptionV3/AuxLogits n --max_number_of_steps=1000 n --batch_size=32 n --learning_rate=0.01 n --learning_rate_decay_type=fixed n --save_interval_secs=60 n --save_summaries_secs=60 n --log_every_n_steps=100 n --optimizer=rmsprop n --weight_decay=0.00004n
進行模型微調時,系統自動保留最新的五個生成模型,如果發生中斷,過後會在最新模型基礎上繼續微調。
訓練模型文件如下:
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代碼
代碼如下:
pythonn# fer_inference.pynimport numpy as npnimport tensorflow as tfnnfrom PIL import Imagenfrom inception_v3 import *nfrom uai.arch.tf_model import TFAiUCloudModelnnclass FerModel(TFAiUCloudModel):n def __init__(self, conf):n super(FerModel, self).__init__(conf)nn def load_model(self):n sess = tf.Session()n input_tensor = tf.placeholder(tf.float32, [None, 299, 299, 3])n arg_scope = inception_v3_arg_scope()n with slim.arg_scope(arg_scope):n logits, end_points = inception_v3(input_tensor,n is_training=False,n num_classes=7)n saver = tf.train.Saver()n params_file = tf.train.latest_checkpoint(self.model_dir)nn saver.restore(sess, params_file)n self.output[sess] = sessn self.output[input_tensor] = input_tensorn self.output[logits] = logitsn self.output[end_points] = end_pointsnn def execute(self, data, batch_size):n sess = self.output[sess]n input_tensor = self.output[input_tensor]n logits = self.output[logits]n end_points = self.output[end_points]n ims = []n for i in range(batch_size):n im = Image.open(data[i]).resize((299, 299))n im = np.array(im) / 255.0n im = im.reshape(299, 299, 3)n ims.append(im)n ims = np.array(ims)n predict_values, logit_values = sess.run(n [end_points[Predictions], logits], feed_dict={input_tensor: ims})n ret = []n for val in predict_values:n ret_val = np.array_str(np.argmax(val)) + nn ret.append(ret_val)n return retn
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.0Step2.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君~
相關閱讀推薦:
QPS超200萬的CC攻擊要如何防禦?
使用Docker網路解決方案weave遇到的那些坑
記一次虛擬化環境下Windows IO性能的解析
阿里雲、騰訊雲、UCloud和AWS的雲主機測評
企業要如何防禦惡意 bot 流量?
五大常見的MySQL高可用方案
福利時間
如果你想親自上手,在雲上部署體驗以上技術實踐過程,大U為大家爭取到了100元 UCloud雲服務代金券,夠大家免費使用1個月的1核/2G/20G數據盤雲主機。
立即 註冊UCloud,在活動/邀請碼一欄填入:zhihu-ucloud,即可獲得代金券。 此外,我們還在V2EX上做了一個爆款雲主機的活動,99包月990包年,還等什麼~~[UCloud 爆款雲主機] 2 核/2G/2M 帶寬 低至 99 元/月, V2EX 用戶再送 100 元代金券! - V2EX有問題請添加UCloud運營小妹個人微信號:Surdur 進行諮詢。
「UCloud機構號」將獨家分享雲計算領域的技術洞見、行業資訊以及一切你想知道的相關訊息。歡迎提問&求關注 o(*////▽////*)q~
以上。
推薦閱讀:
※Face ID 才是未來,別想指紋了
※日機場全面部署人臉識別,谷歌捲入隱私大亂斗
※基於Ensemble of Regression Tress演算法的人臉關鍵點檢測
※迪拜機場搞了個虛擬水族館管隧道代替安檢門,能讓安檢就像旅遊?
※基於回歸的統一關鍵點檢測模型