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的正脸以及相应的特征点就取得了。

如下图:

再正则其他图片

我们通过普氏分析将其他图片的特征点与第一张正则化的特征点对齐,获得统一尺寸下的特征点,这样就可求解平均值了。

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,1)

if(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);

end

if(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;

end

end

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 debug

Trans = -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;

end

shape = z;

end

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

matlab sdm,SDM For Face Alignment 流程介绍及Matlab代码实现之预处理篇相关推荐

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

    SDM全称为 Supervised Descent Method,是一种机器学习的方法,可以被用来做Face Alignment. 下面我们将通过matlab代码来梳理整个实现的过程. 预处理阶段 I ...

  2. SDM For Face Alignment 流程介绍及Matlab代码实现之训练篇

    SDM 训练阶段的任务如下: 载入标准化的数据(包括400*400的正脸及特征点) 对每一张标准化的图片,模拟人脸检测仪,产生10个扰动的人脸框及相应的初始特征点x0x_0. 求解Δx\Delta x ...

  3. SDM For Face Alignment流程介绍及Matlab代码实现之测试篇

    测试很简单了,只需要载入数据,然后做正则化处理,使用训练模型产生的{Rk}\{R_k\},就可以预测特征点了. face_alignment.m:用来预测特征点 function shape = fa ...

  4. matlab 思维进化算法,差分进化算法介绍及matlab实现

    引言 差分进化算法是基于群体智能理论的优化算法,是通过群体内个体间的合作与竞争而产生的智能优化搜索算法,它保留了基于种群的全局搜索策略,采用实数编码.基于差分的简单变异操作和"一对一&quo ...

  5. matlab 逻辑回归实现,逻辑回归原理介绍及Matlab实现

    一.逻辑回归基本概念 1. 什么是逻辑回归 逻辑回归就是这样的一个过程:面对一个回归或者分类问题,建立代价函数,然后通过优化方法迭代求解出最优的模型参数,然后测试验证我们这个求解的模型的好坏. Log ...

  6. RBF神经网络简单介绍与MATLAB实现

    文章目录 RBF的直观介绍 1 RBF是一种两层的网络 2 RBF的隐层是一种非线性的映射 3 RBF输出层是线性的 4 RBF的基本思想是:将数据转化到高维空间,使其在高维空间线性可分 RBF学习算 ...

  7. 模拟退火算法介绍及matlab实现

    模拟退火算法介绍及matlab实现 参数 待求解参数维度:D x i L x_{\text{i}}^L xiL​, x i U x_{\text{i}}^U xiU​:待求解参数的上下限 L:每一温度 ...

  8. 聊天机器人之需求分析和流程介绍

    聊天机器人之需求分析和流程介绍 1. 需求分析 在黑马头条的小智同学板块实现聊天机器人,能够起到智能客服的效果,能够为使用app的用户解决基础的问题,而不用额外的人力. 但是由于语料的限制,所以这里使 ...

  9. 微信小程序开发的完整流程介绍,新手必读

    自从跳一跳小程序游戏出现后,一夜之间,小程序就变得家喻户晓了,功能开发也越来越丰富,在微信搜一搜就会发现许多大品牌早已有自己的小程序了,越来越多的企业和商家都看中了这个风口,想快速开发出一款属于自己的 ...

最新文章

  1. 今天的工作发现了4年前的“bug一枚”
  2. linux c 获取进程 可执行文件路径
  3. Vivado关联Modelsim进行仿真
  4. 见微知著(一):解析ctf中的pwn--Fast bin里的UAF
  5. Google Authenticator加强ssh安全
  6. 这座中国小城,靠“造假”称霸一个全球市场
  7. mysql存储过程的优缺点,数据库篇(二)——什么是存储过程?有哪些优缺点?...
  8. 信息学奥赛NOIP/CSP-J初赛知识点汇总
  9. 四 实例 图像的手绘效果
  10. c语言课程设计歇后语,拼音字母c开头的歇后语
  11. 【网页前端】HTML基本语法之排版标签和表单标签
  12. 2022年全球市场柠檬酸单镁总体规模、主要生产商、主要地区、产品和应用细分研究报告
  13. DMHS搭建、以及DMHS 双向同步
  14. 爱国html源码,鼠标点击网页爱国富强民主特效(附代码)
  15. 2017广东工业大学程序设计竞赛决赛 Problem H: tmk买礼物(数论)
  16. xshell6个人版解除窗口限制(亲测可用,需卸载当前xshell6)
  17. 苹果xr十大隐藏功能_苹果手机有哪些隐藏小功能?【建议收藏】
  18. 烤仔建工 | 来红浪漫和漂亮姐姐Yanelis K歌吧
  19. Linux技巧之Ubuntu11.04下安装极点五笔输入法
  20. 社区活动| Apache Doris 社区开发者会议议题征集中

热门文章

  1. 安搭Share:主播探店为实体店发展迎来新机遇
  2. m4r转换工具html加载视频,在线m4r格式转换器
  3. 『david_lv』老朋友喜相逢 《走出软件作坊》也喜相逢-SD2.0大会第一天
  4. 动态代理模式_应用(Redis工具类)
  5. 百度SEO站群在线随机看抖音快手小姐姐网站源码
  6. Firewalld防火墙 常见命令
  7. fck编辑器下载及配置使用说明
  8. 2020/1/31 关于mathtype6.9的安装 “我的第一次编辑
  9. 计算机计算线性卷积规则,线性卷积与圆周卷积的计算(杭电)
  10. [转]“0级画质”及“示范级音质”蓝光中文排名