三维重建 几何方法 深度学习_基于深度学习的视觉三维重建研究总结

eeca252cfc914891ef74e14a4ec7e4e9.png

三维重建意义

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

66241ff68afb6fd949d1c08b7171f45c.png

6e466fe016eb4baf897bf95b586bd280.png
港科大权龙教授

三维重建定义

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

常见的三维重建表达方式

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

77097e2c45ef60f51c258745260281af.png
深度图

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

d22900aa2bcb72edf9c6551b6fc74ad8.png
体素

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

9d899b530bfdc8f5da2912d54467d6ef.png
点云

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

bfd729530d58368000022f9b48fa4341.png
用三角网格重建

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

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

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

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

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

7b49bebdbe459033c6478a01d555d5ac.png
三角网格

三维重建的分类

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

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

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

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

近几年代表性论文回顾

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

a6a4a22c197b01f79f50dec76ff49b8d.png
Depth, NIPS 2014, Cited by 1011

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

9d1f55c710eaaad347fa5b1706316991.png
主体网络

81b7a33e01d2051da080b269bbce420b.png
Scale-invariant Mean Squared Error

本文总结

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

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

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

105f48f7303afe1a7c83f494ddc2087f.png
Voxel, ECCV 2016, Cited by 342

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

d992a2cbd558063c30ad489dfcbb6a52.png
Framework

79c631e11c731292949156ac8c319afb.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 的映射。

a97926dfa16ad9545a7d31b66ba2067d.png
3D LSTM 和 3D GRU

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

42a5bb5aa64b423d51b1f6cbd938f77b.png
损失函数

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

fea41cc9194315133bb9881fbb841726.png
IoU可作为评价指标

26c34a205fb4409ed8336f8fcd0a1f30.png
Single Real-World Image Reconstruction

6192688eaeb7cfe523effdcb00eefbab.png
Reconstructing From Different Views.

本文总结

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

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

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

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

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

18190d587acc0a4e3ce98880671813a8.png
Point Cloud, CVPR 2017, Cited by 274

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

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

c7d0fac0521fbdedfb363eb33c223630.png

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

78e08febeb9d0010b1a2538b2457f96e.png
主框架

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

本文使用的 loss

ed9205fd7c866272be7b0a919fbbc746.png
倒角距离

933502e20a446c378e975e8b61eb35aa.png
搬土距离

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

9d429118c1425d040e61dc2b017aebcc.png

e60ef42b7b02f86c74b6c86742572dc8.png

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

5bd5c9a918ef984d2153b6f71877833c.png
实验可视化结果

37ff6019ec44a4aff0a56e9746d31fe8.png
实验可视化结果

b34b1ce028a69241c469fa670a1912c1.png
实验数值结果

本文总结

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

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

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

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

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

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

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

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

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

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

03918575b153d8036facaf93f0053ebb.png

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

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

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

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

cf94931b65670c510811b0d1f4c6d33a.png
Mesh, ECCV 2018, cited by 58

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

a9223c0c45752296dab17394061458b7.png
主框架

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

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

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

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

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

9857ff5870db236a0d3742636e4180c6.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的体现,如下图:

545f76ffeaf58d1c1aebc9d47e1adbb4.png
graph uppooling

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

f8d76fcc847cbccd9a55ef03a5a072b6.png
loss

4415b4e84c8f47783a1f65459f5e0879.png
loss

本文的实验结果

0d10ac6a297d71008e38af451c5bea6e.png

4dfd4983c0386b591b42ad995623f24b.png

本文总结

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

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

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

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

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

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

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

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

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

38d15be4451f4adeb209a98b58729fff.png
mask rcnn

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

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

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

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

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

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

e7adb3e46994885f2a50815d065ccc77.png
基本的pipeline

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

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

1f362d143efe219483307cff7f834650.png
总框架图

c6ee845a6ecfd3e5040d1d35bd45033f.png
分支细节

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

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

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

网格细化分支

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

921e382f35bd48e92e47ea092a7d12e3.png
网格细化分支

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

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

5db3148674241b0610fdfe7138a74fb7.png

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

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

19034ec496ca0884c5d4c2df2c30233b.png

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

模型损失函数

dc65a75508f3b18fd09ada9d0103a9b3.png
模型损失函数

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

db21392bc8a73cb146c08719e69109ad.png
网格细化损失

论文实验

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

622e3af36189db2f1491f9d6582d0a04.png

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

459ac5b3f2aa2a14a62c417f3fb7c8bd.png

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

b118be38bc32b1969ba14e3e7d02b895.png

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

533f3059c300ffc04a84a7112801ce95.png
尽管不使用边长正则化器的训练结果在标准度量中有更好的表现,但是会产生退化的预测网格,会导致输出的网格出现许多重叠的面。

39443fa0247c5f1a132309e7fcd17333.png
对比Pixel2Mesh模型,Pixel2Mesh模型的输出结果是从一个标准椭圆变形得到的,不能正确地建模有孔的物体。相反,Mesh R-Cnn可以对任意拓扑结构的物体进行建模。

Pix3D数据集

5b4edb71b0974cd74f59ba92459c8026.png
Pix3D数据集

440332b4437dc31c60423b3f2d2d51eb.png

可视化结果

5cd8a884bd99e13778726c6986882e70.png

7c9162dfa132a0cd67178edbe26f7391.png

本文总结

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

(1)借鉴mask rcnn 框架;

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

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

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

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

64fe5b7b8807045055f72e749aef71f3.png
CVPR 2019, cited by 0

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

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

6f03f801958cf8ff5b0e505c994b4b10.png

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

33c6a87dd815600e0a1c606da3d5c01a.png
主框架

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

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

Distance Metric:

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

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

20dcd505d5b8909a22e6a0cafdf2ce85.png
Diversity Constraint:

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

88a615bc224e3ef9c6f25fb1d572083f.png
Front Constraint

2cc2cc6330897abf75f5a79adcd96b92.png
对Front Constraint采样部分的解释

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

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

89c01e2f1da57ff3f8534a1830795f16.png
判别器

训练总的损失:

6352f43c55865485eb7f3677b81ae121.png

Inference (consistency constraint):

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

245291e7c6b1e4d8bb860701849f4d50.png

cb12c40c658ed1e308d0c570c422c977.png
consistency constraint

条件生成器的结构:

57e8d48655a2e50eb8a98043f9a592a3.png
条件生成器的结构(简约版本)

de45534b5402eae9aa88934d84d74583.png
条件生成器的结构(详细版本)

实验结果

79341caee016efcf13b0f525163de11d.png

72402ee1955105e671894f6b3ebce442.png

db51cee9186ffa82dd270bcd9e71eb52.png

ca4549a212f050dd6f79861e700ab747.png

988c983a20ea375ded7a33e7b0f1e6ca.png

本文总结

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

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

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

(3)提出了三种约束;

在知乎的处女作哈哈~~最后,总之,三维重建是一个很热门的方向,我也会持续的关注,并且继续写作分享。

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

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

相关文章

Codeforces Round #174 (Div. 2) Cows and Primitive Roots(数论)

Cows and Primitive Roots time limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputThe cows have just learned what a primitive root is! Given a prime p, a primitive root is an integer x (1 ≤ x < p) such …

Android之SlidingMenu使用和总结

SlidingMenu使用和总结 我们经常看到手机QQ和酷狗主界面里面都有侧滑菜单的使用,今天我们在这里介绍怎么使用SlidingMenu的使用和总结,SlingMenu是开源的,不说了多了,先爆照 第一步:下源码 // 下载 ZXing 项目源码 https://github.com/jfeinstein10/SlidingMenu …

如何让你的碎片化时间更有价值?

全世界只有3.14 % 的人关注了爆炸吧知识不知道大家有没有发现&#xff0c;我们开始变得浮躁起来了&#xff0c;我们不再愿意花大量时间去做成一件事情&#xff0c;也无法下定决心&#xff0c;改变自己糟糕的现状。却羡慕着手机屏幕里各种各样的成功人士&#xff0c;活出了自己最…

窥探Swift编程之强大的Switch

之前初识Swift中的Switch语句时&#xff0c;真的是让人眼前一亮&#xff0c;Swift中Switch语句有好多特有而且特好用的功能。说到Switch, 只要是写过程序的小伙伴对Switch并不陌生。其在程序中的出镜率还是比较高档。Switch属于程序的分支语句&#xff0c;Switch的功能便于处理…

安富莱v6开发板网口通讯_安富莱嵌入式周报第170期:2020.07.202020.07.26

说明&#xff1a;谢谢大家的关注&#xff0c;继续为大家盘点上周精彩内容。1、沁恒推出带USB3.0&#xff0c;千兆以太网&#xff0c;光纤接口的RISC内核单片机CH569 CH569/565 微控制器使用 RISC-V3A 内核&#xff0c; 支持 RISC-V 指令的 IMAC 子集。片上集成超高速USB3.0主…

连续子数组的最大和

有一个整数数组&#xff0c;求出连续子数组的和的最大值。有一个首尾相连的整数数组&#xff0c;求出连续子数组的和的最大值。在数组中&#xff0c;数字减去它右边的数字得到一个数对之差。求所有数对之差的最大值。1、思路&#xff1a; 动态规划思路&#xff1a;用函数f(i)表…

WPF中设置了WindowStyle=None后,窗口仍然有边框的解决方法

1. 设置了窗体的WindowStyle"None",窗口还是右边框&#xff0c;如下图&#xff1a; 2. 这是因为窗体默认是可以改变大小的&#xff0c;所以需要修改ResizeMode的值 ResizeMode"NoResize", 这样设置后&#xff0c;上图中的边框就没有了

两度破译“白宫密码”,让美国政府部门崩溃,却称自己是抱娃敲代码的普通妈妈

全世界只有3.14 % 的人关注了爆炸吧知识抱娃敲代码称成功是幸运而已今天我们来点正经的&#xff0c;来跟大家分享一位乘风破浪的姐姐--王小云教授。自踏入2020年以来&#xff0c;山东大学网络空间安全学院&#xff08;研究院&#xff09;院长&#xff0c;双聘院士、讲席教授王小…

github java开源项目经验_10月份Github上最热门的Java开源项目

10 月份 GitHub 上最热门的Java开源项目排行已经出炉啦&#xff0c;在本月的名单中&#xff0c;实战项目类居多&#xff0c;当然也有像JavaGuide这样学习指南类项目&#xff0c;下面就是本月上榜的10个开源项目&#xff1a;1、Java&#xff08;Star 18468&#xff09;https://g…

浙江移动无线dns服务器地址,浙江移动4g的dns服务器地址

浙江移动4g的dns服务器地址 内容精选换一换当创建文件系统后&#xff0c;您需要使用云服务器来挂载该文件系统&#xff0c;以实现多个云服务器共享使用文件系统的目的。本章节以Windows 2012版本操作系统为例进行NFS文件系统挂载&#xff0c;其他版本请参考以下主要步骤根据实际…

Android之给gridview的单元格加上分割线

有时候需要给gridview加上分割线&#xff0c;没有现成的解决方案&#xff0c;这里写好一个可以直接用的自定义gridview&#xff0c;就叫做LineGridView吧。先上图&#xff0c;zaker客户端第三方分享的gridview样式&#xff1a; 可以看到靠边的格子都是半封闭的&#xff0c;要实…

Azure Machine Learning - 如何使用 GPT-4 Turbo with Vision

介绍如何在Azure中使用GPT-4 Turbo with Vision 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0c;复旦机器人智能实验室成员&#xff0c;阿里云认证的资深架构师&#xff0c;项目管理…

系统命名与 SQL 命名之争 - 第 1 部分

创建数据库对象的命名规范 创建数据库对象时&#xff0c;开发人员可以选择一种命名方法&#xff0c;可以选择遵循传统 IBM i 行为的系统命名模式 (*SYS)&#xff0c;也可以选择遵循SQL 标准规则的 SQL 命名规范 (*SQL)。 DB2 for i 与其他数据库管理系统 (DBMS) 之间的主要差别…

C++ const 关键字使用

2019独角兽企业重金招聘Python工程师标准>>> 为什么使用const&#xff1f;采用符号常量写出的代码更容易维护&#xff1b;指针常常是边读边移动&#xff0c;而不是边写边移动&#xff1b;许多函数参数是只读不写的。const最常见用途是作为数组的界和switch分情况标号…

论大象如何装进冰箱

全世界只有3.14 % 的人关注了爆炸吧知识在这美好的一天&#xff0c;想和大家讨论一个有趣的数学话题&#xff1a;怎么才能将一只大象装进冰箱呢&#xff1f;数学的方法把大象放到冰箱里的分析学方法1&#xff09;先把大象微分&#xff0c;然后把它放到冰箱里&#xff0c;再在冰…

2020下半年新机最新消息_提前剧透 2020 年下半年五大新机

华为 Mate40系列 美帝一系列封杀骚操作&#xff0c;并没有影响到华为手机下一代的处理器——台积电代工的、采用了 5nm 进程的 Mate40 处理器——麒麟 1020。为了 3D 脸部识别&#xff0c;可能还是采用刘海屏。Mate40 Pro 的曲率更大&#xff0c;正面屏幕的视觉冲击更加震撼&am…

手把手教你学Dapr - 5. 状态管理

介绍使用状态管理&#xff0c;您的应用程序可以将数据作为键/值对存储在支持的状态存储中。您的应用程序可以使用 Dapr 的状态管理 API 使用状态存储组件来保存和读取键/值对&#xff0c;如下图所示。例如&#xff0c;通过使用 HTTP POST&#xff0c;您可以保存键/值对&#xf…

Android之drawlayout使用和总结

DrawLayout 今天发的Android之SlidingMenu博客之后,有人说out了,说用DrawLayout,我插,被叼了,然后我就到网上查drawLayout是什么?原来是侧滑菜单,好吧,赶快学习下,网上很多例子,都不怎么全面,然后找了找了呀,终于找到到了个成形的,然后自己改了下,不说了,先爆照 …

eclipse 汉化教程(语言包)

Eclipse 汉化图形教程此教程仅仅以links方式安装eclipse插件&#xff0c;且接下来主要以eclipse安装语言包为例&#xff0c;如果教程过程中哪里不对&#xff0c;请指出&#xff0c;谢谢。因使Eclipse版本太多&#xff0c;我这里就以eclipse3.5.2为例&#xff0c;讲讲如何将其汉…

4. MyBatis几个可以优化的地方

与其说是优化, 还不如说是让配置更简单.一: 连接数据库的配置单独放到一个属性文件中在 src 路径下新建一个 db.properties 属性文件, 并把数据库连接信息放入文件中, 然后在 conf.xml 文件中导入属性文件引用就可以了, 这样更好管理.1. 新建 db.properties 文件2. 写入属性信息…