Simon Shi的小站

人工智能,机器学习, 强化学习,大模型,自动驾驶

0%

Open3D API

[TOC]

Open3D demo

文件读取

PointCloud:

  • 1 文件读取
  • 2 数组数据读取
1
2
3
4
print("Testing IO for point cloud ...")
pcd = o3d.io.read_point_cloud("../../TestData/fragment.pcd")
print(pcd)
o3d.io.write_point_cloud("copy_of_fragment.pcd", pcd)
1
2
source = o3d.io.read_point_cloud("../TestData/ICP/cloud_bin_0.pcd")
target = o3d.io.read_point_cloud("../TestData/ICP/cloud_bin_1.pcd")

TriMesh:

1
2
3
4
print("Testing IO for meshes ...")
mesh = o3d.io.read_triangle_mesh("../../TestData/knot.ply")
print(mesh)
o3d.io.write_triangle_mesh("copy_of_knot.ply", mesh)

Image:

1
2
3
4
print("Testing IO for textured meshes ...")
textured_mesh = o3d.io.read_triangle_mesh("../../TestData/crate/crate.obj")
print(textured_mesh)
o3d.io.write_triangle_mesh("copy_of_crate.obj",

TriMesh to PointCloud v1

​ triMesh完全PointCloud读取

1
2
3
4
5
6
7
8
9
10
11
12
def load_ply_point_cloud(filename,voxel_size=0.5):
print("Load a ply point cloud, print it, and render it")
mesh= open3d.io.read_triangle_mesh(filename)
voxel_mesh = open3d.geometry.VoxelGrid.create_from_triangle_mesh(mesh)
return mesh,voxel_mesh

points_ar = []
for x in voxel_mesh.voxels:
points_ar.append(x.grid_index)
points = np.array(points_ar)
pcd = open3d.geometry.PointCloud()
pcd.points = open3d.utility.Vector3dVector(points)

TriMesh to PointCloud v2

​ 采样的方式,进行采用PointCloud

sample_points_poisson_disk(self, number_of_points, init_factor=5, pcl=None)

​ 函数从网格中取样点,其中每个点到邻近点的距离大致相同(蓝色噪声)。 方法是基于 Yuksel

sample_points_uniformly(self 自我, number_of_points=100 点数100)

​ 函数来均匀地从网格中取样点。

1
2
3
print("Load a ply point could, print, render it")
mesh= open3d.io.read_triangle_mesh(filename)
o3d.geometry.TriangleMesh.sample_points_uniformly(mesh, voxel_size)

Voxel

Base Voxel class, containing grid id and color

基本体素类,包含网格 id 和颜色

VoxelGrid

open3d.geometry.VoxelGrid

可视化

1
2
source = o3.io.read_point_cloud(mscan)
o3.visualization.draw_geometries([source])

API detail

open3d.gemotry.TriangleMesh

staticcreate_from_point_cloud_alpha_shape(pcd, alpha, tetra_mesh, pt_map)

staticcreate_from_point_cloud_ball_pivoting(pcd, radii)

staticcreate_from_point_cloud_poisson(pcd, depth=8, width=0, scale=1.1, linear_fit=False)

open3d.registration.registration_ransac_based_on_feature_matching

Parameters

Returns

​ open3d.registration.RegistrationResult

open3d.registration.RegistrationResult

  • propertycorrespondence_set

    Correspondence set between source and target point cloud.Typen x 2 int numpy array

    源点云与目标点云之间的对应集[source, target]。(此处的源点云与目标点云,均是采样过后的对应关系之间)

  • propertyfitness

    The overlapping area (# of inlier correspondences / # of points in target). Higher is better.Typefloat

    重叠区域(向内对应的 # / 目标点的 #)。越高越好。

  • propertyinlier_rmse

    RMSE of all inlier correspondences. Lower is better.Typefloat

    所有相关函数的 RMSE。越低越好。

  • propertytransformation

    The estimated transformation matrix.Type4 x 4 float64 numpy array

    估计的变换矩阵。

open3d.registration.CorrespondenceCheckerBasedOnDistance

​ Class to check if aligned point clouds are close (less than specified threshold).

​ 检查对齐的点云是否关闭(小于指定的阈值)。

open3d.registration.CorrespondenceCheckerBasedOnEdgeLength

​ Check if two point clouds build the polygons with similar edge lengths. That is, checks if the lengths of any two arbitrary edges (line formed by two vertices) individually drawn withinin source point cloud and within the target point cloud with correspondences are similar. The only parameter similarity_threshold is a number between 0 (loose) and 1 (strict)

​ 检查两个点云是否构建边长相似的多边形。 也就是说,检查在源点云和目标点云中单独绘制的任意两条边(由两个顶点组成的直线)的长度是否相似。 唯一的参数相似性阈值是介于0(宽松)和1(严格)之间的数字

open3d.registration.RANSACConvergenceCriteria

​ 定义 RANSAC 的收敛准则。 如果迭代次数达到最大迭代次数,或者验证已经运行了最大验证次数,则 RANSAC 算法停止。 注意,验证是迭代中最昂贵的计算运算符。 大多数迭代并不完全进行验证。 这是至关重要的,以控制最大验证,使计算时间是可接受的。

open3d.geometry.PointCloud

​ crop**(bounding_box,** bounding_box)

open3d.geometry.OrientedBoundingBox

​ static create_from_points

​ get_max_bound**(self)**

get_min_bound(self)

get_oriented_bounding_box

[TOC]

三维坐标变换原理-平移, 旋转, 缩放

基础知识

齐次坐标

给定一个二维点(x, y),那么形如(kx, ky, k)的所有三元组就都是等价的,它们就是这个点的齐次坐标(homogeneous)。齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示,是指一个用于投影几何里的坐标系统,如同用于欧氏几何里的笛卡儿坐标一般

矩阵的乘法

矩阵的乘法运算,阮一峰老师写的比较清楚,具体可以看 这里

矩阵的线性变换

矩阵的线性变换就是从一个线性空间 $V_1$ 的某一个点跃迁到另一个线性空间 $V_2$ 的另一个点的运动。也就是说是一个点不仅可以变换到同一个线性空间中的另一个点,而且可以变换到另一个线性空间中的另一个点去

矩阵和线性变换之间的关系: 矩阵本身描述了一个坐标系,矩阵与矩阵的乘法描述了一个运动。换句话说:如果矩阵仅仅自己出现,那么他描述了一个坐标系,如果他和另一个矩阵或向量同时出现,而且做乘法运算,那么它表示运动(线性变换)

数学表述为: $\vec{b}=M\vec{a}$, 即矩阵 M 描述了向量 $a$ 到向量$b$ 的运动

如将三维坐标D1经过矩阵M变换到坐标D2, 就可以表达为:

$$
D_2 = D_1 \cdot M =
\left[
\begin{matrix} a1 & b1 & c1 \ b2 & b2 & c2 \ a3 & b3 & c3 \end{matrix}
\right]
\left( \begin{matrix} z1 \ y2 \ z3 \end{matrix} \right)
= x1 \left( \begin{matrix} z1 \ y2 \ z3 \end{matrix} \right)

  • y2 \left( \begin{matrix} b1 \ b2 \ b3 \end{matrix} \right)
  • z3 \left( \begin{matrix} c1 \ c2 \ c3 \end{matrix} \right)
    = \left( \begin{matrix} X \ Y \ Z \end{matrix} \right)
    $$

坐标变换

平移

假设在三维空间坐标系中, 点Ai​(x, y, z)在x方向移动了dx, y方向移动dy, z方向移动了dz。到达点Aj​(X, Y, Z), 则

1
2
3
X = x + dx
Y = y + dy
Z = z + dz

如上所述, 则存在一个平移矩阵M,使得Ai​M=Aj​,但是在纯粹的三维矩阵中,我们永远也找不到这样一个矩阵M使条件成立。此时可以借助齐次坐标。齐次坐标规定用一个n+1维度的向量来表示原来的n维向量. 此时将Ai(x, y, z) 表示为(x, y, z, 1), 则可以得到矩阵M

验证: 假设Ai(4, 8, 2), x方向移动了dx, y方向移动dy, z方向移动了dz, 则Aj(4+dx, 8+dy , 2+dz)

缩放

假设在三维空间坐标系中, 点Ai(x, y, z)在x方向缩放了Sx, y方向缩放了Sy, z方向缩放了Sz。到达点Aj(X, Y, Z), 则

1
2
3
X = x * Sx
Y = y * Sy
Z = z * Sz

同理,缩放矩阵为

旋转

矩阵的旋转比较复杂,需要涉及到三角函数。 点Ai(x, y, z)绕X轴旋转θ度时, 到达点Aj(X, Y, Z), 则

1
2
3
X = X
Y = y*cosθ - y*sinθ
z = z*sinθ + z*cosθ

矩阵M为

绕Y轴旋转时

绕Z轴旋转时

欧拉变换是绕3个旋转轴的旋转矩阵的乘积

Open3D示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import numpy as np
import open3d as o3d
import copy

vec = np.identity(4)
vec[0][0] = 2
vec[1][1] = 2
vec[2][2] = 2
print(vec)

# filename = 'data/hello_smpl_stand_new.ply'
mbody = '/home/simon/tf_demo/vton3d/3dface/Align/data/hello_smpl_stand_new.ply'
mface = '/home/simon/tf_demo/vton3d/3dface/Align/data/mx_new.ply'

mmbody = o3d.io.read_triangle_mesh(mbody)

mesh_face = o3d.io.read_triangle_mesh(mface)
mmface = o3d.geometry.Geometry3D.transform(mesh_face, vec)
print(mmface)

o3d.visualization.draw_geometries([mmface, mmbody])

问题:给定两个坐标,如何计算变换矩阵?

webgl示例分析

在webgl中, 在矩阵变换常用的库glmatrix中有计算平移矩阵的translate方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/**
* Translate a mat4 by the given vector
*
* @param {mat4} out the receiving matrix
* @param {mat4} a the matrix to translate
* @param {vec3} v vector to translate by
* @returns {mat4} out
*/
function translate(out, a, v) {
var x = v[0],
y = v[1],
z = v[2];
var a00 = void 0,
a01 = void 0,
a02 = void 0,
a03 = void 0;
var a10 = void 0,
a11 = void 0,
a12 = void 0,
a13 = void 0;
var a20 = void 0,
a21 = void 0,
a22 = void 0,
a23 = void 0;

if (a === out) {
out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];
out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];
out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];
out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];
} else {
a00 = a[0];a01 = a[1];a02 = a[2];a03 = a[3];
a10 = a[4];a11 = a[5];a12 = a[6];a13 = a[7];
a20 = a[8];a21 = a[9];a22 = a[10];a23 = a[11];

out[0] = a00;out[1] = a01;out[2] = a02;out[3] = a03;
out[4] = a10;out[5] = a11;out[6] = a12;out[7] = a13;
out[8] = a20;out[9] = a21;out[10] = a22;out[11] = a23;

out[12] = a00 * x + a10 * y + a20 * z + a[12];
out[13] = a01 * x + a11 * y + a21 * z + a[13];
out[14] = a02 * x + a12 * y + a22 * z + a[14];
out[15] = a03 * x + a13 * y + a23 * z + a[15];
}

return out;
}
复制代码

通常使用translate方法来创建一个平移矩阵, 之后再shader中便可以通过这个平移矩阵来计算gl_Position的值。 通过上面的结果我们知道平移矩阵由最后四位数决定, 所以只需要计算数组的最后四位数即可。 根据矩阵的运算法则, 即可得到结果。

通常如果在webgl想创建一个平移矩阵, 可以使用下面的方式。

1
2
3
var translateMatrix = mat4.create(); //创建单位矩阵
mat4.translate(translateMatrix, translateMatrix, vec3.fromValues(dx, dy, dz));
复制代码

得到平移矩阵后,传递到顶点shader中与需要计算的点相乘即可得到目标点的坐标。

ref

人脸姿态估计(计算欧拉角)-CSDN博客

人脸识别技术的发展经历了以下三个阶段

第一阶段,主要研究简单背景中的人脸的识别和人脸识别过程中所需的面部特征。二十世纪七十年代,得利于电脑的发展,开始有研发人员利用电脑搭建质量较高的人脸灰度图模型。在这个阶段的研究虽然人脸识别还未能真正落地应用,但是对设计师机器识别人脸算法和系统的工程师有很重要的引导。

第二阶段,主要研究的是人机交互式的人脸识别。同样的,这主要还是老外们在研究,lesk和harmon采用几何特征参数和多维特征向量共同描述人脸图像信息,同时基于这种思想开发了图像识别系统。Kobayashi和kaya将统计识别的相关理论应用到人脸识别众,采用欧式几何距离来描述面部特征,比如嘴唇和鼻子的距离、鼻子和眼睛的距离等等。Stonham则提出了一种单隐层的自适应神经网络来进行人脸识别和表情分析。尽管如此,这个阶段还是没有摆脱人工干预,还是需要操作员的某些经验知识。

第三阶段,**机器自动识别阶段。**随着计算机硬件配置的不断提高和算法的不断改善和提高,人脸识别的运算速度和效率也越来越高。不仅能自动识别正面的光照良好、没有遮挡的面部,而且对不用姿态、不同表情、不同年龄、不同光照的人脸也能进行识别。甚至可以识别出表情、年龄等信息。现今,机器识别的准确率已经超越了人类。

近几年来,随着数据库训练基础的大大增加,和神经技术的累积,再加之统计学和数据学的发展,才逐渐走向了成熟。加上计算机的发展、物联网、互联网行业的快速发展,人脸识别的精度也逐渐上升,人脸识别技术也得到了前所未有的发展。人脸识别算法的更新、扫描方式、对比方式、数据库,各个环节相关打通,人脸识别终端设备终于投入到实际生产以及服务中来。

[TOC]

GAN

1、模型发展、理论改进

PGGAN、SNGAN、SAGAN、BigGAN、StyleGAN 等,这些模型都还在强调如何通过随机采样生成高质量图像。

2、应用领域发展

如 FUNIT、SPADE 等已经将注意力放在了应用层,也就是如何利用 GAN 做好图像翻译等实际应用任务。

Image-to-Image Translation

  • 局部纹理间的转换展开的,例如人脸属性变换、画作的风格变换、图像分割等,
  • 语义联系模型转换,引入注意力机制(U-GAT-IT)
    • 采用全局和平均池化下的类激活图(Class Activation Map-CAM)[2]来实现的
    • 再加上自适应图层实例归一化(AdaLIN),其作用是帮助注意力引导模型灵活控制形状和纹理的变化量。

pix2pix(监督学习)

pix2pipxHD

CycleGan(非监督学习)

UNIT citeUNIT

MUNIT [9]

将图像分解为领域不变的内容代码和捕获领域特定属性的样式代码,从而可以扩展到多对多映射。

U-GAT-IT (★★★★★)

基于GAN的新型无监督图像转换

https://www.sohu.com/a/333947112_500659

FUNIT

SPADE

论文标题:《Semantic Image Synthesis with Spatially-Adaptive Normalization》

论文链接:CVPR 2019 Open Access Repository

源码链接:https://github.com/NVlabs/SPADE

语义图像合成是指基于语义分割的结果来生成真实图片,过程如下图所示。很显然,这是图像语义分割的反过程;但不同的是,语义分割由真实图片分割出来的结果应该是唯一的(one-to-one mapping),而语义图像合成的结果只要是合理的就可以了,也就是说有多样的结果(one-to-many mapping)。

目前语义图像合成领域的经典方法有:CRN [1], pix2pixHD [2], SIMS [3], SPADE [4], 以及近些年来更多基于GAN的方法。

CAM

(Class Activation Map)

(AdaLIN)

Adaptive Layer-Instance Normalization

VideoGAN

vid2vid

Vid2Vid多图详解-CSDN博客

Cartoon

CartoonGAN CVPR 2018

清华

https://github.com/znxlwm/pytorch-CartoonGAN

https://github.com/taki0112/CartoonGAN-Tensorflow

img

img

CarttonGAN CVPR2020

https://github.com/SystemErrorWang/CartoonGAN

效果:

​ 风景好点

​ 人物处理差点

alt text

White-box-Cartoonization

https://github.com/SystemErrorWang/White-box-Cartoonization

CVPR2020 paper “Learning to Cartoonize Using White-box Cartoon Representations”.

https://systemerrorwang.github.io/White-box-Cartoonization

https://systemerrorwang.github.io/White-box-Cartoonization/paper/06791.pdf

字节跳动,东京大学,Style2Paints Research(线稿上色)

image-20200514204037043

AnimeGAN

AnimeGAN: a novel lightweight GAN for photo animation

武汉大学 土木工程学院

湖北工业大学 计算机学院

Wine-64

1
2
3
./configure --enable-win64

sudo apt-get install mingw-64

Wine-32

1
2
3
4
5
6
7
8
9
sudo apt-get install g++-multilib
sudo apt-get install libncurses5:i386
sudo apt-get install libc6:i386 libgcc1:i386 libstdc++5:i386 libstdc++6:i386
————————————————
https://blog.csdn.net/m0_37763336/article/details/83618390
原文链接:https://blog.csdn.net/hackerwin7/java/article/details/37878007

sudo apt install libx11-dev:i386
sudo apt-get install libfreetype6-dev:i386 libfreetype6-dev

Ref

CycleGAN、DualGAN、DiscoGAN

Computer Vision Algorithm

[TOC]

Point set registration

1.1Rigid registration

刚性注册:给定两个点集,刚性配准产生一个刚性变换,该变换将一个点集映射到另一个点集。刚性变换定义为不改变任何两点之间距离的变换。通常,这种转换包括平移旋转。[12]在极少数情况下,点集也可能会被镜像。在机器人技术和计算机视觉中,刚性配准应用最多。

1.2Non-rigid registration

给定两个点集,非刚性配准产生一个非刚性转换,该转换将一个点集映射到另一个点集。非刚性变换包括affine仿射变换,例如缩放剪切贴图。但是,在点集配准的情况下,非刚性配准通常涉及非线性变换。如果已知点集变化本征模式,则可以通过特征值对非线性变换进行参数化。[13]非线性变换也可以参数化为(TPS)薄板样条。[14] [13]

Registration algorithm

三维点集拟合

PPF –2010

算法的精髓:“整体建模,局部匹配”

【6D位姿估计】Point Pair Feature (PPF)

(学习opencv)Surface Matching之PPF Point Pair Feature 点对特征

Others

机器视觉之 ICP算法和RANSAC算法

三维点集拟合:平面拟合、RANSAC、ICP算法

平面拟合

  • SVD :

    • 根据协方差矩阵的SVD变换,最小奇异值对应的奇异向量就是平面的方向。
    • 注意:这个方法是直接的计算方法,没办法解决数值计算遇到的病态矩阵问题.在公式转化代码之前必须对空间点坐标进行近似归一化!
  • 使用法线方法

    • 使用合适的方法剔除离群点,计算点云的形心P;

    • 若在已经获得法线的点云中,可以对法线进行剔除离散点之后,求取最小方差的均值,直接求得法线方向N( alpha, beta, theta );

    • 使用点法式描述三维平面;或者根据形心P和法线方向,计算出平面方程的一般式。

  • 空间向量的旋转

Ransac 1981

“RANdom SAmple Consensus(随机抽样一致)”

[ICP-ptp] Point-to-Point –1992

点云匹配:ICP(Iterative Closest Point迭代最近点)

ICP_SVD

matlab: https://github.com/ToughStoneX/3D_ICP

open3d-python: http://www.open3d.org/docs/release/tutorial/Basic/icp_registration.html

[ICP-ptl] Point-to-Plane ICP –2001

Efficient variants of the ICP algorithm. In 3-D Digital Imaging and Modeling, 2001.

Rusinkiewicz和M.Levoy。ICP算法的高效变体。在3D数字成像和建模中,2001年

GMMREG 2010

《A Robust Algorithm for Point Set Registration Using Mixture of Gaussians 2005》 Bing Jian

《Robust Point Set Registration Using Gaussian Mixture Models 2010》Bing Jian

Colored Point Cloud Registration 2017

Colored Point Cloud Registration Revisited, ICCV, 2017. J.Park, Q.-Y. Zhou, and V. Koltun

该算法比以前的点云配准算法更准确,更健壮,而运行速度与ICP配准的运行速度相当。

Global Registration

ICP彩色点云登记被称为当地的,因为它们依赖于一个粗略的排列为初始登记的方法。本教程介绍了另一类注册方法,称为全局注册。该算法系列不需要对齐即可进行初始化。它们通常产生不太严格的对齐结果,并用作局部方法的初始化。

Fast global registration –2016

RANSAC 《Fast Global Registration, ECCV》, 2016. Q.-Y. Zhou, J. Park, and V. Koltun

基于RANSAC的Fast global registration解决方案可能需要很长时间,这是因为有无数的模型建议和评估。 [Zhou2016]引入了一种更快的方法,该方法可以快速优化几乎没有对应关系的行处理权重。由于每次迭代都没有模型建议和评估,[Zhou2016]中提出的方法可以节省大量的计算时间。

该脚本比较了基于RANSAC的全局注册和[Zhou2016]的实现的运行时间。

Multiway registration

Robust Reconstruction of Indoor Scenes, CVPR, 2015. S.Choi, Q.-Y. Zhou, and V. Koltun

Multiway registration is the process to align multiple pieces of geometry in a global space. Typically, the input is a set of geometries (e.g., point clouds or RGBD images) $ {𝐏_𝑖} $. The output is a set of rigid transformations ${𝐓_𝑖}$, so that the transformed point clouds ${𝐓_𝑖 P_i} $ are aligned in the global space.

Supply

《Alignment of 3D models》

《A 3D Model Alignment and Retrieval System》

$TS -> R_c -> TS -> R_r -> TS$

image-20200313130556659

AlignNet-3D

引言
Align(register) point clouds 即对齐(配准)点云,意思是将一个点云匹配到另一个点云上面,主要用来将从一个物体的不同角度得到的局部点云拼接起来,由此得到一个完整的3D模型,对点云做Alignment或Registration从本意上来说并没有什么本质的区别,尤其是在阅读学术论文的时候。

  但是我在工作中所了解到的是Alignment是把几个3D相机固定起来,然后计算出这几台3D相机点云之间相对位置的转换矩阵,一般情况下以第一个相机的坐标系为基准,把其他相机的点云通过转换与平移移到相同的坐标系下,然后可以实时捕捉完整的3D点云。而Registration则指的是只用一台3D相机,连续从各个角度对一个物体进行扫描,然后把把得到的点云一帧一帧的拼接起来,由此而得到完整的3D模型。所以从这个角度来说,Alignment得到完整模型是实时的,是多个相机同一时间从多个角度得到的点云拼接起来,每一帧都是完整模型,Registration则是一台相机从不同时间不同角度的到点云拼接,完整3D模型不是实时的,需要通过离线处理得到。但其本质均是通过得到点云之间的转换矩阵来实现匹配。

常见的Alignment或Registration算法
最常见的Alignment算法即**ICP(Iterative Closest Point)**及其各种变体,如其名字所示,此方法是通过先对点云进行初配准,然后迭代最近点使相对应的点距离最小而得到一个转换矩阵。以下对Point-to-point ICP和Point-to-plane ICP这两种ICP方法做简要介绍:

Point-to-point & Point-to-plane ICP

一般来说,此ICP算法会迭代两个步骤:

(1)找到目标点云P和源点云Q中相对应的点集K={(p,q)},定义p与q的目标函数E(T)和q到p的转换矩阵T,不同的ICP变体使用不同的目标函数E(T)。
(2)通过最小化目标函数E(T)来更新变换T。
point-to-point ICP使用的目标函数如下所示

而point-to-plane ICP使用了一个不同的目标函数

AlignNet-3D介绍
AlignNet-3D是论文AlignNet-3D: Fast Point Cloud Registration of Partially Observed Objects里研究的一种align点云的方法,论文主要研究了智能汽车的精确3D跟踪状态估计,提出了一个以学习为基础的方法AlignNet-3D来对不同时间捕获的汽车点云做Alignment,以此来估计汽车近距离内的精确运动,作者的评估表明AlignNet-3D在计算上优于global 3D registration,同时显著提高了效率。

论文创新点,参考论文所使用的方法都是直接通过优化计算转换的算法,而此论文是通过学习的方式来Align点云,因此,它可以受益于额外的训练数据,并对遮挡和截断具有鲁棒性。

方法简述,论文的方法可以概述为给定一个物体在不同时间捕获的两个点云,然后通过对观测到的点云做Alignment来精确地估计物体的相对运动,如下图所示:
————————————————
版权声明:本文为CSDN博主「Asher_zheng」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Asher_zheng/article/details/103094927

Aligning 3D Data

动机:

  • 形状检查

  • 运动估计

  • 外观分析(我们所做的)

  • 纹理映射 (Texture mapping) 一般应用于2D到3D的UV Map

  • 跟踪

How to find correspondences: User input? Feature detection? Signatures?( 用户输入?特征检测?签名?)

Alternative(备选方案): assume closest points correspond 假设最接近的点

参考资料:

Open3D官网

open3d ply文件 表面体素(voxel)、点云(point cloud)

基础知识:

霍夫的投票方案

SVD

PnP

账号分享

v2ray https://ssrvps.org/archives/2870

15天过期,重新

v2ray

v2ray 客户端(Linux、Ubuntu)

https://github.com/v2ray/v2ray-core/releases/download/v4.22.1/v2ray-linux-64.zip

客户端配置:

无GUI: .v2ray –config=../../config.json

带GUI参考:https://mahongfei.com/1776.html

virtual Net

Linux 安装

1
curl -s https://install.zerotier.com | sudo bash

查看安装zerotier版本

1
sudo zerotier-cli status

加入一个netWork

1
sudo zerotier-cli join ################(networkid)

查看加入的网络的信息,比如network

1
sudo zerotier-cli listnetworks

退出加入的network网段

1
sudo zerotier-cli leave ################(networkid)

启动、停止服务(mac下,linux尝试发现没有launchctl command)

#Stop and start the service with launchctl
停止

1
2
sudo launchctl unload /Library/LaunchDaemons/com.zerotier.one.plist
1

启动

1
2
sudo launchctl load /Library/LaunchDaemons/com.zerotier.one.plist
1

卸载服务(未尝试)

#Cleanly uninstall ZeroTier One, preserving only your secret identity

1
sudo "/Library/Application Support/ZeroTier/One/uninstall.sh"

AI 研究所

马普所

MIP-virtualhumans

  • CV, 3D

http://virtualhumans.mpi-inf.mpg.de/publications.html

DeepMind

  • 游戏,机器博弈

Uwa - 西澳大学-工程数学学院

​ 世界排名前100, 澳洲八校联盟成员

https://www.uwa.edu.au/ems/home

http://staffhome.ecm.uwa.edu.au/~00053650/recognition.html

清华

Aminer: 科技情报大数据挖掘与服务系统平台

中科院

微软研究院

Google研究院

FaceBook研究院

阿里

百度

腾讯

字节跳动

- 今日头条
- 西瓜视频
- 抖音(孵化)

计算机图形学与混合现实在线平台

AIGC汇聚

OOAIOO AI工具集合

[TOC]

官网下载 x86_64-posix-seh

VSCode

配置参考

CSDN VS Code gcc配置C++环境(Mingw-w64)

C/C++ for Visual Studio Code

1
2
3
4
5
6
7
8
9
# cltr+shift+P 打开命令面板
# 1 输入C/C++ 选择编辑配置Ui
- c_cpp_properties.json
# 2 输入tasks 选择任务-配置默认构建任务
- tasks.json
# 3 输入launch,选择调试,打开launch.json
- launch.json
# 4 运行配置(auto gen)
- settings.json

运行:

​ 1、终端–运行生成任务(Ctrl+Shift+B)

​ 2、F5 调试(Ctrl+F5 运行)

Cmake

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 新建项目
# 插件市场安装 Cmake Tools

# 创建CmakeList.txt
--
cmake_minimum_required (VERSION 3.0.0)
project(Cmake_demo)

add_executable(demo, "main.cpp", "foo.cpp", "foo.h")
---

# ctrl+shift+P 打开命令面板,输入configure检索并执行“Cmake:Configure”命令
# 执行Configure,选择一个kit

Configure 完成的输出

VS窗口底部默认又一些按钮,可以点击`build`按钮,就可以构建目标all。

_GLIBCXX_USE_CXX11_ABI宏的作用

参考GCC提供的手册:

在 GCC 5.1 版本中,libstdc++ 引入了一个新特性,其中包括 std::string 和 std::list 的新实现。为了符合 C++11 标准,这些更改是必要的,该标准禁止 Copy-On-Write 字符串并要求列表跟踪其大小。

这样虽然符合了c++11的标注,旧版就无法兼容了。为了解决这个问题,对于旧版而言,GCC5.1添加了__cxx11命名空间,GCC5.1或者说c++11规范下的string和list,实际上是std::__cxx11::string和std::__cxx11::list,所以我们一般的using namespace std就会变成形如using namespace std::__cxx11的样子。也就是说,有旧版(c++03规范)的libstdc++.so,和新版(c++11规范)的libstdc++.so两个库同时存在。

为了避免两个库到底选择哪一个的麻烦,GCC5.1就引入了-D_GLIBCXX_USE_CXX11_ABI来控制编译器到底链接哪一个libstdc++.so,

-D_GLIBCXX_USE_CXX11_ABI=0 链接旧版库
-D_GLIBCXX_USE_CXX11_ABI=1 链接新版库

如果在CMakeLists里设置

add_definitions(-D _GLIBCXX_USE_CXX11_ABI=0)
1
Reference:

[1]. https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html

ERR

‘’’’ The terminal process “C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Command g++ -g D:\Qiansi\games\DDZ-QS-Server\AI_server_Star_call/ddz_move_star.cpp D:\Qiansi\games\DDZ-QS-Server\AI_server_Star_call/main.cpp -I D:\Qiansi\games\DDZ-QS-Server\AI_server_Star_call/ -o main.exe” terminated with exit code: 1.

  • Terminal will be reused by tasks, press any key to close it.

  • Executing task: g++ -g D:\Qiansi\games\DDZ-QS-Server\AI_server_Star_call/main.cpp D:\Qiansi\games\DDZ-QS-Server\AI_server_Star_call/ddz_move_star.cpp -I D:\Qiansi\games\DDZ-QS-Server\AI_server_Star_call/ -o main.exe

C:\Users\Simon\AppData\Local\Temp\ccwu1HiS.o: In function main': D:/Qiansi/games/DDZ-QS-Server/AI_server_Star_call/main.cpp:22: undefined reference to ddzmove_star::get_move_type(int*)’
collect2.exe: error: ld returned 1 exit status

  • The terminal process “C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Command g++ -g D:\Qiansi\games\DDZ-QS-Server\AI_server_Star_call/main.cpp D:\Qiansi\games\DDZ-QS-Server\AI_server_Star_call/ddz_move_star.cpp -I D:\Qiansi\games\DDZ-QS-Server\AI_server_Star_call/ -o main.exe” terminated with exit code: 1.
  • Terminal will be reused by tasks, press any key to close it.
1
2
3
#include <ddz_move_star.h>
--->
#include "ddz_move_star.h"

ERR2

CMake Error: Error: generator : Ninja

Does not match the generator used previously: MinGW Makefiles

Either remove the CMakeCache.txt file and CMakeFiles directory or choose a different binary directory.

—> 删除缓存

[TOC]

Tools-Ubuntu-Desktop install

1、Ubuntu Desktop 官网:

https://www.ubuntugeek.com/install-gui-in-ubuntu-server.html

We have already discussed how to install ubuntu 9.04 LAMP server .If you are a new user and not familiar with command prompt you can install GUI for your ubuntu LAMP server using the 2 options

  1. Install desktop Environment

  2. Install Webmin

1) Install desktop Environment

First you nee to make sure you have enabled Universe and multiverse repositories in /etc/apt/sources.list file once you have enable you need to use the following command to install GUI

sudo apt-get update

sudo apt-get install ubuntu-desktop

The above command will install GNOME desktop

If you wan to install a graphical desktop manager without some of the desktop addons like Evolution and OpenOffice, but continue to use the server flavor kernel use the following command

sudo aptitude install –without-recommends ubuntu-desktop

If you want to install light weight desktop install xfce using the following command

sudo apt-get install xubuntu-desktop

If you want to install KDE desktop use the following command

sudo apt-get install kubuntu-desktop

2) Install Webmin in Ubuntu

2、xinit

apt install -y xinit

3、VNC server/client

安装Gnome桌面环境:

1
sudo apt-get install gnome-session-flashback

安装VNC服务:

1
2
sudo apt install vnc4server -y
sudo apt install ubuntu-desktop gnome-panel gnome-settings-daemon metacity nautilus gnome-terminal -y

首次配置VNC服务:

1
vncserver

输入VNC连接密码。

结束 vncserver:

1
vncserver -kill :1

修改~/.vnc/xstartup,在 x-window-manager &的后面新增下面这些行:

1
2
3
4
5
6
7
gnome-panel &
gnome-settings-daemon &
metacity &
nautilus &
# Fix to make GNOME work
export XKL_XMODMAP_DISABLE=1
/etc/X11/Xsession

重新启动VNC服务

1
vncserver

作者:赵星云
链接:https://www.jianshu.com/p/70b522d006d8
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

4、xrdp

一.在操作系统中用管理员权限安装以下软件

\1. 安装xrdp:

​ sudo apt-get install xrdp

\2. 安装vnc4server:

​ sudo apt-get install vnc4server

\3. 安装xubuntu-desktop:

​ sudo apt-get install xubuntu-desktop

​ \4. xsession中写入xfce4-session,需要远程的用户都要单独执行这条命令:

​ echo “xfce4-session” >~/.xsession

​ \5. 重启xrdp服务:

​ /etc/init.d/xrdp restart

二. Windows端操作

1.执行MSTSC开启远程登陆终端

img

\2. 输入密码:

img

\3. 连接的界面

img

#########################################################

三. ubuntu vsftpd.conf配置

listen=YES

listen_port=2112

anonymous_enable=NO

local_enable=YES

write_enable=YES

chroot_local_user=NO

chroot_list_file=/etc/vsftpd.chroot_list

pam_service_name=ftp

5、Question

安装xserver的时候不要安装有关nvidia的软件,然后编译安装就好了。

6、Install X window

https://stackoverflow.com/questions/40195740/how-to-run-openai-gym-render-over-a-server

1
2
3
4
5
6
7
8
9
10
11
12
13
# Install and configure X window with virtual screen
sudo apt-get install xserver-xorg libglu1-mesa-dev freeglut3-dev mesa-common-dev libxmu-dev libxi-dev
# Configure the nvidia-x
sudo nvidia-xconfig -a --use-display-device=None --virtual=1280x1024
# Run the virtual screen in the background (:0)
sudo /usr/bin/X :0 &
# We only need to setup the virtual screen once

# Run the program with vitural screen
DISPLAY=:0 <program>

# If you dont want to type `DISPLAY=:0` everytime
export DISPLAY=:0

sudo nvidia-xconfig -a –use-display-device=Device0 –virtual=1280x1024

sudo nvidia-xconfig -a –virtual=1280x1024

7、VNC 配置ALL(+ 自启动选项)

开源3D人脸重建项目整理

[TOC]

本文主要总结了经典3D人脸重建开源算法,如有遗漏请大家提醒补充。

〇、基础

1. 3DMM 1999

3D Morphable Model

《A Morphable Model For The Synthesis Of 3D Faces》 1999

提出人脸的一种线性表示方法

所有三维人脸是已经进行**稠密对齐(3D face registration)**的,即所有的三维人脸都能用相同的点云数或面片数来表示,且相同序号的点代表相同的语义

The model has 53K vertices and 106K faces.

3D 人脸建模 介绍 + code

3DMM的传统优化方法 | 阮明康

image-20200210230052577

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def split_coeff(self, coeffs):
"""
Return:
coeffs_dict -- a dict of torch.tensors

Parameters:
coeffs -- torch.tensor, size (B, 256)
"""
id_coeffs = coeffs[:, :80]
exp_coeffs = coeffs[:, 80: 144]
tex_coeffs = coeffs[:, 144: 224]
angles = coeffs[:, 224: 227]
gammas = coeffs[:, 227: 254]
translations = coeffs[:, 254:]
return {
'id': id_coeffs,
'exp': exp_coeffs,
'tex': tex_coeffs,
'angle': angles,
'gamma': gammas,
'trans': translations
}

2.BFM模型

BFM模型介绍及可视化实现(C++)

Basel Face Model是一个开源的人脸 数据库,其基本原理是3DMM,因此其便是在PCA的基础上进行存储的。 目前有多个版本的数据库(2009,2017, 2022)。 官方网站:2009,2017

数据内容(以2009版本为例)

01_MorphableModel.mat(数据主体)

​ BFM模型由53490个顶点构成,其shape/texture的数据长度为160470(53490*3),因为其排列方式如下:

1
2
shape: x_1, y_1, z_1, x_2, y_2, z_2, ..., x_{53490}, y_{53490}, z_{53490}
texture: r_1, g_1, b_1, r_2, g_2, b_2, ..., r_{53490}, g_{53490}, b_{53490}

.h5文件与.mat文件对应关系

[注] .h5文件中的tl数量与.mat数量不同,主成分方差的值也不同,且shape的值是.mat中shape值的0.001倍(见/shape/representer/length-unit)。

Matlab脚本

​ 建议阅读script_gen_random_head.m文件,该脚本实现了如何生成随机脸,从中我们可以学习到BFM模型的使用方法。

一、单图三维人脸重建开源算法

单图三维人脸重建代码,指根据一张二维人脸图像,恢复与之对应的三维人脸(包括形状和纹理),一些算法提供了训练代码及网络框架,一些算法仅提供了测试接口。

目前单图三维人脸重建主要的发展方向有两种,一种是基于多任务的三维人脸重建,在三维人脸重建过程的同时完成其他与人脸有关的任务,例如,人脸识别,人脸对齐,特征点定位等,以同时提高多任务的效果。另一种,期望重建出精细化的三维人脸,包括对表情和细节的恢复。

1.3DDFA CVPR 2016:

Github: https://github.com/cleardusk/3DDFA

Face Alignment in Full Pose Range: A 3D Total Solution》CVPR2016

通过恢复稠密的三维形状,以解决大姿态人脸2D特征点检测的问题。文中提到,这是第一篇利用CNN来解决3D人脸对齐问题的文章,网络通过输入PNCC图和原始二维图,输出234维参数(包括6维姿态参数[缩放参数,pitch,yaw,roll偏转角,沿xy轴的平移量],199维3DMM形状参数,29维3DMM表情参数),利用得到的系数更新原始的PNCC图,再与原图一起进行迭代。

Vertex 3D

2.pix2vertex ICCV 2017:

Github: https://github.com/matansel/pix2vertex

Unrestricted Facial Geometry Reconstruction Using Image-to-Image Translation》ICCV 2017(Sela17)

文章通过一个Image-to-Image转换网络,从一张二维图像中恢复一张普通深度图像与一张稠密对应图。根据文中提到的迭代弹性形变算法(实际是一种非刚性三维人脸对齐方法)将2.5D图像转化3D人脸网格。

image-20200210190858197

3.CNN3DMM_CVPR 2017:

Regressing Robust and Discriminative 3D Morphable Models With a Very Deep Neural Network》CVPR2017

Github: https://github.com/anhttran/3dmm_cnn

本文介绍的是上2文中恢复基础形状的方法,利用ResNet101深层神经网络框架,从in-the-wild二维图像恢复三维人脸形状,并用于识别,在文中针对训练数据量不足提出数据扩充方法,利用一篇多图三维人脸重建文章方法生成足量的带标签的三维人脸,训练过程仍采用回归3DMM参数的方法。

image-20200210191137165

4.Richardson_CVPR 2017

Github: https://github.com/Cogito2012/3DFaceRecon

《Learning Detailed Face Reconstruction from a Single Image》CVPR2017

image-20200210193653717

5.E2FAR CVPR 2017:

End-To-End 3D Face Reconstruction With Deep Neural Networks》CVPR2017

Github: https://github.com/ShownX/mxnet-E2FAR

文章采用端到端的方法估计最优3DMM参数,输入是二维图像及其感兴趣区域,采用Dlib进行特征点检测,将恢复人脸身份形状和表情形状作分为人脸重建的两个子任务,输出包含身份参数向量和表情参数向量。

image-20200210223741952

6.VRN ICCV 2017:

Large Pose 3D Face Reconstruction from a Single Image via Direct Volumetric CNN Regression》ICCV2017

GitHub: https://github.com/AaronJackson/vrn

官网: https://cvl-demos.cs.nott.ac.uk/vrn/

A.S. Jackson 诺丁汉大学

采用体素方法进行三维人脸重建,对人脸而言重建精度不高,但是一种很好的三维人体重建方法。

image-20200210173005834

7. 3DMMasSTN ICCVW 2017:

Github: https://github.com/anilbas/3DMMasSTN

3D Morphable Models as Spatial Transformer Networks》ICCVW2017

3DMM方法作为空间转化网络的应用,利用3DMM恢复三维人脸形状从而得到姿态归一化和补全自遮挡的人脸图片。

Overview of the 3DMM-STN

8. EOSand4Dface 2017:

A Multiresolution 3D Morphable Face Model and Fitting Framework》Visapp 2016 and 《Real-Time 3D Face Fitting and Texture Fusion on In-the-Wild VideosIEEE Signal Processing Letters24.4 (2017)

Github: https://github.com/patrikhuber/eos

Github: https://github.com/patrikhuber/4dface

这篇文章的方法主要致力于将3DMM应用到实际开发中,作者提出一个基于C++的拟合框架,可支持Surrey Face Model (SFM), 4D Face Model (4DFM), and the Basel Face Model (BFM) 2009 and 2017数据库,目前这个拟合框架仍在更新。

eos

4D Face Model colour picture

4Dface

4D Face Model colour picture 4D Face Model colour picture

www.4dface.io/4dfm.

9 .Genova_CVPR 2018 1806.06098:

《Unsupervised Training for 3D Morphable Model Regression》CVPR2018

https://arxiv.org/abs/1806.06098

github: https://github.com/google/tf_mesh_renderer (bazel, c++, tf)

本文由普林斯顿大学、谷歌和麻省理工学院合作完成,是 CVPR 2018 的 spotlight 文章。使用无监督训练的方法基于 3DMM 进行人脸三维重建。论文基于编码器和解码器模型,创新性地将人脸识别网络引入训练的损失函数,使得生成的 3D 人脸能很好地保留了输入图片的人脸个体特征。**该模型旨在拟合形状和纹理,并没有学习姿态表情和光照。**算法的编码器接受图像作为输入,输出用于 3DMM 模型的参数。解码器接受参数后合成 3D 人脸。为了使网络不仅能保持个体信息,还能生成自然真实的人脸,作者提出了 3 个新的损失函数,即批分布损失(batch distribution loss)、回环损失(loopback loss)和多视角身份损失(multi-view identity loss)。批分布损失可使每个批的统计量与 3DMM 的统计量一致。回环损失可保证生成的 3D 人脸模型的2D成像图片重新进入编码器得到的参数和原图的参数尽量一致。多视角身份损失能使得模型学习到独立于观察角度的个体特征。实验结果说明,模型不仅仅可以生成与输入图像高度相似的 3D 人脸,而且生成的人脸独立于输入的表情和姿态,甚至被遮挡的人脸也可以达到不错的生成效果。

image-20200210185718650

10. CoMA ECCV 2018:

Generating 3D faces using Convolutional Mesh Autoencoders》ECCV2018

提出一种基于卷积面片自编码重建网络来获得三维人脸形状信息。

github: https://github.com/anuragranj/coma

image-20200210185852990

11. PRnet ECCV 2018:

Joint 3D Face Reconstruction and Dense Alignment with Position Map Regression Network》ECCV2018

github: https://github.com/YadiraF/PRNet

  • 上海交通大学 + 云从科技 +

一篇针对三维人脸重建与对齐的论文,文章通过恢复稠密的3D人脸形状来定位2D人脸图片上的特征点,同时完成估计人脸姿态,人脸交换等应用。文中提到用uv-map来表示3D形状,实现了从端到端的网络结构。

image-20200210190114627

12. Extreme_3d_faces CVPR2018:

Extreme 3D Face Reconstruction: Seeing Through Occlusions》CVPR2018

Github: https://github.com/anhttran/extreme_3d_faces

文章方法先恢复一个基础形状,表情,六维视角自由度,然后估计一个凹凸贴图,用来捕捉人脸皱纹和非参的中级特征,再补全人脸被遮挡区域。

image-20200210190240938

13. Deep3DFace CVPRW 2019:

《Accurate 3D Face Reconstruction with Weakly-Supervised Learning: From Single Image to Image Set》arXiv 2019

最近,基于深度学习的3D人脸重建方法在质量和效率上均显示出令人鼓舞的结果,但是训练深度神经网络通常需要大量数据,而具有真实3D人脸形状的人脸图像却很少。 在本文中,我们提出了一种新颖的深度3D人脸重建方法,该方法包括:1)利用鲁棒的混合损失函数进行弱监督学习,同时考虑了低层和感知层信息以进行监督,以及2)执行多通过利用来自不同图像的互补信息进行形状聚合来重建图像人脸。 我们的方法快速,准确,并且对遮挡和大姿势稳健。我们在三个数据集上提供了全面的实验,系统地比较了我们的方法和15种最新方法,并展示了其最新的性能。

github: https://github.com/Microsoft/Deep3DFaceReconstruction

  • Microsoft
  • 3DMM系数

训练流程:

3-Figure1-1

示例:

image-20200210174434478

14. MMFace CVPR 2019

  • 用多指标回归网络MMFace解决3D人脸可变形模型(3DMM)与输入图像对齐的野外人脸重建问题。

    图2。我们的方法在AFLW2000-3D上的人脸重建和对齐结果[2]。

15. 2DASL 2019

project: Joint 3D Face Reconstruction and Dense Face Alignment from A Single Image with 2D-Assisted Self-Supervised Learning (2DASL)

1903.09359《3D Face Reconstruction from A Single Image Assisted by 2D Face Images in the Wild》

从单个2D图像重建3D人脸是具有广泛应用的挑战性问题。最近的方法通常旨在学习基于CNN的3D人脸模型,该模型从2D图像中回归3D变形模型(3DMM)的系数,以渲染3D人脸重建或密集人脸对齐。但是,缺少带有3D注释的训练数据会极大地限制那些方法的性能。为了缓解这个问题,我们提出了一种新颖的2D辅助自我监督学习(2DASL)方法,该方法可以有效地使用带有嘈杂地标信息的“野生” 2D面部图像来显着改善3D面部模型学习。具体来说,将稀疏的2D面部地标作为附加信息,2DSAL引入了四种新颖的自我监督方案,这些方案将2D地标和3D地标预测视为一种自映射过程,包括2D和3D界标自预测一致性,基于2D界标预测的循环一致性以及基于界标预测的预测3DMM系数的自评。使用这四个自我监督方案,2DASL方法大大减轻了对传统的配对2D到3D注释的需求,并提供了更高质量的3D人脸模型,而无需任何其他3D注释。在多个具有挑战性的数据集上进行的实验表明,我们的方法在3D人脸重建和密集人脸对齐方面都远远超过了最新技术。2DASL方法极大地减轻了对传统的2D到3D配对注释的需求,并提供了更高质量的3D人脸模型,而无需任何其他3D注释。在多个具有挑战性的数据集上进行的实验表明,我们的方法在3D人脸重建和密集人脸对齐方面都远远超过了最新技术。2DASL方法极大地减轻了对传统的2D到3D配对注释的需求,并提供了更高质量的3D人脸模型,而无需任何其他3D注释。在多个具有挑战性的数据集上进行的实验表明,我们的方法在3D人脸重建和密集人脸对齐方面都远远超过了最新技术。

Paper: https://arxiv.org/abs/1903.09359

Github: https://github.com/XgTu/2DASL

image-20200731170617469

image-20200731170640042

16. GANFIT 2019

code: https://github.com/barisgecer/GANFit

《GANFIT: Generative Adversarial Network Fitting for High Fidelity 3D Face Reconstruction》

Figure 2: Detailed overview of the proposed approach. A 3D face reconstruction is rendered by a differentiable renderer (shown in purple). Cost functions are mainly formulated by means of identity features on a pretrained face recognition network (shown in gray) and they are optimized by flowing the error all the way back to the latent parameters (ps, pe, pt, c, i, shown in green) with gradient descent optimization. End-to-end differentiable architecture enables us to use computationally cheap and reliable first order derivatives for optimization thus making it possible to employ deep networks as a generator (i.e,. statistical model) or as a cost function.

17. TBGAN 2019

code: https://github.com/barisgecer/TBGAN

《Synthesizing Coupled 3D Face Modalities by Trunk-Branch Generative Adversarial Networks》

Fig. 1: We propose a novel generative adversarial network that can synthesize high-quality texture, shape, and normals jointly for realistic and coherent 3D faces. Moreover, we demonstrate how we can condition the generation on the expression and create faces with various facial expressions.

Adaptive 2D 3D 2020

  • 《Adaptive 3D Face Reconstruction from a Single Image》
  • 3D重建,遮挡和极端姿势的解决方案
  • 没有开源

AvatarMe CVPR 2020

https://arxiv.org/abs/2003.13845

《AvatarMe: Realistically Renderable 3D Facial Reconstruction “in-the-wild”》

AvatarMe是第一种能够从单个“野生”图像中以更高的细节水平重建逼真的3D人脸的方法。为此,我们捕获了大量的面部形状和反射率数据集,并基于一种3D纹理和形状重建方法,并逐步完善其结果,以生成高分辨率散布和镜面反射所需的图像。逼真的渲染。

  • 使用专业扫描设备,搜集了一套完整的3D人脸数据集
avatarme_method

avatarme_teaser

proc_specAlbs

FRDA-open

https://github.com/Star-Clouds/FRDA

  • Face Reconstruction
  • Dense Alignment
  • Face 3D landmarks
  • 3D Pose Estimation

二、多图三维人脸重建开源算法

大部分基于多图的三维人脸的工作,希望从同一个人不同时间和环境拍摄的图像集合中恢复一个标准的具有身份信息的人脸形状(不带姿态,表情,纹理等),

1.AFAR

Adaptive 3D Face Reconstruction from Unconstrained Photo Collections》CVPR2016

这篇文章在首先在CVPR2015提出,在CVPR2016对算法细节进行了改进,先基于从粗到细的方法,利用二维图片的特征点拟合3DMM系数,再根据PS方法对精细的细节进行恢复,最后得到三维人脸。

三、人脸数据集

300W-LP

FaceWarehouse:用于视觉计算的3D面部表情数据库

3D面部表情数据库图4:使用具有不同数量组件的双线性模型拟合面部表情网格。 左上角是输入网格,下面显示了在identity属性和expression属性中使用不同数量组件的拟合结果。

训练源码:

3D-Morphable-Model-training

​ This program is to train the face 3D morphable model (3DMM)

https://github.com/hkbonychen/3D-Morphable-Model-training

参考资料:

开源3D人脸重建项目整理

3D Morphable Face Models—Past, Present, and Future

3DMM-and-3D-Face-reconstruction-and-manipulation

四、综述文献

State of the Art on Monocular 3D Face Reconstruction, Tracking, and Applications

单眼3D人脸重建,跟踪和应用的最新技术 2018

计算机图形和视觉社区长期致力于构建用于基于视觉输入来重建,跟踪和分析人脸的计算机化工具。在过去的几年中,取得了飞速的进步,这导致了新颖而强大的算法,即使在从单个RGB或RGB-D摄像机进行重建的极具挑战性的情况下,也能获得令人印象深刻的结果。随着这些技术在速度,准确性和易用性方面的进一步提高,应用范围广泛且稳步增长。受此飞速发展的推动,这份最新报告总结了单眼面部表情捕捉的最新趋势,并讨论了其应用,从基于动作的动画到实时面部重现。我们将讨论的重点放在使用基于优化的重建算法来恢复和跟踪人脸的三维模型的方法上。我们提供了有关真实世界图像形成的基本概念的深入概述,并讨论了使这些算法实用的常见假设和简化方法。 此外,**我们广泛介绍了用于更好地约束欠约束的单眼重建问题的先验知识,并讨论了用于从单眼2D数据中恢复密集的,光几何3D人脸模型的优化技术。**最后,我们在运动捕捉,面部动画以及图像和视频编辑的背景下,讨论了所审查算法的各种用例。

CCS概念•计算方法→重构;跟踪;动作捕捉; 形状造型;3D成像;


人脸企业级商业应用

face++8K

face++1K

花钱采,花钱标 :)

数据问题统一回复下:采集的话,主要是公司内部有一定数据积累,尤其是人脸识别组数据积累很大,这也是我们公司的优势吧。然后标注前期是精标,后期有些数据是大模型+筛选标注的。

10M的数据量