论文阅读:Computational Long Exposure Mobile Photography (二)
这篇文章是谷歌发表在 2023 ACM transaction on Graphic 上的一篇文章,介绍如何在手机摄影中实现长曝光的一些拍摄效果。
Abstract
长曝光摄影能拍出令人惊叹的影像,用运动模糊来呈现场景中的移动元素。它通常有两种模式,分别产生前景模糊或背景模糊效果。前景模糊图像通常是用安装在三脚架上的相机拍摄的,描绘的是移动的前景元素(如丝般的流水或光轨)呈现出模糊效果,而背景景观则非常清晰。背景模糊图像(也称为平移摄影)是在相机追踪移动主体时拍摄的,从而得到主体清晰而背景因相对运动而模糊的图像。这两种技术都极具挑战性,并且需要额外的设备和高超的技巧。
本文介绍了一种计算式连拍摄影系统,它运行在手拿式智能手机的相机应用程序中,只需按下快门按钮就能全自动地实现这些效果。我们的方法首先检测并分割出显著主体。我们对多帧画面中的场景运动进行追踪并对齐图像,以保持所需的清晰度并产生具有美感的运动拖影。我们拍摄一组曝光不足的连拍照片,并选择输入帧的子集,无论场景或相机的运动速度如何,这些子集都能产生长度可控的模糊拖影。我们预测帧间运动并合成运动模糊来填补输入帧之间的时间间隙。最后,我们将模糊图像与正常曝光的清晰图像合成,以保证面部或场景中几乎没有移动的区域的清晰度,并生成最终的高分辨率和高动态范围(HDR)照片。我们的系统使原本只有专业人士才能掌握的能力得以普及,让大多数普通摄影爱好者也能使用这种创意风格。
文章太长,分成两部分,第一部分:
Computational Long Exposure Mobile Photography (一)
Frame Selection
我们的系统使用一种帧选择机制,该机制计算运动模糊轨迹长度的估计值,以决定增量帧处理外循环何时应该停止。首先,我们利用对齐求解器计算出的变换将运动特征轨迹转换到基准帧的参考空间,在该空间中它们在空间上与输出图像中相应被跟踪特征的运动模糊轨迹对齐。然后可以计算出每条对齐轨迹的长度,并且我们使用轨迹长度分布的高百分位数作为整体模糊轨迹长度的估计值。最后将这个估计值与一个恒定的目标设置进行比较,以决定是否满足帧选择标准。
我们以图像对角线的百分比来测量轨迹长度,这种度量在很大程度上对图像分辨率或宽高比不敏感。在前景模糊的情况下,我们的标准是第 98 百分位数达到 30% 的目标,为移动最快的物体产生相对较长且平滑的模糊轨迹。在背景模糊的情况下,我们采用第 80 百分位数和 2.8% 的目标,为背景的较大区域产生短模糊轨迹,目的是保持主体清晰度并避免丢失周围场景的背景信息。这些设置是通过对大量输入连拍进行反复试验得出的经验值。
Motion Prediction
一旦输入的低分辨率图像完成对齐,我们就将它们输入到一个运动模糊核预测神经网络中,每次输入一帧对,每次迭代预测一对线条和权重核图。低分辨率核图用于以半分辨率合成运动模糊片段,跨越相应的输入帧。
运动预测模型负责预测沿线段的两个空间积分的参数,这两个空间积分近似于定义在相应时间间隔内通过每个运动模糊输出像素看到的颜色平均的时间积分。我们使用基于 [Brooks 和 Barron 2019] 的模型,并进行了进一步修改,改善了性能和图像质量之间的权衡,使我们能够在移动设备上适应合理的内存和计算预算。
他们的数学公式可预测给定图像对 k 中每个输入帧 i 的权重图 W i W_i Wi, W i W_i Wi 有 N = 17 个通道,这些通道用于对沿预测线段的每个相应纹理样本进行加权。我们通过仅预测单个通道来简化该模型,该通道用于对来自每个输入帧的积分结果进行加权。图 2 展示了一个灰度图示例,显示出网络预测在输入图像的各处权重大致相等,除了在遮挡区域,在这些区域权重偏向于两个输入之一的结果。这种简化显著降低了系统复杂性和内存使用量,并使网络能够将更多的能力用于预测线段。
- 图 6
运动预测模型斜坡函数消融。(a)从单个输入图像对合成的运动模糊移动火车的渲染图。火车前部的运动模糊特写以及相应的输入图像对,上面覆盖了表示预测线段的向量场可视化,分别在(b)和(c)中使用模型 “我们的消融(Ours-abl.)” 和 “我们的(Ours)”,即分别在没有和有斜坡函数的情况下。在图像(b)- 左图中,蓝色箭头表示运动模糊轨迹的整个跨度,红色箭头展示了在模糊轨迹中间最明显的间隙不连续性。
此外,我们消除了由于预测线段端点误差 [Zhang 等人,2016] 所导致的伪影,这些伪影会使线段在跨越的时间间隔末端无法完美衔接,从而在模糊轨迹中间产生非常明显的伪影,如图 6 所示。为避免这一问题,我们通过一个归一化的递减线性斜坡函数 wn 进一步对输入图像纹理样本进行缩放,该函数更倾向于靠近输出像素的样本,并沿着每条预测线段逐渐降低较远样本的权重。对于输入帧对 k,输出像素 (x,y) 的强度为
I k ( x , y ) = ∑ i ∈ k , k + 1 W i ( x , y ) ∑ n = 0 N − 1 w n ∑ n = 0 N − 1 w n I i ( x i n , y i n ) (6) I_{k}(x, y) = \sum_{i\in{k,k+1}} \frac{W_i(x,y)}{\sum_{n=0}^{N-1} w_n} \sum_{n=0}^{N-1} w_n I_{i}(x_{in}, y_{in}) \tag{6} Ik(x,y)=i∈k,k+1∑∑n=0N−1wnWi(x,y)n=0∑N−1wnIi(xin,yin)(6)
其中, w n = 1 − n / N w_n = 1 - n/N wn=1−n/N, 采样位置定义如下:
x i n = x + ( n N − 1 ) Δ i x ( x , y ) , y i n = y + ( n N − 1 ) Δ i y ( x , y ) x_{in} = x + (\frac{n}{N-1}) \Delta_{i}^{x}(x, y), \quad y_{in} = y + (\frac{n}{N-1}) \Delta_{i}^{y}(x, y) xin=x+(N−1n)Δix(x,y),yin=y+(N−1n)Δiy(x,y)
我们还对网络架构进行了如下修改。首先,我们将各处的带泄漏修正线性单元(Leaky ReLU)卷积激活函数全部替换为参数化的修正线性单元(ReLU)[He 等人,2015],其中斜率系数是可学习的。接下来,为了避免常见的棋盘格伪影 [Odena 等人,2016],我们将 2 倍重采样层替换为使用平均池化进行下采样,以及双线性上采样后接一个 2×2 卷积。这就得到了在后面分析的标记为 “Ours - large” 的模型。此外,为了改善浮点运算次数、参数数量和感受野之间的平衡,我们进一步将 U - Net 模型拓扑结构减少到仅 3 层,其中每层都使用 1×1 卷积,接着是一个包含 4 个 3×3 卷积层的残差网络(ResNet)块 [He 等人,2016]。这样就得到了一个标记为 “Ours” 的模型,其可学习参数显著减少。
如图 6 所示,斜坡函数 w n w_n wn 对我们所学习的单权重模型有显著益处,因为它使得预测线段在每个输入图像中跨越空间,等同于对整个时间间隔进行积分。当我们的模型在去掉这个项的情况下进行训练,得到 “Ours - abl.” 模型时,网络预测的线段在每一侧大约跨越时间间隔的一半,导致在模糊轨迹中间出现明显的不连续性。更多示例可在后面章节提供的模型比较分析中找到。
Rendering
运动预测网络输出的线条和权重核图由渲染器使用,以合成运动模糊图像。渲染器在 OpenCL 内核中实现,它在移动设备的 GPU 上运行效率非常高,在自适应地对半分辨率输入图像进行纹理采样时利用了硬件纹理单元(纹理样本数量 N 与预测线向量的长度成比例调整)。运动预测和渲染迭代可以每次针对一对输入帧进行,从而产生分段线性运动模糊轨迹。通过使用双线性纹理查找,核图从低分辨率上采样到半分辨率。
样条插值。分段线性运动插值可能会在运动轨迹中引入锯齿状的视觉伪影。为了更平滑地对运动进行插值,我们使用三次埃尔米特样条对帧间推断出的瞬时流 Δ𝑖 进行插值。
通过构建一个与(Δ𝑖⁺ + Δ𝑖⁻)平行的向量𝐻(Δ𝑖⁺, Δ𝑖⁻) 来推断每个像素处的瞬时流量𝛿𝑖,其大小等于 |Δ𝑖⁺| 和 |Δ𝑖⁻| 的调和平均数。上标 “⁺” 和 “⁻” 分别表示时间方向。如果 Δ𝑖⁺和 Δ𝑖⁻与直线路径偏离一个角度𝜃,对于较小的角度偏差(<90°),该向量会进一步按(𝜃/sin𝜃)的比例进行缩放,对于较大的偏差(路径急剧折回的地方),这种调整会逐渐回归到零,以避免出现奇异点。这些校正因子减少了过冲,并使参数样条曲线在中等曲率区域的速度更加稳定。
δ i = H ( Δ i + , Δ i − ) ( θ / sin ( θ ) ) × { 1 θ ≤ π / 2 1 − ( 2 θ / π − 1 ) 4 θ > π / 2 (7) \delta_i = H(\Delta_{i}^{+}, \Delta_i^{-})(\theta / \sin(\theta)) \times \left\{\begin{matrix} 1 & \theta \leq \pi/2 \\ 1 - (2\theta/\pi - 1)^{4} & \theta > \pi/2 \end{matrix}\right. \tag{7} δi=H(Δi+,Δi−)(θ/sin(θ))×{11−(2θ/π−1)4θ≤π/2θ>π/2(7)
对于输出位置(x,y)处图像 I k I_k Ik 在区间 [k…k+1] 上的累积模糊,我们求解一个满足四个约束条件的参数化二维三次样条路径 ρ ( x , y , t ) \rho(x,y,t) ρ(x,y,t)
- ρ ( x , y , 0 ) = ( x , y ) \rho(x, y, 0) = (x, y) ρ(x,y,0)=(x,y)
- ρ ( x , y , 1 ) = ( x , y ) + Δ i + ( x , y ) \rho(x, y, 1) = (x, y) + \Delta_i^{+}(x, y) ρ(x,y,1)=(x,y)+Δi+(x,y)
- ρ ′ ( x , y , 0 ) = δ i ( ρ ( x , y , 0 ) ) \rho'(x, y, 0) = \delta_i(\rho(x, y, 0)) ρ′(x,y,0)=δi(ρ(x,y,0))
- ρ ′ ( x , y , 1 ) = δ i + 1 ( ρ ( x , y , 1 ) ) \rho'(x, y, 1) = \delta_{i+1}(\rho(x, y, 1)) ρ′(x,y,1)=δi+1(ρ(x,y,1))
然后,我们通过在参数空间中均匀采样来沿着这条路径累积模糊,并对每个样本的权重进行归一化,以补偿图像空间中的非均匀空间采样,从而确保沿着运动轨迹的空间亮度均匀。在突发序列的端点处,我们通过尝试保持流经这些端点的流的曲率来外推第一帧和最后一帧之外的流。如图 7 所示:如果 “C” 表示突发序列中的最后一帧,那么在 “下一” 帧 D 处的运动轨迹位置是通过将 A 点关于平分 BC 的直线进行反射(构造出 A’)来外推的,然后将 CA’ 的大小限制为 | BC | 以形成 CD。接着,从点 {B,C,D} 推断出 C 处的流。
帧累积, 在实际中,模糊是通过多次遍历进行累积的:每对帧进行两次遍历,其权重在一帧和下一帧之间呈线性下降。对于在帧 I i I_{i} Ii 中位置为 p 的输出像素,通过使用上述的流样条来确定在相对时间 t 下帧 I i I_{i} Ii 中的投影位置 p’,从而累积帧 I i I_{i} Ii 和 I i + 1 I_{i+1} Ii+1 之间的模糊。对于突发序列中的 K 对帧,计算 2K 次这样的遍历(K 次向前,K 次向后)并求和以得到最终的模糊结果。对于每个时间方向:
I ( x , y ) = ∑ i = 0 K − 1 ∑ n = 0 N − 1 I i ( ρ i ( x , y , t n ) ) ∣ ρ i ′ ( x , y , t n ) w n ∣ (8) I(x, y) = \sum_{i=0}^{K-1}\sum_{n=0}^{N-1} I_{i}(\rho_i(x,y,t_n)) \left | \rho_i^{'}(x,y,t_n) w_n \right| \tag{8} I(x,y)=i=0∑K−1n=0∑N−1Ii(ρi(x,y,tn)) ρi′(x,y,tn)wn (8)
软伽马色彩空间。非常明亮的高光(例如汽车前灯)往往会使相机传感器饱和,即使在线性色彩空间中进行处理,其模糊的运动轨迹也会变得不真实地暗淡。这种截断是由于输入传感器的有限范围造成的,并且当被截断的输入高光能量分布(即合成地进行运动模糊)在许多输出像素上时,亮度损失会变得明显。
为了解决这个限制,我们在一个有意的非线性色彩空间中处理模糊,在区间 [0…1] 上使用一个可逆的类似伽马的 “软伽马” 函数
这会朝着与线性到 sRGB 色彩转换相反的方向调整亮度曲线,强调高光而不压暗阴影,使得非线性帧能够以可用的保真度存储在 16 位缓冲区中。在创建时,使用 k = 3.0 k=3.0 k=3.0 的值将该函数应用于扭曲下采样的 2 倍缓冲区,并且在累积所有帧的模糊后(通过再次应用 k = 1.0 / 3.0 k=1.0/3.0 k=1.0/3.0)进行反转。
γ s ( v ) = v v + ( 1 − v ) k ≈ v k (9) \gamma_s(v) = \frac{v}{v + (1-v)k} \approx v^{k} \tag{9} γs(v)=v+(1−v)kv≈vk(9)
Compositing
合成的模糊图像以半分辨率计算,以满足设备内存和延迟约束。因此,即使模糊图像中完全对齐的零运动区域,由于以半分辨率计算的结果进行上采样,也会丢失细节。为了保留细节,我们将模糊图像与最大锐度的常规曝光图像进行合成,在我们期望物体清晰的地方。有两类内容需要这种保护:1)静止的场景内容;2)语义上重要且几乎没有移动的主体。
对于第一类,我们生成一个在整个帧对集合中运动非常小的像素的掩码。
- (1)计算所有帧对中每个像素的最大运动幅度 |𝐹|。
- (2)计算一个参考运动幅度 |𝐹|_ref,它实际上是 |𝐹| 中所有像素的稳健最大值(即第 99 百分位数)。
- (3)重新缩放并截断每个像素的运动幅度,使得任何低于𝛼|𝐹|ref 的值被映射为 0,任何高于𝛽|𝐹|ref 的值被映射为 1。我们分别使用 0.16 和 0.32 作为𝛼和𝛽的值。
M f l o w = ∣ F ∣ − α ∣ F ∣ r e f β ∣ F ∣ r e f − α ∣ F ∣ r e f M_{flow} = \frac{|F| - \alpha |F|_{ref}}{\beta |F|_{ref} - \alpha |F|_{ref}} Mflow=β∣F∣ref−α∣F∣ref∣F∣−α∣F∣ref
- (4) 使用清晰图像作为引导应用双边模糊,以确保在 M f l o w M_{flow} Mflow 中的任何边缘对应于真实边缘,并在流场不可靠的地方(例如,像天空这样的均匀或无纹理区域)最小化伪影
第二类更加复杂,它背离了光学运动模糊的物理行为而倾向于美学。例如,如果一个场景中有两个主体以不同的轨迹移动,那么就不可能同时在两者上都清晰对齐。即使是单个主体,由于主体内部的运动(例如,面部表情的变化等)也可能无法对齐。一个主体面部模糊的图像是(不好的)模糊图像。我们的解决方案是重用前面描述的语义面部信号,修改为只包括在对齐的参考帧中具有低平均特征运动的面部。
最终的效果图例:
相关文章:

论文阅读:Computational Long Exposure Mobile Photography (二)
这篇文章是谷歌发表在 2023 ACM transaction on Graphic 上的一篇文章,介绍如何在手机摄影中实现长曝光的一些拍摄效果。 Abstract 长曝光摄影能拍出令人惊叹的影像,用运动模糊来呈现场景中的移动元素。它通常有两种模式,分别产生前景模糊或…...

基于SSM+小程序的高校寻物平台管理系统(失物1)
👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 本基于微信小程序的高校寻物平台有管理员,用户以及失主三个角色。 1、管理员功能有个人中心,用户管理,失主管理,寻物启示管理,拾…...

gerrit 搭建遇到的问题
1、启动Apache,端口被占用 : AH00072: make sock: could not bind to address (0S 10048)通常每个套接字地址(协议/网络地址/端口)只允许使用一次。: AH00072: make sock: could not bind to address 0.0.0.:443 a AH00451: no listening sockets available, shutti…...

UBUNTU查看CPU核心数
UBUNTU查看CPU核心数 前言一、使用lscpu命令1. 执行命令2. 查看输出 二、使用/proc/cpuinfo文件1. 查看文件2. 解释输出 三、使用nproc命令1. 执行命令2. 查看输出 四、使用htop或top工具1. 使用htop2. 使用top 五、使用inxi命令1. 执行命令2. 查看输出 六、使用图形界面工具1.…...

【JS】声明提升与块级作用域
我是目录 引言声明提升声明提升的理解函数表达式声明提升总结代码生成与查找变量的过程代码生成词法分析( Tokenizing/Lexing)语法分析( Parsing)代码生成生成代码总结查找变量不同版本中的执行上下文不同版本对执行上下文的定义let/constlet特点const特点let/const声明的变…...

Flink的流、批处理
Flink的数据流处理,是持续流模型,数据不会落地,上游和下游的Task同时启动,等待数据的到达,Flink的批处理还是用的MapReduce计算模型,先处理map端,再执行reduce端。 flink的流处理(STREAMING)&a…...

学习方法该升级了,AI时代的弯道超车:【心流学习法】行动与意识合一的巅峰进化
你是否曾感到内心如荒漠般干涸,面对浩瀚的知识海洋,热情逐渐消磨殆尽? 你是否渴望忘却时间的流逝,心无旁骛,与知识展开一场纯粹而深邃的对话? 在AI时代,智能体处理数据、知识迭代的速率让人…...

【大模型LLM面试合集】大语言模型架构_chatglm系列模型
chatglm系列模型 1.ChatGLM 1.1 背景 主流的预训练框架主要有三种: autoregressive自回归模型(AR模型):代表作GPT。本质上是一个left-to-right的语言模型。通常用于生成式任务,在长文本生成方面取得了巨大的成功&a…...

深入理解 Kafka:分布式消息队列的强大力量
一、引言 在现代分布式系统中,消息队列扮演着至关重要的角色,而 Kafka 作为其中的佼佼者,以其高吞吐量、可扩展性和持久性等特点被广泛应用。无论是处理海量的日志数据、实时的用户交互信息,还是复杂的微服务间通信,Ka…...

LabVIEW 离心泵机组故障诊断系统
开发了一套基于LabVIEW图形化编程语言设计的离心泵机组故障诊断系统。系统利用先进的数据采集技术和故障诊断方法,通过远程在线监测与分析,有效提升了离心泵的预测性维护能力,保证了石油化工生产的连续性和安全性。 项目背景及意义 离心泵作…...

GEE土地分类——土地分类的原始remap转化原始的土地分类名称
简介 GEE土地分类——土地分类的原始remap转化原始的土地分类名称 函数 first(image2) Selects the value of the first value for each matched pair of bands in image1 and image2. If either image1 or image2 has only 1 band, then it is used against all the bands…...

一些关于云电脑与虚拟化东西
前言 好久没有更新了,在进行自我校准。 云计算是什么? 云计算是一种模型,它使得用户能够随时随地、方便地、按需访问共享的可配置计算资源池(例如,网络、服务器、存储、应用程序和服务),这些资…...

Java实现图片转pdf
该方法可以选择多个图片是否合并为一个pdf输出,也可以选择图片为横向或者纵向输出,也可以选择pdf页面为A3或者A4 第一步 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version…...

【iOS】使用AFNetworking进行网络请求
文章目录 前言AFNetworkingAFNetworking 的核心组件AKNetworking库的常用方法使用AKNetworking进行网络请求的步骤和代码示例 总结 前言 在暑假写天气预报项目时,我们已经接触到网络请求,当时我们是使用URLSession类,即Foundation框架中用于管…...

ThingsBoard规则链节点:RPC Call Reply节点详解
引言 1. RPC Call Reply 节点简介 2. 节点配置 2.1 基本配置示例 3. 使用场景 3.1 设备控制 3.2 状态查询 3.3 命令执行 4. 实际项目中的应用 4.1 项目背景 4.2 项目需求 4.3 实现步骤 5. 总结 引言 ThingsBoard 是一个开源的物联网平台,提供了设备管理…...

【AI换装整合包及教程】OOTDiffusion:以AI技术引领的时尚换装革命
在当今数字化快速发展的时代,人工智能(AI)技术正以前所未有的速度改变着我们的生活。从智能家居到自动驾驶,从在线教育到虚拟现实,AI的应用范围正在不断扩展。而在时尚领域,一款名为OOTDiffusion࿰…...

排序算法详细总结
算法 定义:算法是解决特定问题的明确步骤集合。算法的效率通常用时间复杂度和空间复杂度来衡量。 排序算法 定义:排序算法是计算机科学中用于对元素序列进行排序的一系列算法。排序算法在各种应用中都非常常见,从简单的数据处理到复杂的数…...

uniapp MD5加密
安装: npm install js-md5 -D 引入: import Md5 from js-md5 需求加密一个对象, login_form: {openId: 123456789,phone: ,scenario: 656677,phoneSessionKey: ,openIdSessionKey: ,timeStamp: , }, //10位时间戳(秒)…...

提升视觉回归测试体验:Cypress 插件推荐
项目介绍 在现代前端开发中,视觉回归测试是确保用户界面在不同版本之间保持一致性的关键步骤。然而,传统的视觉回归测试工具往往复杂且难以使用。为了解决这一问题,我们推荐一款专为 Cypress 设计的插件:Cypress Plugin Visual Re…...

fastbootd模式刷android固件的方法
1. fastbootd追根溯源 Google在Android 10上正式引入了动态分区机制来提升OTA的可扩展性。动态分区使能后:andorid系统可以在开机阶段动态地进行分区创建、分区销毁、分区大小调整等操作,下游厂商只需要规划好super分区的总大小,其内部的各个…...

基于C#实现Windows后台窗口操作与图像处理技术分析
在Windows编程中,操作后台窗口是一项复杂而有用的技术。它可以用来自动化用户界面测试、应用程序机器人等场景。本文将深入探讨如何在C#中绑定后台窗口、获取后台窗口界面图片,以及在图片中寻找指定图标并获取坐标。本技术文章结合最先进的资料与实践经验…...

戴尔电脑 Bios 如何进入?Dell Bios 进入 Bios 快捷键是什么?
BIOS(基本输入输出系统)是计算机启动时运行的第一个程序,它负责初始化硬件并加载操作系统。对于戴尔电脑用户来说,有时可能需要进入 BIOS 进行一些特定的设置调整,比如更改启动顺序、调整性能选项或解决硬件兼容性问题…...

数据结构之二叉树——堆 详解(含代码实现)
1.堆 如果有一个关键码的集合 K { , , , … ,},把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中,则称为小堆( 或大堆 ) 。将根节点最大的堆叫做最大堆或大根堆,根节点最小的…...

推荐一款面向增材制造的高效设计平台:nTopology
nTopology是一款面向增材制造的高效设计平台,平台预置了大量增材制造常用的设计工具包,工程师通过调用若干个预置工具包、或自主开发定制的工具包,建立一个工作流,实现复杂几何结构的参数化设计。nTopology集合了的强大几何建模和…...

SQL,力扣题目1767,寻找没有被执行的任务对【递归】
一、力扣链接 LeetCode_1767 二、题目描述 表:Tasks ------------------------- | Column Name | Type | ------------------------- | task_id | int | | subtasks_count | int | ------------------------- task_id 具有唯一值的列。 ta…...

JavaScript数据类型- Symbol 详解
文章目录 前言1.唯一性2. 描述3. 作为对象属性键4. 全局注册6. 不可变性7. 隐式转换 前言 Symbol是ES6新增内容,代表创建后独一无二且不可变的数据类型,它主要是为了解决可能出现的全局变量冲突的问题 在JavaScript发展的过程中,其中的ES6带…...

WordPress网站添加嵌入B站视频,自适应屏幕大小,取消自动播放
结合bv号 改成以下嵌入式代码(自适应屏幕大小,取消自动播放) <iframe style"width: 100%; aspect-ratio: 16/9;" src"//player.bilibili.com/player.html?isOutsidetrue&bvidBV13CSVYREpr&p1&autoplay0" scrolling…...

11.6 校内模拟赛总结
打的很顺的一场 复盘 7:40 开题,看到题目名很interesting T1 看起来很典,中位数显然考虑二分,然后就是最大子段和;T2 构造?一看数据范围这么小,感觉不是很难做;T3 神秘数据结构;T…...

Redis常用的五大数据类型(列表List,集合set)
简介 List 的特点:单键多值。底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。 Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边ÿ…...

Ubuntu 20.04 部署向量数据库 Milvus + Attu
前言 最开始在自己的办公电脑(无显卡的 windows 10 系统) 上使用 Docker Desktop 部署了 Milvus 容器,方便的很, 下载 Attu 也很方便,直接就把这个向量数据库通过 Attu 这个图形化界面跑了起来,使用起来感…...