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

基于单张图像的深度估计方法研究:利用 Hugging Face 与 FiftyOne 实现单目深度估计模型的运行与评估

1 引言

人类通过双眼感知外部世界,这种双目视觉的核心优势之一在于能够获取深度信息——即判断物体与观察者之间的距离。人脑通过对比左右眼在同一时刻捕捉到的图像差异,进而推断物体深度,该过程被称为立体视觉(Stereopsis)。

深度感知不仅在人类视觉与空间导航中至关重要,在自动驾驶、机器人技术、增强现实(AR)等众多计算机视觉应用领域也具有不可替代的作用。然而,受空间限制、预算约束等实际因素影响,许多应用场景仅能配备单个摄像头,这就对单图像深度估计技术提出了迫切需求。

单目深度估计(Monocular Depth Estimation, MDE)是指从单张二维图像中预测场景深度信息的技术任务。由于三维场景投影到二维图像平面的过程存在多义性(即不同三维场景可能对应同一二维图像),单目深度估计本质上是一个病态问题。因此,该任务具有较高挑战性,需要(显式或隐式地)融合物体尺寸、遮挡关系、透视效应等多种视觉线索进行推理。

本文将系统演示单目深度估计的完整流程,包括深度图数据的加载与可视化、单目深度估计模型的部署推理,以及深度预测结果的定量评估。研究过程采用SUN RGB-D数据集作为实验数据,具体技术路线如下:

  1. 数据准备:加载SUN RGB-D数据集并完成深度图可视化;
  2. 模型部署:基于Hugging Face生态库实现DPT与Marigold两种主流单目深度估计模型的推理;
  3. 性能评估:利用定量指标(RMSE、PSNR、SSIM)对比分析模型预测效果,并结合可视化工具验证结果合理性。

    图1 基于Marigold模型在NYU Depth v2图像上生成的单目深度热力图

1.1 实验环境配置

本文实验基于开源工具链实现,核心依赖库包括:

  • Hugging Face的transformers与diffusers库:用于模型加载与推理;
  • FiftyOne:用于数据集管理、标注与可视化;
  • scikit-image:用于计算深度估计性能评估指标。

(免责声明:作者任职于Voxel51公司,该公司为FiftyOne库的主要维护方。)

1.1.1 依赖库安装

通过pip命令安装所有必要依赖:

pip install -U torch fiftyone diffusers transformers scikit-image
1.1.2 模块导入

实验中需提前导入以下Python模块:

from glob import glob  
import numpy as np  
from PIL import Image  
import torch  import fiftyone as fo  
import fiftyone.zoo as foz  
import fiftyone.brain as fob  
from fiftyone import ViewField as F

2 SUN RGB-D深度数据的加载与可视化

SUN RGB-D数据集是单目深度估计与语义分割领域的经典基准数据集,包含10,335张RGB-D图像,每张图像均配套提供RGB图像、深度图像及相机内参。该数据集整合了NYU Depth v2、伯克利B3DO与SUN3D三个子数据集的图像资源,在Papers with Code平台上被广泛引用。

注:本文实验仅采用SUN RGB-D数据集中的NYU Depth v2子集。该子集遵循MIT许可证,支持商业使用,可直接从Hugging Face数据集仓库下载。

2.1 原始数据下载

可通过以下两种方式获取SUN RGB-D数据集:

  1. 直接访问数据集官网https://rgbd.cs.princeton.edu/下载并解压;
  2. 通过curl命令在终端中直接下载:
    curl -o sunrgbd.zip https://rgbd.cs.princeton.edu/data/SUNRGBD.zip
    
    下载完成后,执行解压命令:
    unzip sunrgbd.zip
    

若需将该数据集用于其他计算机视觉任务(如语义分割),可进一步转换标注格式并完整加载至FiftyOne数据集对象中。本文聚焦于单目深度估计,仅需使用RGB图像与深度图像(存储于depth_bfx子目录)。

2.2 数据集构建

为简化实验流程,本文选取数据集中前20个样本(均来自NYU Depth v2子集)构建实验数据集,具体实现代码如下:

# 创建并持久化FiftyOne数据集(命名为"SUNRGBD-20")
dataset = fo.Dataset(name="SUNRGBD-20", persistent=True)  # 选取前20个场景目录
scene_dirs = glob("SUNRGBD/kv1/NYUdata/*")[:20]  samples = []  for scene_dir in scene_dirs:  # 提取场景目录中的RGB图像路径image_path = glob(f"{scene_dir}/image/*")[0]  # 提取场景目录中的深度图路径depth_path = glob(f"{scene_dir}/depth_bfx/*")[0]  # 读取深度图并归一化至[0,255]范围(uint8类型)depth_map = np.array(Image.open(depth_path))  depth_map = (depth_map * 255 / np.max(depth_map)).astype("uint8")  # 构建FiftyOne样本对象(存储RGB图像路径与深度热力图)sample = fo.Sample(  filepath=image_path,  gt_depth=fo.Heatmap(map=depth_map),  # 深度图以热力图格式存储)  samples.append(sample)  # 将样本添加至数据集中
dataset.add_samples(samples);

上述代码中,深度图以热力图(Heatmap)格式存储,采用相对距离归一化策略:255代表场景中最远距离,0代表最近距离。该方式是深度图可视化的常用手段,若需保留绝对距离信息,可在每个样本中额外存储场景的最小/最大距离参数,后续通过逆变换恢复绝对深度。

2.3 真实深度数据可视化

将深度图以热力图格式存储后,可通过FiftyOne的交互式应用实现可视化,代码如下:

# 启动FiftyOne应用(禁用自动打开浏览器)
session = fo.launch_app(dataset, auto=False)  
# 手动在浏览器中访问"localhost:5151"查看可视化结果


图2 SUN RGB-D数据集中样本的真实深度图可视化结果

在深度图可视化过程中,热力图的配色方案与不透明度设置对结果解读至关重要。例如,对于色觉障碍人群,viridis配色方案在不透明度设为100%时具有较好的可读性,调整过程如图3所示:
在这里插入图片描述
图3 深度热力图可见性(配色、不透明度)调整演示

2.4 真实数据质量分析

通过对比RGB图像与对应深度图,可发现SUN RGB-D数据集的真实深度图存在一定噪声与偏差。例如,图4中图像中心的暗区实际为场景中最远区域,但真实深度图却将其标注为最近区域,这反映了深度数据采集过程中的系统误差。


图4 SUN RGB-D数据集真实深度数据的偏差示例
该现象揭示了单目深度估计任务的核心挑战之一:高质量真实深度数据的获取难度大且成本高,现有数据集普遍存在噪声、标注偏差等问题。因此,在模型评估过程中需充分考虑真实数据的质量局限性,避免对模型性能产生误判。

3 单目深度估计模型的部署与推理

在完成数据集加载与预处理后,本节将部署两种主流单目深度估计模型(DPT与Marigold)并实现推理。两类模型分别代表了当前单目深度估计领域的两大技术路线:基于Transformer的模型与基于扩散(Diffusion)的模型。

实验提供两种推理方式:

  1. 本地推理:基于Hugging Face生态库在本地计算设备上运行模型;
  2. 远程推理:通过Replicate平台调用远程API运行模型(适用于本地计算资源有限的场景)。

若选择远程推理,需提前安装Replicate Python客户端并配置API令牌:

# 安装Replicate客户端
pip install replicate
# 导出Replicate API令牌(需替换为个人令牌)
export REPLICATE_API_TOKEN=r8_<your_token_here>

注:Replicate平台存在“冷启动”现象,模型首次加载至服务器内存可能需要1分钟左右,但后续推理仅需数秒。对于Marigold等计算密集型扩散模型,远程推理在速度上通常优于本地推理(尤其在无GPU加速的情况下)。

3.1 基于DPT模型的单目深度估计

3.1.1 模型简介

密集预测Transformer(Dense Prediction Transformer, DPT)是一种基于Transformer架构的深度估计模型,适用于单目深度估计、语义分割等需要像素级密集预测的任务。本文采用的DPT模型基于MiDaS框架训练,其输出为逆深度图(Inverse Depth Map),需通过逆变换转换为常规深度图以实现后续对比分析。

3.1.2 本地推理实现
  1. 模型与图像处理器加载
    首先通过Hugging Face的transformers库加载预训练模型与图像处理器,代码如下:

    from transformers import AutoImageProcessor, AutoModelForDepthEstimation  # 选择预训练模型(可替换为"Intel/dpt-large"以提升性能)
    pretrained_model_name = "Intel/dpt-hybrid-midas"  # 加载图像处理器(负责图像预处理,如 resize、归一化)
    image_processor = AutoImageProcessor.from_pretrained(pretrained_model_name)  
    # 加载DPT深度估计模型
    dpt_model = AutoModelForDepthEstimation.from_pretrained(pretrained_model_name)
    
  2. 推理函数定义
    定义apply_dpt_model函数,封装图像预处理、模型推理、结果后处理的完整流程:

    def apply_dpt_model(sample, model, label_field):  """对单个样本应用DPT模型推理,生成深度图并存储至样本指定字段参数:sample: FiftyOne样本对象model: 加载的DPT模型label_field: 存储预测深度图的字段名"""# 读取RGB图像image = Image.open(sample.filepath)  # 图像预处理(转换为模型输入格式)inputs = image_processor(images=image, return_tensors="pt")  # 模型推理(禁用梯度计算以提升速度)with torch.no_grad():  outputs = model(**inputs)  predicted_depth = outputs.predicted_depth  # 获取模型输出的逆深度图# 深度图上采样至原始图像尺寸(采用双三次插值)prediction = torch.nn.functional.interpolate(  predicted_depth.unsqueeze(1),  # 增加通道维度(适配插值函数输入格式)size=image.size[::-1],  # 目标尺寸(与原始图像一致,注意宽高顺序)mode="bicubic",  # 插值方式align_corners=False,  )  # 后处理:转换为numpy数组并逆变换为常规深度图output = prediction.squeeze().cpu().numpy()  # 移除冗余维度并转移至CPUformatted_depth = (255 - output * 255 / np.max(output)).astype("uint8")  # 逆变换+归一化# 将预测深度图以热力图格式存储至样本sample[label_field] = fo.Heatmap(map=formatted_depth)  sample.save()  # 保存样本更新
    

    上述代码中,torch.nn.functional.interpolate函数的作用是将模型输出的低分辨率深度图上采样至原始RGB图像尺寸。该步骤的必要性在于:模型为提升推理速度,通常在降采样后的图像上进行预测,而后续的定量评估(逐像素对比)要求预测深度图与真实深度图尺寸一致。

  3. 批量推理与可视化
    遍历数据集完成批量推理,并通过FiftyOne应用查看结果:

    # 遍历数据集样本,应用DPT模型推理(显示进度条)
    for sample in dataset.iter_samples(autosave=True, progress=True):  apply_dpt_model(sample, dpt_model, "dpt_pred")  # 预测结果存储至"dpt_pred"字段# 启动FiftyOne应用查看预测结果
    session = fo.launch_app(dataset)
    

    图5为DPT模型在SUN RGB-D样本上的深度预测结果,可见模型能够较好地捕捉场景中的深度层次结构:


    图5 DPT模型(基于MiDaS)在SUN RGB-D样本上的相对深度预测结果

3.1.3 远程推理实现

通过Replicate平台调用DPT模型API(采用cjwbw/midas模型),代码如下:

import replicate  # 以数据集中第一个样本为例演示远程推理
rgb_image_path = dataset.first().filepath  # 调用Replicate API进行推理
output = replicate.run(  "cjwbw/midas:a6ba5798f04f80d3b314de0f0a62277f21ab3503c60c84d4817de83c5edfdae0",  input={  "model_type": "dpt_beit_large_512",  # 选择模型类型"image": open(rgb_image_path, "rb")  # 读取RGB图像并传入}  
)  # 输出推理结果(返回深度图URL)
print("DPT远程推理结果URL:", output)

3.2 基于Marigold模型的单目深度估计

3.2.1 模型简介

Marigold是一种基于扩散模型(Diffusion Model)的单目深度估计方法,其核心思想是复用文本到图像扩散模型的特征提取与生成能力,将深度估计任务转化为基于图像内容的扩散生成问题。该模型在复杂场景下的深度估计精度具有显著优势,但计算复杂度高于传统CNN或Transformer模型。

3.2.2 本地推理实现
  1. 模型仓库克隆
    Marigold模型通过自定义Diffusers流水线实现,需先克隆官方仓库:

    git clone https://github.com/prs-eth/Marigold.git
    
  2. 模型加载与推理
    仓库中定义的MarigoldPipeline可直接用于深度估计推理,以数据集中第一个样本为例,代码如下:

    # 导入Marigold自定义流水线
    from Marigold.marigold import MarigoldPipeline  # 从Hugging Face加载预训练Marigold模型
    pipe = MarigoldPipeline.from_pretrained("Bingxin/Marigold")  # 读取数据集中第一个样本的RGB图像
    rgb_image = Image.open(dataset.first().filepath)  # 模型推理(默认输出彩色深度图与灰度深度图)
    with torch.no_grad():output = pipe(rgb_image)  # 提取灰度深度图(用于后续定量评估)
    depth_gray = output['depth_gray']  # 灰度深度图(numpy数组)
    # 提取彩色深度图(用于可视化)
    depth_colored = output['depth_colored']  # PIL图像格式
    
  3. 深度图后处理
    模型输出的灰度深度图需进行归一化与逆变换(与DPT模型一致),以匹配真实深度图的数值范围:

    # 归一化至[0,255]并逆变换(确保近距对应低数值、远距对应高数值)
    depth_normalized = (depth_gray - np.min(depth_gray)) / (np.max(depth_gray) - np.min(depth_gray))
    formatted_depth = (255 - depth_normalized * 255).astype("uint8")
    
3.2.3 远程推理实现

通过Replicate平台调用Marigold模型API(采用adirik/marigold端点),并封装为批量推理函数,代码如下:

import replicate  
import requests  
import io  def marigold_remote_infer(rgb_image_file):"""调用Replicate远程API实现Marigold模型推理参数:rgb_image_file: 打开的RGB图像文件对象(rb模式)返回:灰度深度图的numpy数组"""# 调用Replicate APIoutput = replicate.run(  "adirik/marigold:1a363593bc4882684fc58042d19db5e13a810e44e02f8d4c32afd1eb30464818",  input={"image": rgb_image_file}  )  # 从返回的URL中下载灰度深度图(output[1]对应灰度图,output[0]对应彩色图)response = requests.get(output[1]).content  # 转换为numpy数组(所有通道值相同,取单通道即可)depth_gray = np.array(Image.open(io.BytesIO(response)))[:, :, 0]  return depth_gray  def apply_marigold_model(sample, infer_func, label_field):"""对单个样本应用Marigold模型推理,结果存储至样本指定字段参数:sample: FiftyOne样本对象infer_func: 推理函数(本地/远程)label_field: 存储预测深度图的字段名"""# 读取RGB图像并调用推理函数with open(sample.filepath, "rb") as f:depth_gray = infer_func(f)  # 深度图后处理(归一化+逆变换)formatted_depth = (255 - depth_gray).astype("uint8")  # 存储为FiftyOne热力图sample[label_field] = fo.Heatmap(map=formatted_depth)  sample.save()  # 遍历数据集完成批量推理
for sample in dataset.iter_samples(autosave=True, progress=True):  apply_marigold_model(sample, marigold_remote_infer, "marigold_pred")  # 启动FiftyOne应用查看预测结果
session = fo.launch_app(dataset)

图6为Marigold模型在SUN RGB-D样本上的深度预测结果,可见其对场景细节的刻画更为精细,但在远距离区域存在一定噪声:


图6 Marigold模型在SUN RGB-D样本上的相对深度预测结果

4 单目深度估计模型的定量与定性评估

本节采用定量指标计算定性可视化对比相结合的方式,对DPT与Marigold模型的性能进行全面评估。定量评估基于scikit-image库实现,选取单目深度估计领域常用的三个指标:

  • 均方根误差(Root Mean Square Error, RMSE):衡量预测值与真实值的整体偏差,数值越小表示精度越高;
  • 峰值信噪比(Peak Signal-to-Noise Ratio, PSNR):衡量预测结果的保真度,数值越大表示质量越好;
  • 结构相似性指数(Structural Similarity Index, SSIM):衡量预测图与真实图的结构一致性,取值范围为[0,1],越接近1表示结构越相似。

注:本文计算的指标数值依赖于深度图的预处理/后处理流程(如归一化方式、尺寸匹配),因此重点关注模型间的相对性能差异,而非绝对数值。

4.1 定量评估实现

4.1.1 评估指标函数定义

首先定义RMSE、PSNR、SSIM的计算函数(基于scikit-image封装):

from skimage.metrics import peak_signal_noise_ratio, mean_squared_error, structural_similarity  def calculate_rmse(gt_map, pred_map):"""计算均方根误差(RMSE)参数:gt_map: 真实深度图(numpy数组,uint8类型)pred_map: 预测深度图(numpy数组,uint8类型)返回:rmse_value: RMSE数值"""return np.sqrt(mean_squared_error(gt_map, pred_map))  def evaluate_depth_model(dataset, pred_field, gt_field):"""批量评估数据集上模型的深度预测性能,结果存储至样本字段参数:dataset: FiftyOne数据集对象pred_field: 预测深度图字段名(如"dpt_pred")gt_field: 真实深度图字段名(如"gt_depth")"""# 遍历所有样本计算指标for sample in dataset.iter_samples(autosave=True, progress=True):  # 提取真实深度图与预测深度图gt_map = sample[gt_field].map  pred_heatmap = sample[pred_field]  pred_map = pred_heatmap.map  # 计算三个评估指标pred_heatmap["rmse"] = calculate_rmse(gt_map, pred_map)  pred_heatmap["psnr"] = peak_signal_noise_ratio(gt_map, pred_map)  pred_heatmap["ssim"] = structural_similarity(gt_map, pred_map)  # 更新样本中的预测结果(包含指标)sample[pred_field] = pred_heatmap  # 添加动态字段至数据集(确保FiftyOne应用中可查看指标)dataset.add_dynamic_sample_fields()
4.1.2 批量评估与结果统计

调用评估函数对DPT与Marigold模型的预测结果进行批量评估,并计算数据集上的平均指标:

# 评估DPT模型
evaluate_depth_model(dataset, "dpt_pred", "gt_depth")  
# 评估Marigold模型
evaluate_depth_model(dataset, "marigold_pred", "gt_depth")  # 统计并打印平均指标
print("单目深度估计模型平均性能指标对比")  
print("="*80)  
for model_field in ["dpt_pred", "marigold_pred"]:  model_name = "DPT" if model_field == "dpt_pred" else "Marigold"  print(f"\n【{model_name}模型】")  print("-"*40)  # 计算每个指标的平均值avg_rmse = dataset.mean(f"{model_field}.rmse")  avg_psnr = dataset.mean(f"{model_field}.psnr")  avg_ssim = dataset.mean(f"{model_field}.ssim")  # 格式化输出(保留4位小数)print(f"平均RMSE: {avg_rmse:.4f}")  print(f"平均PSNR: {avg_psnr:.4f} dB")  print(f"平均SSIM: {avg_ssim:.4f}")  
4.1.3 定量结果分析

实验输出的平均指标如下(基于20个SUN RGB-D样本计算):

模型平均RMSE平均PSNR(dB)平均SSIM
DPT49.891614.80590.8398
Marigold104.00617.93020.4277

从定量结果可得出以下结论:

  1. RMSE指标:DPT模型的平均RMSE(49.8916)远低于Marigold(104.0061),表明DPT的整体深度预测偏差更小;
  2. PSNR指标:DPT的平均PSNR(14.8059 dB)约为Marigold(7.9302 dB)的1.87倍,说明DPT预测结果的保真度更高;
  3. SSIM指标:DPT的平均SSIM(0.8398)接近理想值1,且显著高于Marigold(0.4277),证明DPT更能准确捕捉场景的深度结构。

需注意的是,指标结果受以下因素影响:

  • 真实数据质量:如2.4节所述,SUN RGB-D的真实深度图存在噪声与偏差,可能导致指标低估模型性能;
  • 预处理流程:深度图的归一化方式、尺寸插值算法会直接影响逐像素对比结果;
  • 模型输入设置:Marigold的远程推理未调整超参数(如扩散步数),若优化参数可能提升性能。

4.2 定性评估与结果可视化

定性评估通过FiftyOne应用的多视图对比掩码切换功能实现,重点观察模型在不同场景区域的表现差异。

4.2.1 场景细节对比

选取包含复杂物体遮挡(如家具、门窗)的样本,对比模型对细节区域的深度预测能力:

  • DPT模型:对物体边缘的深度过渡刻画更平滑,如桌椅与地面的交界区域,深度值变化连续,无明显跳变;
  • Marigold模型:物体内部的深度细节更丰富(如桌面纹理对应的深度微小差异),但边缘区域存在噪声,易将相邻物体的深度混淆。
4.2.2 远距离区域对比

选取包含远景(如墙面、窗外场景)的样本,观察模型对远距离深度的预测精度:

  • DPT模型:远距离区域的深度预测更稳定,如墙面整体深度值一致,无明显斑块状噪声;
  • Marigold模型:远距离区域易出现深度值波动,部分区域甚至出现“近距误判”(如将墙面标注为近距),可能与扩散模型的生成随机性有关。
4.2.3 动态对比演示

通过FiftyOne应用的“掩码切换”功能,可实时对比真实深度图与模型预测图的差异,操作如图7所示:

在这里插入图片描述
图7 真实深度图与模型预测图的动态对比演示

动态对比可直观发现:DPT模型的预测图与真实图的整体结构更一致,而Marigold在局部区域(如阴影、暗区)的偏差更明显。

5 结论与展望

5.1 研究结论

本文基于Hugging Face与FiftyOne工具链,完成了单目深度估计的全流程实验,主要结论如下:

  1. 技术流程可行性:通过Hugging Face的transformers/diffusers库可快速部署主流单目深度估计模型(DPT、Marigold),FiftyOne则为数据管理、可视化与评估提供了高效支持,两类工具的结合显著降低了单目深度估计的实验门槛;
  2. 模型性能差异:在SUN RGB-D数据集的NYU Depth v2子集上,DPT模型(基于Transformer)的综合性能优于Marigold模型(基于扩散),尤其在整体偏差(RMSE)与结构一致性(SSIM)上优势明显;Marigold虽在细节刻画上有潜力,但需优化超参数以降低远距离区域噪声;
  3. 任务核心挑战:单目深度估计仍面临三大核心问题——真实深度数据质量有限(噪声、标注偏差)、模型泛化能力不足(易受场景光照/纹理影响)、评估指标局限性(RMSE对异常值敏感,SSIM难以捕捉全局结构偏差)。

5.2 未来展望

针对当前研究的局限性,未来可从以下方向展开进一步探索:

  1. 数据增强与预处理:采用深度图去噪、多模态数据融合(如RGB+语义标签)等方式提升数据质量,减少真实数据偏差对模型评估的影响;
  2. 模型优化:结合Transformer与扩散模型的优势,设计混合架构(如用Transformer提取特征、扩散模型优化细节),平衡精度与效率;
  3. 评估体系完善:引入更贴合实际应用的指标(如深度排序一致性、场景导航适用性),并结合主观评估(人工打分)构建多维度评估体系;
  4. 应用场景拓展:将单目深度估计与下游任务(如目标检测、路径规划)结合,验证模型在实际系统中的实用性,如机器人室内导航、自动驾驶环境感知等。

通过持续优化模型架构、数据质量与评估方法,单目深度估计技术有望在资源受限场景(如移动端、嵌入式设备)中实现更广泛的应用。

http://www.dtcms.com/a/352054.html

相关文章:

  • 从零开始学MCP(7) | 实战:用 MCP 构建论文分析智能体
  • 零基础从头教学Linux(Day 20)
  • javascript 基础知识- 字面量/内置对象
  • LVGL学习
  • 【设计模式】 面向对象基础
  • K8S-Service资源对象
  • 虚拟机中kubeadim部署的k8s集群,虚拟机关机了,重新开机后集群状态能否正常恢复的两种可能(详解)
  • 114、【OS】【Nuttx】【周边】效果呈现方案解析:-print0 补充(下)
  • WeakAuras Lua Script ICC (BarneyICC) Simplified Chinese [Mini]
  • WeakAuras Lua Script (My Version)
  • 【数据分享】各地级市当年实际使用外商外资金额(2003-2021)-有缺失值
  • 【AI Agent三】工具使用设计模式
  • 系统设计(数据库/微服务)
  • 基于Python+AlphaBot 实现红外遥控且自动避障的嵌入式智能小车系统
  • Cursor 中文输出设置:繁体改为简体的方法
  • uniapp 页面favicon.ico文件不存在提示404问题解决
  • uniapp 自动升级-uni-upgrade-center
  • 家庭事务管理系统|基于java和vue的家庭事务管理系统设计与实现(源码+数据库+文档)
  • 【Python实战练习】用 Python与Pygame 打造完整的贪吃蛇小游戏
  • Elasticsearch中的设置refresh_interval
  • Linux SSH 密钥认证登录原理与配置指南
  • linux下的网络编程:TCP(传输控制协议)编程
  • 数据结构(C语言篇):(一)算法复杂度
  • 复盘一个诡异的Bug之FileNotFoundException
  • 数据结构的线性表 之 链表
  • 二、JVM 入门——(三)栈
  • 动手学深度学习(pytorch版):第七章节—现代卷积神经网络(2)使用块的网络(VGG)
  • MyBatis 流式查询详解
  • 使用 mcp-use 构建极简 Web 自动化测试智能体「喂饭教程」
  • 前端漏洞(上)- CORS漏洞