日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

人脸对齐实现“平均脸”制作

發布時間:2023/12/18 pytorch 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 人脸对齐实现“平均脸”制作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

“平均臉”的歷史

雖然現在很流行,但是,其實平均臉的歷史相當悠久。

1878年,英國的弗朗西斯·高爾頓爵士(Sir Francis Galton)發明了一種創造出“平均”面容的技術。

?

弗朗西斯·高爾頓爵士,英國維多利亞時代的博學家、人類學家、優生學家、熱帶探險家、地理學家、發明家、氣象學家、統計學家、心理學家和遺傳學家;也是《物種起源》作者查爾斯·達爾文的表弟。*

這一方法是通過將許多人的照片合成為一張照片完成的。

當時具體的做法是:照片疊加——給多個人,比如20個人,照相,將每個人照片所需的曝光時間縮短為1/20,通過20次曝光得到一張“平均”照片。

?

弗朗西斯·高爾頓最初合成平均臉的目的是將不同“種類”的人(例如:囚犯、精神病患者等等)視覺化,以期得到這類人的“原型”(共同特征)。

但結果卻意外的發現,這樣合成的人臉卻比用于合成大部分(甚至是全部)都要好看!

雖然高爾頓爵士的初衷沒有達到,合成平均臉的方法卻保留了下來。

新技術讓人人可制作“平均臉”

隨著技術的發展,照片不再需要物理底片,合成也不再需要復雜的曝光沖印技術,通過一些簡單的操作就能做到,人人都可以上手。

?

大家想必看到過很多合成的“平均臉”圖片吧。

有按國家、民族合成的:

?

?

也有針對政要明星合成的,例如這張,韓中日三國明星平均臉:

?

?

想不想自己動手制作一張周圍人的平均臉?

一點都不復雜,只要知道了用Image Morphing技術疊加照片的原理,再會寫幾行簡單的代碼,就能順利完成。

Image Morphing技術的原理相當簡單:給定兩張圖片I和J,我們通過疊加(或者叫做混合)I和J來獲得一張中間狀態的圖片M。

I和J的疊加由一個參數[0,1]區間內的參數alpha來控制。當alpha=0時,M就等同于I,而aphla=1時,M就為J。

換言之, M中的每一個像素M(x,y),都可以通過這樣一個公式來得到它的值:

M(x,y) = (1 – alpha)·I(x,y) + alpha·J(x,y)

當alpha=0.5的時候,I和J就五五開,平均貢獻了M。如果I和J是兩張人臉照片的話,M自然也就成了它們的“平均臉”。

看起來好容易哦,那我們趕緊找兩張照片來試試吧!就用這兩張:

?

這兩張照片alpha=0.5后直接疊加的結果是這樣的:

?

這也不是人臉呀!先別急,看看為什么會這樣?

從這張“重影圖”上不難看出來,之所以這樣,是因為最基本的五官都沒有對齊。

如果我們事先把兩個人的眼睛和嘴對齊,效果就不會是這樣的了。

疊加兩張*對齊的*人臉

疊加圖片I和圖片J的時候,首先應該建立兩張照片中像素的對應關系

?

對I中的某一個像素點(xi,yi),我們不是直接在J中取同樣位置的點就可以了,而是要找到它在J中內容上的對應點 (xj,yj)。

?

然后再進一步找到M中這兩個點疊加之后應當處在的位置(xm,ym),最后再用下列式子得出M中對應點的像素值:

?

xm = (1-alpha) · xi + alpha · xj

ym = (1-alpha) · yi + alpha · yj

算式-1

對一個像素點我們這樣做,對整幅圖片,則是將上面的過程運用到它的每一個像素點上:

M(xm,ym) = (1 – alpha)·I(xi,yi) + alpha·J(xj,yj)

算式-2

很好,我們已經知道從原理上該怎么疊加兩張圖了。

其中關鍵的一步就是:找到對應點。

其實對應點疊加的方法可以用來疊加任何圖片,不僅限于人臉。

不同物體的疊加,真正的區別就在于找到像素點之間的對應關系!一旦對應關系找到,直接運用算式-2就好了。

劃分區域對應人臉

既然我們現在要做的是疊加人臉,那么首先當然要找到人臉上的對應點。

人臉是生活中最常見的事物,我們每一個人都非常熟悉。

一個人的臉如果用簡筆畫畫出來,可以簡化為:臉型+五官(眉毛、眼睛、鼻子、嘴)。

那么如果我們要疊加兩個人的臉的話,自然就是要針對他們的臉型和五官形制求平均。

人的五官如果用圖形來描繪,都是不規則圖形。如果要完全不走樣的獲取一個人的眼睛、眉毛、鼻子或者嘴,需要繪制非常復雜的形狀。

實際上,我們沒有必要這樣做,而是可以通過一種非常簡單的近似方法,把一張人臉分割成若干三角形的區域,然后再來疊加兩張臉上對應的三角區域。

分割方法如下:

1.?獲取人臉特征

?

在圖片中獲取人臉和人臉特征(臉型+五官)。

我們先在每張面孔上獲取68個面部基準點(如下圖)。

?

2. Delaunay 三角剖分

?

在獲得了68個面部基準點之后,我們結合人臉所在的矩形的四個頂點和每條邊的中心點,將人臉所在的矩形分割成如下圖所示的三角形的組合。

?

這一方法又稱為Delaunay三角剖分。更多細節請看:https://www.learnopencv.com/delaunay-triangulation-and-voronoi-diagram-using-opencv-c-python/

疊加經過仿射變換的Delaunay剖分三角形

?

Delaunay三角剖分將圖像分解成若干三角形后,再分別對齊各個三角形區域,對其中像素值進行平均。

?

Step-1:找到合成圖片中的面部特征點

使用前述的算式-1,根據圖像I和圖像J中已經獲得的76個點,在疊加的結果圖像M中找到76個點(xm, ym)

Step-2: 計算原圖到目標圖像的仿射變換

現在我們在圖像I,J和M中分別得到了76個點,以及由這76個點剖分而成的三組三角形。

從圖像I中選取一個三角形ti,在M中找到對應區域tm,通過ti三個頂點到tm三個頂點的映射關系來計算ti到tm的仿射變換。

同理計算出tj到tm的仿射變換。

Step-3:扭曲Delaunay剖分三角形

對于圖像I中的一個三角形,使用step-2中計算出的放射變換,將其中每一個像素通過仿射變換對應到M中對應的位置去。

重復這個過程,處理圖像I中的每一個三角形,得到一個扭曲的(warped)圖像I'。用同樣的方法處理圖像J,獲得扭曲的圖像J'。

Step-4:疊加兩張臉

在step-3中我們已經得到了扭曲的圖像I'和圖像J'。這兩個圖像就可以直接使用算式-2進行疊加了。最后得到疊加結果。

?

疊加多張人臉

算式-2用于疊加2張人臉,在alpha=0.5時求取的是兩張臉的平均。

那么我們把算式推廣一下,從圖像I和圖像J推廣為圖像I1, I2, I3, ..., In;令alpha=1/n;則算式-2變形為如下:

M(xm,ym) = 1/n · [I1(xi1, yi1) + I2(xi2, yi2) + ... ... + In(xin, yi_n)]

由此,我們也就得到了n張臉的平均。

用這個方法,我們可以得到6位美國總統的平均臉:

?

他們平均之后的樣子是這樣的:

?

總結

以上是生活随笔為你收集整理的人脸对齐实现“平均脸”制作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。