黃萍 朱惠娟 左志遠
摘 ?要:本文設(shè)計了一款基于CNN、Alexnet等網(wǎng)絡(luò)模型的妝容推薦系統(tǒng),系統(tǒng)能根據(jù)臉部屬性差異來推薦適宜的化妝方法,滿足用戶的個性化化妝需求。從技術(shù)實踐的角度上來說,完成了從數(shù)據(jù)收集、模型訓(xùn)練到應(yīng)用開發(fā)部署的開發(fā)流程。在工程實現(xiàn)上引入當今比較主流云架構(gòu)方案,采用較為先進的架構(gòu),使得應(yīng)用的性能和各方面的擴展延伸上都得到了增強。
關(guān)鍵詞:妝容推薦;深度學(xué)習(xí);人臉特征提取
中圖分類號:TP39 ? ? 文獻標識碼:A
Abstract: This paper proposes a makeup recommendation system based on network models such as CNN (Cable News Network), Alexnet, etc. The system recommends suitable makeup methods based on differences in facial attributes to meet users' personalized makeup needs. From the perspective of technical practice, development process including data collection, model training to application development and deployment is completed. The introduction of cloud architecture solutions makes the proposed system more powerful in application performance and extension of all aspects.
Keywords: makeup recommendation; deep learning; facial feature extraction
1 ? 引言(Introduction)
在這樣的一個創(chuàng)新融合的時期,移動互聯(lián)網(wǎng)的高歌猛進,讓女性對于美麗的追求越來越高,也從線下追到線上,化妝人群也更加趨向年輕化,越來越多的年輕女生也開始通過互聯(lián)網(wǎng)獲取化妝相關(guān)的知識[1]。但是目前絕大多數(shù)試妝應(yīng)用也僅僅是利用妝容遷移,把各類不同的化妝產(chǎn)品或者妝容模板,利用技術(shù)遷移到用戶的臉上,無法給客戶提供合適自己的妝容。合適的妝容應(yīng)根據(jù)用戶的面容特點來推薦且應(yīng)該附上對應(yīng)的化妝方法。
本文研究的系統(tǒng)主要是利用深度學(xué)習(xí)相關(guān)技術(shù)來分析用戶的臉部特點,再配合相關(guān)美妝知識個性化的推薦給用戶。相對于目前市面上統(tǒng)一的妝容模板,本文嘗試開發(fā)的產(chǎn)品更加具有靈活性和輕便型。同時本文產(chǎn)品主要針對年輕人群,隨著經(jīng)濟的基礎(chǔ)不斷發(fā)展,化妝人群年輕化,對于初學(xué)化妝的人群來說,定制化的個性推薦對于對化妝知識了解不多的她們來說尤為重要。
2 ?妝容推薦系統(tǒng)設(shè)計(Makeup recommendation system design)
2.1 ? 系統(tǒng)開發(fā)流程
本文主要研究和開發(fā)女性妝容推薦系統(tǒng)的方法。經(jīng)過閱讀了大量的化妝方法資料和文獻,結(jié)合實際給出了根據(jù)人臉五官和臉型特征提供對應(yīng)的化妝方法的妝容推薦系統(tǒng)開發(fā)流程。系統(tǒng)的功能流程如圖1所示。
系統(tǒng)采用了dlib人臉特征點檢測的相關(guān)功能,將從CelebA數(shù)據(jù)集中采集來的圖像數(shù)據(jù)進行人臉五官特征信息的分割,再將特征點信息和CelebA屬性整理形成CSV文件用作網(wǎng)絡(luò)訓(xùn)練的訓(xùn)練集和測試集,分別采用不同類型的神經(jīng)網(wǎng)絡(luò)模型(BP網(wǎng)絡(luò)、CNN網(wǎng)絡(luò)和Alexnet)學(xué)習(xí)人臉的五官特征,最終根據(jù)已有的數(shù)據(jù)集將神經(jīng)網(wǎng)絡(luò)調(diào)參至最佳效果,并保存相關(guān)模型放入到網(wǎng)絡(luò)環(huán)境中去使用。
2.2 ? 系統(tǒng)工程實現(xiàn)
系統(tǒng)工程主要實現(xiàn)神經(jīng)網(wǎng)絡(luò)在生產(chǎn)環(huán)境中應(yīng)用,利用相關(guān)工程技術(shù),如Nginx、Docker、Tensorflow Serving、Kubernetes、React等,制作高效可運行的交互軟件。
用戶利用瀏覽器上傳圖片之后會轉(zhuǎn)碼成base64傳遞到服務(wù)端,服務(wù)端的入口是Ingress中間件,它會將Http的請求發(fā)送到后端的均衡負載器中,負載器會根據(jù)目前各個節(jié)點的資源剩余狀態(tài)將請求發(fā)送到具體的計算節(jié)點中去,在具體計算節(jié)點中會利用進行預(yù)處理和模型判斷的工作最終要結(jié)果返回Ingress組成一個完整的Http響應(yīng)包,返回到用戶的瀏覽器客戶端,客戶端會根據(jù)模型計算的組合結(jié)果再根據(jù)預(yù)存的美妝推薦規(guī)則反饋成相應(yīng)的內(nèi)容顯示出來。
在計算節(jié)點內(nèi)部,當接收到一個帶有Base64的載荷字符時會進行不同的預(yù)處理操作,如針對臉型判斷會先分析出人臉的關(guān)鍵點再把輪廓的部分的關(guān)鍵點坐標進行相關(guān)整合傳入訓(xùn)練好的網(wǎng)絡(luò)模型中去,最終會把各個模型計算的結(jié)果整合成一個對象結(jié)果傳遞出去。
2.3 ? 開發(fā)環(huán)境和平臺介紹
本文所研究的系統(tǒng)主要都在一臺裝在Deepin 15.11的小米筆記本上進行開發(fā)。主要利用的工具有如下:
(1)Conda 4.8可以快速切換python版本環(huán)境,利用高效的包管理工具,便捷的管理一些深度學(xué)習(xí)相關(guān)的模塊包[2]。
(2)Pycharm是一款業(yè)界優(yōu)秀的python開發(fā)ide,有非常多的實用的功能。
(3)Kears是一款神經(jīng)網(wǎng)絡(luò)庫,相比較TensorFlow,Kears提供了很多基礎(chǔ)的算法模型和簡潔的Api,新手非常容易就可以上手。
(4)dlib是一款十分優(yōu)秀的集成多種人臉識別的機器學(xué)習(xí)庫,文檔豐富社區(qū)活躍,本文使用的人臉定位就是依賴dlib的人臉68位檢測分類器。
3 ?數(shù)據(jù)采集和預(yù)處理工作(Data acquisition and preprocessing)
3.1 ? 數(shù)據(jù)采集、分離屬性和標記工作
本文實驗所使用的數(shù)據(jù)來自香港中文大學(xué)開放提供的名人人臉屬性數(shù)據(jù)集CelebA,它是一個大型的面部屬性的數(shù)據(jù)集,其中超過二十多萬的名人人臉圖像,每個人臉圖像有超過40個的特征屬性。該數(shù)據(jù)集中的圖像涵蓋了較大的人臉特征范圍,比較齊全。該數(shù)據(jù)集可用于人臉屬性標識訓(xùn)練、人臉檢測訓(xùn)練以及l(fā)andmark標記等。本文從其中的40個面部屬性主要提取以下幾個屬性:Pale_Skin(較白的膚色)、Chubby(圓胖的)、Pointy_Nose(尖鼻子)等屬性。由于CelebA給出的特征集是較為繁雜的,但是往往只需要單獨幾個屬性拿出來做訓(xùn)練,因此需要先將屬性和圖片信息一起提取出來,將對應(yīng)的屬性提取出來。采用了dlib人臉特征點檢測的相關(guān)功能,分割出人臉五官的特征信息。且將特征點信息和Celeba屬性整理好CSV文件用作訓(xùn)練網(wǎng)絡(luò)的訓(xùn)練集和測試集。
3.2 ? 數(shù)據(jù)預(yù)處理和特征提取
(1)臉型特征
首先根據(jù)dlib官方開源出來的shape_predictor_68_face_landmarks模型獲取數(shù)據(jù)集中每張圖片的人臉特征點信息,如圖2所示。針對人臉的臉型,本文利用計算0—16位特征點之間的歐式距離,獲取了兩個特征變量,加上CelebA中對應(yīng)屬性中的Chubby二進制數(shù)據(jù),組成對應(yīng)的訓(xùn)練集數(shù)據(jù)存儲成對應(yīng)的csv文件。首位0和1就是人臉胖瘦趨向標志,后面八位則是人臉16個對稱點之間的8個歐式距離,如下所示:
0,94,92,89,85,75,61,42,22
0,88,85,81,77,70,58,41,21
1,89,89,88,85,78,65,46,24
0,84,83,81,78,70,56,40,21
(2)膚色特征
針對膚色檢測,本文首先利用常見基于YCrCb顏色空間Cr、Cb范圍篩選法先濾出人臉照片中的皮膚部分,將圖片的RGB顏色空間映射到Y(jié)CrCb顏色空間上時,在crcb的二維空間上這些皮膚像素點分布近似一個橢圓,因此這里只需要判斷像素點是否在橢圓范圍內(nèi),就可知道是否是膚色點像素。本文將在膚色范圍內(nèi)的像素值整理成一個一維數(shù)組,同時本文也從Celeba數(shù)據(jù)集的屬性中提取Pale_Skin(蒼白的皮膚)和Rosy_Cheeks(紅潤的臉頰)整合成為訓(xùn)練數(shù)據(jù),如圖3所示。
(3)鼻子特征
針對鼻子部分的特征提取,由于沒有較好的明顯特征可以提取,所以這里只需要截取鼻子周圍的圖片即可,降低臉部其他特征對于結(jié)果的影響,具體的鼻子特征將交由Alexnet網(wǎng)絡(luò)去提取隱含的高級特征。首先會根據(jù)dlib臉部分類器獲取到鼻子附近的關(guān)鍵點尋如圖(todo),找到最小的X和最大的Y點和最小的Y點。生成(Xmin,Y1)(Xmax,Y2)(Xmin,Ymin)(Xmax,Ymin)四個坐標點,并進行裁剪和統(tǒng)一縮放,如圖4所示。
4 ?神經(jīng)網(wǎng)絡(luò)模型人臉特征分類(Face feature classification in neural network model)
隨著深度學(xué)習(xí)的不斷發(fā)展,神經(jīng)網(wǎng)絡(luò)層數(shù)的不斷加深和復(fù)雜,服務(wù)器性能的不斷提升,人們對于人臉的特征研究早已經(jīng)走出了刀耕火種的時代,可以通過非常成熟的模型做到如人臉識別、臉部特征點定位和臉部屬性分析等。這些成熟的網(wǎng)絡(luò)模型為本文的研究打下了堅硬的技術(shù)基礎(chǔ),本文將運用這些模型打造更加貼近美妝用戶的系統(tǒng)。
針對人臉五官的特征,本文設(shè)置了不同的神經(jīng)網(wǎng)絡(luò)模型來學(xué)習(xí)對應(yīng)的五官特征,用全連接前饋網(wǎng)絡(luò)訓(xùn)練人臉的臉型特征,用卷積神經(jīng)網(wǎng)絡(luò)訓(xùn)練膚色特色,用Alexnet網(wǎng)絡(luò)訓(xùn)練鼻子特征,并根據(jù)已有的數(shù)據(jù)集將神經(jīng)網(wǎng)絡(luò)調(diào)參至最佳效果,并將訓(xùn)練好的模型放入到生成環(huán)境中去使用。
4.1 ? 基于全連接前饋網(wǎng)絡(luò)臉型特征分類訓(xùn)練
針對臉型數(shù)據(jù)的訓(xùn)練,本文采用了全連接前饋網(wǎng)絡(luò)(BP神經(jīng)網(wǎng)絡(luò))模型。它的基本思想是梯度下降法,利用梯度搜索技術(shù),以期使網(wǎng)絡(luò)的實際輸出值和期望輸出值的誤差均方差為最小[3]。人臉的胖瘦,從主觀角度的來說是通過臉寬和臉寬的下降速度來判定的,而BP神經(jīng)網(wǎng)絡(luò)數(shù)學(xué)理論已證明它具有實現(xiàn)任何復(fù)雜非線性映射的功。實驗結(jié)果也驗證了BP神經(jīng)網(wǎng)絡(luò)可以學(xué)習(xí)到八個歐氏距離樣本量和胖瘦分類之間的權(quán)重抉擇。
因為人臉胖瘦是一個二進制量,是一個典型的二分類的線性回歸問題,所以本文選擇了Sigmoid函數(shù)作為激活函數(shù),采用了二值交叉熵作為損失函數(shù)。Sigmoid函數(shù)也叫Logistic函數(shù),用于隱層神經(jīng)元輸出,取值范圍為(0,1),可以將一個實數(shù)映射到(0,1)的區(qū)間,用來做二分類。在特征相差比較復(fù)雜或是相差不是特別大時效果比較好。
如圖5所示,本文設(shè)計了一個三層的神經(jīng)網(wǎng)絡(luò),由一層輸入層、一層隱藏層、一層輸出層組成。在訓(xùn)練時本文選取了10000個訓(xùn)練樣本,經(jīng)過調(diào)參優(yōu)化超參數(shù)設(shè)定batchsize為100,訓(xùn)練100次,學(xué)習(xí)率設(shè)定為0.001可以快速達到最小損失。通過實驗可以看到隨著訓(xùn)練的組數(shù)越多,損失逐漸降低,預(yù)判的正確率的也逐步升高。
4.2 ? 基于卷積神經(jīng)網(wǎng)絡(luò)膚色特征分類訓(xùn)練
卷積神經(jīng)網(wǎng)絡(luò)也是一種前饋神經(jīng)網(wǎng)絡(luò),但是卻又和普通的前饋全連接神經(jīng)網(wǎng)絡(luò)有很大的不同[4]。由于膚色和鼻子形狀特征提取相對來說比較復(fù)雜,所以本文把膚色和鼻子形狀的高階特征提取交給卷積神網(wǎng)絡(luò)來自動提取。針對膚色的訓(xùn)練,這里僅對膚色是否白嫩進行訓(xùn)練,本文設(shè)計了一個簡單的CNN模型,將上部分預(yù)處理后的圖片的像素值作為輸入量,由于CelebaDataset中圖片尺寸都已經(jīng)固定好,這里不必要再做裁剪,將10000*218*218*3(圖片樣本數(shù)量*圖片高度* 圖片寬度*顏色通道數(shù))作為CNN輸入層的維度。
本文設(shè)計了如圖6所示的CNN網(wǎng)絡(luò),由多層卷積、池化、全連接層組成,選用Relu作為激活函數(shù),分類交叉熵作為損失函數(shù)。
膚色的訓(xùn)練會受到過多其他因素的影響,如光線和種族本身膚色都會對結(jié)果產(chǎn)生影響。
4.3 ? 基于Alexnet網(wǎng)絡(luò)鼻子特征分類訓(xùn)練
Alexnet是一種較為高效的CNN網(wǎng)絡(luò),對推動神經(jīng)網(wǎng)絡(luò)的發(fā)展起到了重要的作用,其作者加拿大多倫多大學(xué)的AlexKrizhevsky等人憑借Alexnet網(wǎng)絡(luò)在2012年的ImageNet比賽中獲得冠軍。Alexnet與普通的CNN的最大的不同地方就在于它的網(wǎng)絡(luò)構(gòu)造上,進一步加深了網(wǎng)絡(luò)的深度,增加了網(wǎng)絡(luò)模型獲取高級特征的能力[5]。
本文采用的AlexNet有五個卷積層,其中三個卷積層后面連接了最大池化層,最后還有三個全連接層,如圖7所示。本文采用Alexnet作為訓(xùn)練鼻子形狀的模型,將裁剪后的鼻子作為的像素矩陣作為輸入層進行訓(xùn)練。
5 推薦系統(tǒng)工程實現(xiàn)(Recommend system engineering implementation)
模型的訓(xùn)練已經(jīng)完成,但是在數(shù)據(jù)科學(xué)領(lǐng)域中將模型部署到生成環(huán)境且能夠提供高效和交互良好的工程也是一項很有挑戰(zhàn)性的課題。因為是否能夠讓模型更好的面向消費者也是評價模型的重要指標。本文針對推薦系統(tǒng)的工程實現(xiàn),搭建了一個B/S架構(gòu)的交互軟件,能夠讓用戶上傳人臉狀態(tài)并且反饋給用戶合適的妝容議。
5.1 ? 服務(wù)端的部署
服務(wù)端的主要實現(xiàn)的是利用模型和神經(jīng)網(wǎng)絡(luò)平臺來進行特征分類,并提供有效接口。本文的模型是利用kears框架來實現(xiàn)訓(xùn)練,kears能夠以Tensorflow、CNTK或者Theano作為后端運行。這里依舊采用默認后端來支撐網(wǎng)絡(luò)運行計算作出預(yù)算結(jié)果。同時利用Flask作為http服務(wù)器,它可以幫助開發(fā)響應(yīng)請求的RESTFUL API。采用RESTFUL式的API接口可以更好地分離服務(wù)端和客戶端,提高客戶端的敏捷性,其無狀態(tài)的特點也提高服務(wù)的可見性,可靠性和可緩存性,同時也可以提高服務(wù)端和客戶端的可擴展性[6]。
為了進一步實現(xiàn)應(yīng)用的快速部署和擴展性,采用了Docker制作HTTP服務(wù)的鏡像。Docker主要利用Linux中的cgroups來限制進程的資源使用率,chroot來限制進程可訪問文件的權(quán)限,以及Linux核心命名空間(namespace)來分類網(wǎng)絡(luò)和權(quán)限的劃分,以此來達到一個快速穩(wěn)定可以迭代的虛擬化環(huán)境[7]。為了讓服務(wù)端程序具有自動化部署,大規(guī)??缮炜s的特性,還需要在Docker鏡像之上,將應(yīng)用部署到Kubernetes中去。Kubernetes是一個開源的容器編排引擎,它支持自動化部署、大規(guī)??缮炜s、應(yīng)用容器化管理。所以在完成一個應(yīng)用程序的開發(fā)時,需要冗余部署該應(yīng)用的多個實例,同時需要支持對應(yīng)用的請求進行負載均衡,在Kubernetes中,因為采用備災(zāi)的原則,同一應(yīng)用會在不同的服務(wù)器上創(chuàng)建多個容器實例,每個容器實例不僅僅在別的實例宕機時備用,利用Kubernetes自帶的負載均衡器或者自己設(shè)計的均衡負載可以讓各個實例分擔外部流量。
(1)RESTFUL服務(wù)搭建
在Flask引用中系統(tǒng)只需要提供一個統(tǒng)一接口,可以接受圖像文件,并返回相關(guān)預(yù)測標簽,將相關(guān)的標簽和化妝推薦規(guī)則映射放到客戶端來做。本文定義了"/face"這個接口來做統(tǒng)一接口文件,預(yù)處理圖片并調(diào)用模型進行預(yù)測,返回一個標準JSON結(jié)構(gòu)體。如下:
{
"code":0,
"data":{
"nose":1,//是否高挺鼻子
"skin":50,// 膚色檢測均值
"face_shape":40 //臉型胖瘦均值
}
}
(2)封裝Docker鏡像
為了進一步實現(xiàn)應(yīng)用的快速部署和擴展性,可以選擇采用了Docker制作HTTP服務(wù)的鏡像。在制作鏡像中選擇采用Centos的作為基礎(chǔ)鏡像,添加python環(huán)境支持,利用python requirement。txt描述好所需要的包,利用CMD指令安裝好依賴包并啟動程序,對外開放80端口。
(3)部署進入Kubernetes內(nèi)
為了讓服務(wù)端程序具有自動化部署,大規(guī)模可伸縮的特性。因此需要在Docker鏡像之上,將應(yīng)用部署到Kubernetes中去。Kubernetes集群中主要使用Kubernetes Service作為負載均衡的控制器,根據(jù)訪問的流量來控制運行的Pod數(shù)量和分散請求流量,而Pod自動化部署和自愈性又進一步增強了系統(tǒng)的問題性[8]。最后通過Ingress作為Kubernetes集群的入口對外提供訪問服務(wù)。
5.2 ? 客戶端的實現(xiàn)
(1)技術(shù)選型介紹
客戶端主要實現(xiàn)圖片上傳和信息反饋的功能,這里主要采用React和Antd 組件庫來完成快速開發(fā)。React是FaceBook推出的一款基于VirtualDom的前端框架。程序員只需要去操作VirtualDom的結(jié)構(gòu),框架會根據(jù)性能和顯示優(yōu)先級自動使用DomAPi更新頁面圖示。且React還是一款基于組件化的前端框架,因此可以不斷復(fù)用相同的組件,Antd就是提供了一些通用的前端組件,極大地減少了開發(fā)者的開發(fā)工作量。Antd是服務(wù)于企業(yè)級產(chǎn)品的設(shè)計體系,基于確定和自然的設(shè)計價值觀上的模塊化解決方案,讓設(shè)計者和開發(fā)者專注于更好的用戶體驗。
(2)客戶端操作方法
客戶端的使用非常簡單,由于是采用B/S架構(gòu),用戶只需使用瀏覽器訪問對應(yīng)的頁面即可。點擊上傳按鈕選擇本機已經(jīng)拍攝好的素顏照片確定即可,圖片會傳遞到集群服務(wù)器中進行分析并返回對應(yīng)的結(jié)果,在前端顯示。顯示結(jié)果會以彈窗的形式進行展示,如圖8所示。