当前位置: 首页 > news >正文

[论文解读]Street Gaussians: Modeling Dynamic Urban Scenes with Gaussian Splatting

Street Gaussians是年初的一篇动态场景重建论文, 在当时是做到了SOTA,至今为止很多自动驾驶或者动态场景重建的文章都会将Street Gaussians作为实验的比较对象,这也表明了这篇文章的重要性,今天就一起来看看这篇文章;

论文地址:[2401.01339] Street Gaussians: Modeling Dynamic Urban Scenes with Gaussian Splatting

源码链接:zju3dv/street_gaussians: [ECCV 2024] Street Gaussians: Modeling Dynamic Urban Scenes with Gaussian Splatting

项目主页:Street Gaussians


论文解读

这篇论文《Street Gaussians: Modeling Dynamic Urban Scenes with Gaussian Splatting》提出了一种名为Street Gaussians的新方法,用于解决自动驾驶场景中动态城市街道建模问题,该方法利用点云构建动态场景,显著提高了训练和渲染效率,实现了高效的实时渲染和高质量的视图合成。

  1. 研究背景与目的
    • 背景:从图像建模动态3D街道在城市模拟、自动驾驶和游戏等领域有重要应用,但现有方法如基于NeRF的方法在处理大规模场景时存在训练时间长、无法处理动态车辆或实时渲染效果差等问题。
    • 目的:提出一种新的场景表示方法Street Gaussians,能够高效重建和实时渲染高保真的动态城市街道场景。
  2. 方法原理
    • Street Gaussians表示
      • 背景模型:用世界坐标系中的点集表示,每个点带有3D高斯参数(协方差矩阵、位置向量)、透明度、球谐系数和语义logit,协方差矩阵由缩放矩阵和旋转矩阵恢复。
      • 对象模型:每个前景车辆对象由一组可优化的跟踪车辆姿态和点云表示,点云的高斯属性与背景相似但坐标系不同,位置和旋转在对象局部坐标系,通过跟踪姿态转换到世界坐标系;外观模型使用4D球谐模型,用傅里叶变换系数编码时间信息以降低存储成本;语义表示为可学习的一维标量。
      • 初始化:背景模型使用聚合LiDAR点云初始化,颜色通过投影到图像平面获取,对象模型收集3D边界框内的点并转换到局部坐标系,点数不足则随机采样,背景模型还进行体素下采样并结合SfM点云补偿LiDAR覆盖不足。
    • 渲染过程:通过将所有点云投影到2D图像空间来渲染,先计算球谐函数,根据跟踪姿态转换对象点云到世界坐标系,连接背景和对象点云,计算2D高斯参数,用α - 混合计算像素颜色,还可渲染深度、语义等信号,天空区域使用高分辨率立方体贴图映射天空颜色并与渲染颜色混合。
    • 训练方法
      • 跟踪姿态优化:将跟踪姿态视为可学习参数,在转换矩阵中添加可学习的变换,直接获取梯度,避免额外计算。
      • 损失函数:联合优化场景表示、天空立方体贴图和跟踪姿态,损失函数包括颜色重建损失、深度损失、天空监督损失、语义损失和正则化项,用于去除浮动和增强分解效果。
  3. 实验结果
    • 实验设置
      • 数据集:在Waymo Open和KITTI数据集上进行实验,Waymo数据集选择8个序列,每4帧选1帧为测试帧,输入图像降为1066×1600,KITTI和Virtual KITTI 2数据集遵循MARS的设置。
      • 基线方法:与NSG、MARS、3D Gaussians、EmerNeRF比较,前两者用真实对象轨迹训练和评估,后两者用官方代码和特定设置运行。
    • 对比结果:在渲染质量和速度上与基线方法比较,采用PSNR、SSIM和LPIPS评估,对移动对象计算PSNR*,模型在所有指标上表现最佳,渲染速度比基于NeRF的方法快两个数量级,定性结果显示其他方法存在模糊、失真或伪影,而该方法能生成高质量视图。
    • 消融实验:验证算法设计选择,优化跟踪姿态可提高质量,4D球谐模型能细化渲染质量,尤其是在对象与环境光照交互时,结合LiDAR点云可增强结果,恢复更准确的场景几何形状。
    • 应用展示:可应用于场景编辑(如车辆旋转、平移、交换)、对象分解(生成高质量分解结果)和语义分割(语义图性能优于Video - K - Net)。
  4. 结论与展望
    • 研究成果总结:提出Street Gaussians场景表示,将背景和前景车辆分别建模为点云,可实现场景编辑和实时渲染,性能与使用精确真实姿态相当,通过实验验证了方法的有效性。
    • 研究局限与未来方向:方法限于重建刚性动态场景,依赖现成跟踪器的召回率,仍需逐场景优化;未来可考虑采用更复杂动态场景建模方法处理非刚性对象,通过2D跟踪获取连续轨迹改善跟踪问题,探索前馈方式预测通用3D高斯。

代码解读

初始化

  1. 场景初始化从点云开始,
  2. 需要对每个移动障碍物进行track,得到每个障碍物在每个相机下的轨迹。

模型设计

整个模型的结构可以参考下图或者**StreetGaussianModel**的setup_functions函数,主要包括背景,前景和天空三类;

def setup_functions(self):obj_tracklets = self.metadata['obj_tracklets']obj_info = self.metadata['obj_meta']tracklet_timestamps = self.metadata['tracklet_timestamps']camera_timestamps = self.metadata['camera_timestamps']self.model_name_id = bidict()self.obj_list = []self.models_num = 0self.obj_info = obj_info# Build background modelif self.include_background:self.background = GaussianModelBkgd(model_name='background', scene_center=self.metadata['scene_center'],scene_radius=self.metadata['scene_radius'],sphere_center=self.metadata['sphere_center'],sphere_radius=self.metadata['sphere_radius'],)self.model_name_id['background'] = 0self.models_num += 1# Build object modelif self.include_obj:for track_id, obj_meta in self.obj_info.items():model_name = f'obj_{track_id:03d}'setattr(self, model_name, GaussianModelActor(model_name=model_name, obj_meta=obj_meta))self.model_name_id[model_name] = self.models_numself.obj_list.append(model_name)self.models_num += 1# Build sky modelif self.include_sky:self.sky_cubemap = SkyCubeMap()    else:self.sky_cubemap = None    # Build actor model 动态物体的pose优化if self.include_obj:self.actor_pose = ActorPose(obj_tracklets, tracklet_timestamps, camera_timestamps, obj_info)else:self.actor_pose = None# Build color correction 未启用,类似于曝光补偿if self.use_color_correction:self.color_correction = ColorCorrection(self.metadata)else:self.color_correction = None# Build pose correction, 未启用,位姿优化if self.use_pose_correction:self.pose_correction = PoseCorrection(self.metadata)else:self.pose_correction = None

静态背景

静态背景的表示还是基础的3DGS来进行建模,在基础的3DGS属性上面增加了一个语义(semantic)属性,为了后面的3D语义特征构建(本文暂未使用,也许是长线计划);

模型代码在**GaussianModelBkgd类中,继承自GaussianModel**类,和作者论文中一致,这是一个基础的高斯类,这里不再详细展开

动态前景

对每一个动态物体都构建一个高斯模型,模型代码在**GaussianModelActor**

  1. 傅里叶变换
def IDFT(time, dim):if isinstance(time, float):time = torch.tensor(time)t = time.view(-1, 1).float()idft = torch.zeros(t.shape[0], dim)indices = torch.arange(dim)even_indices = indices[::2]odd_indices = indices[1::2]idft[:, even_indices] = torch.cos(torch.pi * t * even_indices)idft[:, odd_indices] = torch.sin(torch.pi * t * (odd_indices + 1))return idft
# 这里在获取颜色的时候调用
def get_features_fourier(self, frame=0):normalized_frame = (frame - self.start_frame) / (self.end_frame - self.start_frame)time = self.fourier_scale * normalized_frameidft_base = IDFT(time, self.fourier_dim)[0].cuda()features_dc = self._features_dc # [N, C, 3]features_dc = torch.sum(features_dc * idft_base[..., None], dim=1, keepdim=True) # [N, 1, 3]features_rest = self._features_rest # [N, sh, 3]features = torch.cat([features_dc, features_rest], dim=1) # [N, (sh + 1) * C, 3]return features
  1. 动态物体的位姿优化,开启opt_track的选项后在**ActorPose**模块中会开始动态物体的位姿优化,在训练过程中优化动态物体的平移和旋转两个参数;在OmniRe的论文中也有,这也是目前动态3DGS重建的主流方向,不过动态物体的位姿处理也有很多方法,可以放在数据前处理阶段用传统的slam等方式,但是在训练中优化的方法都认为可以获得更好的重建效果;
self.opt_track = cfg.model.nsg.opt_track
if self.opt_track:self.opt_trans = nn.Parameter(torch.zeros_like(self.input_trans)).requires_grad_(True) # [num_frames, max_obj, [dx, dy, dz]]self.opt_rots = nn.Parameter(torch.zeros_like(self.input_rots[..., :1])).requires_grad_(True) # [num_frames, max_obj, [dtheta] 
  1. 由于object的位姿和背景是不同的,而且opt track的作用也会优化位姿,所以论文对obj的gaussian做了一些刚体变换,也就是公式2;对应StreetGaussianModelget_xyzget_rotation 两个函数;这里只贴上核心处理部分
def get_xyz(self):......if len(self.graph_obj_list) > 0:xyzs_local = []for i, obj_name in enumerate(self.graph_obj_list):obj_model: GaussianModelActor = getattr(self, obj_name)xyz_local = obj_model.get_xyzxyzs_local.append(xyz_local)xyzs_local = torch.cat(xyzs_local, dim=0)xyzs_local = xyzs_local.clone()# 这里的filp是借鉴的AutoSplat论文中的对称建模的方法,行人会关闭xyzs_local[self.flip_mask, self.flip_axis] *= -1obj_rots = quaternion_to_matrix(self.obj_rots)xyzs_obj = torch.einsum('bij, bj -> bi', obj_rots, xyzs_local) + self.obj_transxyzs.append(xyzs_obj)xyzs = torch.cat(xyzs, dim=0)return xyzs
def get_rotation(self):......if len(self.graph_obj_list) > 0:rotations_local = []for i, obj_name in enumerate(self.graph_obj_list):obj_model: GaussianModelActor = getattr(self, obj_name)rotation_local = obj_model.get_rotationrotations_local.append(rotation_local)rotations_local = torch.cat(rotations_local, dim=0)rotations_local = rotations_local.clone()rotations_local[self.flip_mask] = quaternion_raw_multiply(self.flip_matrix, rotations_local[self.flip_mask])rotations_obj = quaternion_raw_multiply(self.obj_rots, rotations_local)rotations_obj = torch.nn.functional.normalize(rotations_obj)rotations.append(rotations_obj)rotations = torch.cat(rotations, dim=0)return rotations    

loss设计

这部分代码在train.pytraining函数,写的很清楚,就不再贴代码了;这几个loss项和regulation也是目前三维重建中常见的设计;

这里对代码里面加入的几个loss但是论文中没有提及的,做个讨论;

  1. 颜色修正:颜色的正则项是在对相机的仿射变换矩阵进行修正,感觉有点像appearance embedding的操作,进行一定的曝光补偿;
# color correction loss,
if optim_args.lambda_color_correction > 0 and gaussians.use_color_correction:color_correction_reg_loss = gaussians.color_correction.regularization_loss(viewpoint_cam)scalar_dict['color_correction_reg_loss'] = color_correction_reg_loss.item()loss += optim_args.lambda_color_correction * color_correction_reg_loss
  1. 位置loss:这部分是需要开启位置校正的情况下,在训练中修正每个相机到world系的位姿,这里的正则是将位姿的修正值最小化;
# pose correction loss
if optim_args.lambda_pose_correction > 0 and gaussians.use_pose_correction:pose_correction_reg_loss = gaussians.pose_correction.regularization_loss()scalar_dict['pose_correction_reg_loss'] = pose_correction_reg_loss.item()loss += optim_args.lambda_pose_correction * pose_correction_reg_loss
  1. scale扁平化,主轴的平均绝对值不要逼近0,同时保证s2和s3两个比例接近,避免场景扭曲;
def scale_flatten_loss(self):scales = self.get_scalingsorted_scales = torch.sort(scales, dim=1, descending=False).valuess1, s2, s3 = sorted_scales[:, 0], sorted_scales[:, 1], sorted_scales[:, 2]s1 = torch.clamp(s1, 0, 30)s2 = torch.clamp(s2, 1e-5, 30)s3 = torch.clamp(s3, 1e-5, 30)scale_flatten_loss = torch.abs(s1).mean()scale_flatten_loss += torch.abs(s2 / s3 + s3 / s2 - 2.).mean()return scale_flatten_loss
# scale flatten loss
if optim_args.lambda_scale_flatten > 0:scale_flatten_loss = gaussians.background.scale_flatten_loss()scalar_dict['scale_flatten_loss'] = scale_flatten_loss.item()loss += optim_args.lambda_scale_flatten * scale_flatten_loss
  1. 不透明度loss,利用二维交叉熵损失鼓励不透明度趋近于0或者1,避免中间状态
# opacity sparse loss
if optim_args.lambda_opacity_sparse > 0:opacity = gaussians.get_opacityopacity = opacity.clamp(1e-6, 1-1e-6)log_opacity = opacity * torch.log(opacity)log_one_minus_opacity = (1-opacity) * torch.log(1 - opacity)sparse_loss = -1 * (log_opacity + log_one_minus_opacity)[visibility_filter].mean()scalar_dict['opacity_sparse_loss'] = sparse_loss.item()loss += optim_args.lambda_opacity_sparse * sparse_loss
  1. 法线监督:和GaussianPro文章中提到的法线监督很像,估计也是借鉴了一下,这种法线针对于路面或者深度确定的平面应该效果很好,这个真值比较重要,需要置信度比较高的数据,这个其实和文章中的lidar depth应该关系比较紧密,因为lidar的深度数据是比较可信的,如果能够用这种数据计算法线进行监督应该比较好的方法;
# normal loss
if optim_args.lambda_normal_mono > 0 and 'mono_normal' in viewpoint_cam.meta and 'normals' in render_pkg:if sky_mask is None:normal_mask = maskelse:normal_mask = torch.logical_and(mask, ~sky_mask)normal_mask = normal_mask.squeeze(0)normal_mask[:50] = Falsenormal_gt = viewpoint_cam.meta['mono_normal'].permute(1, 2, 0).cuda() # [H, W, 3]R_c2w = viewpoint_cam.world_view_transform[:3, :3]normal_gt = torch.matmul(normal_gt, R_c2w.T) # to world spacenormal_pred = render_pkg['normals'].permute(1, 2, 0) # [H, W, 3]   normal_l1_loss = torch.abs(normal_pred[normal_mask] - normal_gt[normal_mask]).mean()normal_cos_loss = (1. - torch.sum(normal_pred[normal_mask] * normal_gt[normal_mask], dim=-1)).mean()scalar_dict['normal_l1_loss'] = normal_l1_loss.item()scalar_dict['normal_cos_loss'] = normal_cos_loss.item()normal_loss = normal_l1_loss + normal_cos_lossloss += optim_args.lambda_normal_mono * normal_loss

另外有LightWheel实验室对整个算法进行了重构,采用nerfstudio的框架,链接放在此处:https://github.com/LightwheelAI/street-gaussians-ns,感兴趣的同学可以看看;

相关文章:

[论文解读]Street Gaussians: Modeling Dynamic Urban Scenes with Gaussian Splatting

Street Gaussians是年初的一篇动态场景重建论文, 在当时是做到了SOTA,至今为止很多自动驾驶或者动态场景重建的文章都会将Street Gaussians作为实验的比较对象,这也表明了这篇文章的重要性,今天就一起来看看这篇文章; …...

在Github上上传大文件的办法(图文版)

在上一篇笔记中,笔者用图文的形式介绍了如何在GITHUB中上传文件夹。 可参考这篇笔记 在GITHUB上传本地文件指南(详细图文版)-CSDN博客 但接下来,笔者在继续上传别的文件的过程中,遇到了新的问题,gitbash…...

关于springBoot+vue项目中配置SSL证书问题

前端可以通过https进行访问 1.前端在访问后端接口时,使用https进行访问,在request.js配置文件中,这个文件是配置axios的基本请求的,在基础请求地址中改为https方式 2.需要在Linux中的nginx中配置ssl证书,具体请参考&…...

GitLab

Git服务器 一、概念 C/S 架构的 Git 服务端是存放代码的公用平台是多人并行协作的核心部分通常单独部署在一台独立的服务器上客户端可以通过网络访问服务器上的仓库 GitLab搭建 一、部署 1、安装依赖包 [rootGitLab ~]# yum -y install policycoreutils-python-utils.noarc…...

TCP客户端服务器端通信(线程池版)

1、什么是监听套接字,和UDP相比,TCP为什么文件描述符变多了? 在网络编程中,TCP和UDP是两种常见的传输协议,它们之间最大的不同之一在于连接的管理方式。为了更好地理解这个区别,我们可以用一个生动的比喻来…...

go语言的成神之路-标准库篇-fmt标准库

目录 一、三种类型的输出 print: println: printf: 总结: 代码展示: 二、格式化占位符 %s:用于格式化字符串。 %d:用于格式化整数。 %f:用于格式化浮点数。 %v&#xff1…...

高级java每日一道面试题-2024年12月08日-JVM篇-什么是类加载器?

如果有遗漏,评论区告诉我进行补充 面试官: 什么是类加载器? 我回答: 在Java高级面试中,类加载器(ClassLoader)是一个重要的概念,它涉及到Java类的加载和初始化机制。以下是对类加载器的详细解释: 定义与作用 类加…...

数据库之连接池Druid

Druid是一个由阿里巴巴开源的高性能数据库连接池组件,它在许多项目中都是首选的连接池实现。Druid不仅提供了高效的连接管理,还具备丰富的监控和统计功能,以及强大的安全特性。 一、功能介绍 1、高效连接管理 Druid采用了高效的连接管理机…...

【如何审稿】Notes on Constructive and Positive Reviewing

学习体会: 用chatgpt翻译的2005年审稿人如何审稿的一篇文章, 学着用审稿人的角度评审自己写的稿件~ 全文摘录: 作为审稿人,您代表的是您的社区,您的审稿意见应当是专业和建设性的。会议的质量取决于审稿的质量。审稿人的任务是选出高质量、创…...

1.文本方块方法(Spacy Text Splitter 方法)Can‘t find model ‘zh_core_web_sm‘

一、概述 执行如下: def split_spacy(text):import spacynlp spacy.load( "zh_core_web_sm" ) doc nlp(text) for s in doc.sents: print(s) # d:\programdata\anaconda3\envs\python310\lib\site-packages if __name__"__main__":text &q…...

IT类项目实施流程

一、项目启动准备阶段 (一)甲方组建项目委员会 **甲方委员会确立:**指定负责人,全权负责整个项目人员、启动及时间调配、需求确定及需求变更、项目节点的验收、项目款项的支付工作。 (二) 乙方组建项目实施工作组 **乙方实施工作组确立:**工作组主要包括项目经理、需…...

数据分析平台业务落地痛点分析

在当今数字化时代,数据已成为企业决策和运营的核心驱动力。数据分析平台作为数据处理和洞察的重要工具,其业务落地过程中的痛点分析对于企业的数据战略至关重要。本文将通过概述、功能点、背景、业务点、底层原理等多个方面,深入剖析数据分析…...

java语言学习(5)

第九章 目录 类变量和类方法 理解main方法语法 代码块 单列设计模式 final关键字 抽象类 接口 类变量/静态变量 该变量最大的特点就是会被本类的所有对象实例共享,类变量可以通过类名来访问 分析代码,探讨内存的分配 class Child{private Str…...

基于SSM框架点餐管理系统(计算机毕业设计)论文,Java

系统合集跳转 源码获取链接 一、系统环境 运行环境: 最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 IDE环境: Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以 tomcat环境: Tomcat 7.x,8.x,9.x版本均可 操作系统…...

独家首发 | 基于 KAN、KAN卷积的轴承故障诊断模型

往期精彩内容: Python-凯斯西储大学(CWRU)轴承数据解读与分类处理 基于FFT CNN - BiGRU-Attention 时域、频域特征注意力融合的轴承故障识别模型-CSDN博客 基于FFT CNN - Transformer 时域、频域特征融合的轴承故障识别模型-CSDN博客 P…...

nginx-proxy-manager初次登录502 bad gateway

nginx-proxy-manager初次登录502 bad gateway 按照官方docker-compose安装后,页面如下: 默认账户密码: adminexample.com/changeme点击sign in,提示Bad Gateway 打开调试 重装后依然如此,最后查阅githup issue 找到答案 https://github.com/NginxProxyManager/nginx-proxy-…...

棋牌项目Go的日志打印问题

棋牌项目Go的日志打印问题 项目使用 go work 管理模块 github.com/spf13/viper 通过 application.yml 加载配置 $ tree . ├── README.md ├── common │ ├── application.yml │ ├── config │ │ └── config.go │ ├── go.mod │ ├── go.su…...

基于SpringBoot校园台球厅人员与设备管理系统设计与实现

1.1课题背景与意义 在Internet高速发展的今天,计算机的应用几乎完全覆盖我们生活的各个领域,互联网在经济,生活等方面有着举足轻重的地位,成为人们资源共享,信息快速传递的重要渠道。在中国,网上管理的兴起…...

样品前处理工作站自动化操作

样品前处理工作站通过集成多种技术和自动化模块,实现了对样品的高效、精准处理。以下是实现自动化操作的关键步骤和原理: 1、集成多种技术:工作站通常集成了液体处理、固相萃取、离心、过滤等多种技术。这些技术的结合使得工作站能够完成从样…...

在 Vue 3 中实现点击按钮后禁止浏览器前进或后退

在 Vue 3 中实现点击按钮后禁止浏览器前进或后退&#xff0c;我们可以通过 ref 和 watch 来管理状态&#xff0c;同时使用 onBeforeUnmount 来清理事件监听。 使用 Vue 3 实现&#xff1a; <template><div><button click"disableNavigation">点击…...

【Redis集群】使用docker compose创建docker集群,并暴露外部接口

使用 Docker Compose 创建一个 Redis 集群并暴露外部接口需要配置 docker-compose.yml 文件。以下是一个基本的步骤&#xff0c;包括 Redis 集群的创建和外部接口的暴露。 1、创建 docker-compose.yml 首先&#xff0c;您需要创建一个 docker-compose.yml 文件&#xff0c;配…...

RabbitMq 基础

文章目录 一、初识 MQ1.1 同步调用&#xff1a;1.2 异步调用&#xff1a; 二、RabbitMQ三、SpringAMQP3.1 依赖和配置文件3.2 消息发送和接收&#xff1a;3.2.1 消息发送&#xff1a;3.2.2 消息接收&#xff1a; 3.3 WorkQueues 模型&#xff1a;3.4 交换机类型&#xff1a;3.4…...

类文件结构详解

一、引言 Java 类文件是 Java 虚拟机执行的基本单元。它包含了 Java 程序的字节码以及其他重要的元数据信息。了解类文件结构可以帮助我们更好地理解 Java 程序的编译过程、运行机制以及如何进行优化。 二、类文件结构概述 Java 类文件采用一种紧凑的二进制格式&#xff0c;主…...

01_Linux

一.Linux简介 1.1 Linux介绍 Linux是一套免费使用和自由传播的操作系统。说到操作系 统&#xff0c;大家比较熟知的应该就是Windows和MacOS操作系统&#xff0c; 我们今天所学习的Linux也是一款操作系统 1.2 Linux发展历史 时间&#xff1a;1991年 地点&#xff1a;芬兰赫尔…...

区块链与AI结合:驱动Web3的未来发展

Web3作为下一代互联网的核心理念&#xff0c;强调去中心化、用户主权和透明性。而区块链技术和人工智能&#xff08;AI&#xff09;则是推动Web3发展的两大关键力量。两者的结合不仅为Web3带来了新的可能性&#xff0c;还推动了智能化、透明化、自治化等特点的实现。本文将探讨…...

如何解决 docker 容器中 “-bash: ping: command not found” 错误 ?

在 Docker 的世界里&#xff0c;遇到错误是学习曲线的一部分&#xff0c;其中一个常见的错误是&#xff1a; -bash: ping: command not found。当您在 Docker 容器中尝试使用 ping 命令来测试与其他网络机器或服务的连接&#xff0c;但该命令在您的容器环境中不可用时&#xff…...

Leetcode 每日一题 242.有效的字母异位词

目录 问题描述 示例 题目要求 解决方案 算法思路 过题图片 代码实现 算法分析 优化思路 优化后的代码实现 优化后的算法分析 题目链接 问题描述 给定两个字符串 s 和 t&#xff0c;我们需要编写一个函数来判断 t 是否是 s 的字母异位词。字母异位词指的是两个字符串…...

centos7搭建FTP详细讲解

文章目录 1、ftp服务1、工作原理2、工作模式3、身份验证模式4、ftp服务器配置5、ftp客户端操作 1、ftp服务 1、工作原理 ![img](https://img2023.cnblogs.com/blog/3210480/202412/ 3210480-20241208224333047-141845069.png) 是一个cs架构 2个通道&#xff0c;21端口为控制…...

YOLOv8-ultralytics-8.2.103部分代码阅读笔记-build.py

build.py ultralytics\data\build.py 目录 build.py 1.所需的库和模块 2.class InfiniteDataLoader(dataloader.DataLoader): 3.class _RepeatSampler: 4.def seed_worker(worker_id): 5.def build_yolo_dataset(cfg, img_path, batch, data, mode"train"…...

JAVA-动态代理

文章目录 概要两种主要方式JDK 动态代理Proxy 类作用&#xff1a;常用方法&#xff1a; InvocationHandler 接口作用&#xff1a; 目标对象、代理对象、被代理对象JDK 动态代理工作原理 cjlib 动态代理demo 对比 概要 Java 动态代理利用 Java 的反射机制&#xff0c;可以在运行…...

【前端】React_Next.js

定期更新&#xff0c;建议关注、收藏&#xff01; 安装 要使用react的框架&#xff0c;都应当安装node.js conda install nodejs选择Next.js 并创建项目 npx create-next-applatest可以看到目录结构生成如下 作为网页中的一个子路由 想让其嵌入已经写好的项目中&#xf…...

深入理解malloc与vector:内存管理的对比

引言‌ 在编程中&#xff0c;内存管理是一个至关重要的环节。无论是C语言中的malloc函数&#xff0c;还是C标准库中的vector容器&#xff0c;它们都在内存分配和释放上扮演着关键角色。然而&#xff0c;它们的设计理念和用法有着显著的不同。本文将深入探讨malloc和vector的区…...

LeetCode题练习与总结:四数相加 Ⅱ --454

一、题目描述 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1&#xff1a; 输入&#xff1a;n…...

AI绘画设计实战-Day1

AI绘画变现方向&#xff1a; 生成猫咪拟人化&#xff1b;老照片修复&#xff1b;生成奇幻场景&#xff0c;换上客户的脸&#xff1b;生成商品详情模特图&#xff1b;商品宣传图&#xff1b;建筑/室内设计方案&#xff1b; AI视频-变现方向&#xff1a; AI跳舞视频&#xff…...

【Windows】ImmGetContext函数不适合跨进程工作

1. 教授回复 ChatGPT-o1: ImmGetContext() is not designed to work across process boundaries. It is indicates that a thread should not access the input context created by another thread, which implies that the function is intended for use within the same proc…...

【Linux】进程间通信——System V共享内存

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;Linux系统编程 这里将会不定期更新有关Linux的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 文章目…...

fastAPI快速使用

1. 安装: pip install fastapi 并且安装uvicorn来作为服务器&#xff1a; pip install uvicorn 最简单的 FastAPI 文件可能像下面这样&#xff1a; # main.pyfrom fastapi import FastAPIapp FastAPI()app.get("/") async def root():return {"message&qu…...

ruoyi前后端不分离创建module

ruoyi创建module 1.创建表 2.在若依中创建module 3.注意选择maven 4.命名 5&#xff0e;把module加入到rouyi的pom.xml中 6.student 中加入common依赖 二.生成代码 2.1先创建目录 2&#xff0e;2导入创建的表 2.3 注意各种配置 2.4预览代码 2.5 生成代码 2.6…...

【AI日记】24.12.08 kaggle 比赛 Titanic-11

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 内容&#xff1a; 学习 kaggle 入门比赛 Titanic - Machine Learning from Disaster学习机器学习&#xff08;pandas&#xff0c;numpy&#xff0c;sklearn&#xff0c;seaborn&#xff0c;matplotlib&a…...

处理后端返回的时间格式问题

今天在做项目的时候&#xff0c;发现后端返回的时间格式是“2024-12-08T06:11:46.00000:00”。 通过查阅资料&#xff0c;我发现这是后端返回的ISO 8601标准时间格式。这种格式在前端展示时可能不符合用户习惯&#xff0c;需要转换为更常见的“yyyy-MM-dd HH:mm:ss”格式&…...

【读书笔记·VLSI电路设计方法解密】问题33:ASIC芯片构建的主要步骤是什么

如问题32所述,ASIC芯片构建的主要步骤包括:RTL编写、功能验证、逻辑综合、布局布线、最终逻辑验证、时序验证、物理验证以及流片(Tapeout)。 RTL编写(RTL Coding) 这一阶段将设计意图从自然语言(如英文或中文)翻译为计算机可模拟的语言,以便进行仿真验证设计意图。此外…...

[机器学习] 监督学习之线性回归与逻辑回归

这里写目录标题 一、监督学习概述二、线性回归&#xff08;一&#xff09;模型表示&#xff08;二&#xff09;损失函数&#xff08;三&#xff09;梯度下降算法导入所需库生成模拟数据&#xff08;可替换为真实数据&#xff09;初始化参数并进行训练可视化损失函数随迭代次数的…...

十五、全局搜索正则表达式

一.grep简介 grep 全程Globally search a Regular Expression and Print&#xff0c;是一种强大的文本搜索工具&#xff0c;它能使用特 定模式匹配&#xff08;包括正则表达式&#xff09;搜索文本&#xff0c;并默认输出匹配行。Unix的grep家族包括grep和egrep 二.grep的工作…...

kali Linux 安装配置教程(图文详解)

目录 一、下载安装VMware二、下载kali镜像三、安装kali到虚拟机 一、下载安装VMware 点我查看 二、下载kali镜像 官网下载&#xff1a;https://www.kali.org/get-kali/#kali-platforms 演示下载的为下图左边的&#xff0c;实际我们直接下载右侧虚拟机的直接使用就行 右侧下…...

QT QTableWidget::setModel”: 无法访问 private成员

//严重性代码说明项目文件行禁止显示状态 //错误C2248 “QTableWidget::setModel”: 无法访问 private 成员(在“QTableWidget”类中声明) QSqlQueryModel* sql_model; ui.tableView_database->setModel(sql_model); //ok ui.tableWidget_database->setModel(sql_model)…...

C#怎么判断电脑是否联网

在 C# 中&#xff0c;可以通过几种方法检测计算机是否联网。以下是几种常用的方式&#xff1a; 1. 使用 System.Net.NetworkInformation.Ping 类 通过发送一个 Ping 请求到公共 DNS 服务器&#xff08;如 Google 的 DNS 8.8.8.8&#xff09;来检测是否联网。这是最常见的一种…...

丢垃圾视频时间检测 -- 基于状态机的实现

文章目录 OverviewKey PointsPseudo-code Overview 需要考虑的方面 状态定义和转换条件时序约束空间约束异常处理 状态机的设计需要考虑的场景&#xff1a; 没有人人进入人携带垃圾人离开但垃圾留下垃圾消失异常情况&#xff08;检测失败、多人多垃圾等&#xff09; Key P…...

EEG2Rep自监督脑电大模型文献阅读

原文网址&#xff1a; EEG2Rep: Enhancing Self-supervised EEG Representation... - Google 学术搜索https://scholar.google.com/scholar?hlzh-CN&as_sdt0%2C5&qEEG2Rep%3AEnhancingSelf-supervisedEEGRepresentationThroughInformativeMaskedInputs&btnG 1.文…...

【前端知识】React简单入门

React语法介绍 概述一、产生背景与发展历程二、主要特点三、技术细节四、应用场景与优势五、学习与实践 JSX语法一、JSX的基本概念二、JSX的基本使用三、JSX中的JavaScript表达式四、JSX的条件渲染五、JSX的列表渲染六、JSX的样式处理七、JSX的其他注意事项 基础语法一、基础概…...

高通---Camera调试流程及常见问题分析

文章目录 一、概述二、Camera配置的整体流程三、Camera的代码架构图四、Camera数据流的传递五、camera debug FAQ 一、概述 在调试camera过程中&#xff0c;经常会遇到各种状况&#xff0c;本篇文章对camera调试的流程进行梳理。对常见问题的提供一些解题思路。 二、Camera配…...