FaceChain高保真人像風(fēng)格生成挑戰(zhàn)賽:一等獎方案
共 3658字,需瀏覽 8分鐘
·
2024-04-29 23:44
Datawhale分享
作者:馬琦鈞,Datawhale成員
Datawhale分享
作者:馬琦鈞,Datawhale成員
簡 介
大家好,我是馬琦鈞,Datawhale成員,畢業(yè)于浙江農(nóng)林大學(xué),統(tǒng)計學(xué)/會計學(xué)雙學(xué)位,獲得過由阿里云、谷歌、百度、CVPR、思否、極棒等舉辦的相關(guān)賽事獎項。
本次主要分享 FaceChain 高保真人像風(fēng)格生成挑戰(zhàn)賽——賽題三的一等獎方案。
賽事地址:https://competition.atomgit.com/competitionInfo?id=7fc6be7904f842050caa5597fa00ba32
作者本人決賽路演圖
賽題分析
賽題三要求提升生成的人像真實感,原始的facechain其實已經(jīng)能很好地生成高質(zhì)量人像,但在微觀細節(jié)上仍有提升空間,框架自帶的人臉美化模型可能會導(dǎo)致生成的人像缺少痣、皺紋等相關(guān)特征,皮膚相對有磨皮、反光感等。
賽題要求還原人臉痣、皺紋等特征,考慮直接復(fù)制原始人臉的痣、皺紋、斑等特征到新生成的人臉上進行還原(簡單來說就像P圖,直接把原始的部分P過去)。
整體框架圖
數(shù)據(jù)集準備
數(shù)據(jù)集來源:https://www.seeprettyface.com/mydataset_page3.html#yellow網(wǎng)站提供的真實數(shù)據(jù)集——黃種臉訓(xùn)練集
我們使用了 Datawhale 的免費開源軟件 whale-anno 做圖片點標注,標簽選擇了痣、斑、痘、皺紋,如下圖(為保護人臉隱私,截圖時原圖做了模糊處理):
人臉痣標注截圖
whale-anno 支持移動平臺標注,本次標注有一半是在 ipad 上完成標注的。
模型訓(xùn)練
標注了100張以后,通過 keypoint-rcnn 已可很好地檢測到非數(shù)據(jù)集圖片中人臉痣的位置。在標注完大約300張圖片后再訓(xùn)練,平常不太見到的比較大的痣也可以很好地檢測出來,而且位置(坐標)更精準了。
模型加載代碼如下:
from torchvision.models.detection import keypointrcnn_resnet50_fpn
model = keypointrcnn_resnet50_fpn(pretrained=False, pretrained_backbone=True,
num_keypoints=4, num_classes=2)
這個模型最早用于檢測人體關(guān)鍵點,但我們在訓(xùn)練人臉時,不一定會每次都有痣出現(xiàn)。我們在處理訓(xùn)練數(shù)據(jù)的時候,可以把沒有目標特征的關(guān)鍵點設(shè)置到(0, 0)位置。在推理的時候,根據(jù)關(guān)鍵點的置信度來確定對應(yīng)人臉是否有痣。
后處理
1.人臉痣模型優(yōu)化
將人臉輸入到上述模型獲取到坐標后,計算出新人臉相對位置圖像的亮度系數(shù),按新圖調(diào)整后,先用高斯模糊來降噪,然后將原始的痣用cv2.findContours查找輪廓去除背景,再貼圖到新圖像上。
這里其實會涉及到挺多細節(jié),最早嘗試了直接將圖貼過去的方式,但因為光照等影響會有差異,所以有了如下根據(jù)亮度調(diào)整的方案,亮度轉(zhuǎn)換代碼如下:
# 轉(zhuǎn)換到LAB顏色空間
source_lab = cv2.cvtColor(source, cv2.COLOR_BGR2LAB)
輪廓查找代碼如下:
# 查找輪廓
contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
新的坐標根據(jù)3個最接近的人臉關(guān)鍵點計算相對位置得到,如下圖中藍色圓點表示。
和痣最接近的3個人臉關(guān)鍵點
最終生成的效果如下(為保護隱私,這里沒有使用真實人臉LoRA):
痣融合人臉效果示例
2. LoRA模型微調(diào)優(yōu)化
人臉模型基于真實人臉先微調(diào),再基于目標人臉繼續(xù)微調(diào),訓(xùn)練出的人臉更加真實,減少了磨皮感和反光。不過由于在背景為白色的人臉圖上訓(xùn)練過多,這樣操作以后人臉附近可能會有斷層出現(xiàn)。
模型微調(diào)需要18G顯存,我們這里使用了a10顯卡,訓(xùn)練每張圖大約需要3分鐘,生成每張圖大約需要12秒。
這里再簡單科普一下LoRA(Low-Rank Adaptation),如果模型層本來需要MxN個參數(shù),改為增加MxR, RxN的疊加訓(xùn)練,如果M是100,N是100,R是2的話,相當于原來需要訓(xùn)練100 * 100=10000個參數(shù),現(xiàn)在只需要訓(xùn)練100 * 2+2 * 100=400個參數(shù),是一個很巧妙地用小參數(shù)量表征大參數(shù)量的方案。
3. 人臉篩選優(yōu)化
從原始的生成10張,篩選6張并和最高單張圖片比較相似度,改為生成20張,與所有人臉比較相似度并再按最高得分排序。測試下來這樣得到的人臉與目標人物更相似。
篩選代碼節(jié)選如下:
max_sim = 0
for selected_face_emb in selected_face_embs:
sim = np.dot(emb, selected_face_emb)
if sim.item() > max_sim:
max_sim = sim.item()
sim_list.append(max_sim)
評委點評
-
(人臉痣模型)是一個簡單但有效的方案 -
能看到不同光照下痣的區(qū)別 -
是否有測試:添加痣后人臉相似度有無變化(賽后有測試,模型評判為變化不大,但肉眼看起來還是變化挺大的) -
皺紋變化看起來不太直觀 -
特征位置的細節(jié)還有待優(yōu)化(目前采用最近三個人臉關(guān)鍵點來定位,如果結(jié)合人臉旋轉(zhuǎn)角度,應(yīng)該能更精準)
寫在最后
這是作者本人參加這么多比賽以來第一次獲得一等獎,總體來說收獲很多,比如從facechain(https://github.com/modelscope/facechain) 的開源代碼中,能學(xué)習(xí)到很多人臉相關(guān)的各類處理流程。
同時在這次比賽中,有浙大學(xué)生們制作了精美的電競風(fēng)獲得了賽道二的一等獎,春日團隊做的表情包控制人臉生成,基于圖像壞損來修復(fù)人臉圖像,還有用agent控制生成場景提示詞,圖像推理風(fēng)格等等優(yōu)秀方案。
在之前Datawhale的組隊學(xué)習(xí)中,也總是能看到大家對于AI學(xué)習(xí)的某種追求,希望大家都能在這樣的氛圍里學(xué)習(xí)到東西,互幫互助,一起構(gòu)建出AI的未來~
作者本人是whale-anno項目的前端,目前項目已有文本分類、實體抽取、關(guān)系抽取、圖片點標注、圖片分類等功能,之后還會增加語義分割、自動標注等功能,有數(shù)據(jù)標注需求的同學(xué)歡迎關(guān)注本項目:
https://github.com/datawhalechina/whale-anno
比賽代碼開源地址:https://atomgit.com/maxmon/FaceChain_competition/tree/master/zhi_readd
