?

深度學習在人臉妝容推薦系統中的應用研究

2020-01-07 08:07黃萍朱惠娟左志遠
軟件工程 2020年12期
關鍵詞:深度學習

黃萍 朱惠娟 左志遠

摘 ?要:本文設計了一款基于CNN、Alexnet等網絡模型的妝容推薦系統,系統能根據臉部屬性差異來推薦適宜的化妝方法,滿足用戶的個性化化妝需求。從技術實踐的角度上來說,完成了從數據收集、模型訓練到應用開發部署的開發流程。在工程實現上引入當今比較主流云架構方案,采用較為先進的架構,使得應用的性能和各方面的擴展延伸上都得到了增強。

關鍵詞:妝容推薦;深度學習;人臉特征提取

中圖分類號: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)

在這樣的一個創新融合的時期,移動互聯網的高歌猛進,讓女性對于美麗的追求越來越高,也從線下追到線上,化妝人群也更加趨向年輕化,越來越多的年輕女生也開始通過互聯網獲取化妝相關的知識[1]。但是目前絕大多數試妝應用也僅僅是利用妝容遷移,把各類不同的化妝產品或者妝容模板,利用技術遷移到用戶的臉上,無法給客戶提供合適自己的妝容。合適的妝容應根據用戶的面容特點來推薦且應該附上對應的化妝方法。

本文研究的系統主要是利用深度學習相關技術來分析用戶的臉部特點,再配合相關美妝知識個性化的推薦給用戶。相對于目前市面上統一的妝容模板,本文嘗試開發的產品更加具有靈活性和輕便型。同時本文產品主要針對年輕人群,隨著經濟的基礎不斷發展,化妝人群年輕化,對于初學化妝的人群來說,定制化的個性推薦對于對化妝知識了解不多的她們來說尤為重要。

2 ?妝容推薦系統設計(Makeup recommendation system design)

2.1 ? 系統開發流程

本文主要研究和開發女性妝容推薦系統的方法。經過閱讀了大量的化妝方法資料和文獻,結合實際給出了根據人臉五官和臉型特征提供對應的化妝方法的妝容推薦系統開發流程。系統的功能流程如圖1所示。

系統采用了dlib人臉特征點檢測的相關功能,將從CelebA數據集中采集來的圖像數據進行人臉五官特征信息的分割,再將特征點信息和CelebA屬性整理形成CSV文件用作網絡訓練的訓練集和測試集,分別采用不同類型的神經網絡模型(BP網絡、CNN網絡和Alexnet)學習人臉的五官特征,最終根據已有的數據集將神經網絡調參至最佳效果,并保存相關模型放入到網絡環境中去使用。

2.2 ? 系統工程實現

系統工程主要實現神經網絡在生產環境中應用,利用相關工程技術,如Nginx、Docker、Tensorflow Serving、Kubernetes、React等,制作高效可運行的交互軟件。

用戶利用瀏覽器上傳圖片之后會轉碼成base64傳遞到服務端,服務端的入口是Ingress中間件,它會將Http的請求發送到后端的均衡負載器中,負載器會根據目前各個節點的資源剩余狀態將請求發送到具體的計算節點中去,在具體計算節點中會利用進行預處理和模型判斷的工作最終要結果返回Ingress組成一個完整的Http響應包,返回到用戶的瀏覽器客戶端,客戶端會根據模型計算的組合結果再根據預存的美妝推薦規則反饋成相應的內容顯示出來。

在計算節點內部,當接收到一個帶有Base64的載荷字符時會進行不同的預處理操作,如針對臉型判斷會先分析出人臉的關鍵點再把輪廓的部分的關鍵點坐標進行相關整合傳入訓練好的網絡模型中去,最終會把各個模型計算的結果整合成一個對象結果傳遞出去。

2.3 ? 開發環境和平臺介紹

本文所研究的系統主要都在一臺裝在Deepin 15.11的小米筆記本上進行開發。主要利用的工具有如下:

(1)Conda 4.8可以快速切換python版本環境,利用高效的包管理工具,便捷的管理一些深度學習相關的模塊包[2]。

(2)Pycharm是一款業界優秀的python開發ide,有非常多的實用的功能。

(3)Kears是一款神經網絡庫,相比較TensorFlow,Kears提供了很多基礎的算法模型和簡潔的Api,新手非常容易就可以上手。

(4)dlib是一款十分優秀的集成多種人臉識別的機器學習庫,文檔豐富社區活躍,本文使用的人臉定位就是依賴dlib的人臉68位檢測分類器。

3 ?數據采集和預處理工作(Data acquisition and preprocessing)

3.1 ? 數據采集、分離屬性和標記工作

本文實驗所使用的數據來自香港中文大學開放提供的名人人臉屬性數據集CelebA,它是一個大型的面部屬性的數據集,其中超過二十多萬的名人人臉圖像,每個人臉圖像有超過40個的特征屬性。該數據集中的圖像涵蓋了較大的人臉特征范圍,比較齊全。該數據集可用于人臉屬性標識訓練、人臉檢測訓練以及landmark標記等。本文從其中的40個面部屬性主要提取以下幾個屬性:Pale_Skin(較白的膚色)、Chubby(圓胖的)、Pointy_Nose(尖鼻子)等屬性。由于CelebA給出的特征集是較為繁雜的,但是往往只需要單獨幾個屬性拿出來做訓練,因此需要先將屬性和圖片信息一起提取出來,將對應的屬性提取出來。采用了dlib人臉特征點檢測的相關功能,分割出人臉五官的特征信息。且將特征點信息和Celeba屬性整理好CSV文件用作訓練網絡的訓練集和測試集。

3.2 ? 數據預處理和特征提取

(1)臉型特征

首先根據dlib官方開源出來的shape_predictor_68_face_landmarks模型獲取數據集中每張圖片的人臉特征點信息,如圖2所示。針對人臉的臉型,本文利用計算0—16位特征點之間的歐式距離,獲取了兩個特征變量,加上CelebA中對應屬性中的Chubby二進制數據,組成對應的訓練集數據存儲成對應的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顏色空間映射到YCrCb顏色空間上時,在crcb的二維空間上這些皮膚像素點分布近似一個橢圓,因此這里只需要判斷像素點是否在橢圓范圍內,就可知道是否是膚色點像素。本文將在膚色范圍內的像素值整理成一個一維數組,同時本文也從Celeba數據集的屬性中提取Pale_Skin(蒼白的皮膚)和Rosy_Cheeks(紅潤的臉頰)整合成為訓練數據,如圖3所示。

(3)鼻子特征

針對鼻子部分的特征提取,由于沒有較好的明顯特征可以提取,所以這里只需要截取鼻子周圍的圖片即可,降低臉部其他特征對于結果的影響,具體的鼻子特征將交由Alexnet網絡去提取隱含的高級特征。首先會根據dlib臉部分類器獲取到鼻子附近的關鍵點尋如圖(todo),找到最小的X和最大的Y點和最小的Y點。生成(Xmin,Y1)(Xmax,Y2)(Xmin,Ymin)(Xmax,Ymin)四個坐標點,并進行裁剪和統一縮放,如圖4所示。

4 ?神經網絡模型人臉特征分類(Face feature classification in neural network model)

隨著深度學習的不斷發展,神經網絡層數的不斷加深和復雜,服務器性能的不斷提升,人們對于人臉的特征研究早已經走出了刀耕火種的時代,可以通過非常成熟的模型做到如人臉識別、臉部特征點定位和臉部屬性分析等。這些成熟的網絡模型為本文的研究打下了堅硬的技術基礎,本文將運用這些模型打造更加貼近美妝用戶的系統。

針對人臉五官的特征,本文設置了不同的神經網絡模型來學習對應的五官特征,用全連接前饋網絡訓練人臉的臉型特征,用卷積神經網絡訓練膚色特色,用Alexnet網絡訓練鼻子特征,并根據已有的數據集將神經網絡調參至最佳效果,并將訓練好的模型放入到生成環境中去使用。

4.1 ? 基于全連接前饋網絡臉型特征分類訓練

針對臉型數據的訓練,本文采用了全連接前饋網絡(BP神經網絡)模型。它的基本思想是梯度下降法,利用梯度搜索技術,以期使網絡的實際輸出值和期望輸出值的誤差均方差為最小[3]。人臉的胖瘦,從主觀角度的來說是通過臉寬和臉寬的下降速度來判定的,而BP神經網絡數學理論已證明它具有實現任何復雜非線性映射的功。實驗結果也驗證了BP神經網絡可以學習到八個歐氏距離樣本量和胖瘦分類之間的權重抉擇。

因為人臉胖瘦是一個二進制量,是一個典型的二分類的線性回歸問題,所以本文選擇了Sigmoid函數作為激活函數,采用了二值交叉熵作為損失函數。Sigmoid函數也叫Logistic函數,用于隱層神經元輸出,取值范圍為(0,1),可以將一個實數映射到(0,1)的區間,用來做二分類。在特征相差比較復雜或是相差不是特別大時效果比較好。

如圖5所示,本文設計了一個三層的神經網絡,由一層輸入層、一層隱藏層、一層輸出層組成。在訓練時本文選取了10000個訓練樣本,經過調參優化超參數設定batchsize為100,訓練100次,學習率設定為0.001可以快速達到最小損失。通過實驗可以看到隨著訓練的組數越多,損失逐漸降低,預判的正確率的也逐步升高。

4.2 ? 基于卷積神經網絡膚色特征分類訓練

卷積神經網絡也是一種前饋神經網絡,但是卻又和普通的前饋全連接神經網絡有很大的不同[4]。由于膚色和鼻子形狀特征提取相對來說比較復雜,所以本文把膚色和鼻子形狀的高階特征提取交給卷積神網絡來自動提取。針對膚色的訓練,這里僅對膚色是否白嫩進行訓練,本文設計了一個簡單的CNN模型,將上部分預處理后的圖片的像素值作為輸入量,由于CelebaDataset中圖片尺寸都已經固定好,這里不必要再做裁剪,將10000*218*218*3(圖片樣本數量*圖片高度* 圖片寬度*顏色通道數)作為CNN輸入層的維度。

本文設計了如圖6所示的CNN網絡,由多層卷積、池化、全連接層組成,選用Relu作為激活函數,分類交叉熵作為損失函數。

膚色的訓練會受到過多其他因素的影響,如光線和種族本身膚色都會對結果產生影響。

4.3 ? 基于Alexnet網絡鼻子特征分類訓練

Alexnet是一種較為高效的CNN網絡,對推動神經網絡的發展起到了重要的作用,其作者加拿大多倫多大學的AlexKrizhevsky等人憑借Alexnet網絡在2012年的ImageNet比賽中獲得冠軍。Alexnet與普通的CNN的最大的不同地方就在于它的網絡構造上,進一步加深了網絡的深度,增加了網絡模型獲取高級特征的能力[5]。

本文采用的AlexNet有五個卷積層,其中三個卷積層后面連接了最大池化層,最后還有三個全連接層,如圖7所示。本文采用Alexnet作為訓練鼻子形狀的模型,將裁剪后的鼻子作為的像素矩陣作為輸入層進行訓練。

5 推薦系統工程實現(Recommend system engineering implementation)

模型的訓練已經完成,但是在數據科學領域中將模型部署到生成環境且能夠提供高效和交互良好的工程也是一項很有挑戰性的課題。因為是否能夠讓模型更好的面向消費者也是評價模型的重要指標。本文針對推薦系統的工程實現,搭建了一個B/S架構的交互軟件,能夠讓用戶上傳人臉狀態并且反饋給用戶合適的妝容議。

5.1 ? 服務端的部署

服務端的主要實現的是利用模型和神經網絡平臺來進行特征分類,并提供有效接口。本文的模型是利用kears框架來實現訓練,kears能夠以Tensorflow、CNTK或者Theano作為后端運行。這里依舊采用默認后端來支撐網絡運行計算作出預算結果。同時利用Flask作為http服務器,它可以幫助開發響應請求的RESTFUL API。采用RESTFUL式的API接口可以更好地分離服務端和客戶端,提高客戶端的敏捷性,其無狀態的特點也提高服務的可見性,可靠性和可緩存性,同時也可以提高服務端和客戶端的可擴展性[6]。

為了進一步實現應用的快速部署和擴展性,采用了Docker制作HTTP服務的鏡像。Docker主要利用Linux中的cgroups來限制進程的資源使用率,chroot來限制進程可訪問文件的權限,以及Linux核心命名空間(namespace)來分類網絡和權限的劃分,以此來達到一個快速穩定可以迭代的虛擬化環境[7]。為了讓服務端程序具有自動化部署,大規??缮炜s的特性,還需要在Docker鏡像之上,將應用部署到Kubernetes中去。Kubernetes是一個開源的容器編排引擎,它支持自動化部署、大規??缮炜s、應用容器化管理。所以在完成一個應用程序的開發時,需要冗余部署該應用的多個實例,同時需要支持對應用的請求進行負載均衡,在Kubernetes中,因為采用備災的原則,同一應用會在不同的服務器上創建多個容器實例,每個容器實例不僅僅在別的實例宕機時備用,利用Kubernetes自帶的負載均衡器或者自己設計的均衡負載可以讓各個實例分擔外部流量。

(1)RESTFUL服務搭建

在Flask引用中系統只需要提供一個統一接口,可以接受圖像文件,并返回相關預測標簽,將相關的標簽和化妝推薦規則映射放到客戶端來做。本文定義了"/face"這個接口來做統一接口文件,預處理圖片并調用模型進行預測,返回一個標準JSON結構體。如下:

{

"code":0,

"data":{

"nose":1,//是否高挺鼻子

"skin":50,// 膚色檢測均值

"face_shape":40 //臉型胖瘦均值

}

}

(2)封裝Docker鏡像

為了進一步實現應用的快速部署和擴展性,可以選擇采用了Docker制作HTTP服務的鏡像。在制作鏡像中選擇采用Centos的作為基礎鏡像,添加python環境支持,利用python requirement。txt描述好所需要的包,利用CMD指令安裝好依賴包并啟動程序,對外開放80端口。

(3)部署進入Kubernetes內

為了讓服務端程序具有自動化部署,大規??缮炜s的特性。因此需要在Docker鏡像之上,將應用部署到Kubernetes中去。Kubernetes集群中主要使用Kubernetes Service作為負載均衡的控制器,根據訪問的流量來控制運行的Pod數量和分散請求流量,而Pod自動化部署和自愈性又進一步增強了系統的問題性[8]。最后通過Ingress作為Kubernetes集群的入口對外提供訪問服務。

5.2 ? 客戶端的實現

(1)技術選型介紹

客戶端主要實現圖片上傳和信息反饋的功能,這里主要采用React和Antd 組件庫來完成快速開發。React是FaceBook推出的一款基于VirtualDom的前端框架。程序員只需要去操作VirtualDom的結構,框架會根據性能和顯示優先級自動使用DomAPi更新頁面圖示。且React還是一款基于組件化的前端框架,因此可以不斷復用相同的組件,Antd就是提供了一些通用的前端組件,極大地減少了開發者的開發工作量。Antd是服務于企業級產品的設計體系,基于確定和自然的設計價值觀上的模塊化解決方案,讓設計者和開發者專注于更好的用戶體驗。

(2)客戶端操作方法

客戶端的使用非常簡單,由于是采用B/S架構,用戶只需使用瀏覽器訪問對應的頁面即可。點擊上傳按鈕選擇本機已經拍攝好的素顏照片確定即可,圖片會傳遞到集群服務器中進行分析并返回對應的結果,在前端顯示。顯示結果會以彈窗的形式進行展示,如圖8所示。

猜你喜歡
深度學習
從合坐走向合學:淺議新學習模式的構建
基于自動智能分類器的圖書館亂架圖書檢測
搭建深度學習的三級階梯
有體驗的學習才是有意義的學習
電子商務中基于深度學習的虛假交易識別研究
利用網絡技術促進學生深度學習的幾大策略
MOOC與翻轉課堂融合的深度學習場域建構
大數據技術在反恐怖主義中的應用展望
深度學習算法應用于巖石圖像處理的可行性研究
構建“單元整合、主題牽引”詩歌鑒賞“深度學習”課堂的策略
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合