cv姿态评估:Levenberg-Marquardt优化-阻尼最小二乘(DLS)

2023-11-02 09:59

本文主要是介绍cv姿态评估:Levenberg-Marquardt优化-阻尼最小二乘(DLS),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

'''
自己整理备忘,也供后人参考。
KZ@njucs.onMicrosoft.com本节记录了cv姿态评估的常见思路,建立模型的方法与Levenberg-Marquardt优化原理。
在下一节中,我们将讨论如何在工程上将旋转向量、欧拉角与四元数之间进行转换。
'''

基础知识:

仿射变换是计算机视觉领域应用十分广泛的特殊变换。是指在几何中,一个向量进行一次线性变换并接上一个平移,变换为另一个向量。对于一个三维直角坐标系,基于每个坐标轴的旋转具有的规则旋转空间的集合,可以表示任何三维向量。在有限维的情况,每个仿射变换可以由一个矩阵A和一个向量b给出,对应于一个矩阵和一个向量的乘法,而仿射变换的复合对应于普通的矩阵乘法,只要加入一个额外的行到矩阵的底下,这一行全部是0除了最右边是一个1,而列向量的底下要加上一个1。

一个对向量平移向量b,与旋转放大缩小 A的仿射映射为

在齐次坐标上,等价于

在分形的研究里,收缩平移仿射映射可以制造制具有自相似性的分形。一个在两个仿射空间之间的仿射变换,是在向量上呈现线性之坐标点的变换(即为空间中点与点之间的向量)。以符号表示的话,  使得 ,决定任一对点的线性变换:

或者

 

在二维坐标系上绕原点进行的二维旋转:

如图所示,当点v绕原点转动θ至v',假设v点的坐标是(x,y),那么可以推导得到v'(x',y'),过程如下:

参数如图,我们发现:

x=rcosϕ

y=rsinϕ

x′=rcos(θ+ϕ)

y′=rsin(θ+ϕ)

通过三角函数展开得:

x′=rcosθcosϕ−rsinθsinϕ

y′=rsinθcosϕ+rcosθsinϕ

代入x,y表达式可得:

x′=xcosθ−ysinθ

y′=xsinθ+ycosθ

使用矩阵表示:

绕任意轴的三维旋转

绕任意轴的三维旋转可以将旋转分解为一系列基本的二维旋转,如图所示:

步骤一,二,三 

 

 

什么是姿势估计?

在计算机视觉中,物体的姿势指的是其相对于相机的相对取向和位置。通过相对于相机移动对象或相对于对象移动相机来更改姿势。

姿势由上下翻转(pitch),左右翻转(yaw),平面内旋转(roll)构成。

比如,人脸姿态估计的思想:旋转三维标准模型一定角度,直到模型上“三维特征点”的“2维投影”,与待测试图像上的特征点(图像上的特征点显然是2维)尽量重合。这时候我们脑海中就应该浮现出一种诡异的场景:在幽暗的灯光中,一个发着淡蓝色光芒的人皮面具一点点的“自我调整”,突然一下子“完美无缺”的“扣在了你的脸上”。这就是人脸姿态估计的思想。

计算图像中对象的3D姿势,需要以下几个参量:

1.几个点的2D坐标。

在工程中,通常使用dlib的detector。

2.相同点的3D位置

代表2D要素点的3D位置。理想情况下需要照片中人物的3D模型才能获得3D位置。但在实践中,通用3D模型就足够了。只需要在某个任意参考系中的几个点的3D位置。通常来说,使用以下3D点。

  1. 鼻尖:(0.0,0.0,0.0)
  2. 下巴:(0.0,-330.0,-65.0)
  3. 左眼左角:( - 225.0f,170.0f,-135.0)
  4. 右眼右角:(225.0,170.0,-135.0)
  5. 口的左角:( - 150.0,-150.0,-125.0)
  6. 嘴角:(150.0,-150.0,-125.0)

3.相机的光学参数

相机的光学参数包括图像的光学中心和径向失真参数,所以我们必须校准相机。具体方法在这里不再多说,我们假设相机已经被校准。

 

姿态估计算法原理

 

这里有三个坐标系。上面显示的各种面部特征的3D坐标是世界坐标。如果我们知道旋转和平移参量,我们可以将世界坐标中的3D点转换为相机坐标中的 3D点。可以使用相机的固有参数(焦距,光学中心等)将相机坐标中的3D点投影到图像平面(即图像坐标系)上。

假设我们知道世界坐标中(U,V,W)3D点的位置P。如果我们知道相对于相机坐标的世界坐标的旋转\ mathbf {R}(3×3矩阵)和平移\ mathbf {吨}(3×1矢量),我们可以使用以下等式计算相机坐标系(X,Y,Z)中点的位置P

将它展开:

如果我们知道足够数量的点对应(即(X,Y,Z)(U,V,W)),上面就是一个线性方程组,其中R_ {} IJ(t_x,t_y,t_z)是未知数,可以很容易被求出。

3D模型上的许多点(即(U,V,W))是给出的,但我们不知道(X,Y,Z)。我们只知道2D点的位置(即(x,y))。在不考虑径向畸变的情况下,图像坐标中(x,y)的点p的坐标由下式给出

 \ begin {align *} \ begin {bmatrix} x \\ y \\ 1 \ end {bmatrix}&= s \ begin {bmatrix} f_x&0&c_x \\ 0&f_y&c_y \\ 0&0&1 \ end {bmatrix} \ begin {bmatrix} X \\ Y \\ Z \ end {bmatrix} \ end {align *}

其中,F_Xf_y是在x和y方向上的焦距,并且(c_x,c_y)是光学中心。

小号是一个未知的比例因子,因为在任何图像中我们都不知道深度。我们将矩阵[X,Y,Z]代入以上矩阵。

\ begin {align *} s \ begin {bmatrix} X \\ Y \\ Z \ end {bmatrix} = \ begin {bmatrix} r_ {00}ï¼r_ {01}ï¼r_ {02}ï¼t_ {x} \ \ r_ {10}ï¼r_ {11}ï¼r_ {12}ï¼t_ {y} \\ r_ {20}ï¼r_ {21}ï¼r_ {22}ï¼t_ {z} \\ \ end {bmatrix} \ begin {bmatrix} U \\ V \\ W \\ 1 \ end {bmatrix} \ end {align *}

是不是看起来有点复杂?这里使用一种称为直接线性变换(DLT)的方法,可以解决上述形式的等式。

但DLT方法不是非常准确。首先,旋转\ mathbf {R}具有三个自由度,但DLT解决方案中使用的矩阵表示具有9个数字。DLT解决方案中没有任何内容迫使估计的3×3矩阵成为旋转矩阵。更重要的是,DLT解决方案不会最小化正确的目标函数。

 

Levenberg-Marquardt优化

莱文贝格-马夸特方法(Levenberg–Marquardt algorithm)能提供数非线性最小化(局部最小)的数值解。此算法能借由执行时修改参数达到结合高斯-牛顿算法以及梯度下降法的优点,并对两者之不足作改善(比如高斯-牛顿算法之反矩阵不存在或是初始值离局部极小值太远)。

假设f 是一个从\Re ^{m}\rightarrow \Re ^{n} 的非线性映射,也就是说{\mathbf  {P}}\in \Re ^{m} 且{\mathbf  {X}}\in \Re ^{n}, 那么,f({\mathbf  {P}})={\mathbf  {X}}

我们希望任意给定一个 \mathbf {x} 以及合理的初始值 {\mathbf  {p}}_{0},我们能找到一个 {\mathbf  {p}}^{​{+}},使得 {\mathbf  {\epsilon }}^{T}{\mathbf  {\epsilon }} 尽量小(局部极小),其中{\mathbf  {\epsilon }}=f({\mathbf  {p}}^{+})-{\mathbf  {x}}

我们通过迭代实现最小化,首先根据泰勒展开式我们能把 f({\mathbf  {p}}+{\mathbf  {\delta _{p}}}) 写为下面的近似,这有两个好处:

第一是线性的、第二是只需要一阶微分。

f({\mathbf  {p}}+{\mathbf  {\delta _{p}}})\approx f({\mathbf  {p}})+{\mathbf  {J\delta _{p}}}

其中\mathbf {J}f的雅克比矩阵。对于每次的迭代我们实际上做了这样一件事:

假设这次 iteration 的点是{\mathbf  {p}}_{k},我们要找到一个 {\mathbf  {\delta }}_{​{​{\mathbf  {p}},k}} 让 |{\mathbf  {x}}-f({\mathbf  {p}}+{\mathbf  {\delta }}_{​{​{\mathbf  {p}},k}})|\approx |{\mathbf  {x}}-f({\mathbf  {p}})-{\mathbf  {J{\mathbf  {\delta }}_{​{​{\mathbf  {p}},k}}}}|=|{\mathbf  {\epsilon }}_{​{k}}-{\mathbf  {J{\mathbf  {\delta }}_{​{​{\mathbf  {p}},k}}}}| 最小。 根据投影公式我们知道当下面式子被满足的时候能有最小误差:

({\mathbf  {J}}^{T}{\mathbf  {J}}){\mathbf  {\delta _{p}}}={\mathbf  {J}}^{T}{\mathbf  {\epsilon }}_{​{k}}

我们将这个公式略加修改得到:

[\mu {\mathbf  {I}}+({\mathbf  {J}}^{T}{\mathbf  {J}})]{\mathbf  {\delta _{p}}}={\mathbf  {J}}^{T}{\mathbf  {\epsilon }}_{​{k}}

如此一来 \mu 大的时候这种算法会接近最速下降法,小的时候会接近高斯-牛顿方法。为了确保每次{\mathbf  {\epsilon }} 长度的减少,我们这么作:先采用一个小的 \mu,如果{\mathbf  {\epsilon }} 长度变大就增加\mu

此算法当以下某些条件达到时结束迭代:

  1. 如果发现 {\mathbf  {\epsilon }} 长度变化小于特定的给定值就结束。
  2. 发现{\mathbf  {\delta _{p}}} 变化小于特定的给定值就结束。
  3. 到达了迭代的上限设定就结束。

 

在下一节中,我们将讨论如何将旋转向量、欧拉角与四元数之间进行转换。

引用:

1.https://www.cnblogs.com/warmlayu/p/9937067.html

3.https://en.wikipedia.org/wiki/Levenberg%E2%80%93Marquardt_algorithm

4.https://www.learnopencv.com/head-pose-estimation-using-opencv-and-dlib/

这篇关于cv姿态评估:Levenberg-Marquardt优化-阻尼最小二乘(DLS)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/329830

相关文章

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n