Streaming Dense Video Captioning

原文出处

CVPR

原文链接

[2404.01297] Streaming Dense Video Captioningicon-default.png?t=O83Ahttps://arxiv.org/abs/2404.01297

原文笔记

What

1、提出了一种基于聚类传入token的新记忆模块,该模块可以处理任意长的视频,并且可以在不访问视频所有帧的情况下处理视频(这句话的含义是他是个因果模型)因为记忆模块的大小是固定的,所以解码时的计算预算是固定的。

2、开发了一种流解码算法,使我们的模型能够在处理整个视频之前进行预测。流输出大大降低了模型的延迟,因为我们不需要模型处理整个输入序列进行预测,这一特性意味着流媒体模型理论上可以应用于处理实时视频流,如视频会议、安全和持续监控等应用。此外流式传输输出实际上可以提高模型的准确性(由于我们有一个固定大小的内存K,从中解码输出,随着时间的推移不可避免地丢失信息,作者通过在处理整个视频前进行预测来避免这个问题)并显着提高了三个密集视频字幕基准的最高技术水平:ActivityNet、YouCook2 和 ViTT。

Why

对于密集视频描述任务:

1、现有的方法通常采用固定数量的下采样帧来处理不同长度的视频,这种方法对于短视频效果较好,对于长视频这样做有可能会损失信息。

2、现有方法都是将整个视频数据进行完整读取之后在进行的时间定位以及预测,无法满足实时caption的要求。

3、目前的模型完全依赖自回归解码在最后生成多个句子。无法满足生成长输出的要求。

(我们研究了密集视频字幕的任务——联合定位视频中的事件并为它们生成字幕。实现这一目标的理想模型应该能够处理两种长输入序列——对而未经修剪的视频进行推理——也能够处理文本空间中的长输出序列,详细描述视频中的所有事件。之前关于密集视频字幕的工作既不能处理长输入也不能处理长输出。给出一个任意长度的视频,最先进的模型要么以大跨步[11,30,48]对非常少的帧(例如,6帧/帧)进行采样(即,时间下采样),要么对所有帧[51,59,65]保持每帧一个特征(即,空间下采样)。对于长文本输出,目前的模型完全依赖于自回归解码[19]在最后生成多个句子。)

Challenge

1、重复事件的预测问题,以及所有事件的完备的预测的问题

2、长时记忆丢失信息,

3、对密集视频描述任务的因果模型来说,输出字母与视频帧没有一一对应

4、K-means算法在数据点分配到聚类中心 δ 方面是不可微的(Alg.1 的第 6 行)。

How

1、我们提供早期解码点的预测作为后续解码点的上下文。

2、在处理整个视频前做出预测。

3、提出一种流解码算法来解决这个问题。

4、然而,我们的内存模块的输入和输出是更新的聚类中心 Mt,它是输入 X = [Mt−1, ft] 的线性映射,因为 Mt = AX,其中 A 是从 X 计算的权重矩阵。因此,即使我们无法计算 A 相对于 X 的梯度,我们可以计算 Mt 相对于输入 X 的梯度,从而计算输入视觉特征 f。因此,我们可以在神经网络的任何部分使用我们的内存模块,并学习前一层的参数。

原文翻译

Abstract

密集视频字幕的理想模型——预测视频中在时间上定位的描述——应该能够处理长输入视频、预测丰富、详细的文本描述,并在处理整个视频之前能够产生输出。然而,当前最先进的模型处理固定数量的下采样帧,并在看到整个视频后做出单个完整预测。我们提出了一种流密集视频字幕模型,该模型由两个新的组件组成:首先,我们提出了一种基于聚类传入token的新记忆模块,该模块可以处理任意长的视频,因为内存的大小是固定的。其次,我们开发了一种流解码算法,使我们的模型能够在处理整个视频之前进行预测。我们的模型实现了这种流能力,并显着提高了三个密集视频字幕基准的最高技术水平:ActivityNet、YouCook2 和 ViTT。我们的代码发布在 https://github.com/google-research/scenic。

1. Introduction

视频在现代社会中无处不在,迅速成为传播信息最流行的媒体格式之一。大多数为视频理解而设计的计算机视觉模型只处理少数帧,大多数只覆盖几秒钟[31,33,39,49,58],并且通常仅限于将这些短片段分类为固定数量的概念。为了实现全面、细粒度的视频理解,我们研究了密集视频字幕的任务——联合定位视频中的事件并为它们生成字幕。实现这一目标的理想模型应该能够处理两种长输入序列——对而未经修剪的视频进行推理——也能够处理文本空间中的长输出序列,详细描述视频中的所有事件。

之前关于密集视频字幕的工作既不能处理长输入也不能处理长输出。给出一个任意长度的视频,最先进的模型要么以大跨步[11,30,48]对非常少的帧(例如,6帧/帧)进行采样(即,时间下采样),要么对所有帧[51,59,65]保持每帧一个特征(即,空间下采样)。对于长文本输出,目前的模型完全依赖于自回归解码[19]在最后生成多个句子。

在这项工作中,我们设计了一个密集视频字幕的流模型,如图1所示。由于记忆存储机制,我们的流模型不需要同时访问所有输入帧来处理视频。此外,由于采用了一种新的流解码算法,我们的模型可以在不处理整个输入序列的情况下产生因果输出。像我们这样的流媒体模型天生就适合处理长视频——因为它们每次只摄取一个帧。此外,由于输出是流的,在处理完整视频之前会产生中间预测。这一特性意味着流媒体模型理论上可以应用于处理实时视频流,如视频会议、安全和持续监控等应用。

为了开发我们的流模型,我们首先提出一种新颖的记忆机制,一次取一帧。内存模型基于K-means聚类,并使用固定数量的聚类中心令牌来表示每个时间戳的视频。该方法简单有效,可以处理可变帧数,且解码时的计算预算是固定的。

我们还开发了一种流式解码算法,并训练我们的网络,以便给定特定时间戳的“解码点”(图2),它预测在给定该时间戳的记忆特征之前结束的所有事件标题。因此,我们的网络经过训练,可以在视频的任何时间戳进行预测,而不是像传统的非流媒体模型那样,只在视频的末尾进行预测。此外,我们提供早期解码点的预测作为后续解码点的上下文。这种情境避免了对重复事件的预测,并且可以用自然语言作为“显性”记忆来总结之前的视频。我们的流输出也受到这样一个事实的驱动,即随着视频长度的增长,我们的记忆将不可避免地随着时间的推移而丢失信息,因为它的大小是有限的。我们通过在处理整个视频之前做出预测来避免这个问题,并且仍然通过语言上下文保留早期信息。

我们在三个流行的密集视频字幕数据集ActivityNet[29]、YouCook2[64]和ViTT[23]上评估我们的方法。我们的结果表明,我们的流模型比最先进的模型显着改进,后者不可避免地使用更少的帧或更少的特征,最多 11.0CIDEr 点。我们表明,我们的方法可以推广到 GIT [48] 和 Vid2Seq [59] 架构。最后,我们提出的内存也可以应用于段落字幕,将基线提高了 1-5 个 CIDEr 点。

2. Related Work

Dense video captioning.密集的视频字幕需要为事件添加字幕,并在时间上对其进行定位。传统上来说,之前的工作使用了两阶段的方法,首先在视频中定位事件,然后为它们添加字幕[24,25,29,47,50]。最近的端到端方法包括PDVC[66],它使用类似于detr的[10]模型推断事件标题和时间戳。Vid2Seq[59]使用时间戳标记增强了语言模型的词汇表,允许它们以与常规字幕模型相同的方式生成串联的事件标题。我们还使用[59]的输出公式,因为它与基础视觉语言模型[48]集成得很好。一个相关但不同的问题是电影中的音频描述[20,21,43],它需要为视障人士生成字幕,这些字幕必须与语音互补,并且经常使用辅助的非因果模型来识别角色或他们的语音。

据我们所知,所有先前的密集字幕模型都不是因果的,因为它们一次对整个视频进行编码。此外,为了处理长视频,它们通常使用大量下采样的视觉特征(通过选择几帧[11,30,48],或每帧的空间池化特征[51,59,65])。相比之下,我们以流式方式处理视频,使用记忆模块一次处理长输入序列,并使用一种新颖的解码算法流式输出句子。

Models for long videos.处理较长视频的一种常见方法是使用记忆机制来提供过去事件的紧凑表示。使用transformer,存储器,可以很容易地通过使用过去观察中的标记(token)作为当前时间步的输入来实现[13,36,56]。视觉的例子包括[22,35,53,54],它离线预提取特征并在推理过程中检索它们,因此不是因果的。MemViT[55]使用前一个时间步的令牌激活作为当前时间步的输入。然而,这意味着序列长度随着时间的推移而增长,因此它无法处理任意长的视频

记忆的另一种观点是将其视为一种将先前观察到的标记压缩成更小、固定大小的集的方法,用于未来的时间步长。令牌图灵机[41]使用[40]的令牌摘要模块总结了过去和当前的观察结果。MovieChat [44] 遵循类似的想法,但使用 Token Merging [5] 的变体来执行摘要。TeSTra[62]使用指数移动平均来整合视频特征。这种方法的优点是内存库具有固定的大小,因此无论视频的长度如何,计算成本都是有界的。我们的记忆模型具有相同的理想属性。然而,我们的内存基于聚类,使用来自类似 K-means 的算法的中心来总结每个时间步的标记,并且我们通过实验表明这优于其他替代方案。

Causal models in video.我们的流模型是因果的,这意味着它的输出仅取决于当前帧和过去的帧,而无需访问未来的帧。尽管我们不知道用于密集视频字幕的先验因果模型,但许多其他视觉领域都存在因果模型。在线动作检测[14,28,62,63]旨在实时预测视频的动作标签,而无需访问未来的帧。类似地,在线时间动作定位 [7, 26, 42] 模型还预测观察到动作后的开始和结束时间。大多数对象跟踪 [3, 52] 和视频对象分割 [9, 32, 34] 的模型也是因果的。上述任务的一个共同主题是模型必须对视频的每一帧进行预测。相比之下,我们专注于密集视频字幕 [29],这具有挑战性,因为输出字幕与视频帧没有一一对应。我们通过提出一种流解码算法来解决这个问题。

3. Streaming Dense Video Captioning

给定一个视频 V ∈ RT ×H×W ×3,我们的目标是生成一组时间定位的标题:{(s, e, c)1,。, (s, e, c)ne },其中 s ∈ R 和 e ∈ R 分别是开始和结束时间戳 (0 ≤ s < e ≤ T ),c = [w1, · · · , wn] 是单词序列标记,ne 是事件的数量。每个单词标记 wi 是 [0, |V |] 范围内的整数,索引词汇表 V。我们首先描述传统的字幕模型(第 3.1 节),然后详细说明我们如何通过带有记忆存储的流输入(第 3.2 节)和解码点的输出(第 3.3 节)来开发流模型(图 2)。

3.1. Preliminaries

字幕模型大致由视觉编码器和文本解码器组成。我们概述了这些方法,并展示了它们如何扩展到接下来的密集字幕。

Visual encoder.第一步是将视频编码为特征 f = F(V), f ∈ R^N ×D ,其中 N 是特征分辨率(即基于转换器的编码器的token数量),D 是特征维度。视觉特征编码器 F 可以是应用于每个单独帧的原生视频主干 [1, 4] 或图像编码器 [37, 60]。在后一种情况下,视频特征是一堆图像特征,即 N = T · Nf ,其中 Nf 是每帧的标记数。我们使用每帧编码,但不是从整个视频中预先提取它们,而是使用记忆机制以因果流式方式(第 3.2 节)处理特征,可以推广到更长的视频持续时间。

Text decoder.给定视觉特征 f 和可选的文本前缀标记 p,文本解码器 D 从中生成一系列单词标记 c。我们使用自回归[19,45]解码器来生成下一个单词标记wi,条件是前面的单词w1:i−1,如果提供前缀则是wi = D(f, p, w1:i−1)。请注意,前缀标记通常不用于字幕任务,而是用于问答 (QA) 来编码输入问题。具体来说,文本解码器 D 是一系列transformer层 [45],它在视觉特征 f 和前缀的词嵌入的拼接上运行 [38, 48]。这种架构已被证明在图像和视频的字幕和 QA 任务中都是有效的 [11,30,48]。

Dense video captioning with timestamps.结合上述视觉编码器和文本解码器为视频字幕提供了基本架构。为了将其扩展到使用开始和结束时间戳对多个事件进行字幕,Vid2Seq [59] 引入了两个主要修改:首先,它使用时间标记 ws 和we增强了字幕模型的词汇表 V‘,它们分别代表开始和结束时间。因此,单个事件表示为 c′ = [ws,we, w1, · · · , wn] 和 |V′| = |V | + |T |其中 |V | ≤ ws<we ≤ |V'|,|T |是时间标记的数量。其次,Vid2Seq 将所有定时字幕连接到单个长字幕中,该字幕由开始时间排序:C = [c′1, c′2, · · · , c′ne ] 其中 ne 是事件的数量。因此,密集视频字幕可以表述为目标 C 的标准视频字幕。

尽管它很有效,但(广义)Vid2Seq [59] 架构有许多关键限制:首先,它通过解码器从整个视频 f 转发视觉特征,这意味着它不能有效地扩展到更长的视频和更多的标记。此外,由于 Vid2Seq 在处理整个视频后一次预测所有事件字幕,因此它难以预测长、详细的字幕。为了解决这些问题,我们引入了流式密集视频字幕模型,其中我们使用内存模块一次处理输入以限制计算成本,并流式传输输出,以便在处理整个视频之前进行预测。

3.2. Streaming inputs using memory

输入视觉特征 f 具有维度 R^T ·Nf ×D ,其中典型值T>64用于稀疏采样(例如 1 FPS)、几分钟长视频典型值Nf = 257 个标记每帧用于视觉转换器,例如 CLIP [37]。由于自注意力的二次复杂度,直接将所有 T·Nf 馈送到文本解码器是非常昂贵的。因此,现有方法积极地对 f 进行下采样以减少令牌的数量(通过以大步幅 [11, 48] 对几帧进行时间采样,或者将每一帧在空间上子采样为单个令牌 [51, 59, 65])。即便如此,我们将随着视频时间的延长而达到内存限制,细粒度定位和描述所需的信息会丢失。因此,我们使用记忆机制逐帧处理所有标记,而不是激进的下采样,这确保了计算成本是有界的,而不考虑视频的长度。

设 K 是预定义的记忆大小,在每个时间点处的记忆Mt 总是是一个常数大小 K,即 Mt ∈ R^K×D , ∀t。我们将 M 解释为视频中所有相关信息的摘要,并通过从 f 中获取前 K 个标记来初始化它。因此,我们将 K 设置为 Nf 的倍数,使得初始记忆是第一个 K/Nf 帧的特征:MK/Nf = [f1, · · · , fK/Nf ]。

接下来,我们为每个传入帧ft在每个时间戳更新内存。我们的直觉是尽可能保留原始视频中的尽可能多的信息,同时不会增加存储预算(即通过保持恒定的内存大小 K)。因此,我们提出了一种类似 K-means 的聚类算法,使用特征聚类中心作为近似视频特征。为了避免聚类中心迅速偏向传入的特征,我们跟踪每个聚类中心合并的token的数量。我们将此用作动量权重,以便从更多token合并的聚类中心变化较慢。详细的算法图在 Alg 中提供。1,如图3所示。

K-means算法在数据点分配到聚类中心 δ 方面是不可微的(Alg.1 的第 6 行)。然而,我们的内存模块的输入和输出是更新的聚类中心 Mt,它是输入 X = [Mt−1, ft] 的线性映射,因为 Mt = AX,其中 A 是从 X 计算的权重矩阵。因此,即使我们无法计算 A 相对于 X 的梯度,我们可以计算 Mt 相对于输入 X 的梯度,从而计算输入视觉特征 f。因此,我们可以在神经网络的任何部分使用我们的内存模块,并学习前一层的参数。

3.3. Streaming outputs with decoding points

第3.2节中的记忆模块使我们能够有效地摄取长输入视频。然而,我们的模型的文本解码器在处理整个输入序列之前预测输出仍然是可取的:流输出大大降低了模型的延迟,因为我们不需要等待模型处理整个输入序列进行预测。这与处理特别相关,例如实时视频流。此外,流式传输输出实际上可以提高模型的准确性:由于我们有一个固定大小的内存 K,我们从中解码输出,我们将随着时间的推移不可避免地丢失信息。因此,我们可以通过在我们处理整个视频之前进行预测来避免这个问题。

Decoding points.如图4所示,我们将“解码点”、“di”定义为中间时间戳,在给定记忆中的特征Mdi的情况下解码事件描述。我们训练我们的模型,使得在每个解码点 di 处,模型预测在其之前完成的所有事件字幕。更具体地说,

由于解码点是顺序应用的,因此后面的解码点应该可以访问先前解码点的预测,并且不应该再次重复它们。因此,从第二个解码点开始,我们将前面解码点的输出作为文本解码器的前缀连接起来,如图4所示。此外,在训练期间,我们通过从前缀中随机删除一些先前的事件标题来执行进一步的数据增强,并将它们添加到目标中,以增加对早期预测中潜在错误的鲁棒性。因此,我们在训练期间将前缀和字幕目标表示为

在实践中,我们在训练和推理过程中统一采样解码点,间隔为S帧。由于该模型被训练为预测解码点之前的所有事件标题,这意味着在推理时间的确切位置不需要与事件边界紧密匹配。解码点的数量在训练和推理之间也可能是不同的,我们将会发现。这种方法既简单又可扩展,我们将在下一节中进行实验。

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

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

相关文章

TCP 连接:三次握手与四次挥手

TCP 协议&#xff0c;全称为“传输控制协议”。 1. TCP 协议段格式 给出几个定义 &#xff1a; 16位源端口号 &#xff1a;用于标识发送端的应用程序。 16位目的端口号 &#xff1a;用于标识接收端的目标应用程序。 32位序号 &#xff1a;用于标识发送的每一个字节流中的第一…

IDEA+Docker一键部署项目SpringBoot项目

文章目录 1. 部署项目的传统方式2. 前置工作3. SSH配置4. 连接Docker守护进程5. 创建简单的SpringBoot应用程序6. 编写Dockerfile文件7. 配置远程部署 7.1 创建配置7.2 绑定端口7.3 添加执行前要运行的任务 8. 部署项目9. 开放防火墙的 11020 端口10. 访问项目11. 可能遇到的问…

【机器学习】回归

文章目录 1. 如何训练回归问题2. 泛化能力3. 误差来源4. 正则化5. 交叉验证 1. 如何训练回归问题 第一步&#xff1a;定义模型 线性模型&#xff1a; y ^ b ∑ j w j x j \hat{y} b \sum_{j} w_j x_j y^​b∑j​wj​xj​ 其中&#xff0c;( w ) 是权重&#xff0c;( b )…

C++ 设计模式:状态模式(State Pattern)

链接&#xff1a;C 设计模式 链接&#xff1a;C 设计模式 - 备忘录 状态模式&#xff08;State Pattern&#xff09;是一种行为设计模式&#xff0c;它允许对象在内部状态改变时改变其行为。状态模式将状态的行为封装在独立的状态类中&#xff0c;并将状态的切换逻辑委托给这些…

redis开发与运维-redis0401-补充-redis流水线与Jedis执行流水线

文章目录 【README】【1】redis流水线Pipeline【1.1】redis流水线概念【1.2】redis流水线性能测试【1.2.1】使用流水线与未使用流水线的性能对比【1.2.2】使用流水线与redis原生批量命令的性能对比【1.2.3】流水线缺点 【1.3】Jedis客户端执行流水线【1.3.1】Jedis客户端执行流…

leetcode hot 100 杨辉三角

118. 杨辉三角 已解答 简单 相关标签 相关企业 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 class Solution(object):def generate(self, numRows):""":ty…

Uncaught ReferenceError: __VUE_HMR_RUNTIME__ is not defined

Syntax Error: Error: vitejs/plugin-vue requires vue (>3.2.13) or vue/compiler-sfc to be present in the dependency tree. 第一步 npm install vue/compiler-sfc npm run dev 运行成功&#xff0c;本地打开页面是空白&#xff0c;控制台报错 重新下载了vue-loa…

【微服务】【Sentinel】认识Sentinel

文章目录 1. 雪崩问题2. 解决方案3. 服务保护技术对比4. 安装 Sentinel4.1 启动控制台4.2 客户端接入控制台 参考资料: 1. 雪崩问题 微服务调用链路中的某个服务故障&#xff0c;引起整个链路中的所有微服务都不可用&#xff0c;这就是雪崩。动图演示&#xff1a; 在微服务系统…

【Python运维】构建基于Python的自动化运维平台:用Flask和Celery

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在现代IT运维中,自动化运维平台扮演着至关重要的角色,它能够显著提高运维效率,减少人为错误,并且增强系统的可维护性。本文将引导读者如…

STM32完全学习——使用定时器1精确延时

一、定时器的相关配置 首先一定要是递减定时器&#xff0c;递增的不太行&#xff0c;控制的不够准确&#xff0c;其次在大于10微秒的延时是非常准确的&#xff0c;小于的话&#xff0c;就没有那没准&#xff0c;但是凑合能用。误差都在一个微秒以内。使用高级定时器也就是时钟…

connect to host github.com port 22: Connection timed out 的解决方法

原因是 Github 被 GFW 屏蔽了。 Windows 系统&#xff0c;打开 C:\Windows\System32\drivers\etc&#xff0c;复制其中的 hosts 文件至桌面&#xff0c;用文本编辑器或者其他工具打开。 复制以下内容进去&#xff1a; 140.82.114.4 github.com 151.101.1.6 github.global.ss…

PyTorch中的autocast:混合精度训练的实现原理

PyTorch中的autocast&#xff1a;混合精度训练的实现原理 在深度学习中&#xff0c;尤其是在训练大型模型时&#xff0c;计算资源和显存消耗往往是非常关键的因素。为了优化这些问题&#xff0c;混合精度训练&#xff08;Mixed Precision Training&#xff09;应运而生。autoc…

Word格式修改

经常修改格式&#xff0c;留下这篇汇总 Word的累加符号上下标变右标指定目录&#xff1a;word如何取消封面或者目录下方的页码&#xff0c;页码从正文开始加参考文献&#xff1a;【Word】怎样给论文添加引用参考文献删空白页&#xff1a; word中无法删除空白页怎么办&#xff…

常见的排序算法过程和比较分析

比较分析 排序类别排序算法时间复杂度&#xff08;最好&#xff09;时间复杂度&#xff08;最坏&#xff09;时间复杂度&#xff08;平均&#xff09;辅助空间复杂度稳定性插入排序直接插入排序O(n)O(n)O(n)O(1)稳定插入排序折半插入排序O(n)O(n)O(n)O(1)稳定插入排序希尔排序…

随笔 | 写在2024的最后一天

. 前言 转眼又到了一年的末端。过去这一年&#xff0c;和前些年有些不同&#xff0c;变化巨大&#xff0c;感触良多。多到一时竟不知从何开始写。今天这篇随笔&#xff0c;因为时间有限&#xff0c;可能文法也会有些凌乱&#xff0c;就是想到哪里写到哪里&#xff0c;如果未来…

【QGIS入门实战精品教程】7.3:QGIS制作千层饼(DEM+等高线+影像+TIN)

文章目录 一、效果展示二、数据准备三、制作过程1. 打开软件2. 添加图层3. 制作千层饼一、效果展示 二、数据准备 订阅专栏后,从专栏配套案例数据包中的7.3.rar中获取。 1. dem 2. 影像 3. 等高线 4. tin 三、制作过程 1. 打开软件 打开QGIS软件。 QGIS软件主界面。

如何将CSDN文章 导出为 PDF文件

一、首先&#xff0c;打开我们想要导出为 PDF格式的 CSDN文章&#xff0c;以下图为例。 二、按 F12 调出浏览器调式模式后&#xff0c;选择 控制台 三、在控制台处粘贴代码 代码&#xff1a; (function(){ use strict;var articleBox $("div.article_content"…

Apache Hive常见问题

入门问题 什么是Apache Hive&#xff1f; 解释Hive的用途。Hive作为基于Hadoop的数据仓库工具是如何工作的&#xff1f;与传统关系型数据库相比&#xff0c;使用Hive有什么优势&#xff1f; Hive和关系型数据库管理系统&#xff08;RDBMS&#xff09;之间的区别是什么&#…

HTML——54. form元素属性

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>form元素属性</title></head><body><!--form标签用于创建一个表单&#xff0c;会将里面的内容一起发送服务器&#xff0c;结构类似于表格--><!-…

告别 $arr[0]: PHP 和 Laravel 中更优雅的数组处理方式

你是否曾经历过这样的惊魂时刻&#xff1a;线上代码突然崩溃&#xff0c;只因访问了一个不存在的数组元素&#xff1f;或者更糟的是&#xff0c;应用开始疯狂抛出错误&#xff0c;而你却毫无头绪&#xff1f;这一切的罪魁祸首可能就是看似人畜无害的硬编码数组索引&#xff0c;…