三维图形几何变换算法实验_计算机视觉方向简介 | 深度学习视觉三维重建

点击上方“计算机视觉life”,选择“星标”

快速获得最新干货

作者: Moonsmile

https://zhuanlan.zhihu.com/p/79628068

本文已由作者授权,未经允许,不得二次转载

三维重建意义

三维重建作为环境感知的关键技术之一,可用于自动驾驶、虚拟现实、运动目标监测、行为分析、安防监控和重点人群监护等。现在每个人都在研究识别,但识别只是计算机视觉的一部分。真正意义上的计算机视觉要超越识别,感知三维环境。我们活在三维空间里,要做到交互和感知,就必须将世界恢复到三维。所以,在识别的基础上,计算机视觉下一步必须走向三维重建。本文笔者将带大家初步了解三维重建的相关内容以及算法。

三维重建定义

在计算机视觉中, 三维重建是指根据单视图或者多视图的图像重建三维信息的过程. 由于单视频的信息不完全,因此三维重建需要利用经验知识. 而多视图的三维重建(类似人的双目定位)相对比较容易, 其方法是先对摄像机进行标定, 即计算出摄像机的图象坐标系与世界坐标系的关系.然后利用多个二维图象中的信息重建出三维信息。

常见的三维重建表达方式

常规的3D shape representation有以下四种:深度图(depth)、点云(point cloud)、体素(voxel)、网格(mesh)。

1808787242ab992307e96d586d513bf5.png
深度图

深度图其每个像素值代表的是物体到相机xy平面的距离,单位为 mm。

55c3ae0606a18312511e1f40324b86ac.png
体素

体素是三维空间中的一个有大小的点,一个小方块,相当于是三维空间种的像素。

a14d71bf71cf27be484cd0c4ea8cf309.png
点云

点云是某个坐标系下的点的数据集。点包含了丰富的信息,包括三维坐标X,Y,Z、颜色、分类值、强度值、时间等等。在我看来点云可以将现实世界原子化,通过高精度的点云数据可以还原现实世界。万物皆点云,获取方式可通过三维激光扫描等。

17f51264060120def44573838adcc856.png
用三角网格重建

三角网格就是全部由三角形组成的多边形网格。多边形和三角网格在图形学和建模中广泛使用,用来模拟复杂物体的表面,如建筑、车辆、人体,当然还有茶壶等。任意多边形网格都能转换成三角网格。

三角网格需要存储三类信息:

顶点:每个三角形都有三个顶点,各顶点都有可能和其他三角形共享。.

边:连接两个顶点的边,每个三角形有三条边。

面:每个三角形对应一个面,我们可以用顶点或边列表表示面。

5f7befb81c67886dcefee4bf0b35ae91.png
三角网格

三维重建的分类

根据采集设备是否主动发射测量信号,分为两类:基于主动视觉理论和基于被动视觉的三维重建方法。

主动视觉三维重建方法:主要包括结构光法和激光扫描法。

被动视觉三维重建方法:被动视觉只使用摄像机采集三维场景得到其投影的二维图像,根据图像的纹理分布等信息恢复深度信息,进而实现三维重建。

其中,双目视觉和多目视觉理论上可精确恢复深度信息,但实际中,受拍摄条件的影响,精度无法得到保证。单目视觉只使用单一摄像机作为采集设备,具有低成本、易部署等优点,但其存在固有的问题:单张图像可能对应无数真实物理世界场景(病态),故使用单目视觉方法从图像中估计深度进而实现三维重建的难度较大。

近几年代表性论文回顾

一、从单张图像恢复深度图

df64033d49ab1c56cd9e44709ab15b9b.png
Depth, NIPS 2014, Cited by 1011

这篇论文思路很简单,算是用深度学习做深度图估计的开山之作,网络分为全局粗估计和局部精估计,对深度由粗到精的估计,并且提出了一个尺度不变的损失函数。

cd2c2a05c5208859f6b4aa78d080586c.png
主体网络
eae8c1c7eda4b99fa4eb7f550c665de5.png
Scale-invariant Mean Squared Error

本文总结

(1)提出了一个包含分为全局粗估计和局部精估计,可以由粗到精估计的网络。

(2)提出了一个尺度不变的损失函数。

二、用体素来做单视图或多视图的三维重建

eebbbc7deeba8ee3df8a5db14b0b2a7f.png
Voxel, ECCV 2016, Cited by 342

这篇文章挺有意思,结合了LSTM来做,如果输入只有一张图像,则输入一张,输出也一个结果。如果是多视图的,则将多视图看作一个序列,输入到LSTM当中,输出多个结果。

564a74037998ff14996cfc13f3067138.png
Framework
5f2df5d44c26c0066d6967ae695e9302.png
Framework

如主框架所示,这篇文章采用深度学习从2D图像到其对应的3D voxel模型的映射: 首先利用一个标准的CNN结构对原始input image 进行编码;再利用一个标准 Deconvolution network 对其解码。中间用LSTM进行过渡连接, LSTM 单元排列成3D网格结构, 每个单元接收一个feature vector from Encoder and Hidden states of neighbors by convolution,并将他们输送到Decoder中. 这样每个LSTM单元重构output voxel的一部分。总之,通过这样的Encoder-3DLSTM-Decoder 的网络结构就建立了2D images -to -3D voxel model 的映射。

82f568a850b3c555033edf64ba6bc1d2.png
3D LSTM 和 3D GRU

损失函数采用的是二分类的交叉熵损失,类似于在三维空间做分割,类别是两类,分别是占有或者不占有。

ebff1bb9c5d6715acaba90be6e36b3a5.png
损失函数

除了交叉熵loss可以用作评价指标,还可以把预测结果跟标签的IoU作为评价指标,如下图所示:

0df9f9be808cbbbef1a29fa7f10ba30a.png
IoU可作为评价指标
421eb40c0fb3007f457b261c223ba527.png
Single Real-World Image Reconstruction
4b56ccee2c60f48d462e7596ee19442e.png
Reconstructing From Different Views.

本文总结

(1)采用深度学习从2D图像到其对应的3D voxel模型的映射,模型设计为Encoder+3D LSTM + Decoder。

(2)既适用单视图,也适用多视图。

(3)以体素的表现形式做的三维重建。

(4)缺点是需要权衡体素分辨率大小(计算耗时)和精度大小。

三、用点云来做单张RGB图像的三维重建

4f33d263d8d0e8e434afa295415748af.png
Point Cloud, CVPR 2017, Cited by 274

大多数现存的工作都在使用深度网络进行3D 数据采用体积网格或图像集合(几何体的2D视图)。然而,这种表示导致采样分辨率和净效率之间的折衷。在这篇论文中,作者利用深度网络通过单张图像直接生成点云,解决了基于单个图片对象生成3D几何的问题。

点云是一种简单,统一的结构,更容易学习,点云可以在几何变换和变形时更容易操作,因为连接性不需要更新。该网络可以由输入图像确定的视角推断的3D物体中实际包含点的位置。

2e5eb4146fb0d89b27ba64b0a8f7d803.png

模型最终的目标是:给定一张单个的图片(RGB或RGB-D),重构出完整的3D形状,并将这个输出通过一种无序的表示——点云(Point cloud)来实现。点云中点的个数,文中设置为1024,作者认为这个个数已经足够表现大部分的几何形状。

3f42a9886ad0eca4b10b9659f0261ed5.png
主框架

鉴于这种非正统的网络输出,作者面临的挑战之一是如何在训练期间构造损失函数。因为相同的几何形状可能在相同的近似程度上可以用不同的点云来表示,因此与通常的L2型损失不同。

本文使用的 loss

a4b65d0cfc298fd398eb65a92c22f4bb.png
倒角距离
f4b5cffeb0edd1f5d7675bba5dcd9b41.png
搬土距离

对于解决2D图片重构后可能的形状有很多种这个问题,作者构造了一个 Min-of-N loss (MoN) 损失函数。

078b4954a99fbdc8eaba6d5e81aa39c7.png
cc0ba5747acf310916c3a5880d6657c4.png

Min-of-N loss 的意思是,网络G通过n个不同的r扰动项进行n次预测,作者认为从直觉上来看,我们会相信n次中会至少有一次预测会非常接近真正的答案,因此可以认为这n次预测与真正的答案的距离的最小值应该要最小。

fa45517548d3ab998e2c4133784fc11e.png
实验可视化结果
44cf7434a8f63647df7d66566db624d1.png
实验可视化结果
4cbfb024cbdc509451f10c0e41b8a65f.png
实验数值结果

本文总结

该文章的贡献可归纳如下:

(1)开创了点云生成的先例(单图像3D重建)。

(2)系统地探讨了体系结构中的问题点生成网络的损失函数设计。

(3)提出了一种基于单图像任务的三维重建的原理及公式和解决方案。

总体来说,该篇文章开创了单个2D视角用点云重构3D物体的先河,是一篇值得一看的文章。

先中场休息一下,简单先分析一下:

根据各种不同的表示方法我们可以知道volume受到分辨率和表达能力的限制,会缺乏很多细节;point cloud 的点之间没有连接关系,会缺乏物体的表面信息。相比较而言mesh的表示方法具有轻量、形状细节丰富的特点。

bffa9ded7c50ac0ed438144b547e5959.png
不同表现形式的对比

Mesh: 我不是针对谁,我是想说在座的各位都是垃圾(depth、volume、point cloud)

由于后边的内容使用了图卷积神经网络(GCN),这里简要介绍一下:

db53f5b3236fdc2566b6831bccbe7933.png

f(p,l), f(p,l+1)分别表示顶点p在卷积操作前后的特征向量;

N(p)指顶点p的邻居节点;

W1,W2表示待学习的参数;

四、用三角网格来做单张RGB图像的三维重建

7d6497ab97c51044102cd1db6935c9f2.png

Mesh, ECCV 2018, cited by 58

这篇文章提出的方法不需要借助点云、深度或者其他更加信息丰富的数据,而是直接从单张彩色图片直接得到 3D mesh。

c1ee246afbabe36f75f4ce06e3161b02.png
主框架

1、给定一张输入图像:Input image

2、为任意的输入图像都初始化一个椭球体作为其初始三维形状:Ellipsoid Mesh

整个网络可以大概分成上下两个部分:

1、上面部分负责用全卷积神经网络提取输入图像的特征;

2、下面部分负责用图卷积神经网络来表示三维mesh,并对三维mesh不断进行形变,目标是得到最终的输出(最后边的飞机)。

cb3d4082aeaea5a4c3391c77673ed200.png
主框架中的部分内容详细的解释

1、C表示三维顶点坐标,P表示图像特征,F表示三维顶点特征;

2、perceptual feature pooling层负责根据三维顶点坐标C(i-1)去图像特征P中提取对应的信息;

3、以上提取到的各个顶点特征再与上一时刻的顶点特征F(i-1)做融合,作为G-ResNet的输入;

4、G-ResNet(graph-based ResNet)产生的输出又做为mesh deformable block的输出,得到新的三维坐标C(i)和三维顶点特征F(i)。

除了刚刚提到的mesh deformation,下面这部分还有一个很关键的组成是graph uppooling。文章提出这个图上采样层是为了让图节点依次增加,从图中可以直接看到节点数是由156-->628-->2466变换的,这其实就是coarse-to-fine的体现,如下图:

ae6f165c2e053e40b3410a31c8e1d2a6.png
graph uppooling

这篇文章定义了四种loss来约束网格更好的形变:

f95d8279da6f60931378934b2a9eec1e.png
loss
2c4deace721779bf17f17589e14b9651.png
loss

本文的实验结果

f0950dbd587b914f5a616a7b21907ab3.png
33fa1058a4869a090dc7e9548bbbfb70.png

本文总结

该文章的贡献可归纳如下:

(1)文章实现用端到端的神经网络实现了从单张彩色图直接生成用mesh表示的物体三维信息;

(2)文章采用图卷积神经网络来表示3D mesh信息,利用从输入图像提到的特征逐渐对椭圆尽心变形从而产生正确的几何形状;

(3)为了让整个形变的过程更加稳定,文章还采用coarse-to-fine从粗粒度到细粒度的方式;

(4)文章为生成的mesh设计了几种不同的损失函数来让整个模型生成的效果更加好;

文章的核心思路就是给用一个椭球作为任意物体的初始形状,然后逐渐将这个形状变成目标物体。

接下来介绍2019年的相关研究

由于相关内容涉及到mask-rcnn,先回顾一下:

mask-rcnn是对 faster rcnn 的扩展或者说是改进,其增加了一个用于分割的分支,并且将RoIpooling 改成了 RoIAlign。

b0c976a2be38ea198e98c34695633f01.png
mask rcnn

Mask RCNN可以看做是一个通用实例分割架构;。

Mask RCNN以Faster RCNN原型,增加了一个分支用于分割任务。

Mask RCNN比Faster RCNN速度慢一些,达到了5fps。

可用于人的姿态估计等其他任务;

首先介绍一篇2019年做三维重建的文章——Mesh R-CNN

这篇文章使用的正是mask rcnn 的框架,本篇文章提出了一种基于现实图片的物体检测系统,同时为每个检测物体生成三角网格给出完整三维形状。文中的系统mesh-rcnn是基于mask-rcnn的增强网络,添加了一个网格预测分支,通过先预测转化为物体的粗体素分布并转化为三角形网格表示,然后通过一系列的图卷积神经网络改进网格的边角输出具有不同拓扑结构的网格。

737ad22dd736ef2cbea14265387d35e2.png
基本的pipeline

模型目标:输入一个图像,检测图像中的所有对象,并输出所有对象的类别标签,边界框、分割掩码以及三维三角形网格。

模型主框架基于mask-rcnn,使用一个额外的网格预测器来获得三维形状,其中包括体素预测分支和网格细化分支。先由体素预测分支通过预选框对应的RoIAlign预测物体的粗体素分布,并将粗体素转化为初始的三角形网格,然后网格细化分支使用作用在网格顶点上的图卷积层调整这个初始网格的定点位置。总框架图如下所示:

bb7df9f5a1c5fb7a04fa9bf4d8dd42ef.png
总框架图
be20049d6d405a443889e7823dcc8d55.png
分支细节

1、Box/Mask 分支: 和mask-rcnn中的两个分支一样

2、体素预测分支:类似于mask-rcnn中的mask分支,输入是RoIAlign,将预选框假设位于一个分割成 G*G*G个粗体素的空间,然后预测分割出来的粗体素占用率。使用一个小的全卷积网络来保持输入特征和体素占用预测概率之间的对应关系。最后输出用G个通道生成G*G的特征图,为每个位置提供一列体素占用率分数。

3、体素占用转化为网格表示:将体素占用概率转化为二值化体素占用之后,将每个被占用的体素被替换为具有8个顶点、18个边和12个面的立方体三角形网格(如上图Cubify所示),然后合并相邻占用体元之间的共享顶点和边,消除共享内面就可以形成了一个拓扑结构依赖于体素预测的密集网格了。

网格细化分支

网格细化分支将初始的网格结构经过一系列精化阶段(在文中作者使用了三个阶段)来细化里面的顶点位置。每个精化阶段都是输入一个三角形网格),然后经过三个步骤获得更精细的网格结构:顶点对齐(获得顶点位置对应的图像特征);图卷积(沿着网格边缘传播信息);顶点细化(更新顶点位置)。网络的每一层都为网格的每个顶点维护一个三维坐标以及特征向量。

eefc3a657ee7274e5c791e491aebfdeb.png
网格细化分支

1、顶点对齐:利用摄像机的内在矩阵将每个顶点的三维坐标投影到图像平面上。根据获取的RoIAlign,在每个投影的顶点位置上计算一个双线性插值图像特征来作为对应顶点的图像特征。

2、图卷积:图卷积用于沿着网格边缘传播顶点信息,公式定义如下:

36ce0c482d6c49cd98012d0f1bafceea.png

其中N(i)表示顶点i的邻点集合,使用多个图卷积层在局部网格区域上聚合信息。

3、顶点精化:使用2中更新后的顶点特征使用下面公式来更新顶点位置:

a19ac517c6ba028bf229007d5abaf9f9.png

只更改顶点位置,不更改三角形平面。

模型损失函数

7e02542211191e0bb904f55a5f3d99c7.png
模型损失函数

网格细化损失(从三个方面定义了三个损失函数)

9aafbd29c2d7ffbc49f5359943f4a2c7.png
网格细化损失

论文实验

论文在两个数据集上验证模型:在ShapeNet数据集上对网格预测器进行了基准测试与最先进的方法进行比较并且对模型中的各个模块进行单独分析;在Pix3D数据集上测试完整Mesh R-Cnn模型在复杂背景下的物体三维网格预测结果。

328580907ddeb4b16c2d59d4eb8d0013.png

在ShapeNet数据集:Mesh R-Cnn与其他的模型比较结果如图下:

bd9ee867ff8427b4b9f3fe841058ac2b.png

其中Ours(Best)表示去掉形状正则化损失后的结果,在后面的实验中可以发现,去掉形状正则化损失后尽管在标准度量上有好的表现,但是在视觉层面上生成的网格并不如加上后的结果(Ours(Pretty))。

d824a42e0cc3d99e738b39e60c2d2fc6.png

表格中比较了模型的完整版本以及不同去除模块版本的表现,其中Full Test Set表示在完整测试集上的表现,Holes Test Set表示在打孔对象测试集中的表现;Voxel-Only表示不适用网格细化分支;Best和Perry分别表示不使用形状正则化损失和使用形状正则化损失;Ours(light)表示在网格细化分支中使用较轻量的非残差架构。

fb1da65f281d90e2da1d8bf611fe38bc.png
尽管不使用边长正则化器的训练结果在标准度量中有更好的表现,但是会产生退化的预测网格,会导致输出的网格出现许多重叠的面。
966aad4e4a8fea0afac66094068be6cc.png
对比Pixel2Mesh模型,Pixel2Mesh模型的输出结果是从一个标准椭圆变形得到的,不能正确地建模有孔的物体。相反,Mesh R-Cnn可以对任意拓扑结构的物体进行建模。

Pix3D数据集

d0d861551a245010f1ee0102085aedfe.png
Pix3D数据集
d12ed7ad9b325992d2da416a454e77be.png

可视化结果

e39277c521b4366dd206dc068ffbdeff.png
ea9a312365449b08d0a195a89e2fc3e9.png

本文总结

该文章的贡献可归纳如下:

(1)借鉴mask rcnn 框架;

(2)由粗到细调整的思想;

(3)使用图卷积神经网络;

(4)使用多种损失来约束训练;

最后介绍一篇论文,也是CVPR 2019的文章

3340bf2ab239c0d83c52977e4a133dc8.png
CVPR 2019, cited by 0

这篇文章同样是既可以对单视图,也可以对多视图进行重建,只不过这篇文章的重点不在这,而在于它可以对不可见部分(不确定性)进行建模。

基本思想就是,每个输入图像都可以预测出多个重建结果,然后取交集就是最终结果。

187b19465cf4c16653cb8f2b94133670.png

下图是主框架,左边是训练阶段,右边是测试阶段。

0c3a813122bb50b3e8f23118140183ee.png
主框架

左边训练阶段的意思是,输入一张图像 I,对其加入多个噪声(r),生成多个重建结果(S)(类似于条件生成模型)。对改模型的训练要加约束,这里提出了front constraint和diversity constraint。

右边是测试阶段,提出了一个一致性损失(consistency loss)来进行在线优化。

Distance Metric:

9a3ac4ed932dc7fd505b1b46fdb1956d.png
度量距离(这篇文章是基于点云做的,所以需要用度量距离衡量两个点云集的距离)

Diversity Constraint: 目的是让条件生成器生成的重建结果更具有多样性。

cadad134ce1a22801b55b0d2e0870913.png
Diversity Constraint:

Front Constraint: 对图像前边部分(部分点)有监督训练,所以这里有一个采样过程,具体内容如下图所示:

ab881446aa28b5c94c3d24c2daba95b4.png
Front Constraint
ea55859e9cfc10557a9d5730df0eb698.png
对Front Constraint采样部分的解释

对于条件生成器生成的结果,用一个判别器去判断这个形状是否合理,公式如下:

Latent Space Discriminator(判别器是直接从WGAN-GP中拿来的)

c61b372e86d84230db3000df4a58aa7e.png
判别器

训练总的损失:

010e426ebbb9c0ed493e63879588a42e.png

Inference (consistency constraint):

公式中Si 和 Sj 代表两个点云集合。

5f2d1328406427c8a304b10d43883bdc.png
0f6ae31eb582f4f54058096b4fe11a6a.png
consistency constraint

条件生成器的构:

a1b6dd6f91e70c827399cf81da6769d0.png
条件生成器的结构(简约版本)
d722e85cc1a1c91255477a7c4a83a15e.png
条件生成器的结构(详细版本)

实验结果

eb8d40eb05e86eec54586d0238cd7758.png
6271d607709b9b9c67a97564f1b85406.png
1a60ca7cc13bbfb57519d6b64d89eec6.png
a92487fd466baf21b9958aaba025d860.png
a7f0c280b3091661050cbd39ee864ade.png

本文总结

该文章的贡献可归纳如下:

(1)提出对不可见部分的不确定性进行建模;

(2)使用了条件生成模型;

(3)提出了三种约束;

从零开始学习三维视觉核心技术SLAM,扫描查看介绍,3天内无条件退款

3dad78567d643333916b0fd313df3488.png早就是优势,学习切忌单打独斗,这里有教程资料、练习作业、答疑解惑等,优质学习圈帮你少走弯路,快速入门!

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、算法竞赛、图像检测分割、三维视觉、GAN、医学影像、计算摄影、自动驾驶、综合等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

06448d8230b90aa30b741a174f477589.png

推荐阅读

前段时间参加了个线下交流会(附SLAM入门视频)

计算机视觉方向简介 | 从全景图恢复三维结构

计算机视觉方向简介 | 阵列相机立体全景拼接

计算机视觉方向简介 | 单目微运动生成深度图

计算机视觉方向简介 | 深度相机室内实时稠密三维重建

计算机视觉方向简介 | 深度图补全

计算机视觉方向简介 | 人体骨骼关键点检测综述

计算机视觉方向简介 | 人脸识别中的活体检测算法综述

计算机视觉方向简介 | 目标检测最新进展总结与展望

计算机视觉方向简介 | 唇语识别技术

计算机视觉方向简介 | 三维深度学习中的目标分类与语义分割

计算机视觉方向简介 | 基于单目视觉的三维重建算法

计算机视觉方向简介 | 用深度学习进行表格提取

计算机视觉方向简介 | 立体匹配技术简介

计算机视觉方向简介 | 人脸表情识别

计算机视觉方向简介 | 人脸颜值打分

计算机视觉方向简介 | 深度学习自动构图

计算机视觉方向简介 | 基于RGB-D的3D目标检测

计算机视觉方向简介 | 人体姿态估计

计算机视觉方向简介 | 三维重建技术概述

计算机视觉方向简介 | 视觉惯性里程计(VIO)

计算机视觉方向简介 | 多目标跟踪算法(附源码)

计算机视觉方向简介 | 基于自然语言的跨模态行人re-id的SOTA方法(上)

计算机视觉方向简介 | 图像拼接

目标检测技术二十年综述

最全综述 | 医学图像处理

最全综述 | 图像分割算法

最全综述 | 图像目标检测

综述 | 视频分割在移动端的算法进展

综述 | 语义分割经典网络及轻量化模型盘点

综述 | 机器视觉表面缺陷检测

Graph Neural Networks 综述

关于GANs在医学图像领域应用的总结

计算机视觉中,目前有哪些经典的目标跟踪算法?

激光雷达深度补全

最新AI干货,我在看  c534bc08fe596cf12775f75fd2d37b5e.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/537180.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PNG图片详解

1、PNG图片类型 PNG格式有8位、24位、32位三种,下面是一些术语: 索引透明:类似于GIF,某一像素只有全透和全不透明两种效果Alpha透明:半透明PNG8 8位的PNG最多支持256(2的8次方)种颜色&#xff0…

java 删除二维数组中的null_避免在Java中检查Null语句

1.概述通常,在Java代码中处理null变量、引用和集合很棘手。它们不仅难以识别,而且处理起来也很复杂。事实上,在编译时无法识别处理null的任何错误,会导致运行时NullPointerException。在本教程中,我们将了解在Java中检…

simulink显示多个数据_如何在 Simulink 中使用 PID Tuner 进行 PID 调参?

作者 | 安布奇责编 | 胡雪蕊出品 | CSDN(ID: CSDNnews)本文为一篇技术干货,主要讲述在Simulink如何使用PID Tuner进行PID调参。PID调参器( PIDTuner)概述1.1 简介使用PID Tuner可以对Simulink模型中的PID控制器,离散PID控制器,两自由度PID控制…

Java并发编程之堵塞队列介绍以及SkipList(跳表)

堵塞队列 先了解一下生产者消费者模式: 生产者就是生产数据的一方,消费者就是消费数据的另一方。在多线程开发中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继…

Java并发编程之线程池ThreadPoolExecutor解析

线程池存在的意义 平常使用线程即new Thread()然后调用start()方法去启动这个线程,但是在频繁的业务情况下如果在生产环境大量的创建Thread对象是则会浪费资源,不仅增加GC回收压力,并且还浪费了时间,创建线程是需要花时间的&…

Java并发编程之线程定时器ScheduledThreadPoolExecutor解析

定时器 就是需要周期性的执行任务,也叫调度任务,在JDK中有个类Timer是支持周期性执行,但是这个类不建议使用了。 ScheduledThreadPoolExecutor 继承自ThreadPoolExecutor线程池,在Executors默认创建了两种: newSin…

Spring中BeanFactory和FactoryBean的区别

先介绍一下Spring的IOC容器到底是个什么东西&#xff0c;都说是一个控制反转的容器&#xff0c;将对象的控制权交给IOC容器&#xff0c;其实在看了源代码之后&#xff0c;就会发现IOC容器只是一个存储单例的一个ConcurrentHashMap<String, BeanDefinition> BeanDefiniti…

Spring中Aware的用法以及实现

Aware 在Spring当中有一些内置的对象是未开放给我们使用的&#xff0c;例如Spring的上下文ApplicationContext、环境属性Environment&#xff0c;BeanFactory等等其他的一些内置对象&#xff0c;而在我们可以通过实现对应的Aware接口去拿到我们想要的一些属性&#xff0c;一般…

Spring Bean的生命周期以及IOC源码解析

IOC源码这一块太多只能讲个大概吧&#xff0c;建议还是去买本Spring IOC源码解析的书来看比较好&#xff0c;我也是自己看源代码以及视频整理的笔记 Bean的生命周期大概可以分为四个阶段&#xff0c;具体的等会再说&#xff0c;先看看IOC的源码吧 1、bean的创建 2、bean的属…

MongoDB位运算基本使用以及位运算应用场景

最近在公司业务上用到了二进制匹配数据&#xff0c;但是MongoDB进行二进制运算&#xff08;Bitwise&#xff09;没用过&#xff0c;网上博客文章少&#xff0c;所以就上官网看API&#xff0c;因此记录一下&#xff0c;顺便在普及一下使用二进制位运算的一些应用。 在MongoDB的…

Mybatis源码日志模块分析

看源码需要先下载源码&#xff0c;可以去Mybatis的github上的仓库进行下载&#xff0c;Mybatis 这次就先整理一下日志这一块的源码分析&#xff0c;这块相对来说比较简单而且这个模块是Mybatis的基础模块。 之前的文章有谈到过Java的日志实现&#xff0c;大家也可以参考一下&…

python手机端给电脑端发送数据_期货交易软件有哪些比较好用?分手机端和电脑端...

一、电脑端交易软件期货电脑端交易软件目前市场上用的最多的是文华财经和博易大师&#xff0c;这两个软件都是免费交易使用的。从投资者使用角度来看&#xff0c;目前电脑端文华财经的评价比博易大师高一些。当然每个投资者有自己的使用习惯&#xff0c;博易大师也有自己优点&a…

Find the Difference(leetcode389)

2019独角兽企业重金招聘Python工程师标准>>> Given two strings s and t which consist of only lowercase letters. String t is generated by random shuffling string s and then add one more letter at a random position. Find the letter that was added in …

Mybatis源码之数据源模块分析

先来看看java纯jdbc查询数据的示例&#xff1a; try {//加载对应的驱动类Class.forName("com.mysql.cj.jdbc.Driver");//创建连接Connection connection DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?serverTimezoneUTC", "roo…

Mybatis源码之缓存模块分析

缓存这个东西在很多应用中都能看到它们的身影&#xff0c;这次就讲讲在Mybatis中的缓存是怎么应用的&#xff0c;虽然说吧Mybatis中的缓存基本不怎么用&#xff0c;用的更多是第三方组件redis、MongoDB、MemCache等等。 Mybatis的缓存是基于Map实现的&#xff0c;从缓存中读写…

Mybatis源码之核心流程分析

终于谈到了Mybatis最核心的东西了&#xff0c;最核心的就是通过配置XML文件或注解中的SQL&#xff0c;直接调用接口就能执行配置好的SQL语句并封装成对应的返回类型的数据。 先看一下Mybatis使用示例&#xff1a; //创建Builder对象 SqlSessionFactoryBuilder builder new S…

Mybatis源码之与Spring集成包

这次讲讲Mybatis与Spring的整合&#xff0c;作为两款优秀的开源框架&#xff0c;被大众广泛使用&#xff0c;自然是需要强强联合的。 使用示例 先看一下怎么使用&#xff0c;首先需要引用这两款框架的jar包&#xff1a; <dependency>//spring-webmvc会自动去引入其他S…

Mybatis源码之插件模块分析

总结完这个Mybatis的整体主要功能基本上就差不多完&#xff0c;还有一些细节的部分&#xff0c;后续都会记录补充。 插件这个东西一般用的比较少&#xff0c;就算用的多的插件也算是PageHelper分页插件&#xff1b; PageHelper官网&#xff1a;https://github.com/pagehelper…

AMD推出7nm高端显卡Radeon VII,直指英伟达RTX 2080

显卡战争已经发展到了2019年&#xff0c;并且变得比任何人预想的都要激烈。 CES 2019大会上&#xff0c;AMD发布了第一款消费级的 7nm GPU&#xff0c;取名&#xff1a;Radeon VII。据了解&#xff0c;这不是 AMD 的第一颗 7nm 处理器&#xff08;早期以 AI 运算为主的 Radeon …