联合嵌入预测架构(JEPA):从理论构想到世界模型的实践之路

联合嵌入预测架构(JEPA):从理论构想到世界模型的实践之路

1. 引言与概述

2022年,图灵奖得主、Meta首席AI科学家Yann LeCun发表了一篇影响深远的立场论文《A Path Towards Autonomous Machine Intelligence》,在这篇论文中,他系统性地阐述了一种全新的机器学习范式——联合嵌入预测架构(Joint Embedding Predictive Architecture,简称JEPA)。这一架构的提出并非空中楼阁,而是基于LeCun对当前人工智能发展路径的深刻反思:他认为当前以自回归生成为核心的大型语言模型(LLM)并非通往人类级别智能的最优路径,真正的通用人工智能需要具备像人类一样构建世界内部模型、理解物理规律、进行因果推理的能力。

JEPA的核心思想源于认知科学中的预测编码理论(Predictive Coding Theory),该理论认为生物神经系统的学习本质上是通过预测感官输入来构建对世界的内部表征。与传统的生成式模型在像素或token空间进行重建不同,JEPA在抽象的表征空间中进行预测,这使得模型能够专注于捕捉数据中可预测的、具有语义意义的规律,同时忽略那些难以预测且与任务无关的低层细节。从2023年的I-JEPA到2024年的V-JEPA,再到2025年的V-JEPA 2,这一架构经历了从静态图像到动态视频、从纯观察学习到动作条件世界模型的演进历程。

1.1 JEPA家族演进时间线

时间模型核心贡献
2022年6月JEPA理论LeCun发表立场论文,提出JEPA理论框架
2023年6月I-JEPA图像领域首次实践,无需数据增强的自监督学习
2024年2月V-JEPA扩展至视频领域,学习时空动态表征
2025年6月V-JEPA 2引入动作条件,构建可用于机器人控制的世界模型
2025年12月VL-JEPA视觉-语言联合架构,实时多模态理解

2. 从监督学习到自监督学习的演进

2.1 监督学习的局限性

机器学习的发展历程中,监督学习(Supervised Learning)长期占据主导地位。在监督学习范式下,模型通过大量标记样本进行训练,输入数据与输出标签之间存在明确的对应关系。例如,在图像分类任务中,每张图片都需要人工标注其所属类别;在目标检测任务中,每个物体的边界框和类别都需要精确标记。这种方法虽然直观有效,但存在三个根本性的局限。

第一,高质量标注数据的获取成本极高。以医学影像诊断为例,每张CT或MRI图像的标注都需要具备专业资质的医生完成,这不仅耗时耗力,而且在某些罕见病例上几乎无法获得足够的标注样本。据统计,在典型的监督学习项目中,约80%的时间和资源消耗在数据收集与清洗环节。第二,监督学习模型容易产生过拟合,对训练数据分布之外的样本泛化能力有限,面对对抗样本时表现出较差的鲁棒性。第三,监督学习从根本上无法利用海量的无标签数据,而互联网上绝大多数的图像、视频、文本数据都是未经标注的。

2.2 半监督学习与无监督学习

为了突破监督学习的局限,研究者们发展出了半监督学习(Semi-supervised Learning)和无监督学习(Unsupervised Learning)两条路径。半监督学习试图结合少量有标签数据和大量无标签数据进行训练,其核心假设是数据的内在分布结构可以帮助模型更好地学习决策边界。例如,伪标签(Pseudo-labeling)方法首先用有标签数据训练一个初始模型,然后用该模型对无标签数据进行预测,将高置信度的预测结果作为新的标签加入训练集,形成迭代优化的闭环。

无监督学习则完全放弃对标签的依赖,转而专注于发现数据本身的内在结构和模式。聚类算法(如K-means)、降维算法(如PCA、t-SNE)、密度估计等都属于经典的无监督学习方法。然而,传统无监督学习方法在表征学习(Representation Learning)方面的能力有限,难以学习到适用于下游任务的高质量特征表示。

2.3 自监督学习的崛起

自监督学习(Self-supervised Learning)是一种特殊的无监督学习形式,它通过设计巧妙的代理任务(Pretext Task),从无标签数据中自动生成监督信号。正如何恺明团队在MoCo论文中所指出的,自监督学习本质上是"不包含人类注释标签的监督学习"。这种方法的核心洞察在于:数据本身蕴含着丰富的结构信息,通过预测数据的某些部分或属性,模型可以学习到有意义的表征。

自监督学习的代理任务设计多种多样。早期的方法包括预测图像旋转角度、解决拼图问题、图像着色等。这些任务虽然与最终的下游任务(如分类、检测)没有直接关联,但迫使模型在完成这些任务的过程中学习到图像的语义结构。随着研究的深入,两类主流的自监督学习方法逐渐形成:基于对比学习的方法和基于掩码重建的方法。

在这里插入图片描述

3. 对比学习——自监督学习的重要分支

3.1 对比学习的基本原理

对比学习(Contrastive Learning)可以理解为度量学习(Metric Learning)与自监督学习的结合。其核心思想是:在表征空间中,相似的样本(正样本对)应该彼此靠近,而不相似的样本(负样本对)应该相互远离。在自监督场景下,正样本对通常通过对同一图像应用不同的数据增强(Data Augmentation)来构建——例如,对一张猫的图片分别进行随机裁剪、颜色抖动、水平翻转后得到的两个视图,虽然在像素层面差异显著,但在语义层面都表示同一只猫,因此应该在表征空间中被映射到相近的位置。

在这里插入图片描述

对比学习的数学形式通常采用InfoNCE损失函数。给定一个正样本对 ( x i , x j ) (x_i, x_j) (xi​,xj​) 和一组负样本 { x k } k ≠ i \{x_k\}_{k \neq i} {xk​}k=i​,损失函数定义为:

L = − log ⁡ exp ⁡ ( sim ( z i , z j ) / τ ) ∑ k = 1 N exp ⁡ ( sim ( z i , z k ) / τ ) \mathcal{L} = -\log \frac{\exp(\text{sim}(z_i, z_j) / \tau)}{\sum_{k=1}^{N} \exp(\text{sim}(z_i, z_k) / \tau)} L=−log∑k=1N​exp(sim(zi​,zk​)/τ)exp(sim(zi​,zj​)/τ)​

其中 z i , z j z_i, z_j zi​,zj​ 是样本经过编码器后的表征向量, sim ( ⋅ , ⋅ ) \text{sim}(\cdot, \cdot) sim(⋅,⋅) 是余弦相似度函数, τ \tau τ 是温度参数。从几何直观上理解,余弦相似度度量的是两个向量在单位球面上的距离——当两个向量方向一致时,相似度为1;当两个向量正交时,相似度为0;当两个向量方向相反时,相似度为-1。

在这里插入图片描述

3.2 对比学习的代表性工作

对比学习领域涌现出一系列里程碑式的工作。SimCLR由Google的Geoffrey Hinton团队提出,通过简单而有效的框架证明了大批量训练和强数据增强对于对比学习的重要性。MoCo(Momentum Contrast)由何恺明团队提出,引入动量编码器和队列机制,解决了对比学习对大批量大小的依赖问题。BYOL(Bootstrap Your Own Latent)进一步证明,即使不使用负样本,仅通过预测另一个增强视图的表征,也能学习到高质量的表示。SwAV则将对比学习与聚类相结合,通过在线聚类分配实现更高效的学习。

4. 生成式自监督学习

4.1 掩码自编码器(MAE)

与对比学习的判别式路径不同,生成式自监督学习采用重建的方式进行表征学习。掩码自编码器(Masked Autoencoder,MAE)是这一方向的代表性工作。MAE的灵感来源于自然语言处理领域的BERT模型,其核心思想是随机遮挡输入图像的大部分区域(通常为75%),然后训练模型重建被遮挡的像素。

MAE的架构设计体现了效率与有效性的平衡。编码器仅处理可见的图像块(patches),这大幅降低了计算成本。解码器则接收编码器的输出以及表示遮挡位置的mask token,尝试在像素空间重建完整的图像。由于遮挡比例极高,模型无法通过简单的局部插值完成重建,必须理解图像的整体语义结构。

在这里插入图片描述

4.2 生成式方法的局限

然而,生成式自监督方法也存在固有的局限性。由于训练目标是在像素或token空间进行重建,模型不得不花费大量容量来建模低层细节——例如纹理的精确模式、光照的微妙变化、噪声的随机分布等。这些细节对于重建任务至关重要,但对于下游的语义理解任务(如分类、检测)可能并无帮助甚至形成干扰。

在线性探测(Linear Probing)评估中,MAE学习到的表征在语义分类任务上的表现通常不如对比学习方法。这是因为MAE的表征更偏向于编码低层视觉特征,而非高层语义概念。从认知科学的角度理解,重建任务要求模型记住"每片草叶的位置",而语义理解只需要知道"这是一片草地"。

4.3 两类方法的对比总结

特性对比学习生成式方法JEPA
预测空间表征空间像素/Token空间表征空间
数据增强依赖强依赖不依赖不依赖
语义水平
计算效率中等较低
模态通用性受限较好
在这里插入图片描述

5. I-JEPA——图像联合嵌入预测架构

5.1 设计动机与核心思想

I-JEPA(Image-based Joint-Embedding Predictive Architecture)由Meta AI研究团队于2023年6月发布,是JEPA理论框架在图像领域的首次实践。该工作的核心目标是解决前述两类自监督方法的固有缺陷:对比学习对手工数据增强的依赖,以及生成式方法在语义表征层面的不足。

I-JEPA的设计哲学可以概括为一句话:在抽象的表征空间中预测缺失信息,而非在像素空间中重建细节。具体而言,给定一张图像,I-JEPA随机遮挡若干目标区域(target blocks),然后利用剩余的上下文区域(context block)在表征空间中预测这些被遮挡区域的特征表示。由于预测目标是抽象的语义表征而非具体的像素值,模型被引导去学习图像的高层语义结构,同时自然地忽略那些难以预测的低层细节。

这种设计带来了两个关键优势。第一,无需依赖手工设计的数据增强,因为学习信号完全来源于图像内部的空间预测任务。第二,由于预测在表征空间进行,模型不必花费容量去建模像素级的噪声和纹理细节,可以专注于学习语义相关的特征。

在这里插入图片描述

5.2 架构设计详解

I-JEPA的整体架构由三个核心组件构成:上下文编码器(Context Encoder)、目标编码器(Target Encoder)和预测器(Predictor)。这三个组件协同工作,形成一个完整的自监督学习系统。

在这里插入图片描述

上下文编码器负责处理可见的上下文区域。给定一张输入图像,首先将其划分为不重叠的图像块(patches),每个块的大小通常为14×14或16×16像素。然后随机采样一个上下文区域,该区域覆盖图像面积的85%-100%,长宽比固定为1:1。上下文编码器采用标准的Vision Transformer(ViT)架构,将上下文区域内的图像块序列编码为特征表示序列。

目标编码器负责为被遮挡的目标区域生成"真值"表征。其架构与上下文编码器完全相同,但参数更新方式不同。目标编码器的参数通过上下文编码器参数的指数移动平均(Exponential Moving Average,EMA)进行更新,而非直接通过梯度下降优化。这种设计借鉴了MoCo的动量编码器机制,目的是为预测任务提供稳定的目标信号,避免训练过程中的表征坍塌。

预测器是一个轻量级的Transformer网络,其任务是根据上下文编码器的输出,预测目标区域的特征表示。预测器的输入包括上下文特征和一组可学习的掩码token,这些掩码token携带了目标区域的位置信息(通过位置嵌入编码)。预测器的输出是对目标区域特征的预测值。

5.3 多块掩码策略

I-JEPA的另一个关键创新是精心设计的多块掩码策略(Multi-block Masking Strategy)。研究者发现,掩码策略的设计对于引导模型学习语义表征至关重要。

目标块采样:在每次训练迭代中,从图像中随机采样4个目标块。每个目标块的面积占图像总面积的15%-20%,长宽比在0.75到1.5之间随机选择。这些目标块之间可能存在重叠。采样足够大的目标块是引导模型学习语义特征的关键——如果目标块太小,模型可能仅通过局部纹理插值即可完成预测;只有当目标块足够大时,模型才必须理解图像的整体语义结构才能做出准确预测。

上下文块采样:上下文块覆盖图像的85%-100%区域,长宽比固定为1。为确保预测任务的有效性,与目标块重叠的区域会从上下文块中移除,形成稀疏但信息丰富的上下文。

5.4 损失函数与训练过程

I-JEPA的训练目标是最小化预测特征与目标特征之间的L2距离。设第 i i i 个目标块的预测特征为 s ^ y ( i ) \hat{s}_y^{(i)} s^y(i)​,目标编码器生成的真值特征为 s y ( i ) s_y^{(i)} sy(i)​,则损失函数定义为:

L = 1 M ∑ i = 1 M ∥ s ^ y ( i ) − s y ( i ) ∥ 2 2 \mathcal{L} = \frac{1}{M} \sum_{i=1}^{M} \| \hat{s}_y^{(i)} - s_y^{(i)} \|_2^2 L=M1​i=1∑M​∥s^y(i)​−sy(i)​∥22​

其中 M M M 是目标块的数量(通常为4)。

训练过程中,上下文编码器和预测器的参数通过标准的梯度下降(如AdamW优化器)进行更新。目标编码器的参数则通过EMA更新:

θ target ← α ⋅ θ target + ( 1 − α ) ⋅ θ context \theta_{\text{target}} \leftarrow \alpha \cdot \theta_{\text{target}} + (1 - \alpha) \cdot \theta_{\text{context}} θtarget​←α⋅θtarget​+(1−α)⋅θcontext​

其中 α \alpha α 是动量系数,通常设置为0.996-0.999。这种非对称的参数更新机制是防止表征坍塌的关键。

在这里插入图片描述

5.5 代码实现解析

以下是I-JEPA核心组件的简化代码实现,帮助理解其工作原理:

import torch import torch.nn as nn from einops import rearrange classIJEPA(nn.Module):"""I-JEPA: Image-based Joint-Embedding Predictive Architecture"""def__init__( self, image_size=224, patch_size=16, encoder_dim=768, predictor_dim=384, encoder_depth=12, predictor_depth=6, num_heads=12, ema_momentum=0.996):super().__init__() self.patch_size = patch_size self.num_patches =(image_size // patch_size)**2 self.ema_momentum = ema_momentum # 上下文编码器: 标准Vision Transformer self.context_encoder = VisionTransformer( image_size=image_size, patch_size=patch_size, dim=encoder_dim, depth=encoder_depth, heads=num_heads )# 目标编码器: 结构相同,参数通过EMA更新 self.target_encoder = VisionTransformer( image_size=image_size, patch_size=patch_size, dim=encoder_dim, depth=encoder_depth, heads=num_heads )# 初始化时复制参数,并冻结梯度 self.target_encoder.load_state_dict(self.context_encoder.state_dict())for param in self.target_encoder.parameters(): param.requires_grad =False# 预测器: 轻量级Transformer self.predictor = Predictor( encoder_dim=encoder_dim, predictor_dim=predictor_dim, depth=predictor_depth, num_patches=self.num_patches )@torch.no_grad()defupdate_target_encoder(self):"""通过指数移动平均更新目标编码器参数"""for param_ctx, param_tgt inzip( self.context_encoder.parameters(), self.target_encoder.parameters()): param_tgt.data =( self.ema_momentum * param_tgt.data +(1- self.ema_momentum)* param_ctx.data )defforward(self, images, context_masks, target_masks):""" 前向传播 Args: images: 输入图像 [B, 3, H, W] context_masks: 上下文区域掩码 [B, num_patches] target_masks: 目标区域掩码列表 [M, B, num_patches] Returns: loss: L2预测损失 """ batch_size = images.shape[0]# 1. 上下文编码器处理可见区域 context_tokens = self.context_encoder(images, mask=context_masks)# 2. 目标编码器生成目标特征(无梯度)with torch.no_grad(): target_features = self.target_encoder(images)# 3. 预测器预测每个目标块的特征 total_loss =0.0for i, target_mask inenumerate(target_masks):# 获取目标区域的真值特征 target_tokens = self.apply_mask(target_features, target_mask)# 预测目标区域特征 predicted_tokens = self.predictor( context_tokens, target_positions=target_mask )# 计算L2损失 loss = torch.mean((predicted_tokens - target_tokens)**2) total_loss += loss return total_loss /len(target_masks)defapply_mask(self, features, mask):"""根据掩码提取对应位置的特征""" batch_size, num_tokens, dim = features.shape # mask: [B, num_patches], True表示选中 selected = features[mask.unsqueeze(-1).expand_as(features)]return selected.view(batch_size,-1, dim)classPredictor(nn.Module):"""预测器网络:根据上下文预测目标区域特征"""def__init__( self, encoder_dim=768, predictor_dim=384, depth=6, num_patches=196):super().__init__()# 维度映射:将编码器输出降维到预测器维度 self.input_proj = nn.Linear(encoder_dim, predictor_dim)# 可学习的掩码token:作为目标位置的占位符 self.mask_token = nn.Parameter(torch.zeros(1,1, predictor_dim)) nn.init.normal_(self.mask_token, std=0.02)# 位置嵌入:编码空间位置信息 self.pos_embed = nn.Parameter(torch.zeros(1, num_patches, predictor_dim)) nn.init.normal_(self.pos_embed, std=0.02)# Transformer层 self.transformer_blocks = nn.ModuleList([ TransformerBlock(dim=predictor_dim, heads=6)for _ inrange(depth)])# 输出映射:将预测器输出映射回编码器维度 self.output_proj = nn.Linear(predictor_dim, encoder_dim)defforward(self, context_tokens, target_positions):""" Args: context_tokens: 上下文特征 [B, num_context, encoder_dim] target_positions: 目标位置掩码 [B, num_patches] Returns: predictions: 目标位置的预测特征 [B, num_target, encoder_dim] """ batch_size = context_tokens.shape[0]# 1. 映射上下文特征到预测器维度 context_tokens = self.input_proj(context_tokens)# 2. 为目标位置创建掩码token并添加位置嵌入 num_targets = target_positions.sum(dim=1).max().item() pred_tokens = self.mask_token.expand(batch_size, num_targets,-1)# 添加目标位置的位置嵌入 target_pos_embed = self.pos_embed.expand(batch_size,-1,-1) target_pos_embed = target_pos_embed[target_positions] pred_tokens = pred_tokens + target_pos_embed.view(batch_size, num_targets,-1)# 3. 拼接上下文和预测token tokens = torch.cat([context_tokens, pred_tokens], dim=1)# 4. 通过Transformer处理for block in self.transformer_blocks: tokens = block(tokens)# 5. 提取预测部分并映射回编码器维度 predictions = tokens[:,-num_targets:] predictions = self.output_proj(predictions)return predictions 

5.6 掩码采样策略的代码实现

以下代码展示了I-JEPA中目标块和上下文块的采样逻辑:

import torch import math classMultiBlockMaskCollator:"""多块掩码采样器"""def__init__( self, image_size=224, patch_size=16, num_targets=4, target_scale=(0.15,0.2),# 目标块面积占比范围 target_aspect_ratio=(0.75,1.5),# 目标块长宽比范围 context_scale=(0.85,1.0)# 上下文块面积占比范围): self.height = self.width = image_size // patch_size # patch网格尺寸 self.num_patches = self.height * self.width self.num_targets = num_targets self.target_scale = target_scale self.target_aspect_ratio = target_aspect_ratio self.context_scale = context_scale defsample_block_size(self, scale, aspect_ratio_range):""" 采样块的尺寸 Returns: (height, width): 块在patch网格中的尺寸 """# 随机采样面积占比 area_ratio = torch.rand(1).item() area_ratio = scale[0]+ area_ratio *(scale[1]- scale[0]) num_patches =int(self.num_patches * area_ratio)# 随机采样长宽比 aspect_ratio = torch.rand(1).item() aspect_ratio = aspect_ratio_range[0]+ aspect_ratio *( aspect_ratio_range[1]- aspect_ratio_range[0])# 计算高度和宽度 h =int(round(math.sqrt(num_patches * aspect_ratio))) w =int(round(math.sqrt(num_patches / aspect_ratio))) h =min(h, self.height) w =min(w, self.width)return h, w defsample_block_mask(self, block_height, block_width):""" 采样块的位置并生成掩码 Returns: mask: [height, width] 布尔掩码,True表示该位置被选中 """# 随机选择块的起始位置 top = torch.randint(0, self.height - block_height +1,(1,)).item() left = torch.randint(0, self.width - block_width +1,(1,)).item()# 生成掩码 mask = torch.zeros(self.height, self.width, dtype=torch.bool) mask[top:top+block_height, left:left+block_width]=Truereturn mask def__call__(self, batch_size):""" 生成一个batch的掩码 Returns: context_masks: [B, num_patches] 上下文掩码 target_masks: [num_targets, B, num_patches] 目标掩码列表 """ context_masks =[] target_masks_list =[[]for _ inrange(self.num_targets)]for _ inrange(batch_size):# 1. 采样目标块 combined_target_mask = torch.zeros( self.height, self.width, dtype=torch.bool)for i inrange(self.num_targets): h, w = self.sample_block_size( self.target_scale, self.target_aspect_ratio ) target_mask = self.sample_block_mask(h, w) target_masks_list[i].append(target_mask.flatten()) combined_target_mask = combined_target_mask | target_mask # 2. 采样上下文块(移除与目标重叠的部分) ctx_h, ctx_w = self.sample_block_size( self.context_scale,(1.0,1.0)) context_mask = self.sample_block_mask(ctx_h, ctx_w)# 移除重叠区域 context_mask = context_mask &(~combined_target_mask) context_masks.append(context_mask.flatten())# 堆叠成batch context_masks = torch.stack(context_masks, dim=0) target_masks =[ torch.stack(masks, dim=0)for masks in target_masks_list ]return context_masks, target_masks 

6. V-JEPA——视频联合嵌入预测架构

6.1 从图像到视频的扩展动机

人类对世界的理解很大程度上来源于对时间连续性的感知。我们通过观察物体的运动轨迹理解物理规律,通过追踪事件的发展预测未来状态。认知学习理论认为,生物系统表征学习的核心驱动机制是构建内部模型来预测感官输入的变化——时间上相邻的感官刺激的内在表征应该能够相互预测。这种"预测特征原则"(Predictive Feature Principle)是V-JEPA设计的理论基础。

V-JEPA(Video Joint-Embedding Predictive Architecture)于2024年2月由Meta AI发布,是JEPA框架从静态图像向动态视频的自然延伸。与I-JEPA相比,V-JEPA面临的核心挑战在于如何有效地建模时空动态:视频不仅包含空间维度的视觉信息,还包含时间维度的运动信息和因果关系。V-JEPA通过在时空表征空间中进行预测,学习到能够同时捕捉外观特征和运动特征的通用视觉表征。

在这里插入图片描述

6.2 整体架构设计

V-JEPA的架构继承了I-JEPA的核心设计理念,但针对视频的时空特性进行了重要调整。整体框架仍由三个核心组件构成:x-encoder(上下文编码器)、y-encoder(目标编码器)和predictor(预测器)。

在这里插入图片描述

视频Token化:V-JEPA首先将输入视频片段划分为时空连续的3D块(tubelets)。对于一个16帧、分辨率为224×224的视频片段,使用大小为2×16×16的3D卷积核(时间跨度为2,空间跨度为16),将其转换为8×14×14=1568个token的序列。每个token对应原始视频中连续2帧的16×16像素区域。在展平为一维序列后,添加3D正弦-余弦位置嵌入以编码每个token的时空位置信息。

编码器设计:x-encoder和y-encoder均采用标准的Vision Transformer架构,但仅处理各自对应的token子集。x-encoder处理未被遮挡的上下文区域,y-encoder处理完整的视频以生成目标特征。与I-JEPA相同,y-encoder的参数通过x-encoder参数的指数移动平均进行更新,以提供稳定的预测目标。

预测器设计:预测器是一个"窄"Transformer(较少的隐藏维度),接收x-encoder的输出和一组可学习的mask token作为输入。mask token携带了目标区域的时空位置信息,预测器的任务是基于上下文特征预测这些位置的表征。

6.3 时空掩码策略

V-JEPA的掩码策略是其技术创新的核心之一。与I-JEPA的纯空间掩码不同,V-JEPA采用时空联合掩码,同时考虑空间连续性和时间跨度。

核心设计原则:掩码"大的连续块"可以有效限制信息泄露。视频本身存在显著的时空冗余——相邻帧的内容高度相似,相邻区域的纹理连续。如果掩码太小或不连续,模型可能通过简单的局部插值完成预测,无法学习到深层的语义特征。只有当掩码块足够大时,模型才必须理解场景的整体结构和运动规律。

双尺度掩码策略:V-JEPA同时使用短程掩码(short-range masks)和长程掩码(long-range masks)两种策略,使模型学习不同尺度的特征:

掩码类型块数量每帧覆盖面积学习目标
短程掩码8个15%局部细节、小范围运动
长程掩码2个70%全局语义、大范围运动

两种掩码的并集构成最终的目标区域,平均掩码率约为90%。所有块的长宽比在0.75到1.5之间随机选择,时间维度覆盖整个视频片段。

在这里插入图片描述

…详情请参照古月居

Read more

安装 启动 使用 Neo4j的超详细教程

安装 启动 使用 Neo4j的超详细教程

最近在做一个基于知识图谱的智能生成项目。需要用到Neo4j图数据库。写这篇文章记录一下Neo4j的安装及其使用。 一.Neo4j的安装 1.首先安装JDK,配环境变量。(参照网上教程,很多) Neo4j是基于Java的图形数据库,运行Neo4j需要启动JVM进程,因此必须安装JAVA SE的JDK。从Oracle官方网站下载 Java SE JDK。我使用的版本是JDK1.8 2.官网上安装neo4j。 官方网址:https://neo4j.com/deployment-center/  在官网上下载对应版本。Neo4j应用程序有如下主要的目录结构: bin目录:用于存储Neo4j的可执行程序; conf目录:用于控制Neo4j启动的配置文件; data目录:用于存储核心数据库文件; plugins目录:用于存储Neo4j的插件; 3.配置环境变量 创建主目录环境变量NEO4J_HOME,并把主目录设置为变量值。复制具体的neo4j文件地址作为变量值。 配置文档存储在conf目录下,Neo4j通过配置文件neo4j.conf控制服务器的工作。默认情况下,不需

企业微信群机器人Webhook配置全攻略:从创建到发送消息的完整流程

企业微信群机器人Webhook配置全攻略:从创建到发送消息的完整流程 在数字化办公日益普及的今天,企业微信作为国内领先的企业级通讯工具,其群机器人功能为团队协作带来了极大的便利。本文将手把手教你如何从零开始配置企业微信群机器人Webhook,实现自动化消息推送,提升团队沟通效率。 1. 准备工作与环境配置 在开始创建机器人之前,需要确保满足以下基本条件: * 企业微信账号:拥有有效的企业微信管理员或成员账号 * 群聊条件:至少包含3名成员的群聊(这是创建机器人的最低人数要求) * 网络环境:能够正常访问企业微信服务器 提示:如果是企业管理员,建议先在"企业微信管理后台"确认机器人功能是否已对企业开放。某些企业可能出于安全考虑会限制此功能。 2. 创建群机器人 2.1 添加机器人到群聊 1. 打开企业微信客户端,进入目标群聊 2. 点击右上角的群菜单按钮(通常显示为"..."或"⋮") 3. 选择"添加群机器人"选项 4.

Flowise物联网融合:与智能家居设备联动的应用设想

Flowise物联网融合:与智能家居设备联动的应用设想 1. Flowise:让AI工作流变得像搭积木一样简单 Flowise 是一个真正把“AI平民化”落地的工具。它不像传统开发那样需要写几十行 LangChain 代码、配置向量库、调试提示词模板,而是把所有这些能力打包成一个个可拖拽的节点——就像小时候玩乐高,你不需要懂塑料怎么合成,只要知道哪块该拼在哪,就能搭出一座城堡。 它诞生于2023年,短短一年就收获了45.6k GitHub Stars,MIT协议开源,意味着你可以放心把它用在公司内部系统里,甚至嵌入到客户交付的产品中,完全不用担心授权问题。最打动人的不是它的技术多炫酷,而是它真的“不挑人”:产品经理能搭出知识库问答机器人,运营同学能配出自动抓取竞品文案的Agent,连刚学Python两周的实习生,也能在5分钟内跑通一个本地大模型的RAG流程。 它的核心逻辑很朴素:把LangChain里那些抽象概念——比如LLM调用、文档切分、向量检索、工具调用——变成画布上看得见、摸得着的方块。你拖一个“Ollama LLM”节点,再拖一个“Chroma Vector

OpenClaw配置Bot接入飞书机器人+Kimi2.5

OpenClaw配置Bot接入飞书机器人+Kimi2.5

上一篇文章写了Ubuntu_24.04下安装OpenClaw的过程,这篇文档记录一下接入飞书机器+Kimi2.5。 准备工作 飞书 创建飞书机器人 访问飞书开放平台:https://open.feishu.cn/app,点击创建应用: 填写应用名称和描述后就直接创建: 复制App ID 和 App Secret 创建成功后,在“凭证与基础信息”中找到 App ID 和 App Secret,把这2个信息复制记录下来,后面需要配置到openclaw中 配置权限 点击【权限管理】→【开通权限】 或使用【批量导入/导出权限】,选择导入,输入以下内容,如下图 点击【下一步,确认新增权限】即可开通所需要的权限。 配置事件与回调 说明:这一步的配置需要先讲AppId和AppSecret配置到openclaw成功之后再设置订阅方式,