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

NICE-SLAM: Neural Implicit Scalable Encoding for SLAM论文阅读

论文信息

标题:NICE-SLAM: Neural Implicit Scalable Encoding for SLAM
作者:Zihan Zhu, Songyou Peng,Viktor Larsson — Zhejiang University
来源:CVPR
代码:https://pengsongyou.github.io/nice-slam
时间:2022

Abstract

神经隐式(Neural implicit representations)表示最近在同步定位和地图绘制(SLAM)方面有一定的进展,但现有方法会产生过度平滑的场景重建,并且难以扩展到大型场景。这些限制主要是由于其简单的全连接网络架构,未在观测中纳入本地信息。

我们提出了 NICE-SLAM,这是一种密集 SLAM 系统,通过引入分层场景表示来合并多级局部信息。使用预先训练的几何先验优化这种表示,可以实现大型室内场景的详细重建。与最近的神经隐式 SLAM 系统相比,我们的方法更具可扩展性、高效性和鲁棒性。

Introduction

现有方法的缺陷
传统的密集视觉SLAM系统[29,41,58,59]满足实时要求并且可以在大规模场景中使用,但它们无法对未观察到的区域进行合理的几何估计。

基于学习的 SLAM 方法 [3,12,47,67] 获得了一定水平的预测能力,因为它们通常在特定于任务的数据集上进行训练。此外,基于学习的方法往往可以更好地处理噪声和异常值。然而,这些方法通常仅适用于具有多个对象的小场景。

iMAP [46] 的关键限制因素源于它使用单个多层感知器 (MLP) 来表示整个场景,而该场景只能通过每个新的、可能部分的 RGB-D 观察进行全局更新。相比之下,最近的工作[37, 48]表明,建立多级基于网格的特征有助于保留几何细节并能够重建复杂场景,但这些都是离线方法,没有实时能力。

主要贡献
• 我们推出NICE-SLAM,这是一种密集的RGB-D SLAM 系统,具有实时能力、可扩展性、预测性,并且对各种具有挑战性的场景具有鲁棒性。

• NICE-SLAM 的核心是分层的、基于网格的神经隐式编码。与全局神经场景编码相比,这种表示允许局部更新,这是大规模方法的先决条件。

• 我们对各种数据集进行了广泛的评估,这些数据集在绘图和跟踪方面表现出了竞争性的性能。

Related Work

Dense Visual SLAM

地图表示可分为两类:以地图为中心(view-centric)和以世界为中心(world-centric)

view-centric:
将 3D 几何体锚定到特定关键帧,通常在密集环境中表示为深度图。
这一类别的早期例子之一是 DTAM 。由于其简单性,DTAM 已广泛应用于许多最新的基于学习的 SLAM 系统中。例如,[54, 68] 回归深度和姿势更新。 DeepV2D 类似地在回归深度和姿态估计之间交替,但使用测试时优化。 BA-Net 和 DeepFactors 通过使用一组基础深度图简化了优化问题。还有一些方法,例如 CodeSLAM 、SceneCode 和 NodeSLAM ,它们优化了解码为关键帧或对象深度图的潜在表示。 DROID-SLAM 使用回归光流来定义几何残差以进行细化。 TANDEM 将多视图立体与 DSO 结合起来,形成实时密集 SLAM 系统。

word-centric:
将 3D 几何图形锚定在统一的世界坐标中,并且可以进一步分为面元 和体素网格,通常存储占用或 TSDF 值 。体素网格已广泛用于 RGB-D SLAM,例如 KinectFusion 。

Neral Implict Representations(神经隐式表示)

神经隐式表示在对象几何表示、场景完成、新颖视图合成 以及生成建模中有应用。最近的一些论文尝试使用 RGB-(D) 输入来预测场景级几何,但它们都假设给定的相机姿势。另一些工作解决了相机位姿优化问题,但它们需要相当长的优化过程,不适合实时应用

给定 RGB-D 序列,IMAP引入了实时密集 SLAM 系统,该系统使用单个多层感知器 (MLP) 来紧凑地表示整个场景。然而,由于单个 MLP 的模型容量有限,iMAP 无法生成详细的场景几何形状和准确的相机跟踪,特别是对于较大的场景

Method

在这里插入图片描述
图 2. 系统概览。我们的方法采用 RGB-D 图像流作为输入,并以分层特征网格的形式输出相机姿势以及学习到的场景表示。从右到左,我们的管道可以解释为生成模型,它根据给定的场景表示和相机姿势渲染深度和彩色图像。在测试时,我们通过可微渲染器(从左到右)反向传播图像和深度重建损失来解决逆问题,从而估计场景表示和相机姿势。两个实体在交替优化中进行估计: Mapping:反向传播仅更新分层场景表示;Tracking:反向传播仅更新相机姿态。为了更好的可读性,我们将用于几何编码的精细网格与同等大小的颜色网格结合在一起,并将它们显示为具有两个属性(红色和橙色)的一个网格。

Hierarchical Scene Representation(层次化场景表示)

几何形状被编码为三个特征网络 ϕ θ l \phi _\theta ^l ϕθl及其对应的MLP解码器 f l f^l fl,其中 l ∈ { 0 , 1 , 2 } l \in \{0,1,2\} l{0,1,2}分别指coarse、mid、fine-level

场景外观使用单特征网络 ψ ω \psi _\omega ψω和解码器 g ω g_\omega gω进行建模

θ \theta θ ω \omega ω表示几何和颜色的可优化参数,即网格中的特征和颜色解码器中的权重。

Mid-&Fine-level Geometric Representation

在重建过程中,我们以从粗到细的方法使用这两个网格,首先通过优化中级特征网格来重建几何形状,然后使用精细级进行细化。

在实现中,我们使用边长分别为 32cm 和 16cm 的voxel grid(体素网格),除了 TUM RGBD [45],我们使用 16cm 和 8cm。对于mid-level,使用相关的 MLP f 1 f^1 f1 将特征直接解码为占用值。对于任何点 p ∈ R 3 \textbf{p} \in \mathbb{R}^3 pR3,我们得到的占用率为
o p 1 = f 1 ( p , ϕ θ 1 ( p ) ) o_{\textbf{p}}^1=f^1(\textbf{p},\phi ^1_{\theta}(\textbf{p})) op1=f1(p,ϕθ1(p))
其中 o p 1 o_{\textbf{p}}^1 op1表示特征网格在 p 点进行三线性插值。

为了捕获场景几何中较小的高频细节,我们以残差方式添加精细级别的特征。特别地,精细级特征解码器将相应的中级特征和精细级特征两者作为输入,并输出相对于中级占用率的偏移,即:
Δ o p 1 = f 2 ( p , ϕ θ 1 ( p ) , ϕ θ 2 ( p ) ) \Delta o_{\textbf{p}}^1=f^2(\textbf{p},\phi ^1_{\theta}(\textbf{p}),\phi ^2_{\theta}(\textbf{p})) Δop1=f2(p,ϕθ1(p),ϕθ2(p))
最终一个点的占用率为: o p = o p 1 + Δ o p 1 o_{\textbf{p}}=o_{\textbf{p}}^1+\Delta o_{\textbf{p}}^1 op=op1+Δop1

我们固定了预训练解码器 f 1 f^1 f1 f 2 f^2 f2 ,并且在整个优化过程中仅优化特征网格 ϕ θ 1 \phi ^1_{\theta} ϕθ1 ϕ θ 2 \phi ^2_{\theta} ϕθ2 ,这有助于稳定优化并学习一致的几何形状。

Coarse-level Geometric Representation

粗级特征网格旨在捕获场景的高级几何形状(例如墙壁、地板等),并独立于中级和精细级进行优化。

粗网格的目标是能够预测观察到的几何形状(在中/精细级别中编码)之外的近似占用值,即使每个粗体素仅被部分观察到。为此,我们在实现中使用了非常低的分辨率,边长为 2m。与中级网格类似,我们通过对特征进行插值并通过 MLP f 0 f^0 f0 直接解码为占用值,即:
o p 0 = f 0 ( p , ϕ θ 0 ( p ) ) o_{\textbf{p}}^0=f^0(\textbf{p},\phi ^0_{\theta}(\textbf{p})) op0=f0(p,ϕθ0(p))

Pre-training Feature Decoders

在我们的框架中,我们使用三种不同的固定 MLP 将网格特征解码为占用值。粗级和中级解码器作为 ConvONet [37] 的一部分进行预训练,该网络由 CNN 编码器和 MLP 解码器组成。我们使用预测值和真实值之间的二进制交叉熵损失来训练编码器/解码器。

训练后,我们仅使用解码器 MLP ,因为我们将直接优化特征以适应重建管道中的观察结果。

使用相同的策略来预训练精细级解码器,只是我们在输入到解码器之前简单地将中级特征 ϕ θ 1 ( p ) \phi ^1_{\theta}(\textbf{p}) ϕθ1(p)与精细级特征 ϕ θ 2 ( p ) \phi ^2_{\theta}(\textbf{p}) ϕθ2(p)连接起来。

Color Representation

为了对场景中的颜色进行编码,我们应用另一个特征网格 ψ ω \psi _\omega ψω 和解码器 g ω g _\omega gω c p = g ω ( p , ψ ω ( p ) ) c_p=g _\omega(\textbf{p},\psi_\omega(\textbf{p})) cp=gω(p,ψω(p)), 其中 ω 表示优化期间的可学习参数。

Network Design

对于所有 MLP 解码器,我们使用 32 个隐藏特征维度和 5 个全连接块。除了粗级几何表示之外,我们在作为 MLP 解码器的输入之前对 p 应用可学习的高斯位置编码 。

Depth and Color Rendering

给定相机内在参数和当前相机位姿,我们可以计算像素坐标的观察方向 r \textbf{r} r。我们首先沿着这条射线采样 N s t r a t N_{strat} Nstrat点进行分层采样,同时也在深度附近均匀采样 N i m p N_{imp} Nimp点。总共,我们对每条射线采样 N = N s t r a t + N i m p N = N_{strat} + N_{imp} N=Nstrat+Nimp 个点。

p i = o + d i r , i ∈ { 1 , . . . , N } \textbf{p}_i=\textbf{o}+d_i\textbf{r},i \in \{1,...,N\} pi=o+dir,i{1,...,N}表示给定相机原点 o \textbf{o} o 的射线 r \textbf{r} r 上的采样点, d i d_i di 对应于 p i \textbf{p}_i pi 沿该射线的深度值。

计算出每个点的粗级占用概率 o p i 0 o_{p_i}^0 opi0、精细级占用概率 o p i o_{p_i} opi和颜色值 c p i c_{p_i} cpi

将点 p i \textbf{p}_i pi 处的射线终止概率建模为粗略级别的 ω i c = o p i 0 ∏ j = 1 i − 1 ( 1 − o p j 0 ) \omega_i^c=o_{p_i}^0\prod_{j=1}^{i-1}(1-o_{p_j}^0) ωic=opi0j=1i1(1opj0) ,并且 ω i f = o p i ∏ j = 1 i − 1 ( 1 − o p j ) \omega_i^f=o_{p_i}\prod_{j=1}^{i-1}(1-o_{p_j}) ωif=opij=1i1(1opj)为精细水平。

最后,对于每条光线,粗略和精细级别的深度以及颜色可以渲染为:

在这里插入图片描述

Mapping and Tracking

Mapping
为了优化 场景表示,我们从当前帧和选定的关键帧中均匀采样总共 M 个像素。接下来,我们以分阶段的方式进行优化,以最大限度地减少几何和光度损失。

几何损失只是粗略或精细级别的观测值和预测深度之间的 L1 损失:
在这里插入图片描述

光度损失也是 M 个采样像素的渲染颜色值和观察到的颜色值之间的 L1 损失:
在这里插入图片描述

  1. 第一阶段,我们使用等式(8)中的几何损失 L g f L^f_g Lgf仅优化中层特征网格 ϕ θ 1 \phi^1_θ ϕθ1
  2. 接下来,我们使用相同的精细级深度损失 L g f L^f_g Lgf 联合优化中级和精细级 ψ θ 1 ψ^1_θ ψθ1 ψ θ 2 ψ^2_θ ψθ2 特征。
  3. 最后,我们进行局部捆绑调整(BA)来联合优化各级特征网格、颜色解码器以及K个选定关键帧的相机外在参数{ R i , t i R_i,t_i Riti},其中 λ p λ_p λp是损失权重因子。
    在这里插入图片描述

这种多阶段优化方案可以实现更好的收敛,因为更高分辨率的外观和精细级特征可以依赖于来自中级特征网格的已经细化的几何形状。

Camera Tracking
我们还运行并行相机跟踪来优化当前帧的相机姿势,即旋转和平移{R,t}。为此,我们对当前帧中的 M t M_t Mt 像素进行采样,并使用与等式(9)相同的光度损失,以及修改后的几何损失:
在这里插入图片描述

相机跟踪最终被表述为以下最小化问题:

在这里插入图片描述
Robustness to Dynamic Objects
为了使优化在跟踪过程中对动态对象更加鲁棒,我们过滤了具有大深度/颜色重新渲染损失的像素。特别是,我们从优化中删除损失 Eq (12) 大于当前帧中所有像素的中值损失值 10 倍的任何像素。

图 6 显示了一个示例,其中动态对象被忽略,因为它不存在于渲染的 RGB 和深度图像中。
在这里插入图片描述

请注意,对于此任务,我们仅在映射过程中优化场景表示。在动态环境下联合优化相机参数和场景表示并非易事,我们认为这是一个有趣的未来方向。

Keyframe Selection

我们本着 iMAP [46] 的精神维护一个全局关键帧列表,我们根据信息增益逐步添加新的关键帧。然而,与 iMAP [46] 相比,我们在优化场景几何时仅包含与当前帧有视觉重叠的关键帧。

Experiments

我们考虑 5 个通用数据集:Replica [44]、ScanNet [13]、TUM RGB-D 数据集 [45]、Co-Fusion 数据集 [39],以及自捕获的具有多个房间的大型公寓。我们遵循与[53]中相同的 TUM RGB-D 预处理步骤。

** 这部分暂时先不关注

Conclusion

我们提出了 NICE-SLAM,这是一种密集视觉 SLAM 方法,它将神经隐式表示的优点与基于分层网格的场景表示的可扩展性结合起来。与具有单个大 MLP 的场景表示相比,我们的实验表明,我们的表示(微小的 MLP + 多分辨率特征网格)不仅保证了精细的映射和高跟踪精度,而且由于本地场景更新的好处。此外,我们的网络能够填充小孔并将场景几何形状外推到未观察到的区域,从而稳定相机跟踪。

Limitations
我们方法的预测能力仅限于粗略表示的规模。此外,我们的方法不执行闭环检测,这是一个有趣的未来方向。最后,尽管传统方法缺乏一些功能,但与基于学习的方法仍然存在需要弥补的性能差距

相关文章:

NICE-SLAM: Neural Implicit Scalable Encoding for SLAM论文阅读

论文信息 标题:NICE-SLAM: Neural Implicit Scalable Encoding for SLAM 作者:Zihan Zhu, Songyou Peng,Viktor Larsson — Zhejiang University 来源:CVPR 代码:https://pengsongyou.github.io/nice-slam…...

cmake 配置Visual studio的调试命令

配置代码如截图: set_property(TARGET ${TARGET_NAME} PROPERTY VS_DEBUGGER_COMMAND "./consoleTest.exe") set_property(TARGET ${TARGET_NAME} PROPERTY VS_DEBUGGER_COMMAND_ARGUMENTS "./config/labelDriver.cfg") set_propert…...

MPDIoU: A Loss for Efficient and Accurate Bounding BoxRegression--论文学习笔记

超越GIoU/DIoU/CIoU/EIoU MPDIoU让YOLOv7和YOLACT双双涨点 目标检测上的指标对比: 论文地址: [2307.07662] MPDIoU: A Loss for Efficient and Accurate Bounding Box Regression (arxiv.org) 摘要 边界框回归(Bounding Box Regression&am…...

【Uniapp 的APP热更新】

Uniapp 的APP热更新功能依赖于其打包工具 HBuilder,具体步骤如下: 1. 在 HBuilder 中构建并打包出应用程序 具体步骤: 1.点击发行,点击制作wgt包 2.根据需求修改文件储存路径和其他配置,点击确定 3.等待打包完成&a…...

MySQL主从复制配置

Mysql的主从复制至少是需要两个Mysql的服务,当然Mysql的服务是可以分布在不同的服务器上,也可以在一台服务器上启动多个服务。 (1)首先确保主从服务器上的Mysql版本相同 (2)在主服务器上,创建一个充许从数据库来访问的用户slave,密码为:123456 ,然后使用REPLICATION SLAV…...

Linux - 添加普通用户为信任用户

1.添加用户 在Linux系统中,可以使用以下步骤添加用户: 打开终端并以root用户身份登录 输入以下命令以创建新用户(请将username替换为您想要创建的用户名): adduser username 设置该用户的密码,使用以下命…...

flask----路由系统

# 1 flask路由系统是基于装饰器的:参数如下 # 2 转换器: # 3 路由系统本质 # 4 endpoint 不传会怎么样,不传会以视图函数的名字作为值,但是如果加了装饰器,所有视图函数名字都是inner,就会出错,使用wrapp…...

驶向专业:嵌入式开发在自动驾驶中的学习之道

导语: 自动驾驶技术在汽车行业中的快速发展为嵌入式开发领域带来了巨大的机遇。作为自动驾驶的核心组成部分,嵌入式开发在驱动汽车的智能化和自主性方面发挥着至关重要的作用。本文将探讨嵌入式开发的学习方向、途径以及未来在自动驾驶领域中的展望。 一、学习方向:…...

Go语言入门:从零开始的快速指南(一)

文章目录 引言Go语言的诞生背景Go 语言的特性安装Go语言环境集成开发环境安装第一个Go程序Go 源代码的特征解读 引言 Go语言(也称为Golang)是一种开源的、静态类型的编程语言,由Google开发。它的设计目标是简单、高效、安全、并且易于学习和…...

Windows7+内网, 安装高版本nodejs,使用vite+vue3+typescript开发项目

前言:vite只支持高版本的nodejs,而高版本的nodejs只支持windows8及以上,且vite还对浏览器版本有兼容问题。以下均为vite官网截图 1、安装好低版本的nodejs win7系统建议安装13.及以下,我的是12.12.0这个版本。nodejs低版本官网下载…...

【C语言day14】

#include<stdio.h>int fun(char* s) {char* t s;while (*t);return(t - s); }int main() {char s[] "abc";int n fun(s);printf("%d\n", n);//4return 0; }循环在*t为0时停止&#xff0c;同时t&#xff0c;t最后会停在字符串结束的’\0’之后的一…...

暑假刷题第19天--8/1

170. 加成序列 - AcWing题库&#xff08;dfs迭代加深--重点理解&#xff09; #include<iostream> using namespace std; int n; int a[11]; int dfs(int x,int h){if(x>h1)return 0;if(a[x-1]n)return 1;bool st[130]{};for(int i1;i<x-1;i){for(int j1;j<i;j)…...

Java开发中的------修改密码+忘记密码

目录 1.修改密码 客户端响应 前端vue 后端 controller层 ServiceImpl实现层 2.忘记密码 客户端响应 后端 controller层 serviceImpl实现层 本章需要准备&#xff1a;springcloud项目&#xff0c;依赖&#xff0c;数据库.... 数据库SQL SET FOREIGN_KEY_CHECKS0;-- -…...

ffmpeg安装

简介 FFmpeg是一个开源的音视频处理库&#xff0c;它提供了一系列的工具和API&#xff0c;可以用于处理音视频文件。你可以使用FFmpeg的命令行工具来执行各种音视频处理操作&#xff0c;比如转码、剪辑、合并等。FFmpeg的命令格式通常是&#xff1a;ffmpeg [全局选项] {[输入文…...

Mac电脑目录

System&#xff08;系统&#xff09;Applications&#xff08;应用程序&#xff09;应用程序目录&#xff0c;默认所有的GUI应用程序都安装在这里User&#xff08;用户&#xff09;存放用户的个人资料和配置。每个用户有自己的单独目录Library&#xff08;资料库&#xff09;系…...

一起学算法(栈篇)

1.栈的概念 1.栈的定义 栈是仅限在表尾进行插入和删除的线性表&#xff0c;栈又被称为先进后出的线性表&#xff0c;简称“LIFO” 我们这次用数组作为我们栈的底层数据结构&#xff0c;代码会放到结尾供大家参考使用 2.栈顶的定义 栈是一个线性表&#xff0c;我们允许插入…...

Ubuntu开机自启服务systemd.service配置教程(Ubuntu服务)(Linux服务)upstart

文章目录 为什么要将程序配置成服务&#xff1f;1. 自动启动2. 后台运行3. 定时重启4. 简化管理5. 整合系统 版本支持1. Ubuntu 14.04及更早版本&#xff1a;使用upstart作为默认的init系统/etc/rc.local旧版本新版本 2. Ubuntu 15.04到16.04版本&#xff1a;默认使用systemd作…...

大数据课程E4——Flume的Channel

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解Channel的作用和配置; ⚪ 掌握Channel的使用方法; ⚪ 掌握Channel的File Channel; ⚪ 掌握Channel的JDBC Channel; ⚪ 掌握Channel的Spillable Memory Channel; 一、Memory Ch…...

es6中的Map和Set数据结构

Map Map对象可以用于保存键值对 1.创建 一个Map对象 const map new Map() 2.Map的一些方法 set(key,value):通过键值对向Map对象中添加元素get(key):通过建拿到对应的值size:返回Map对象中所包含的键值对的个数has(key):判断Map对象中是否有对应的key&#xff0c;返回一个…...

MyBatis 框架基本的增删改查

提示&#xff1a;写代码要严谨 文章目录 前言前期准备MyBatis CRUD操作流程增加功能删除功能修改功能查询功能#{} 占位符${} 占位符两种占位符的区别❗ 映射文件总结❗ mapper 代理方式实现CRUDmapper代理开发规范增加功能删除功能修改功能查询功能 前言 提示&#xff1a;myba…...

Javascript--JSON

什么是 JSON? JavaScript中的JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;用于存储和表示结构化的数据。JSON使用键值对的方式组织数据&#xff0c;并支持基本数据类型&#xff08;字符串、数字、布尔值、数组和对象&…...

Rust: error: failed to run custom build command for `openssl-sys v0.9.71`

error: failed to run custom build command for openssl-sys v0.9.71 解决 windows &#xff1a; openssl 不要选Light版 设置环境变量 cmd: set OPENSSL_DIR“C:\Program Files\OpenSSL-Win64” OPENSSL_DIR&#xff1a;C:\Program Files\OpenSSL-Win64 linux&#xff1a…...

Excel修改日期格式,改变日期的筛选方式

我们有两列日期数据&#xff1a; 左边这一列筛选会显示&#xff1a; 右边这一列筛选会显示&#xff1a; 修改格式&#xff0c;将【日期1】改为【日期2】 将【日期1】的格式修改为文本格式即可 修改格式&#xff0c;将【日期2】改为【日期1】 选中日期2&#xff0c;点击【数据…...

【RabbitMQ(day2)】默认(直连)交换机的应用

文章目录 一、第一种模型&#xff08;Hello World&#xff09;二、第二种模型&#xff08;work queue&#xff09;自动确认机制的后果和公平分配 三、阐述默认交换机 这篇博客是以下资料学后的总结&#xff1a; 不良人的RabbitMQ的教学视频 官方启动教程 RabbitMQ中文文档 一、…...

谷粒商城第八天-商品服务之品牌管理的整体实现(直接使用逆向生成的代码;含oss文件上传)

目录 一、总述 二、前端部分 2.1 创建好品牌管理菜单 2.2 复制组件 ​编辑2.3 复制api ​​​编辑 2.4 查看效果 ​编辑2.5 需要优化的地方 2.6 具体优化实现 2.6.1 优化一&#xff1a;将表格的状态列&#xff08;这里是是否显示列&#xff09;修改为开关&#xff…...

阿里云率先荣获容器集群稳定性先进级认证

7 月 25 日&#xff0c;由中国信通院发起的“2023 稳保体系”评估结果在可信云大会现场公布&#xff0c;阿里云容器服务 ACK 成为首批通过“云服务稳定运行能力-容器集群稳定性”评估的产品&#xff0c;并荣获“先进级”认证。 云原生技术正在激活应用构建新范式&#xff0c;构…...

【SpringBoot笔记37】SpringBoot基于@ServerEndpoint、@OnMessage等注解的方式集成WebSocket

这篇文章,主要介绍SpringBoot基于@ServerEndpoint、@OnMessage等注解的方式集成WebSocket。 目录 一、基于注解集成WebSocket 1.1、WebSocket常见注解 1.2、创建WebSocket服务端 1.3、配置ServerEndpointExpor...

PyTorch(安装及卸载)

目录 1. 安装 2. 卸载 参考文献 为什么用PyTorch&#xff1a;简单来说&#xff0c;19年之前tensorflow是大哥&#xff0c;19年tensorflow和PyTorch双龙并行&#xff0c;20年之后PyTorch一往无前。宗旨&#xff0c;哪个用的人多用哪个。 1. 安装 1. 先打开Anaconda Prompt&…...

webScoket

webScoket是什么&#xff1f; 支持端对端通讯可以由客户端发起&#xff0c;也可以有服务端发起用于消息通知、直播间讨论区、聊天室、协同编辑等 做一个简单的webScoket 客户端配置&#xff1a; 1、新建一个页面叫web-scoket.html <!DOCTYPE html> <html lang"…...

【C语言初阶(20)】调试练习题

文章目录 前言实例1实例2 前言 在我们开始调试之前&#xff0c;应该有个明确的思路&#xff1b;程序是如何完成工作的、变量到达某个步骤时的值应该是什么、出现的问题大概会在什么位置。这些东西在调试之前都需要先确认下来&#xff0c;不然自己都不知道自己在调试个什么东西…...