深度解析Sora的核心技术
Sora要解决的核心问题
Sora面临的挑战是将不同类型的视觉信息,如视频、文本、图像和声音等,整合为一种共同的表征形式。这种转换是实现统一训练过程的关键,旨在将各类数据集中到一个训练框架中,以便于进行大规模的统一学习。简而言之,OpenAI的目标是将视频数据和其他多种类型的数据结合起来,在一个统一的训练环境中进行处理和学习。
AI视频思路1:
在视频生成领域,有一种方法是基于单帧图像内容进行扩展,即通过分析当前帧的图像来预测下一帧的内容。这种方法将每一帧视为前一帧的自然延伸,从而创建出连续的视频流。
在制作视频时,为了提高稳定性,通常的步骤是先使用文本描述生成初始的图像,然后再基于这些图像生成视频。然而,这个过程存在一个核心问题:由于AI从文本生成图像本身就具有一定的随机性,这种随机性在基于图像生成视频的过程中被放大,导致最终的视频结果难以预测和控制。
这种方法的局限性在于,生成的帧之间缺乏深层的语义理解和本质联系。由于每帧图像的生成相对独立,这使得在文本到视频或图像到视频的转换过程中难以实现精确的控制和稳定性。以stable diffusion体系下的animediff为例,这种技术常常产生出变幻莫测的效果,不适合用于需要稳定输出的视频生成。
尽管如此,这种方法在视频转视频的应用场景中表现出色。例如,在B站上,许多美女跳舞的视频就是通过逐帧重绘技术制作的。这种方法允许创作者轻松改变视频的风格,从而创造出多样化的视觉效果。
AI视频思路2:
在视频生成领域,另一种更为主流的方法是直接对视频本身进行训练。这种方法认识到,基于单帧推导的视频效果并不理想,因此转而关注于视频内容的整体训练。
这种主流方法的操作步骤是,每次选取一段4秒钟的视频片段,并告诉AI这段视频的内容是什么。通过大规模的训练,AI可以学会生成与训练片段相似风格的4秒钟视频。
选择4秒钟的时长主要是因为视频数据相对于图像来说非常大,而显卡的显存有限。在传统方法中,我们只能将有限的视频数据放入显存中进行训练。最初,AI视频的研究仅限于8帧或16帧的视频片段,随着技术的进步,这个时长逐渐扩展到了大约4秒钟。
在这方面,Runway和Pika这两家公司是该领域的代表,它们都能够完成从文本到视频和从图像到视频的生成任务。对于AI已经学习过的内容,它们在4秒内的表现效果较好。然而,由于每次训练只包含4秒钟的视频片段,AI学习到的是片段化的内容,这导致AI难以生成长视频,且视频的连续性和稳定性较差。
此外,由于AI只获得了片段化的记忆,它很难构建对现实世界的完整理解,其“知识量”非常有限,也没有涌现出新的能力。因此,当输入AI不熟悉的内容时,生成的效果可能会非常差。
为了突破AI视频生成的难题,我们必须解决这些核心问题,包括如何提高AI对视频内容的理解能力,如何增强视频生成的连续性和稳定性,以及如何扩展AI的知识量,使其能够处理更广泛的内容。
高效地训练大体量的视频数据
进一步考虑视频数据的多样性,我们发现视频可以呈现多种形式,包括横屏和竖屏格式,以及从4K高清到低分辨率的64x64像素马赛克图片等多种分辨率。这些视频数据来源多样,具有不同的分辨率、宽高比和属性,给AI训练带来了挑战。
为了应对这些挑战,必须开发一种统一的方法来对这些视频数据进行归一化处理,以便AI可以进行大规模训练。Sora的核心任务就是找到这样一种方法,它能够将不同类型的视觉数据转换为统一的表示形式,并实现集中训练。
Sora的工作重点是将海量的视频数据转换为适合Transformer架构处理的向量形式,以便进行后续的训练。为了实现这一目标,Sora采用了多种技术手段来逐步压缩和提炼视频中的核心内容,从而使得视频数据可以在统一的框架下进行有效的训练和学习。通过这种方式,Sora能够处理不同格式的视频数据,使其能够在AI训练过程中得到有效利用。
第一步:压缩原始视频,提炼视频特征
Sora的训练过程首先将原始视频数据转化为低维度的潜空间特征,这一步骤的目的是为了解决视频和图像数据在原始形式下体积过大的问题。在日常生活中,我们观看的视频和图片通常具有很高的分辨率,包含大量的像素信息。这些高分辨率的视频和图像数据对于计算机来说是非常庞大的,直接处理这样的数据会消耗大量的计算资源,包括内存和处理时间。
通过将视频数据转化为低维度的潜空间特征,Sora可以减少数据的复杂性,同时保留视频内容的关键信息。潜空间特征是一种压缩表示,它通过算法提取出数据中最显著和最重要的特征,并将其映射到一个维度更低的向量空间中。这个过程类似于将高维数据压缩到一个更加紧凑的形式,使得AI模型可以在更高效的计算环境中进行训练和推理。这种转换不仅提高了处理效率,还使得AI模型能够更容易地捕捉到视频内容的基本结构和动态变化,从而在保持数据有用性的同时,减少了存储和处理的需求。
对于AI来说,尤其是那些设计用于处理低维度向量的模型,直接处理这些原始的、像素级的数据是非常困难的,因为它们会消耗大量的计算资源,并且训练时间会非常长。为了解决这个问题,我们需要对原始视频进行“压缩”处理,这实际上是一个特征提取的过程。这个过程涉及将视频中的像素数据转换为一组更紧凑、更易于管理的特征信息。这些特征信息代表了视频内容的关键视觉元素,如边缘、纹理、颜色分布和运动模式等,而不需要保留每个像素的具体信息。通过这种方式,我们可以大大减少数据的大小,同时保留视频内容的核心信息。这种压缩后的特征表示可以有效地输入到AI模型中,使得模型能够更快地进行训练和推理,同时还能保持较高的视频理解和生成能力。
把原图提炼成一个潜空间特征,这样把需要处理的数据量大幅压缩了,只提取里面的浓缩的精华。之后,我们可以针对潜空间的特征信息进行各种操作,并生成新的图片。正是基于这个核心原理,才有了这一轮AI绘图的大爆发。在AI绘图时,先输入了一些关键词(prompt),而这些关键词就会形成一堆潜空间特征,最终AI通过vae编码器生成一大堆类似的AI图。比如Midjourney,一次性可以生成4张都符合你描述的特征,但又略有不同的图片,其实就是这个原理的最经典体现。
从上面的例子我们可以理解,将原始的图片转化为潜空间特征,再进行处理,可以既保留原始图片的关键特征信息,同时又可以极大压缩数据量和信息量。
Sora很可能对Stable Diffusion体系下的图片VAE(变分自编码器)进行了升级,以支持视频数据的处理。这样,OpenAI就能够将大量的原始视频数据转化为低维度的潜空间特征。
这种转化过程可以类比为提炼视频的核心要点信息,这些信息能够有效地表示视频的关键内容。通过这种方式,视频被压缩至潜空间,而这些潜空间特征随后可以通过解码器还原为视频数据,类似于解压一个压缩文件。
然而,需要注意的是,这种压缩过程是有损的。这意味着将视频压缩至潜空间并再次解压,得到的视频将是原始视频的一个近似版本,而不是完全相同的副本。这种近似保留了视频的主要特征和内容,但可能会丢失一些细节信息。这种有损压缩是许多媒体处理技术中的一个常见权衡,它允许在存储和处理效率之间找到平衡。
第二步:将视频特征进一步拆分成时空图像块(spacetime patches)
在视频训练领域,为了进行大规模的视频处理和学习,我们需要定义视频训练中的基本单元,这类似于大型语言模型中的“token”。在语言模型中,token代表最小的文本单位,它可以是单词、词组或标点符号,是构成语言的基本拼图块。
将这个概念应用到视频领域,我们可以将视频想象成由一系列“patches”(补丁)组成的拼图游戏。每个patch是视频中的一个小块,它代表了视频帧中的一个局部区域,包含了时间上和空间上的信息。这些patches按照时间和空间顺序组合在一起,形成了连续的视频流。
在Sora的视频处理中,patch成为了AI视频训练的基本单元。Sora的主要任务就是预测视频序列中的下一个patch,这类似于GPT模型预测下一个token的工作。通过学习这些patches及其组合方式,Sora能够理解和生成视频内容,捕捉视频中的动态变化和关键特征。
使用patches作为基本单元的原因与语言模型中使用tokens类似,包括灵活性、效率、兼容性和提高理解力等方面:
- 灵活性:通过将视频分解为patches,模型可以更灵活地处理不同类型的视频内容,无论是静态场景还是动态变化。
- 效率:处理patches比处理整个视频帧更加高效,因为它允许模型专注于学习视频内容的关键部分。
- 兼容性:使用patches作为基本单元,模型能够处理不同分辨率和格式的视频,因为patches可以根据视频的特定属性进行调整。
- 提高理解力:通过学习大量的patches,模型能够把握视频的深层结构和时间上的连续性,从而更好地理解和生成视频内容。
总之,patches作为视频训练的基本单元,是Sora理解和生成视频内容的核心机制。通过这种方式,Sora能够在视频数据的大规模训练中发挥重要作用。
patches是图像块
由于图像通常具有较大的尺寸,直接使用这些图像进行训练并不切实际,尤其是在使用Transformer架构时。这是因为Transformer模型在处理序列数据时,期望输入的序列长度是固定的,而原始图像的像素尺寸往往过大,无法直接作为输入。
在Vision Transformer (ViT)这篇开创性的论文中,作者提出了一种将图像转换为适合Transformer处理的格式的方法。这个思路包括以下几个关键步骤:
- 图像分割:将原始图像分割成一系列固定大小的图像块(patches)。这些图像块通常是正方形的,面积相同。
- 线性嵌入:将每个图像块展平并通过一个线性层(即全连接层)转换成一个固定维度的向量。这个步骤将每个图像块映射到一个连续的特征空间中。
- 位置编码:由于Transformer模型本身不具有处理序列顺序的能力,因此需要将位置信息编码到图像块的向量中。这通常通过添加位置嵌入(position embeddings)来实现,这些位置嵌入是与图像块向量相加的固定数值,表示了每个图像块在原始图像中的位置。
- 分类嵌入:在处理图像块序列之前,通常会添加一个额外的分类嵌入(class token),这个嵌入的目的是为了在后续的模型训练中,能够区分图像的不同类别或进行其他分类任务。
- Transformer处理:将经过上述处理的图像块向量序列作为输入,送入Transformer模型进行处理。Transformer模型利用其自注意力机制,能够同时处理这些向量,捕捉图像块之间的关系,并最终理解整个图像的内容。
通过这种方式,Vision Transformer (ViT)成功地将Transformer架构应用于图像识别任务,并且取得了与传统卷积神经网络相媲美甚至更好的性能。ViT的这种设计理念为后续的视觉Transformer模型奠定了基础,并在各种视觉任务中得到了广泛应用和发展。
在处理图像时,特别是在为Transformer架构准备数据时,一个常见的做法是将图像分割成多个面积相同的图像块,这些图像块通常被称为patches。每个图像块都是原始图像的一个局部区域,包含了图像的一部分信息。
这些图像块随后会被序列化,即按照一定的顺序排列成一条线性序列。在序列化的过程中,每个图像块通常会被转换成一个固定长度的向量,这个向量可以简单理解为一串数字,它代表了图像块的特征。这个过程可以通过卷积神经网络(CNN)或其他特征提取方法来实现。
在形成最终的训练向量时,不仅图像块的特征会被包含进去,而且还会记录每个图像块在原始图像中的位置信息。这样,当模型处理这些向量时,它不仅能够了解每个图像块的内容,还能知道这些块在图像中的相对位置,这对于理解图像的整体结构和上下文是非常重要的。
通过这种方式,复杂的图像数据被转换成了Transformer架构能够处理的形式,即一系列的向量。Transformer模型利用其自注意力机制,可以同时处理这些向量,捕捉图像块之间的关系,并最终理解整个图像的内容。这种处理方法使得AI能够有效地学习和生成具有高度复杂性和多样性的图像内容。
spacetime patches是时空图像块
对于视频数据的处理,仅仅将图像分割成静态的图像块是不够的,因为视频包含了时间维度上的连续性。为了更有效地处理视频,Sora采用了时空图像块(spacetime patches)的概念,这是一种专为视频数据设计的处理技术。
时空图像块不仅包含了每个图像块的空间信息,如尺寸、颜色和纹理,还包含了这些图像块随时间的变化信息。这样,每个时空图像块实际上是一个立方体,它在空间维度上是一个小区域,在时间维度上则包含了连续几帧的信息。
通过将视频分割成时空图像块,Sora能够捕捉到视频中的动态变化和事件的发展。这些时空图像块随后被转换成一系列的向量,每个向量不仅携带了图像块的视觉信息,还包括了它们在视频中的时间和空间位置信息。这样做使得模型能够理解每个图像块的内容及其在整个视频中的相对位置和随时间的演变。
将时空图像块作为视频处理的基本单元,使得Sora能够利用Transformer架构的优势,同时处理空间和时间上的信息。这种处理方法为视频理解、生成和转换提供了强有力的工具,使得AI能够在处理视频数据时更加高效和有效。
因此,spacetime patches(时空图像块)的引入是为了同时捕捉视频中的空间信息(即图像的细节)和时间信息(即图像如何随时间变化)。这种技术允许AI模型更全面地理解和处理视频数据。
具体来说,一个spacetime patch是一个立方体,它不仅包含了视频帧中的一小块空间区域,还包含了这一区域在连续几帧中的变化。这样,每个时空图像块就携带了视频在特定时间间隔内的动态信息。通过这种方式,AI模型能够学习到视频中的运动模式、对象行为的连续性以及场景的动态变化。
在处理视频时,将这些时空图像块作为输入,AI模型可以更加深入地分析视频内容,从而在视频理解、分类、分割、生成等任务中取得更好的性能。这种方法对于处理具有复杂时间和空间关系的视频数据尤为重要,因为它能够帮助模型捕捉到视频中的关键特征和事件。
以一个跳动的心形图案视频为例,使用spacetime patches(时空图像块)可以帮助Sora捕捉到心形图案随时间跳动的动态变化。当视频被划分为时空图像块时,每个patch不仅包含了心形图案的空间细节,比如颜色、形状和纹理,还包含了这些细节随时间的变化信息。例如,一个时空图像块可能会捕捉到心形图案从收缩到膨胀再到收缩的过程,从而包含了整个跳动周期的一部分。
通过分析这些时空图像块,Sora能够学习到心形图案的跳动节奏、速度和模式,以及它与背景或其他对象的互动。这样,Sora不仅能够理解视频中的静态图像内容,还能够理解这些内容随时间的变化和动态。利用这种技术,Sora能够生成新的视频内容,其中可以包含具有丰富空间细节和时间动态的跳动心形图案。例如,它可以生成一个视频,展示不同大小、颜色和节奏的跳动心形图案,或者在不同的背景上以不同的速度跳动。
总之,时空图像块技术使Sora能够深入理解和生成视频中的时空动态,从而在视频处理和生成任务中实现更高的灵活性和表现力。
灵活的时空图像块
时空图像块的概念为我们提供了一种灵活的方式来处理视频数据,它允许我们根据需要捕捉不同尺度的时间和空间动态。这种切片可以是局部微小的细节,比如猫咪轻轻飘动的毛发;也可以是广阔的场景,比如航拍长镜头中的大范围运动。Sora利用这种灵活性来生成从连续长镜头到局部细节的各种视频内容。
在实现时空图像块的过程中,Sora可能确实参考了先前的研究和技术,如Vision Transformer(ViT)中固定尺寸图像块的思路。然而,Sora可能也采用了更先进的技术,如Navit中的“Patch n’ Pack”,以处理不同分辨率和宽高比的输入。
“Patch n’ Pack”技术允许在训练过程中灵活处理不同尺寸和比例的图像。这意味着,无论是哪种宽高比或分辨率的内容,都可以被拆分成图像块,并且这些图像块可以根据不同的需求调整大小。此外,这种技术还允许将来自不同图像的图像块打包到同一个序列中,从而使得不同分辨率和宽高比的内容可以灵活组合,形成一个统一的训练数据集。
通过这种方式,Sora能够处理和生成具有不同细节层次的视频内容,同时保持高效和稳定的表现。这种能力使得Sora在视频理解和生成任务中表现出色,能够处理从宏观场景到微观细节的广泛内容。
另外,“spacetime patches”技术在视频处理中扮演着至关重要的角色,它提供了一种高效的方式来处理视频数据,尤其是在训练阶段。由于视频中的帧与帧之间往往存在大量的重复信息,这种技术可以识别并丢弃这些雷同的图像块,从而减少训练所需的计算资源和时间。
“spacetime patches”类似于语言模型中的单词或词组(token),成为构成视频或图像的基本单元。通过将视频或图像分解成多个patch,我们实际上是将连续的视觉信息转换成了一系列可以被模型处理的离散单元。这种方法使得模型能够处理和生成各种分辨率、持续时间和宽高比的视频,因为模型学习的是视频的基本构成单元——时空图像块的表示,而不是整个视频的全貌。
Sora通过一个视频压缩网络将视频数据压缩成一个低维的潜在空间表示,这个过程既减少了视频在时间上的维度(比如减少帧数),也减少了空间上的维度(比如降低分辨率)。然后,这个压缩后的视频被分解成一系列的“时空patch”,这些patch成为了模型学习和生成的基础。
基于patch的表示方法有几个重要的好处:
- 灵活性:模型可以处理不同分辨率、不同持续时间和不同宽高比的视频和图像,因为无论原始视频或图像的规模如何,都可以通过调整patch的数量和布局来适配。
- 效率:通过将视频和图像转换成patch,模型可以更高效地学习视觉数据的复杂特征,因为每个patch都包含了局部的信息,这些信息是生成或理解整个视频和图像的关键。
- 扩展性:类似于语言模型可以通过学习大量文本token来掌握语言的复杂性,基于patch的视觉模型也可以通过学习大量视觉patch来掌握视觉世界的复杂性。
通过这种方式,Sora能够以一种高效和灵活的方式处理视频数据,从而在视频理解和生成任务中实现高性能。
Sora训练过程
通过上述解释,我们现在可以理解Sora是如何将原始视频转换为最终可训练的时空向量的。这个过程可以概括为以下几个步骤:
- 序列帧提取:首先,原始视频被转换为一系列的帧,这些帧代表了视频在时间上的连续性。
- 特征压缩与提炼:这些序列帧图片随后通过OpenAI训练的模型进行压缩和提炼,转换成时空潜空间特征(spacetime latent features)。这些特征代表了视频内容的关键视觉元素,是视频的压缩表示。
- 时空图像块分割:时空潜空间特征进一步被分割成时空图像块(Spacetime patches)。每个时空图像块包含了视频在特定时间间隔内的空间信息及其变化。
- 向量转化:最后,这些时空图像块被转化为可训练的一维空向量。这些向量代表了视频内容的基本构成单元,可以被Diffusion扩散模型所处理和训练。
通过这种方式,Sora能够将原始视频数据转换为适合Diffusion扩散模型训练的格式。这种基于时空图像块的方法不仅提高了训练的效率,还增强了模型处理不同类型视频内容的能力。最终,这种转换使得Sora能够在视频生成、编辑和其他相关任务中展现出强大的性能。
视频文本描述
OpenAI 在视频理解和生成领域取得了一项重要进展,他们开发了一种新的技术,名为 DALL·E 3,这项技术能够将简短的文本提示转化为对视频内容的详细描述。这类似于 GPT-4V,一个被微调的模型,它能够清晰地按照规范来描述视频中的内容,包括视频的主要内容、角色动作、环境背景、细节以及风格等。这些描述内容比视频原始的标题信息更加详细,为视频的生成和编辑提供了丰富的上下文信息。
此外,这些描述内容可以与前面提到的时空图像块技术相结合,用于视频的训练和生成。在训练阶段,视频数据被转换成时空图像块,这些图像块不仅包含了视频的空间信息,还包含了时间变化信息。这些时空图像块随后被转化为适合 Transformer 架构处理的一维向量,用于模型的训练。在生成阶段,AI 模型利用训练好的时空图像块,结合详细的文本描述,生成高质量的视频内容。
这种结合了文本描述和时空图像块的技术,不仅提高了视频处理的效率,还增强了 AI 模型对视频内容的理解和生成能力。OpenAI 的这一技术为视频内容的创作和编辑提供了新的可能性,有望在视频制作、媒体内容生成等领域发挥重要作用。
Diffusion Transformer训练
视频的文本描述与时空图像块转换成的向量被匹配在一起,用于训练最终的Diffusion模型。在这个过程中,Sora对原始Diffusion模型的Unet结构进行了替换,采用了Transformer架构。这一部分的实现细节基于Dit的架构(参考文献:https://arxiv.org/abs/2212.09748)。
尽管在骨干网络架构上进行了替换,但Sora的基本原理与经典的Diffusion扩散模型仍然非常相似。这种方法在大体量数据训练上表现出色,数据量越大,模型的效果越好。
通过结合文本描述和时空图像块,Sora能够在视频生成、编辑和其他相关任务中展现出强大的性能。这种结合了视觉和文本信息的方法,为视频内容的创作和编辑提供了新的可能性,有望在视频制作、媒体内容生成等领域发挥重要作用。
OpenAI 利用其强大的计算资源,对 Sora 进行了大规模的训练。这一训练过程涉及到大量的视频数据和复杂的模型架构,需要极高的计算能力和内存资源。通过这种大规模的训练,OpenAI 能够使得 Sora 模型在视频理解和生成方面达到更高的准确性和灵活性。
Sora 的训练和优化过程是 OpenAI 团队的重要工作之一。他们通过不断的调整和优化模型架构,以及采用最新的技术和算法,使得 Sora 模型在视频处理和生成方面取得了显著的进展。
OpenAI 的这种训练方式,充分利用了其在计算资源和技术方面的优势,使得 Sora 模型在视频理解和生成领域取得了重要的突破。这种训练方式也为其他研究团队提供了一种新的思路和方法,有望推动整个视频处理和生成领域的发展。
相关文章:

深度解析Sora的核心技术
Sora要解决的核心问题 Sora面临的挑战是将不同类型的视觉信息,如视频、文本、图像和声音等,整合为一种共同的表征形式。这种转换是实现统一训练过程的关键,旨在将各类数据集中到一个训练框架中,以便于进行大规模的统一学习。简而…...

设计模式面试系列-02
1. Java 中工厂模式有什么优势? 1、工厂模式是最常用的实例化对象模式,是用工厂方法代替new操作的一种模式。 2、利用工厂模式可以降低程序的耦合性,为后期的维护修改提供了很大的便利。 3、将选择实现类、创建对象统一管理和控制,从而将调用者跟我们的实现类解耦。 2. …...

MKdocs添加顶部公告栏
效果如图: docs/overrides下新建main.html ,针对main.html文件 树状结构如下: $ tree -a . ├── .github │ ├── .DS_Store │ └── workflows │ └── PublishMySite.yml ├── docs │ └── index.md │ └──overrides │…...

Android全新UI框架之常用ComposeUI组件
在Compose中,每个组件都是一个带有Composable注解的函数,被称为Composable。Compose已经预置了很多基于MD设计规范的Composable组件。 在布局方面,Compose提供了Column、Row、Box三种布局组件(感觉跟flutter差不多),类似于传统视图…...

网络防御保护综合练习
一、实验拓扑 二、实验要求 1, Fw1和Fw2组成主备模式的双机热备 2,DMZ区存在两台服务器,现在要求生产区的设备仅能在办公时间(9:00 - 18:00)访问,办公区的设备全天都可以访问。 3,办…...

Unity调用文心-ERNIE-Bot-turbo
参考文章 ERNIE-Bot-turbo - 千帆大模型平台 | 百度智能云文档 (baidu.com) 错误码 - 千帆大模型平台 | 百度智能云文档 (baidu.com) private readonly string apiKey "";private readonly string secretKey "";private readonly string tokenUrl &q…...

机器学习基本概念(李宏毅课程)
目录 一、概念:1、机器学习概念:2、深度学习概念: 二、深度学习中f(.)的输入和输出:1、输入:2、输出: 三、三种机器学习任务:1、Regression回归任务介绍:2、Classification分类任务介绍:3、Stru…...

浅谈WPF之利用RichTextBox实现富文本编辑器
在实际应用中,富文本随处可见,如留言板,聊天软件,文档编辑,特定格式内容等,在WPF开发中,如何实现富文本编辑呢?本文以一个简单的小例子,简述如何通过RichTextBox实现富文…...

w29pikachu-ssrf实例
SSRF简介 SSRF是服务器端请求伪造 危害: 1.可以对服务器所在内网、本地进行端口扫描,获取一些服务的信息等 2.目标网站本地敏感数据的读取 3.内外网主机应用程序漏洞的利用 4.内外网web站点漏洞的利用 ssrf常用的相关协议: gopher://: 发…...

使用 openssl 进行哈希计算
版本:OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022) SHAx 系列 如果对象完全存储在内存中,可以使用以下函数: #include <openssl/sha.h>unsigned char *SHA1(const unsigned char *data, size_t count, unsigned…...

深度学习基础——SSD目标检测
SSD网络介绍 使用多个特征图作为特征预测层。 SSD (Single Shot MultiBox Detector)于2016年提出。当网络输入为300300大小时,在VOC2007测试集上达到74.3%的mAP;当输入是512512大小时,达到了76.9%的mAP SSD_Backbone部分介绍 不变的部分 特征提取网…...

鸿蒙系统优缺点,能否作为开发者选择
凡是都有对立面,就直接说说鸿蒙的优缺点吧。 鸿蒙的缺点: 鸿蒙是从2019年开始做出来的,那时候是套壳Android大家都知晓。从而导致大家不看鸿蒙系统,套壳Android就是多次一举。现在鸿蒙星河版已经是纯血鸿蒙,但是它的…...

强化学习入门(Matlab2021b)-创建环境【2】
目录 1 前言2 利用step和reset函数创建自定义环境2.1 对象描述2.2 reset函数2.3 step函数2.3 构建自定义环境3 使用匿名函数传递额外的参数4 可视化检查自定义函数的输出参考链接1 前言 本文介绍如何基于MATLAB编写step、reset函数,创建自己的强化学习环境(Environment)。 使…...

OkHttp 相关问题
1、OkHttp请求整体流程是怎么样? Request-》OkHttpClient-》RealCall 同步 -》 在调用线程 执行五大拦截器 异步 -》 使用分发器将任务在线程池执行 五大拦截器 ---首先AsyncCall --加到等待队列readyAsyncCalls--》判断host有没有 已经存在。有,就赋值原来的。(reuseC…...

html的表单标签(上):form标签和input标签
表单标签 表单是让用户输入信息的重要途径。 用表单标签来完成与服务器的一次交互,比如你登录QQ账号时的场景。 表单分成两个部分: 表单域:包含表单元素的区域,用form标签来表示。表单控件:输入框,提交按…...

网页数据的解析提取(XPath的使用----lxml库详解)
在提取网页信息时,最基础的方法是使用正则表达式,但过程比较烦琐且容易出错。对于网页节点来说,可以定义id、class或其他属性,而且节点之间还有层次关系,在网页中可以通过XPath或CSS选择器来定位一个或多个节点。那么&…...

dell r740服务器黄灯闪烁维修现场解决
1:首先看一下这款DELL非常主力的PowerEdge R740服务器长啥样,不得不说就外观来说自从IBM抛弃System X系列服务器后,也就戴尔这个外观看的比较顺眼。 图一:是DELL R740前视图(这款是8盘机型) 图二ÿ…...

202426读书笔记|《尼采诗精选》——高蹈于生活之上,提升自己向下观望
202426读书笔记|《尼采诗精选》——高蹈于生活之上,提升自己向下观望 第一辑 早期尼采诗歌选辑(1858—1869年)第二辑 前期尼采遗著中的诗歌选辑(1871—1882年)第五辑 戏谑、狡计与复仇——德语韵律短诗序曲(…...

【PX4学习笔记】13.飞行安全与炸机处理
目录 文章目录 目录使用QGC地面站的安全设置、安全绳安全参数在具体参数中的体现安全绳 无人机炸机处理A:无人机异常时控操作B:无人机炸机现场处理C:无人机炸机后期维护和数据处理D:无人机再次正常飞行测试 无人机飞行法律宣传 使…...

Puppeteer 使用实战:如何将自己的 CSDN 专栏文章导出并用于 Hexo 博客(二)
文章目录 上一篇效果演示Puppeteer 修改浏览器的默认下载位置控制并发数错误重试并发控制 错误重试源码 上一篇 Puppeteer 使用实战:如何将自己的 CSDN 专栏文章导出并用于 Hexo 博客(一) 效果演示 上一篇实现了一些基本功能,…...

[ 2024春节 Flink打卡 ] -- 优化(draft)
2024,游子未归乡。工作需要,flink coding。觉知此事要躬行,未休,特记 资源配置调优内存设置 TaskManager内存模型 https://nightlies.apache.org/flink/flink-docs-release-1.18/docs/deployment/config/ TaskManager 内存模型…...

电脑进水无法开机怎么办 电脑进水开不了机的解决方法
意外总是会不定时打破你的计划,电脑这类电器最怕遇到的除了火还有水,设备进水会导致数据丢失,那么我们遇到电脑进水怎么办?进水之后不正确处理也会引起很多不必要的麻烦. 解决办法 第一步:关机 如果您的电脑是在开…...

【Flutter】底部导航BottomNavigationBar的使用
常用基本属性 属性名含义是否必须items底部导航栏的子项List是currentIndex当前显示索引否onTap底部导航栏的点击事件, Function(int)否type底部导航栏类型,定义 [BottomNavigationBar] 的布局和行为否selectedItemColor选中项图标和label的颜色否unsel…...

Vue封装全局公共方法
有的时候,我们需要在多个组件里调用一个公共方法,这样我们就能将这个方法封装成全局的公共方法。 我们先在src下的assets里新建一个js文件夹,然后建一个common.js的文件,如下图所示: 然后在common.js里写我们的公共方法,比如这里我们写了一个testLink的方法,然后在main…...

雪花算法生成分布式主键ID
直接上代码,复制即可使用 public class SnowflakeIdGenerator {private static final long START_TIMESTAMP 1624000000000L; // 设置起始时间戳,2021-06-18 00:00:00private static final long DATA_CENTER_ID_BITS 5L;private static final long WO…...

第三百五十九回
文章目录 1. 概念介绍2. 使用方法3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 013pickers2.gif 我们在上一章回中介绍了"如何实现Numberpicker"相关的内容,本章回中将介绍wheelChoose组件.闲话休提,让我们一起Talk Flutter吧。 1. 概念…...

vue3 用xlsx 解决 excel 低版本office无法打开问题
需求背景解决思路解决效果将json导出为excel将table导为excel导出样式 需求背景 原使用 vue3-json-excel ,导致在笔记本office环境下,出现兼容性问题 <vue3-json-excel class"export-btn" :fetch"excelGetList" :fields"js…...

Java后端底座从无到有的搭建(随笔)
文章目录 开发模式的演变草创时期1.0时期(基座时期)1.1时期(低代码时期)2.0时期(无代码时期) 前言:本文是笔者在初创公司,一年多来Java后端服务底座搭建过程的总结,如有不…...

Rust介绍与开发环境搭建
Rust 是一种系统编程语言,它专注于内存安全、并发和性能。它是由 Mozilla 开发的,并得到了许多社区的广泛支持。Rust 的设计理念是“安全 by default”,这意味着你不需要特殊的工具或技巧来编写安全的代码。 Rust 的主要特点: 内…...

本地TCP通讯(C++)
概要 利用TCP技术,实现本地ROS1和ROS2的通讯。 服务端代码 头文件 #include <ros/ros.h> #include "std_msgs/String.h" #include "std_msgs/Bool.h" #include <iostream> #include <cstring> #include <unistd.h>…...