【论文阅读笔记】NeRF+Mip-NeRF+Instant-NGP

目录

  • 前言
  • NeRF
    • 神经辐射场
    • 体渲染
      • 连续体渲染
      • 体渲染离散化
    • 方法
      • 位置编码
      • 分层采样
      • 体渲染推导公式(1)到公式(2)
      • 部分代码解读
        • 相机变换(重要!)
  • Mip-Nerf
    • To do
  • Instant-NGP
    • To do

前言

NeRF是NeRF系列的开山之作,将三维场景隐式的表达为神经网络的权重用于新视角合成
MipNeRF和Instant NGP分别代表了NeRF的两个研究方向,前者是抗锯齿,代表着渲染质量提升方向;后者是采用多分辨率哈希表用于加速NeRF的训练与推理速度。

通过NeRF实现新视角合成

NeRF

Title:NeRF: Representing Scenes asNeural Radiance Fields for View Synthesis
Code:nerf-pytorch
From:ECCV 2020 Oral - Best Paper Honorable Mention

神经辐射场

在这里插入图片描述
辐射场可以理解光线场,给定多张带有相机内外参的二维图片,从摄像机出发,引出到每一个像素的光线,通过对这条光线经历过的空间点的颜色 c c c和体密度体密度 σ \sigma σ进行累积,以得到二维图片上像素点的颜色,从而实现端到端训练。在这个过程中,没有显式的三维结构,如点云、体素或者Mesh,而是通过神经网络的权重 F θ F_{\theta} Fθ将三维场景连续的存储起来,通过空间位置(三维点 [ x , y , z ] [x,y,z] [x,y,z])和视角方向(球坐标系下的极角和方位角 [ θ , ϕ ] [\theta,\phi] [θ,ϕ])作为查询条件,查询出给定摄像机下的光线所经过的空间点颜色 c c c和体密度 σ \sigma σ,通过**体渲染(Volume Rendering)**得到该条光线对应像素点的颜色。

体渲染

P为三维空间中的一个点;o是摄像机的光心在世界坐标系的坐标;d为视角方向,单位向量;t为实数,表示o沿视角方向到P点的距离r(t);t n ≤ t ≤ t f ; t f,t f 分别为三维场景的近和远边界

沿着视角方向的光线上的点P可以用上图来表示,尽管论文中提到视角方向是使用 θ , ϕ \theta,\phi θ,ϕ来表示的,但代码中还是使用单位向量 d d d来表示的

连续体渲染

体渲染实际上就是将视线r上所有的点通过某种方式累计投射到图像上形成像素颜色 C ( r ) C(r) C(r)的过程:
C ( r ) = ∫ t n t f T ( t ) σ ( r ( t ) ) c ( r ( t ) , d ) d t where  T ( t ) = exp ⁡ ( − ∫ t n t σ ( r ( s ) ) d s ) (1) {C}(\boldsymbol{r})=\int_{t_n}^{t_f} T(t) \sigma(\boldsymbol{r}(t)) \boldsymbol{c}(\boldsymbol{r}(t), \boldsymbol{d}) dt \\ \text{where } T(t)=\exp \left(-\int_{t_n}^t \sigma(\boldsymbol{r}(s)) d s\right)\tag{1} C(r)=tntfT(t)σ(r(t))c(r(t),d)dtwhere T(t)=exp(tntσ(r(s))ds)(1)

其中, c ( r ( t ) , d ) \boldsymbol{c}(\boldsymbol{r}(t), \boldsymbol{d}) c(r(t),d)为三维点 r ( t ) r(t) r(t) d d d这个方向看到的颜色值; σ ( r ( t ) ) \sigma(\boldsymbol{r}(t)) σ(r(t))为体密度函数,反映的是该三维点的物理材质吸收光线的能力; T ( t ) T(t) T(t)反映的是射线上从 t n t_n tn t t t的累积透射率。tn和tf首先确定了nerf的边界,而不至于学习到无穷远;其次避免了光心到近景范围内无效采样
直观上理解σ,可以解释为每个三维点吸收光线的能力,光经过该点,一部分被吸收,一部分透射,光的强度(可以理解为 T ( t ) T(t) T(t)) 在逐渐减小,当光强为0时,后面的三维点即便可以吸收颜色,也不会对像素颜色有贡献。指数函数保证了随着σ的累积,光的强度从1逐渐减为0。

体渲染离散化

其实就是函数离散化的形式,将tn到tf拆分成N个均匀的分布空间,从每个区间中随机选取一个样本ti:

t i ∼ U [ t n + i − 1 N ( t f − t n ) , t n + i N ( t f − t n ) ] i 从1到N t_i \sim \mathcal{U}\left[t_n+\frac{i-1}{N}\left(t_f-t_n\right), t_n+\frac{i}{N}\left(t_f-t_n\right)\right] \quad i \text{ 从1到N} tiU[tn+Ni1(tftn),tn+Ni(tftn)]i 1N

然后将连续体渲染公式离散化:

C ^ ( r ) = ∑ i = 1 N T i ( 1 − exp ⁡ ( − σ i δ i ) ) c i where  T i = exp ⁡ ( − ∑ j = 1 i − 1 σ j δ j ) (2) \hat{C}(\mathbf{r})=\sum_{i=1}^N T_i\left(1-\exp \left(-\sigma_i \delta_i\right)\right) \mathbf{c}_i \quad \tag 2 \\ \text{where } T_i=\exp \left(-\sum_{j=1}^{i-1} \sigma_j \delta_j\right) C^(r)=i=1NTi(1exp(σiδi))ciwhere Ti=exp(j=1i1σjδj)(2)
where T i = exp ⁡ ( − ∑ j = 1 i − 1 σ j δ j ) T_i=\exp \left(-\sum_{j=1}^{i-1} \sigma_j \delta_j\right) Ti=exp(j=1i1σjδj)
其中, δ i = t i + 1 − t i \delta_i=t_{i+1}-t_i δi=ti+1ti 表示相邻采样点之间的距离

在这里插入图片描述
但均匀采样有明显的问题, 比如体密度较大的点如果在两个采样点之间,那么永远不可能采样到。从上图中可看出,左半张代表均匀采样,右半张代表真实分布,左边由于表面两侧被采样到,只能反应这个区间内可能存在表面,但估计的σ不一定准确。
作者提出了分层采样来试图解决这个问题。

方法

位置编码

在这里插入图片描述
网络结构由如上图所示全连接网络组成,输入x,d分别分三维点的空间位置和视线方向。该三维点的体密度只与空间位置相关,颜色还和视角相关

γ ( p ) = ( sin ⁡ ( 2 0 π p ) , cos ⁡ ( 2 0 π p ) , ⋯ , sin ⁡ ( 2 L − 1 π p ) , cos ⁡ ( 2 L − 1 π p ) ) \gamma(p)=\left(\sin \left(2^0 \pi p\right), \cos \left(2^0 \pi p\right), \cdots, \sin \left(2^{L-1} \pi p\right), \cos \left(2^{L-1} \pi p\right)\right) γ(p)=(sin(20πp),cos(20πp),,sin(2L1πp),cos(2L1πp))

还可以注意到γ(x)和γ(d)分别是对位置坐标和方向坐标的位置编码(标准正余弦位置编码),这是由于单纯坐标只能体现低频信息,位置编码可以有效的区分开两个距离很近的坐标(即低频接近但高频编码分开【但或许也有问题,离得特别近的两个点或许低频信息也不相似,私以为mipnerf考虑三维点邻域的区间,在一定程度上可以缓解】),从而帮助网络学习到高频几何和纹理细节。如下图所示,视角信息有效反应高光信息,位置编码有助于恢复高频细节。
在这里插入图片描述

分层采样

除了上述提到的均匀采样可能导致i真实表面难以正好采样到,还有均匀采样带来了很多无意义空间的无效采样,简单来说,只有空气的地方没必要进行采样,或者被遮挡区域(可见性问题,不可见区域也没必要采样,需要提前判断累积透射率是否为降为0)。
在这里插入图片描述

首先均匀采样可以得到crose color,wi可以理解为同条射线被采样的 N c N_c Nc个三维点颜色的权重:
C ^ c ( r ) = ∑ i = 1 N c w i c i , w i = T i ( 1 − exp ⁡ ( − σ i δ i ) ) \widehat{C}_c(\mathbf{r})=\sum_{i=1}^{N_c} w_i c_i, \quad w_i=T_i\left(1-\exp \left(-\sigma_i \delta_i\right)\right) C c(r)=i=1Ncwici,wi=Ti(1exp(σiδi))

根据均匀采样点的权重值归一化后按重要性重新采样得到新的 n f n_f nf个位置

w ^ i = w i / ∑ j = 1 N c w j \widehat{w}_i=w_i / \sum_{j=1}^{N_c} w_j w i=wi/j=1Ncwj

最后损失函数可以表示为:

L = ∑ r ∈ R [ ∥ C ^ c ( r ) − C ( r ) ∥ 2 2 + ∥ C ^ f ( r ) − C ( r ) ∥ 2 2 ] \mathcal{L}=\sum_{\mathbf{r} \in \mathcal{R}}\left[\left\|\widehat{C}_c(\mathbf{r})-C(\mathbf{r})\right\|_2^2+\left\|\widehat{C}_f(\mathbf{r})-C(\mathbf{r})\right\|_2^2\right] L=rR[ C c(r)C(r) 22+ C f(r)C(r) 22]

这里为什么选用两个网络来分别做粗糙采样和精细采样,参考大佬【
】。crose网络是用于均匀采样的,包含更多的是低频信息的查询,而fine网络用于重要性采样,适用于三维点高频细节的查询,两个网络起到了类似滤波器的作用。

「待做实验验证!!!Todo」

体渲染推导公式(1)到公式(2)

首先,光线通过区间 [ 0 , t + d t ) [0, t+d t) [0,t+dt) 的概率:
光线通过区间 [ 0 , t + d t ) [0, t+d t) [0,t+dt) 的概率:
T ( t + d t ) = T ( t ) ⋅ ( 1 − d t ⋅ σ ( t ) ) \begin{aligned} \mathcal{T}(t+d t) & =\mathcal{T}(t) \cdot(1-d t \cdot \sigma(t)) \end{aligned} T(t+dt)=T(t)(1dtσ(t))
可以得到
T ( t + d t ) − T ( t ) d t ≡ T ′ ( t ) = − T ( t ) ⋅ σ ( t ) \begin{aligned} \frac{\mathcal{T}(t+d t)-\mathcal{T}(t)}{d t} & \equiv \mathcal{T}^{\prime}(t)=-\mathcal{T}(t) \cdot \sigma(t) \end{aligned} dtT(t+dt)T(t)T(t)=T(t)σ(t)
1 − T ( t ) 1-\mathcal{T}(t) 1T(t) 为光线在区间 [ 0 , t ) [0, t) [0,t) 被终止的累积分布函数(CDF);
T ( t ) σ ( t ) \mathcal{T}(t) \sigma(t) T(t)σ(t) 为其对应的概率密度函数 (PDF)

其中, T ( t ) \mathcal{T}(t) T(t) 为光线通过区间 [ 0 , t ) [0, t) [0,t) 透射率,也就是没被终止的概率,从1->0; σ ( t ) \sigma(t) σ(t) 为体密度函数; d t ⋅ σ ( t ) d t \cdot \sigma(t) dtσ(t) 为光线在 [ t , t + d t ) [t, t+d t) [t,t+dt) 区间被吸收的概率,也就是被终止概率。
T ′ ( t ) = − T ( t ) ⋅ σ ( t ) T ′ ( t ) T ( t ) = − σ ( t ) ∫ a b T ′ ( t ) T ( t ) d t = − ∫ a b σ ( t ) d t log ⁡ T ( t ) ∣ a b = − ∫ a b σ ( t ) d t T ( a → b ) ≡ T ( b ) T ( a ) = exp ⁡ ( − ∫ a b σ ( t ) d t ) \begin{aligned} \mathcal{T}^{\prime}(t) & =-\mathcal{T}(t) \cdot \sigma(t) \\ \frac{\mathcal{T}^{\prime}(t)}{\mathcal{T}(t)} & =-\sigma(t) \\ \int_a^b \frac{\mathcal{T}^{\prime}(t)}{\mathcal{T}(t)} d t & =-\int_a^b \sigma(t) d t \\ \left.\log \mathcal{T}(t)\right|_a ^b & =-\int_a^b \sigma(t) d t \\ \mathcal{T}(a \rightarrow b) \equiv \frac{\mathcal{T}(b)}{\mathcal{T}(a)} & =\exp \left(-\int_a^b \sigma(t) d t\right) \end{aligned} T(t)T(t)T(t)abT(t)T(t)dtlogT(t)abT(ab)T(a)T(b)=T(t)σ(t)=σ(t)=abσ(t)dt=abσ(t)dt=exp(abσ(t)dt)
T ( a → b ) \mathcal{T}(a \rightarrow b) T(ab) 表示光线通过 a a a b b b 区间没被终止的概率,假设 [ a , b ) [a,b) [a,b) 共享 a a a点体密度和颜色

C = ∫ 0 D T ( t ) ⋅ σ ( t ) ⋅ c ( t ) d t + T ( D ) ⋅ c b g C=\int_0^D \mathcal{T}(t) \cdot \sigma(t) \cdot \mathbf{c}(t) d t+\mathcal{T}(D) \cdot \mathbf{c}_{\mathrm{bg}} C=0DT(t)σ(t)c(t)dt+T(D)cbg
c b g c_{b g} cbg 表示背景色彩

C ( a → b ) = ∫ a b T ( a → t ) ⋅ σ ( t ) ⋅ c ( t ) d t = σ a ⋅ c a ∫ a b T ( a → t ) d t = σ a ⋅ c a ∫ a b exp ⁡ ( − ∫ a t σ ( u ) d u ) d t = σ a ⋅ c a ∫ a b exp ⁡ ( − σ a u ∣ a t ) d t = σ a ⋅ c a ∫ a b exp ⁡ ( − σ a ( t − a ) ) d t = σ a ⋅ c a ⋅ exp ⁡ ( − σ a ( t − a ) ) − σ a ∣ a b = c a ⋅ ( 1 − exp ⁡ ( − σ a ( b − a ) ) ) \begin{aligned} \boldsymbol{C}(a \rightarrow b) & =\int_a^b \mathcal{T}(a \rightarrow t) \cdot \sigma(t) \cdot \mathbf{c}(t) d t \\ & =\sigma_a \cdot \mathbf{c}_a \int_a^b \mathcal{T}(a \rightarrow t) d t \\ & =\sigma_a \cdot \mathbf{c}_a \int_a^b \exp \left(-\int_a^t \sigma(u) d u\right) d t \\ & =\sigma_a \cdot \mathbf{c}_a \int_a^b \exp \left(-\left.\sigma_a u\right|_a ^t\right) d t \\ & =\sigma_a \cdot \mathbf{c}_a \int_a^b \exp \left(-\sigma_a(t-a)\right) d t \\ & =\left.\sigma_a \cdot \mathbf{c}_a \cdot \frac{\exp \left(-\sigma_a(t-a)\right)}{-\sigma_a}\right|_a ^b \\ & =\mathbf{c}_a \cdot\left(1-\exp \left(-\sigma_a(b-a)\right)\right)\end{aligned} C(ab)=abT(at)σ(t)c(t)dt=σacaabT(at)dt=σacaabexp(atσ(u)du)dt=σacaabexp(σauat)dt=σacaabexp(σa(ta))dt=σacaσaexp(σa(ta)) ab=ca(1exp(σa(ba)))

T ( a → c ) = = exp ⁡ ( − [ ∫ a b σ ( t ) d t + ∫ b c σ ( t ) d t ] ) = exp ⁡ ( − ∫ a b σ ( t ) d t ) exp ⁡ ( − ∫ b c σ ( t ) d t ) = T ( a → b ) ⋅ T ( b → c ) \begin{aligned} \mathcal{T}(a \rightarrow c)= & =\exp \left(-\left[\int_a^b \sigma(t) d t+\int_b^c \sigma(t) d t\right]\right) \\ & =\exp \left(-\int_a^b \sigma(t) d t\right) \exp \left(-\int_b^c \sigma(t) d t\right) \\ & =\mathcal{T}(a \rightarrow b) \cdot \mathcal{T}(b \rightarrow c)\end{aligned} T(ac)==exp([abσ(t)dt+bcσ(t)dt])=exp(abσ(t)dt)exp(bcσ(t)dt)=T(ab)T(bc)

T n = T ( t n ) = T ( 0 → t n ) = exp ⁡ ( − ∫ 0 t n σ ( t ) d t ) = exp ⁡ ( ∑ k = 1 n − 1 − σ k δ k ) \mathcal{T}_n=\mathcal{T}\left(t_n\right)=\mathcal{T}\left(0 \rightarrow t_n\right)=\exp \left(-\int_0^{t_n} \sigma(t) d t\right)=\exp \left(\sum_{k=1}^{n-1}-\sigma_k \delta_k\right) Tn=T(tn)=T(0tn)=exp(0tnσ(t)dt)=exp(k=1n1σkδk)

C ( t N + 1 ) = ∑ n = 1 N ∫ t n t n + 1 T ( t ) ⋅ σ n ⋅ c n d t = ∑ n = 1 N ∫ t n t n + 1 T ( 0 → t n ) ⋅ T ( t n → t ) ⋅ σ n ⋅ c n d t = ∑ n = 1 N T ( 0 → t n ) ∫ t n t n + 1 T ( t n → t ) ⋅ σ n ⋅ c n d t = ∑ n = 1 N T ( 0 → t n ) ⋅ ( 1 − exp ⁡ ( − σ n ( t n + 1 − t n ) ) ) ⋅ c n \begin{aligned} \boldsymbol{C}\left(t_{N+1}\right) & =\sum_{n=1}^N \int_{t_n}^{t_{n+1}} \mathcal{T}(t) \cdot \sigma_n \cdot \mathbf{c}_n d t \\ & =\sum_{n=1}^N \int_{t_n}^{t_{n+1}} \mathcal{T}\left(0 \rightarrow t_n\right) \cdot \mathcal{T}\left(t_n \rightarrow t\right) \cdot \sigma_n \cdot \mathbf{c}_n d t \\ & =\sum_{n=1}^N \mathcal{T}\left(0 \rightarrow t_n\right) \int_{t_n}^{t_{n+1}} \mathcal{T}\left(t_n \rightarrow t\right) \cdot \sigma_n \cdot \mathbf{c}_n d t \\ & =\sum_{n=1}^N \mathcal{T}\left(0 \rightarrow t_n\right) \cdot\left(1-\exp \left(-\sigma_n\left(t_{n+1}-t_n\right)\right)\right) \cdot \mathbf{c}_n\end{aligned} C(tN+1)=n=1Ntntn+1T(t)σncndt=n=1Ntntn+1T(0tn)T(tnt)σncndt=n=1NT(0tn)tntn+1T(tnt)σncndt=n=1NT(0tn)(1exp(σn(tn+1tn)))cn

T ( 0 → t n ) ⋅ ( 1 − exp ⁡ ( − σ n ( t n + 1 − t n ) ) ) \mathcal{T}\left(0 \rightarrow t_n\right) \cdot\left(1-\exp \left(-\sigma_n\left(t_{n+1}-t_n\right)\right)\right) T(0tn)(1exp(σn(tn+1tn)))表示光线正好在 t N + 1 t_{N+1} tN+1位置的颜色的权重(**透射率*该点的颜色吸收率=该点颜色的贡献率,对应代码中的weights,代码中的 α \alpha α指代 1 − e x p ( − σ ∗ δ ) ∗ ∗ 1-exp(-\sigma*\delta)** 1exp(σδ)

C ( t N + 1 ) = ∑ n = 1 N T n ⋅ ( 1 − exp ⁡ ( − σ n δ n ) ) ⋅ c n , where T n = exp ⁡ ( ∑ k = 1 n − 1 − σ k δ k ) \boldsymbol{C}\left(t_{N+1}\right)=\sum_{n=1}^N \mathcal{T}_n \cdot\left(1-\exp \left(-\sigma_n \delta_n\right)\right) \cdot \mathbf{c}_n, \quad \\ \text{where} \quad \mathcal{T}_n=\exp \left(\sum_{k=1}^{n-1}-\sigma_k \delta_k\right) C(tN+1)=n=1NTn(1exp(σnδn))cn,whereTn=exp(k=1n1σkδk)

部分代码解读

相机变换(重要!)
  • 关于nerf相机方向的解读

  • 关于llff格式数据使用的NDC空间解读
    简单来说就是针对不同种类的数据在不同的空间进行计算,如360度合成数据lego(直接从相机坐标系变换到世界坐标系下)或者无界数据llff(NDC空间能将近远景范围限制在0-1之间)

Mip-Nerf

To do

Instant-NGP

To do

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

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

相关文章

DIP——边缘提取与分割

1.使用canny算法进行边缘提取 本实验比较简单,基本思路是对原图像进行一个高斯模糊处理,用于去噪,之后转换为灰度图,直接调用cv库中的canny记性边缘提取。若想直接得到彩色边缘,则通过按位与操作,将原始彩色…

ingress介绍和ingress通过LoadBalancer暴露服务配置

目录 一.ingress基本原理介绍 1.将原有用于暴露服务和负载均衡的服务的三四层负载均衡变为一个七层负载均衡 2.controller和ingress 3.通过下面这个图可能会有更直观的理解 二.为什么会出现ingress 1.NodePort存在缺点 2.LoadBalancer存在缺点 三.ingress三种暴露服务的…

基于JavaWeb+SSM+Vue微信小程序的科创微应用平台系统的设计和实现

基于JavaWebSSMVue微信小程序的科创微应用平台系统的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 Lun文目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想 1 2相关技术…

Linux Component概述和高通component的使用

1 Linux为什么要引入Component框架? 为了让subsystem按照一定顺序初始化设备才提出来的。 subsystem中由很多设备模块,内核加载这些模块的时间不确定。子系统内有些模块是需要依赖其它模块先初始化才能进行自己初始化工作(例如v4l2 subdev和v4l2 video …

【C语言程序设计】编写简单的C程序

目录 前言 一、程序设计 二、程序改错 三、程序完善 总结 🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。 💡本文由Filotimo__✍️原创,首发于CSDN📚。 📣如…

unity 2d 入门 飞翔小鸟 死亡 显示GameOver(十四)

1、添加Img create->ui->img 把图片拖进去 2、和分数一样、调整位置 3、修改角色脚本 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Fly : MonoBehaviour {//获取小鸟(刚体)private Rigidbod…

【Apipost】批量删除我的51CTO文章

文章目录 一、序二、API分析三、Apipost测试四、脚本五、Apipost中完成 一、序 去年开始再51CTO同步更新文章,一年多过去了,只涨了3个粉丝。看了下这个平台就是卖课、搞培训的,退出了。决定把文章也删除了(有人私信我说专门注册了…

ToolkenGPT:用大量工具增强LLM

深度学习自然语言处理 原创作者:cola 用外部工具增强大型语言模型(LLM)已经成为解决复杂问题的一种方法。然而,用样例数据对LLM进行微调的传统方法,可能既昂贵又局限于一组预定义的工具。最近的上下文学习范式缓解了这一问题,但有…

Shell 常用命令详解-上

Shell 常用命令详解-上 1.目录查阅相关命令2.文件操作相关命令 1.目录查阅相关命令 ll 命令 命令描述:ll命令用于显示指定工作目录下的内容。 命令格式:ll [参数] [目录名]。 参数说明: 参数说明-a显示所有文件及目录(包括隐藏文…

【机器学习】041_模型开发迭代过程

一、模型开发的一般步骤 1. 明确研究问题 确定问题的组成和结果,明晰问题是分类问题还是回归问题 2. 决定系统总体架构 ①理解数据:采集(爬取)数据,生成(导入)数据,进行数据清洗…

代码随想录二刷 |二叉树 |101. 对称二叉树

代码随想录二刷 |二叉树 |101. 对称二叉树 题目描述解题思路 & 代码实现递归法迭代法使用队列使用栈 题目描述 101.对称二叉树 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,…

zcms企业官网建站系统源码搭建-支持页面自定义

1.支持mysql,sqlite,access三种数据库。 2.模板和标签与asp版的zzzcms通用。 3.asp版的zzzcms的access数据库可直接使用。 4.支持手机站。 (增删改查不做描述): 网站信息 名称,logo,微信&…

基于OpenCV的流水线包装箱检测计数应用(附源码)

导 读 本文主要介绍基于OpenCV的流水线包装箱检测计数应用,并给出源码。 资源下载 完整代码和视频下载地址: https://github.com/freedomwebtech/rpi4-conveyor-belt-boxces-counter 核心代码如下(cboxtest.py): import cv2import numpy as npfrom tracker import*cap=c…

【MYSQL】单表查询

查询语法: select 字段(*表示全字段) from 数据表 【where 条件表达式】 【group by 分组字段【having 分组条件表达式】】 【order by 排序字段【asc | desc】】 例子: 教职工表Teacher(Tno, TName, age, sal, mgr, DNo)&#…

C# 图解教程 第5版 —— 第17章 转换

文章目录 17.1 什么是转换17.2 隐式转换17.3 显示转换和强制转换17.4 转换的类型17.5 数字的转换17.5.1 隐式数字转换17.5.2 溢出检测上下文17.5.3 显示数字转换 17.6 引用转换17.6.1 隐式引用转换17.6.2 显式引用转换17.6.3 有效显式引用转换 17.7 装箱转换17.7.1 装箱是创建副…

MySQL - 聚簇索引和非聚簇索引,回表查询,索引覆盖,索引下推,最左匹配原则

聚簇索引和非聚簇索引 聚簇索引和非聚簇索引是 InnoDB 里面的叫法 一张表它一定有聚簇索引,一张表只有一个聚簇索引在物理上也是连续存储的 它产生的过程如下: 表中有无有主键索引,如果有,则使用主键索引作为聚簇索引;…

【Scala】Scala中的一些基本数据类型的特性 列表、元组、构造器、单例对象、伴生类、伴生对象、抽象类与特质

列表 使用List(“”,“”,“”)去声明 sliding 和 groued表示迭代器 val iter List("Hadoop", "Spark", "Scala") sliding 2// sliding 和 groued 是有区别的while (iter.hasNext){println(iter.next())}for (elem <- iter){println(elem)}…

极速学习SSM之SpringMVC笔记

文章目录 一、SpringMVC简介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特点 二、HelloWorld1、开发环境2、创建maven工程a>添加web模块b>打包方式&#xff1a;warc>引入依赖 3、配置web.xmla>默认配置方式b>扩展配置方式 4、创建请求控制器5、创建springMVC…

Kafka 最佳实践:构建可靠、高性能的分布式消息系统

Apache Kafka 是一个强大的分布式消息系统&#xff0c;被广泛应用于实时数据流处理和事件驱动架构。为了充分发挥 Kafka 的优势&#xff0c;需要遵循一些最佳实践&#xff0c;确保系统在高负载下稳定运行&#xff0c;数据可靠传递。本文将深入探讨 Kafka 的一些最佳实践&#x…

四. 基于环视Camera的BEV感知算法-环视背景介绍

目录 前言0. 简述1. 环视背景介绍2. 环视思路3. 主流基于环视Camera的算法详解总结下载链接参考 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第四章——基于环视Camer…