FIIQA-PyTorch
FIIQA
高高興興,跑起來,發現完全不行啊。下載的數據只有3類,結合github上200類,這個有點差距。
所以想著自己制作,參考論文如下:
Face Illumination Transfer through Edge-preserving Filters
論文中主要將人臉分為3部分:顏色層、大尺度層以及細節層。將人臉圖像轉化到Lab顏色空間,其中L通道表示亮度值;a、b表示顏色層。對L通道通過wsl(加權最小二濾波)濾波可以得到大尺度層,然後通過如下:
d e t a i l s = L l a r g e s c a l e details=\frac{L}{largescale} details=largescaleL
其中:largscale表示大尺度層,details表示細節層。
通過上述方法,依次對模板和目標圖像提取大尺度層,然後,這兩個圖像進行引導濾波/導向濾波(Guided Filter)。注意,這裡將目標作為引導圖,模板作為初始圖像,使得模板與目標相似。
通過,導向濾波之後,需要還原亮度通道L,參考上述公式進行計算,然後將Lab空間轉化為BGR空間,最終得到人臉光照不均勻的遷移圖片。
import cv2
from cv2.ximgproc import *
import numpy as np
def lightness_layer_decomposition(img,conf,sigma):
''' 將圖片分離為顏色層和亮度層 :param img: :return: '''
# wsl濾波
large_scale_img=fastGlobalSmootherFilter(img, img, conf, sigma)
detail_img=img/large_scale_img
return large_scale_img,detail_img
def face_illumination_transfer(target=None, reference=None):
''' 將標簽光照遷移到目標人臉上 :param target: :param reference: :return: '''
h,w=reference.shape[:2]
target=cv2.resize(target,(w,h))
# lab顏色轉換
# 提取顏色(a,b)和亮度層l
lab_img = cv2.cvtColor(target, cv2.COLOR_BGR2Lab)
l, a, b = cv2.split(lab_img)
lab_rimg = cv2.cvtColor(reference, cv2.COLOR_BGR2Lab)
lr, ar,br = cv2.split(lab_rimg)
# 將亮度層進行分層:大尺度層和細節層
large_scale_img, detail_img= lightness_layer_decomposition(l,600,20)
large_scale_rimg, detail_rimg = lightness_layer_decomposition(lr,600,20)
# 通過引導波濾波將模板亮度遷移到目標圖上
large_scale_rimg = large_scale_rimg.astype('float32')
large_scale_img = large_scale_img.astype('float32')
out=guidedFilter(large_scale_img,large_scale_rimg,18,1e-3)
out=out*detail_img
out=out.astype(np.uint8)
res=cv2.merge((out,a,b))
res=cv2.cvtColor(res,cv2.COLOR_Lab2BGR)
return res
if __name__=="__main__":
img_file=r"D:\data\face\good3\1630905386503.jpeg"
reference=r"D:\data\face_illumination\illumination patterns\office-lamp-night-6.JPG"
# 讀取人臉圖片
img = cv2.imread(img_file)
rimg=cv2.imread(reference)
res=face_illumination_transfer(img,rimg)
cv2.imshow("res",res)
cv2.waitKey(0)
最終結果如下:
參考連接:
opencv使用 — fastGlobalSmootherFilter
引導圖濾波(Guided Image Filtering)原理以及OpenCV實現