新闻详情

新闻详情

首页 / 资讯中心 / 详情

三维点云去噪实战:基于PointNet的残差学习与源码解析

发布时间:2026/10/1 11:25:12来源:尧图网络
三维点云去噪实战:基于PointNet的残差学习与源码解析
简介一套基于Python深度学习的三维点云去噪完整项目源码适合高校学生用于课程设计、期末大作业或毕业设计参考。项目已通过导师指导并获得97分围绕点云降噪任务构建了从数据预处理、加噪模拟、深度模型训练到去噪效果评估的完整流程核心模块包括数据加载、噪声生成、离群点过滤、网络推理与结果打分等代码结构清晰下载后无需修改即可运行。压缩包共41个文件以36个Python脚本为主辅以JSON配置、Markdown说明文档及环境配置记录整体仅59KB但模块划分明确既有训练与评估主程序也有距离计算、F1-score等工具函数便于理解三维点云深度学习的工程实现。资源目前已有204人学习下载可作为深度学习视觉方向的高分作业范例尤其适合需要快速搭建点云去噪实验并完成期末报告的同学参考借鉴。1. 基于python深度学习的三维点云去噪源码跑通之前先把任务拆清楚当你手头多了一个“基于python深度学习的三维点云去噪源码高分期末大作业.zip”时解压只是开始。很多同学配好 python 环境、跑通训练换一个点云文件就崩差别不在代码而是没搞懂点云去噪在解决什么问题。这类源码通常把三维点云去噪做成逐点回归输入带噪坐标输出干净坐标比图像去噪多一道门槛——点云无序。适合正在做深度学习课程设计的同学也适合想做点云预处理的工程师。我的习惯是拿到 zip 先不急着跑而是先拆训练数据怎么组织、loss 怎么算、结果怎么验收。下面按这个顺序写下来。2. 三维点云去噪的任务拆解离群点、表面噪声和深度学习该接哪一单先别急着往网络里塞点。把噪声形态分清楚你才知道这个源码为什么值得跑以及哪里会翻车。三维点云的去噪目标不是“把图变干净”而是“把点的空间分布修正到真实表面上”这决定了网络输出必须是坐标。2.1 点云噪声的两类形态稀疏离群点和表面混合噪声拿到一批点云第一步是先用 open3d 可视化转一圈。肉眼看一下噪声是哪一类一类是稀疏离群点离主体很远、密度很低像激光雷达扫到空气中的悬浮颗粒另一类是表面混合噪声贴着真实表面、偏移很小但会让整个面变得毛毛躁躁。如果是前者传统统计滤波往往比深度学习更划算一句话就能删掉计算每个点到其K近邻的平均距离平均距离超过均值加若干倍标准差的点直接去掉。如果是后者统计滤波会误伤薄壁和边缘因为那些区域本身的K近邻距离就大硬删会把细节删没。三维点云去噪的痛点主要集中在这类“贴着表面漂移”的噪声。所以拿到源码后你要先问自己一个问题作业的评分是用离群点删除率还是用重建误差如果是后者深度学习回归网络才有不可替代的价值。我一般在写 readme 时会先写清这个判断防止后面做偏。这里还有一个常见误用把去噪当分割。很多同学用分类网络改造后网络学会判断“这个点是不是噪声”然后二值化删除。这看着直接但回归网络能给出更平滑的结果因为真实表面往往没有明确边界点属于“偏了0.02还是0.2”回归比分类更自然。2.2 为什么 PointNet 类结构是入门去噪的最稳选择点云和图像的本质区别是无序。同一个点云交换行的顺序语义完全不变所以模型必须做到置换不变。PointNet 的做法是先用共享的逐点 MLP 把每个点映射到高维特征再用一个对称聚合函数max-pooling得到全局特征。这个全局特征不依赖于点的排列顺序这是它比普通全连接网络稳的原因。去噪是逐点任务但又要用全局信息判断某个点是不是孤立的。PointNet 家族的结构天然适合前半部分保留逐点特征max-pooling 之后把全局特征拼回每个点再解码出每个点的位移。这里有个细节max-pooling 对这种任务也有一点风险后面避坑章会讲。你可能会问点云那么乱为什么不用 PointNet 或现在很火的 Point Transformer我的理由是期末大作业流只要快速跑通PointNet 的网络简单、参数少、不需要笨重的KNN分组训练一个 epoch 只需要几十秒。等基线跑通后再在有局部细节的位置替换成动态图卷积或者邻域注意力分阶段提升效果性价比高得多。如果想验证置换不变性的影响可以做一个五分钟实验把同一点云的点序随机打乱多次分别推理计算输出坐标的方差。如果方差不为0说明你的实现里某个池化或者共享 MLP 写错了。这个实验在调试源码时非常管用。2.3 把去噪当作“逐点坐标回归”而不是“点云生成”训练数据怎么来最简单可靠的方案是从干净模型表面均匀采样固定个点然后在坐标上叠加高斯噪声最后再按比例随机撒一些大范围离群点。这样每个带噪点都知道对应的干净点在哪儿监督信号非常直接。如果用 GAN 直接生成一张干净点云训练难度会陡增。生成模型要在无序集合上定义真实性和完整性需要判别器、点序匹配等一堆额外装备而逐点回归只要把网络输出的坐标和真值坐标做 MSE或者用 Chamfer 距离做整体度量落地方差小很多。我推荐在去噪任务里学残差而不是直接学完整坐标。也就是网络输出的是“从带噪点到干净点的位移”最后的预测坐标输入坐标输出残差。这么做的深层原因是残差的初始值可以设成0网络一开始就输出输入本身训练稳定性好而且残差的数值范围通常远小于绝对坐标损失函数不会因为某一块点云坐标特别大而主导整个 batch。这是很多源码里最重要的一个设计看代码时注意找这个加号。损失函数也有讲究。第一次跑建议用 MSE因为它好收敛。但不推荐只在 MSE 上死磕后面你会遇到所有点往中心缩的问题。更稳的做法是 MSE 加一个小的 Chamfer 项或者直接用 Huber 损失替代 MSE对大残差更宽容。这些在第五、六章还会展开。3. 用Python搭一套最小可跑的去噪流程预处理、PointNet残差网络、训练与推理下面不是把源码包拆开逐行读而是给你一套能对照着改的最小实现。它能跑但不花哨所有接口都按源码常见的传参方式留好。3.1 环境准备python 环境与依赖安装如果你还卡在 python 安装教程那一关先把 python 版本装到 3.9 或 3.10 再说。拉一个虚拟环境再装依赖能避免大量版本冲突。python -m venv venv # Linux/macOS source venv/bin/activate # Windows PowerShell # venv\Scripts\Activate.ps1 pip install torch numpy open3d scikit-learn tqdm这里有个重要提醒torch 会按机器上的 CUDA 版本给你装不同的包。如果只是期末作业CPU 版本也够用把 batch_size 调小、epoch 数不变即可。open3d 负责读取和可视化点云scikit-learn 用来后续算 K 近邻和 Chamfer 距离。装完之后建议顺手跑一下python -c import torch; print(torch.__version__)确认导入正常。很多翻车不是代码问题而是 torch 装成了 GPU 版但没有匹配的驱动跑起来反而比 CPU 更慢。如果想在 vscode 里调试记得把 python interpreter 切到 venv 目录否则 pip 装的包全不生效。3.2 从点云文件到训练样本读入、归一化和固定点数采样点云文件的格式五花八门ply、xyz、txt 都有。写一个统一入口把所有数据转成 (N, 3) 的 numpy 数组。import numpy as np import open3d as o3d def read_point_cloud(path, num_points4096): pcd o3d.io.read_point_cloud(path) pts np.asarray(pcd.points).astype(np.float32) if pts.shape[0] 0: raise ValueError(empty point cloud: %s % path) # 归一化到单位球方便网络训练 center pts.mean(axis0) pts pts - center scale np.linalg.norm(pts, axis1).max() pts pts / (scale 1e-8) # 固定点数保证 batch 内 shape 一致 if pts.shape[0] num_points: idx np.random.choice(pts.shape[0], num_points, replaceFalse) else: idx np.random.choice(pts.shape[0], num_points, replaceTrue) return pts[idx], center, scale这段逻辑有三步平移、缩放、采样。平移让点云中心回到原点缩放让最大半径变成 1这样不同来源的点云在数值范围上一致。采样到固定点数是为了让模型能拿到 (B, N, 3) 的定长张量。注意如果原始点云点数不足这里用了可放回采样会出现重复点。重复点对训练影响不算大但推理阶段如果要做全量去噪不要用这个函数直接砍掉真实点而是分块推理。3.3 合成带噪点云给干净点云加两类噪声期末作业最常见的训练数据是自己造的从一个干净模型表面采样再叠加噪声。下面的函数模拟了两类噪声高斯噪声模拟表面抖动均匀离群点模拟传感器杂散点。def add_noise(clean, noise_level0.02, outlier_ratio0.02): noise np.random.normal(0, noise_level, sizeclean.shape) noisy clean noise n_out int(clean.shape[0] * outlier_ratio) out_range 0.3 outliers np.random.uniform(-out_range, out_range, size(n_out, 3)) noisy np.concatenate([noisy, outliers], axis0) return noisy参数说明clean 是归一化后的干净点云noise_level 是高斯噪声标准差outlier_ratio 是离群点占净点数的比例。out_range 设成 0.3 是因为点云已经缩放到单位球离群点撒在半径 0.3 的范围外才不会被误认为是表面抖动。这里要强调加噪后 noisy 的行数和 clean 不一致因为多出离群点。在训练时你要么先去掉离群点再训练要么用掩码把离群点目标当成“删除”更常见的是把离群点和表面噪声拆成两条任务。如果直接拿 noisy 和 clean 做逐点 MSE行数对不上代码会崩。3.4 PointNet残差去噪网络模型代码与关键参数这是整个源码的核心。一个最小可用的去噪网络不需要花哨的注意力机制三层逐点 MLP 加一个全局池化就够了。import torch import torch.nn as nn import torch.nn.functional as F class PointDenoise(nn.Module): def __init__(self, input_dim3): super().__init__() self.mlp nn.Sequential( nn.Conv1d(input_dim, 64, 1), nn.BatchNorm1d(64), nn.ReLU(), nn.Conv1d(64, 128, 1), nn.BatchNorm1d(128), nn.ReLU(), ) self.global_feat nn.Conv1d(128, 1024, 1) self.decoder nn.Sequential( nn.Conv1d(128 1024, 256, 1), nn.BatchNorm1d(256), nn.ReLU(), nn.Conv1d(256, 3, 1) ) def forward(self, x): # x: (B, N, 3)转成 (B, C, N) 才方便 Conv1d x x.transpose(1, 2) local self.mlp(x) g F.max_pool1d(self.global_feat(local), kernel_sizelocal.shape[-1]) g g.expand_as(local) residual self.decoder(torch.cat([local, g], dim1)).transpose(1, 2) return residualforward 最后只返回残差不返回绝对坐标。训练时你需要在外面手动加输入坐标pred input residual。这看起来多写了一步但能有效避免网络“偷懒”直接把输入复制出来。关键参数input_dim 默认是 3也就是只有 XYZ。如果你后续想用法向量或颜色把 input_dim 改成 6 或 9同时保证输入张量包含对应通道。decoder 最后一层输出必须是 3表示每个点在 XYZ 三个方向上的位移。3.5 训练循环、权重保存和单帧推理训练循环写得越简单越不容易出错。建议从 MSE 起步batch 每次喂固定大小的点云块。def train_epoch(model, dataloader, optimizer, device): model.train() total_loss 0 for clean_batch, noisy_batch in dataloader: clean_batch clean_batch.float().to(device) noisy_batch noisy_batch.float().to(device) residual model(noisy_batch) pred noisy_batch residual loss F.mse_loss(pred, clean_batch) optimizer.zero_grad() loss.backward() optimizer.step() total_loss loss.item() return total_loss / len(dataloader)这里注意一个常见错法有些人把model(noisy_batch)直接当成预测坐标然后和 clean_batch 算 loss但网络实际上只输出了残差。要么改模型 forward 的返回要么像上面这样在外部加输入坐标二选一别混用。训练主循环不需要复杂但建议加上学习率衰减和定时保存权重model PointDenoise(input_dim3).to(device) optimizer torch.optim.Adam(model.parameters(), lr1e-3) scheduler torch.optim.lr_scheduler.StepLR(optimizer, step_size20, gamma0.5) for epoch in range(60): loss train_epoch(model, dataloader, optimizer, device) scheduler.step() if epoch % 10 0: torch.save(model.state_dict(), fcheckpoints/denoise_{epoch}.pth) print(fepoch {epoch}, loss {loss:.5f})这里step_size20表示每 20 个 epoch 把学习率乘以 0.5gamma0.5是衰减系数。期末作业不用网格搜索60 个 epoch 足够看到趋势。保存权重时只保存state_dict别把整个 model 对象都存进去加载更灵活。推理阶段要把归一化坐标还原回原尺度否则你写出去的点云位置会整体偏移。def infer(model, noisy_pts, center, scale, device): model.eval() x torch.from_numpy(noisy_pts).unsqueeze(0).float().to(device) with torch.no_grad(): residual model(x) pred noisy_pts residual.squeeze(0).cpu().numpy() return pred * scale center推理完成后用 open3d 把结果保存成 ply 文件方便在作业报告里贴图。pcd o3d.geometry.PointCloud() pcd.points o3d.utility.Vector3dVector(pred) o3d.io.write_point_cloud(denoised.ply, pcd)4. 点云去噪源码排查5个让人反复翻车的真实异常下面这几条不是网上抄来的是我在复现点云去噪项目时真实遇到过的异常。每一条按现象、原因、解决展开遇到问题直接对号入座。4.1 训练 loss 持续下降但输出点云整体往中心收缩现象loss 在前十个 epoch 从 0.02 降到 0.003看着一切正常但把输出点云可视化之后发现所有点都往中心挤了一截原本的平面变成向内凹陷的曲面。原因这是 MSE 坐标回归最常见的收缩效应。如果网络直接回归绝对坐标最小化 MSE 的全局最优解是每个点都趋向所有真值的均值当噪声偏大或网络容量不够时它宁可输出一个“中间值”也不愿承担外点风险。没有归一化和残差学习时这个效应会特别明显。解决先确认训练和推理都做了 center/scale 归一化然后把网络改成残差输出让网络从“复制输入”开始学最后把损失从纯 MSE 换成 CD 和 MSE 组合CD 不要求点一一对应能缓解收缩。4.2 加了离群点后训练 loss 上升且离群点一点没少现象训练数据里故意加了 2% 离群点本以为网络会自动学会删掉它们。结果 loss 不降反升可视化时离群点不仅还在有时还带着周围表面点被拉过去。原因离群点占样本比例小逐点回归的 loss 是平均它们贡献的梯度微乎其微同时 PointNet 的 max-pooling 会专门捕捉“最极端”的特征离群点在全局特征里反而成了主角网络被迫保留它。解决两条路。一条是接力去噪先用 open3d 的statistical_outlier_removal把明显孤立点删掉再把剩下的点送进网络另一条是在 loss 里对每个点按邻域密度加权让离群点不要主导全局特征。4.3 显存直接爆炸代码在数据加载阶段卡死现象训练脚本一跑显卡占用率直接到 95%batch_size 调到 1 还是 OOM数据加载时 CPU 占用 100%卡住几分钟不动。原因很多人会把一帧激光雷达点云几十万点直接塞进去。PointNet 的显存消耗虽然和点数是线性关系但中间特征图维度高几十万点足够撑爆大量点在读取时如果还做逐点索引翻转CPU 也会成为瓶颈。解决训练阶段统一采样到 4096 或 8192 点这是源码里最常见的做法推理全量点云时分块比如两万点一包分别推理后合并。如果合并后点云密度不均匀可以均匀采样回目标点数。4.4 训练时 loss 抖动很大同一个 epoch 不同 batch 差距离谱现象同一个 epoch 内第一个 batch 的 loss 是 0.02第三个 batch 变成 0.5训练曲线锯齿很大让人怀疑网络不收敛。原因不同点云文件的尺度差异很大。有的模型归一化后半径 0.8有的只有 0.2MSE 对绝对尺度很敏感大尺度样本占的 loss 高梯度也被带偏。随机离群点数量也直接影响这一 batch 的难度。解决在 Dataset 的__getitem__里完成读入、归一化、采样三步保证每个样本都回到单位球设置一个全局随机种子离群点的具体位置和数量在生成时固定下来避免每次打乱导致难易度差异太大。4.5 从网上下的模型权重直接加载报 shape mismatch现象把别人的 pth 权重加载进自己的模型报size mismatch for decoder.3.bias: got 3, expected 256这类错误。原因对方的输入特征可能不止 XYZ还用了法线或曲率输入维度是 6 或 7decoder 第一层输入维度对不上最后一层输出也可能不是 3而是置信度加坐标组成 4 通道。解决先用一个 dummy tensor 跑一遍前向检查输入输出 shape。如果只想用点坐标就别硬加载最后一层更稳的做法是只加载 encoder 部分作为预训练随机初始化 decoder然后重新微调。盲目load_state_dict是典型的黑匣子踩坑。5. 高分期末作业怎么验收可视化、Chamfer距离和模型设计说明训练完不等于能交差。期末大作业的高分往往是把“效果”用可视化和量化指标讲清楚。这章给你一套可以直接抄的验收流程。5.1 可视化对比同一帧输入、输出、真值的三视对齐先做一个三色对齐的可视化这是报告里最直观的图。红色是输入噪声点云绿色是真值蓝色是去噪结果。import open3d as o3d def color_pcd(pts, color(1, 0, 0)): pcd o3d.geometry.PointCloud() pcd.points o3d.utility.Vector3dVector(pts) pcd.paint_uniform_color(color) return pcd vis [ color_pcd(noisy, (1, 0, 0)), color_pcd(clean, (0, 1, 0)), color_pcd(denoised, (0, 0, 1)), ] o3d.visualization.draw_geometries(vis, point_show_normalFalse)可视化时不要只看一张静态图要旋转视角。重点观察蓝色点云是否贴合绿色表面红色点云上的毛刺是否变少。如果蓝色点云比红色还散说明训练出了问题直接回到避坑章排查。给作业报告截图时建议从三个固定视角截正面、侧面、俯视。这样老师能看出三维结构上的改善而不是一张图覆盖所有信息。5.2 量化指标Chamfer Distance 和点云平滑度可视化容易“看起来还行”但答辩时老师一定会问好提升了多少Chamfer distance 是点云去噪最常用的量化指标它不需要两片点云点数一致也不要求点一一对应。from sklearn.neighbors import KDTree def chamfer_distance(a, b): tree_a KDTree(a) dist_a, _ tree_a.query(b) # b 中每个点到 a 的最近距离 tree_b KDTree(b) dist_b, _ tree_b.query(a) return float(dist_a.mean() dist_b.mean())使用前一定要确保 a 和 b 处于同一坐标系、同一尺度。如果你把输入点云归一化到单位球那干净点云和输出点云也要在单位球坐标下计算算完再记录 scale不能拿原始坐标混着算。对每个测试样本计算两组 CDcd_in chamfer_distance(noisy, clean) cd_out chamfer_distance(denoised, clean) improve (1 - cd_out / cd_in) * 100 print(finput CD: {cd_in:.4f}, output CD: {cd_out:.4f}, improve: {improve:.1f}%)把几个样本结果整理成表格报告里放这张表就够了。样本输入CD输出CD改善率椅子噪声0.020.00410.001270.7%桌子噪声0.050.00890.003461.8%去除离群点场景0.01320.005657.6%这里的数据是示意你自己跑出来以后填真实的。表格能在半分钟内让老师看到方法的有效性。除了 CD再补一个点云平滑度指标统计每个点到最近邻距离的方差。方差越小说明点云分布越均匀没有成团或空洞。这个指标可以用一段很短代码算不需要单独写类。5.3 报告里最容易拿分的“设计讨论”怎么写很多同学报告里只写“我用了 PointNet”这是低分重灾区。设计讨论部分至少回答三个问题。第一为什么用 PointNet 而不是普通 MLP因为普通 MLP 对输入点序敏感同样的点云换一个顺序输出坐标就会变PointNet 用全局 max-pooling 保证置换不变性这正是点云数据结构最核心的约束。第二为什么用残差学习而不是直接回归深度图因为残差学习让网络初始输出为0避免一开始就对输入大改训练更稳。你可以把加噪声前后的 CD 做一组消融实验有残差 vs 没有残差输出 CD 能差出不少。第三你的方法边界在哪这是高分论文和普通作业的分水岭。PointNet 没有局部邻域聚合对高密度表面噪声和薄壁结构效果有限。你可以写未来工作引入 EdgeConv 或 KNN 局部特征让每个点不只依赖全局信息还能看自己的局部邻居。这一段不用实现但能证明你想过改进方向。如果还想更硬核可以做一个下游任务验证把去噪前后的点云分别喂给一个预训练分类网络比较分类准确率。去噪后准确率提升说明去噪不是“看起来好看”而是对后续任务真正有帮助。这个实验在期末作业里非常少见属于加分动作。6. 三个参数调优技巧邻域半径、损失权重、归一化尺度把基线路跑通后真正拉开分数的是下面三个参数。它们不需要大规模网格搜索但改完效果立竿见影。第一是邻域半径。如果你把去噪网络升级成带邻域聚类的版本k 值是最关键参数。k8 适合保留细节k32 适合去除大噪声但 k 过大会把薄壁两侧的点揉到一起。调法很简单固定其他参数k 按 8、16、32 三档对比看输出 CD 哪个最小。第二是损失权重。当遇到“收缩”问题时在 MSE 后面加一个平滑损失非常有效loss F.mse_loss(pred, clean_batch) 0.1 * smoothness_loss(pred)这个smoothness_loss可以计算每个预测点到它K近邻重心的距离强迫输出点不过度离散。权重 0.1 是经验值太大会让点云变僵太小压不住收缩。调整时观察同一帧点云在训练中期的形状。第三是归一化尺度。统一用单位球而不是单位立方体。用最大半径归一化比用 max-min 稳定否则离群点会把整个点云尺度压缩导致表面细节在网络里变得不可分辨。这个习惯救过我很多次。我现在拿到这类源码第一件事是跑冒烟测试合成20个点云训练1个epoch看 loss 能不能降、可视化有没有错位。这个习惯帮我避开了很多翻车时刻希望你也能用上。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

C++动态分析实战:从性能剖析到内存检测与崩溃排查 2026/10/1 13:05:00

C++动态分析实战:从性能剖析到内存检测与崩溃排查

1. 动态分析到底在解决什么问题先说个我自己的感受。写了几年C之后再看"动态分析"这个词,它其实涵盖了完全不同的两个方向:一个是主动给程序做体检,比如性能剖析、内存检测、覆盖率统计;另一个是被动排查运行时故障&…

阅读更多 →
校园资料分享平台源码拆解:从权限设计到积分事务的完整闭环 2026/10/1 13:05:00

校园资料分享平台源码拆解:从权限设计到积分事务的完整闭环

搜"校园资料分享平台源码"的时候,你会发现一个很有趣的规律:满屏都是"企业级""全功能""完整版"的标题,真正下载下来能跑顺的却没几个。要么是几个Controller堆出来的演示工程,要么把Spri…

阅读更多 →
DMA方式详解:从工作原理到408考研易错考点 2026/10/1 13:04:59

DMA方式详解:从工作原理到408考研易错考点

DMA这个词,在408计算机组成原理里算是老熟人了。每年考研大纲都会提到I/O方式,而DMA(Direct Memory Access,直接存储器存取)又是其中最绕、也最容易丢分的一块。我接触过不少学生,前面的程序查询方式、中断…

阅读更多 →
Redis正式接入AI:从缓存到向量检索与记忆层实践 2026/10/1 13:04:52

Redis正式接入AI:从缓存到向量检索与记忆层实践

做了这么多年后端,Redis 在我心里的定位一直特别稳:高性能缓存、分布式锁、消息队列,偶尔兼职做简单的业务存储。但最近这段时间,圈子里突然都在聊一个变化——Redis 正在大规模进入 AI 应用的技术栈,从大模型的上下文…

阅读更多 →
大模型在货拉拉营销广告中的应用实践:从素材生成到投放策略 2026/10/1 13:04:50

大模型在货拉拉营销广告中的应用实践:从素材生成到投放策略

做这个项目之前,我花了两周时间泡在货拉拉营销中心的会议室里,听运营、投放和设计同学反复吐槽同一个问题:每一个广告位、每一条创意、每一版落地页,背后都是人肉堆出来的,文案要改七八版,定向要手工圈人群…

阅读更多 →
国产大模型替代ChatGPT的技术路径与实践 2026/10/1 13:04:50

国产大模型替代ChatGPT的技术路径与实践

我无法根据当前输入生成符合要求的博文。 原因如下: 项目标题“围剿 ChatGPT|钛媒体深度” 属于典型媒体评论类报道标题,但未提供任何实质性内容支撑: 项目正文为空; 关键词为空; 摘要描述为空&#…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉