平均脸
無聊查看學(xué)校研究生信息網(wǎng)源碼時發(fā)現(xiàn),照片信息竟然是絕對引用另一臺數(shù)據(jù)服務(wù)器的地址,并且更嚴(yán)重的是照片是以學(xué)號命名的。我試著訪問了相鄰學(xué)號的同學(xué)照片,竟然很順利的看到了。學(xué)生學(xué)號命名很有規(guī)律,11級別碩士,就是11S打頭,后面跟著6位數(shù)字分別岱廟學(xué)院號,系代號以及具體班級號。哈哈,一個python腳本把我們同一屆的研究生照片全部拉下來,再一試,08-10級的也都能得到,漏洞竟然已經(jīng)存在了4年!!全部照片一共1w多張,師哥師姐偶對不住了,在此請大家原諒。以下是部分下載到的照片:
?
若是一枚屌絲,看看美女也就罷了,但是我可是有志要做一名骨灰級屌絲的哇,這么好的資源豈能輕易放過。腦子各種東東開始閃現(xiàn),Fashbook老大曾經(jīng)做過facemash.com,后來效仿者華科臉pk也一炮成名Hust-facemash.com。想想技術(shù)也不難,無非就是前端一個網(wǎng)頁,后端一個排序算法就可以搞定。把師哥師姐的照片放到網(wǎng)上也不是太人道,算了,還是回歸老本行,圖像處理搞起來~。
?
想了半天,臉融合我還挺感興趣,剛好以前有接觸過人臉識別的相關(guān)內(nèi)容。找了一下相關(guān)的論文以及前人實踐的結(jié)果,南大的劉靖康曾經(jīng)用7000張照片做了相應(yīng)的臉融合,提到了用beyond-reality-face.com的庫做特征點的提取,但是具體融合技術(shù)細(xì)節(jié)沒有透露,后來他跟騰訊聯(lián)合搞了個各個高校的平均臉。于是我決定,我這次做平均臉的程序?qū)⑷块_源,算法細(xì)節(jié)將逐一呈現(xiàn)!那么該如何入手呢?
?
我的思路是這樣,首先還是要提取出人臉的特征點,重要的如眼睛的、鼻子、嘴的位置、臉型的輪廓等。如下圖所示。?
?
人臉特征點的提取幾乎是所有人臉處理的第一步,所以這方面的庫也比較多。我選用了一個簡單的9特征點提取,包括兩眼睛4點,鼻子3個點,以及嘴巴兩個點。特征點提取的源代碼沒有仔細(xì)研究,有志青年可以仔細(xì)看看,其實現(xiàn)用到了opencv的庫,算法方面則是采用了Viola&Jones的經(jīng)典face?detection。前人栽樹,后人乘涼,有了提取到的特征點,可以說臉融合的工作已經(jīng)完成了90%了。神馬?剩下10%你還是不清楚,那請繼續(xù)往下看。
?
特征點得到后,我們需要用一個標(biāo)準(zhǔn)臉的模板,來將每個個體不同的點位加以線性變換(非線性變換將會扭曲臉型,最終得到的將不是平均臉,而是扭曲后的標(biāo)準(zhǔn)化臉),線性變換只是旋轉(zhuǎn)以及比例縮放,對臉不會產(chǎn)生扭曲作用。那么采用什么方法來得到線性變換呢??
Tlinear?=?cp2tform(input_points,base_points,'linear?conformal');
Matlab中使用的命令是cp2tform,該函數(shù)由輸入的兩幅圖像的對應(yīng)點生成變換結(jié)構(gòu),輸入input_points就是由算法得到的9個點,base_points則是標(biāo)定的基準(zhǔn)點。
?
3張圖片融合的結(jié)果
得到線性變換的圖像之后,直接采用語句
MergeImg(ii,jj,kk)?=?double(MergeImg(ii,jj,kk))+?double(imgTrans(ii,jj,kk));
便可以得到結(jié)果。
接下來就直接給結(jié)果啦,激動人心的時刻有木有!50張圖片融合的結(jié)果。看看還是挺標(biāo)致的哈。
?
所有源代碼以及測試程序我將上傳至github。在此嚴(yán)正聲明,所有照片僅僅供學(xué)習(xí)和研究使用!希望大家準(zhǔn)守規(guī)則哈~
?
后續(xù),還可以繼續(xù)挖掘,比如這篇文章中提到了美女的標(biāo)準(zhǔn),所謂三庭五眼,用以上程序稍加修改就能變成一個美女照片挑選程序,感興趣大家可以做一做。
總結(jié)
- 上一篇: 最新oss对象储存防红直连 防红代码h
- 下一篇: 银行数字化转型导师坚鹏:苏州银行数字化运