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.mzph.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模式下的…