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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SDM For Face Alignment 流程介绍及Matlab代码实现之预处理篇

發(fā)布時(shí)間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SDM For Face Alignment 流程介绍及Matlab代码实现之预处理篇 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

SDM全稱為 Supervised Descent Method,是一種機(jī)器學(xué)習(xí)的方法,可以被用來做Face Alignment.
下面我們將通過matlab代碼來梳理整個(gè)實(shí)現(xiàn)的過程。

預(yù)處理階段

Input: ../data/lfpw/trainset (811張圖片)
Output: mean_shape 811張圖片的特征點(diǎn)的平均值

我們從網(wǎng)上download下訓(xùn)練數(shù)據(jù)集,包括image和ground-truth points, 我們希望可以得到所有圖片的平均特征點(diǎn),但是由于每張圖片的尺寸各異,圖片里的人臉也是各不相同,因此,只是簡(jiǎn)簡(jiǎn)單單將ground-truth points平均一下是沒有意義的,所以必須把他們統(tǒng)一到一個(gè)尺寸下。

我們可以提取人臉,將其放縮到400*400的尺寸下。然后通過取變換后的特征點(diǎn)的平均值來作為平均特征點(diǎn)。那么如何進(jìn)行呢?方法如下:

先正則化第一張圖片

1.取第一張圖片ground-truth points的包圍盒(即包含特征點(diǎn)的最小矩形)。
2.將包圍盒的左上角向坐標(biāo)系左上角平移包圍盒一半的寬和高,作為新的包圍盒的左上角,寬和高分別取原來的2倍。這樣裁剪出的人臉就基本上是人的正臉了,同時(shí)相應(yīng)的變換特征點(diǎn)的位置。
3.放縮上面新得到的圖片到400*400,同時(shí)相應(yīng)的變換特征點(diǎn)的位置。
這樣第一張圖片的400*400的正臉以及相應(yīng)的特征點(diǎn)就取得了。
如下圖:

再正則其他圖片

我們通過普氏分析將其他圖片的特征點(diǎn)與第一張正則化的特征點(diǎn)對(duì)齊,獲得統(tǒng)一尺寸下的特征點(diǎn),這樣就可求解平均值了。
bounding_box.m代碼,用來裁剪正臉:

function [cropmin,cropmax,offset,minshape,marginW,marginH] = ...bounding_box ( shape,img ) %cropmin,cropmax分別是由特征點(diǎn)的包圍盒延拓的正臉的左上角和右下角 % if(offset==[0 0]表示正臉未躍出圖片 % else 人臉需要做平移,平移后的左上角的坐標(biāo)點(diǎn)為(1,1),平移的長度為offset % minshape:特征點(diǎn)包圍盒的左上角 % marginW:特征點(diǎn)包圍盒的寬的一半 % marginH:特征點(diǎn)包圍盒的高的一半 %shape:特征點(diǎn),以水平的為x,以豎直的為y,同matlab的圖像處理工具箱的相反 minshape = min(shape);%min_x,min_y maxshape = max(shape);%max_x,max_y%% calculating bounding box %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% width = maxshape(1) - minshape(1); height = maxshape(2) - minshape(2);marginW = width/2; marginH = height/2;cropmin = round(minshape - [marginW marginH]); cropmax = round(maxshape + [marginW marginH]);SIZE= size(img);%由于是彩色圖,所以SIZE是三維,因此不能寫成[m,n]offset = [0 0];%前面的盒子求出了正臉的大小包圍盒,但是如果一張照片中的頭像偏向左邊和上邊,將導(dǎo)致求出的正臉包圍盒超過原點(diǎn),越出圖像,因此需要將正臉平移,平移的尺寸為offset()+1,平移后的正臉左上角坐標(biāo)為(1,1if(cropmin(1)<=0)offset(1) = -cropmin(1);cropmin(1) = 1; end if(cropmin(2)<=0)offset(2) = -cropmin(2);cropmin(2) = 1; end % %如下為補(bǔ)充項(xiàng),防止裁剪的圖片過大超過原圖片的邊界 if(cropmax(1)>=SIZE(2))cropmax(1) = SIZE(2); endif(cropmax(2)>=SIZE(1))cropmax(2) = SIZE(1); end end

normalize_first_shape.m代碼:處理第一張圖片

function [shape] = normalize_first_shape( Data, options )shape = Data.shape; image = Data.img;%補(bǔ)充項(xiàng) image=imread(image); %% calculating bounding box %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% [cropmin,cropmax,offset,minshape,marginW,marginH] = bounding_box ( shape,image );%%輸出offset不為0的圖片的位置 %{if offset~=[0 0] disp('我們要找的頭像偏左或偏上的圖片已找到,地址為:'); disp(Data.img); pause; end %}%% calculate scale factor %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% W_H = cropmax - cropmin; wh1 = W_H(1); wh2 = W_H(2);CanvasSize = options.canvasSize;%標(biāo)準(zhǔn)的正臉大小scf = CanvasSize(1)/wh1; if(scf*wh2 > CanvasSize(2))scf = CanvasSize(2)/wh2; end%% croping image (for debug only) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% debug =0;if debug img = imread(Data.img);cropImage = img(cropmin(2):cropmax(2), cropmin(1):cropmax(1));scaleImage = imresize(cropImage, scf); end%% scale shape and image %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%shape = shape - repmat((minshape - [marginW marginH] + offset) ..., size(shape, 1), 1); shape = shape*scf;if debug% Displaying image and feature points.figure(1);imshow(image);figure(3);imshow(scaleImage);hold on;plot(shape(:, 1), shape(:, 2), 'g*');pause; endend

normalize_rest_shape.m:依據(jù)正則化的第一張圖片特征點(diǎn)來正則化其他圖片的特征點(diǎn)。

function [shape,img] = normalize_rest_shape ( ref, data, options )cvw = options.canvasSize(1); cvh = options.canvasSize(2);base = ref.shape;shape = data.shape;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Use procrustes analysis to align shape. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% [d, z, tform] = procrustes(base, shape, 'Reflection',false);%% normaling shape %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% debug =0;if debugTrans = -1/tform.b*tform.c*tform.T';Trans = Trans(1, :);transM = [1/tform.b*tform.T Trans'];cvXY = [1 cvw 1 cvw;1 1 cvh cvh];img = im2double(rgb2gray(imread(data.img)));normImg = quad2Box(img, cvXY, transM);figure(2);imshow(normImg);hold on;plot(z(:, 1), z(:, 2), 'r.');pause;endshape = z;end

然后求解平均特征點(diǎn)即可。

總結(jié)

以上是生活随笔為你收集整理的SDM For Face Alignment 流程介绍及Matlab代码实现之预处理篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。