SDM For Face Alignment 流程介紹及Matlab代碼實現之預處理篇

SDM全稱為 Supervised Descent Method,是一種機器學習的方法,可以被用來做Face Alignment.
下面我們將通過matlab代碼來梳理整個實現的過程。

預處理階段

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

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

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

先正則化第一張圖片

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

再正則其他圖片

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

function [cropmin,cropmax,offset,minshape,marginW,marginH] = ...bounding_box ( shape,img )
%cropmin,cropmax分別是由特征點的包圍盒延拓的正臉的左上角和右下角
% if(offset==[0 0]表示正臉未躍出圖片
% else 人臉需要做平移,平移后的左上角的坐標點為(1,1),平移的長度為offset
% minshape:特征點包圍盒的左上角
% marginW:特征點包圍盒的寬的一半
% marginH:特征點包圍盒的高的一半
%shape:特征點,以水平的為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];%前面的盒子求出了正臉的大小包圍盒,但是如果一張照片中的頭像偏向左邊和上邊,將導致求出的正臉包圍盒超過原點,越出圖像,因此需要將正臉平移,平移的尺寸為offset()+1,平移后的正臉左上角坐標為(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
% %如下為補充項,防止裁剪的圖片過大超過原圖片的邊界
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;%補充項
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;%標準的正臉大小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:依據正則化的第一張圖片特征點來正則化其他圖片的特征點。

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

然后求解平均特征點即可。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259265.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259265.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259265.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Nginx初識

configure腳本&#xff1a;1、cat <EOF >>test.txtEOF多行追加2、uname用于打印當前操作系統的相關信息3、2>/dev/null/dev/null 代表空設備文件 1 表示stdout標準輸出&#xff0c;系統默認值是1&#xff0c;所以">/dev/null"等同于"1>/dev/n…

linux中shell變量$#,$@,$0,$1,$2的含義解釋

linux中shell變量$#,$,$0,$1,$2的含義解釋: 變量說明: $$ Shell本身的PID&#xff08;ProcessID&#xff09; $! Shell最后運行的后臺Process的PID $? 最后運行的命令的結束代碼&#xff08;返回值&#xff09; $- 使用Set命令設定的Flag一覽 $* 所有參數列表。如"$*&quo…

分享25個新鮮出爐的 Photoshop 高級教程

網絡上眾多優秀的 Photoshop 實例教程是提高 Photoshop 技能的最佳學習途徑。今天&#xff0c;我向大家分享25個新鮮出爐的 Photoshop 高級教程&#xff0c;提高你的設計技巧&#xff0c;制作時尚的圖片效果。這些教程可以幫助把你的想法變成現實&#xff0c;并創造新的東西。 …

北京林業大學計算機技術復試,北京林業大學計算機應用技術04年考研復試辦法...

一、復試小組的組成原則和人數計算機應用技術學科碩士研究生復試小組由具有副教授以上(含副教授)職稱的研究生導師和具有博士學位的副教授組成&#xff0c;人數為3~5人。組長有學科負責人擔任&#xff0c;設秘書1名。二、專業課的考核形式和要求專業課的考核形式為筆試和口試。…

SDM For Face Alignment 流程介紹及Matlab代碼實現之訓練篇

SDM 訓練階段的任務如下&#xff1a; 載入標準化的數據&#xff08;包括400*400的正臉及特征點&#xff09;對每一張標準化的圖片&#xff0c;模擬人臉檢測儀&#xff0c;產生10個擾動的人臉框及相應的初始特征點x0。求解Δx,Φ,其中Δxx??x0,x?表示true shape,Φ表示每個特…

Hibernate5-多對1(n:1)-fetch=join

1.創建項目,項目名稱hibernatedemo26,目錄結構如圖所示2.在項目中創建lib目錄存儲jar文件,目錄結構如圖所示3.在src目錄中創建實體類Forum,包名(com.mycompany.demo.bean),如圖所示4.實體類Forum的內容如下package com.mycompany.demo.bean;import java.util.Set;public class …

如何使用固定二級子域名公網訪問多個本地Windows Web網站

文章目錄 1. 下載windows版Nginx2. 配置Nginx3. 測試局域網訪問4. cpolar內網穿透5. 測試公網訪問6. 配置固定二級子域名7. 測試訪問公網固定二級子域名 1. 下載windows版Nginx 進入官方網站(http://nginx.org/en/download.html)下載windows版的nginx 下載好后解壓進入nginx目…

部分和問題

0-1部分和 問題描述&#xff1a;有n個大小不同的數字a&#xff0c;判斷是否能從中取出若干個數&#xff0c;使得這些數的和為k。解決思路&#xff1a;利用DFS(深度優先搜索)來解決&#xff0c;用dfs(i,j)表示前i個數字能否得到部分和j,則根據前i1個數的能否得到部分和j或ja[i1]…

實驗 6 數組1

//輸入n個整數&#xff0c;將它們存入數組a中。輸出最大值和它所對應的下標。 #include<stdio.h> int main(void) {int n,i,x;int a[10];x0;printf("enter n:");scanf("%d",&n);for(i0;i<n;i){printf("enter :");scanf("%d&qu…

初中計算機職稱答辯,晉升中學語文高級教師職稱答辯內容舉例

晉升中學語文高級教師職稱答辯內容舉例 晉升中學語文高級教師職稱答辯秘籍 最重要的一點&#xff1a;你要對課本上的重點篇目非常熟悉&#xff01;對于現代文來說作者、題材、課文重點、重點句子詞語、中心思想等你都要明了。對于文言文來說&#xff0c;要求學生掌握的&#xf…

SDM For Face Alignment流程介紹及Matlab代碼實現之測試篇

測試很簡單了&#xff0c;只需要載入數據&#xff0c;然后做正則化處理&#xff0c;使用訓練模型產生的{Rk},就可以預測特征點了。 face_alignment.m:用來預測特征點 function shape face_alignment( ShapeModel, DataVariation,...LearnedCascadedModel, Data, img, shape,…

Flink – JobManager.submitJob

JobManager作為actor&#xff0c; case SubmitJob(jobGraph, listeningBehaviour) >val client sender()val jobInfo new JobInfo(client, listeningBehaviour, System.currentTimeMillis(),jobGraph.getSessionTimeout)submitJob(jobGraph, jobInfo) submitJob&#xff0…

window內容

window parent top location.href location.reload location.replace轉載于:https://www.cnblogs.com/carlos-guo/p/3391784.html

計算機類公務員如何提升自己,大學畢業才發現:所學專業對考公務員如此重要,4類專業上岸率高...

導語&#xff1a;畢業季來臨&#xff0c;同學們是想直接找工作積累工作經驗&#xff0c;還是繼續考取相關證書&#xff0c;來獲得更穩定職業的入場券&#xff1f;畢業抉擇很多畢業生面臨的第一個問題就是未來職業規劃&#xff0c;因為大學畢業之后&#xff0c;就意味著一段新的…

使用getline讀入

直接上代碼&#xff1a; 第一份&#xff1a;從cin 讀入多行數字&#xff0c;每行2個。當輸入完畢后&#xff0c;按2次回車結束 #include<iostream> #include <cstdio> #include <sstream> #include <string> #include <vector> #include <it…

POJ 1221

整數劃分 劃分成單峰的回文數列 dp[i][j] 表示 把i劃分&#xff0c;其中劃分的數不能大于j 1             i1或j1 dp[i][j]  dp[i][j-1]1         ji dp(i,j-1)dp(i-j,min(i-j,j)) i>j>1 1 #include <iostream>2 #include <cstd…

HYSBZ - 1050(旅行comf 并查集Java實現)

HYSBZ - 1050(旅行comf Java實現) 原題地址 解法&#xff1a;枚舉每一條邊&#xff0c;對于這條邊&#xff0c;我們需要找到集合中和其值相差最小的最大邊&#xff0c;這個集合是指與包括i邊在內的ST聯通集。對于這一要求&#xff0c;我們只需對所有的邊進行從小到大的排序&…

UVA 11401 - Triangle Counting

Problem G Triangle Counting Input: Standard Input Output: Standard Output You are given n rods of length 1, 2…, n. You have to pick any 3 of them & build a triangle. How many distinct triangles can you make? Note that, two triangles will be considere…

蘇州軟件測試11k工資要什么水平,3個月從機械轉行軟件測試,他的入職薪資是11K...

原標題&#xff1a;3個月從機械轉行軟件測試&#xff0c;他的入職薪資是11K只要找到適合自己的學習方式&#xff0c;成功轉行只是早晚的問題&#xff01;今天匯智妹給大家介紹的這位小伙伴&#xff0c;是咱們匯學聯盟平臺上的一位線上學員——小周。97年的小哥哥&#xff0c;19…

python idle 清屏問題的解決

在學習和使用python的過程中&#xff0c;少不了要與python idle打交道。但使用python idle都會遇到一個常見而又懊惱的問題——要怎么清屏?我在stackoverflow看到這樣兩種答案&#xff1a;1.在shell中輸入1 import os 2 os.system(cls) 這種方法只能在windows系統中cmd模式下的…