基于YOLO与视觉大模型的开放词汇检测与分割实践

基于YOLO与视觉大模型的开放词汇检测与分割实践
30款热门AI模型一站整合DeepSeek/GLM/Claude 随心用限时 5 折。 点击领海量免费额度如果你正在做一个视觉项目比如监控人流、检测工业零件缺陷或者识别医学影像中的病灶你可能会遇到一个经典难题模型训练好了但面对一个全新的、从未见过的物体类别时它完全“瞎了”。你不得不重新收集数据、标注、训练这个周期动辄以周计算。有没有一种方法能让模型像人一样听到“帮我找出图片里所有红色的消防栓”或者“分割出那只戴帽子的猫”这样的指令就能立刻执行这正是“视觉大模型”正在颠覆的领域。它不再局限于预定义的几十个类别而是试图理解开放世界的概念。而 YOLO这个以“快”著称的目标检测老将也在不断进化从单纯的检测工具演变为一个支持多种视觉任务的强大平台。当我们将 YOLO 的“暴力”速度与视觉大模型的“理解”能力相结合一种全新的、近乎“暴力美学”的解决方案便诞生了用户输入一句话模型就能实时、准确地完成检测或分割。这篇文章要解决的正是这个核心问题如何利用 YOLO 的最新生态和视觉大模型的开放能力构建一个“即说即检”的智能视觉系统我们将从概念拆解开始一步步深入到代码实现让你不仅能理解这套组合拳背后的原理更能亲手搭建一个可运行的示例。无论你是想为现有项目增加零样本识别能力还是探索下一代人机交互方式这篇文章都将提供一条清晰的实践路径。1. 从“固定类别”到“开放世界”视觉任务的范式转移在传统的计算机视觉项目中流程是高度固化的。以 YOLO 为例你需要定义类别明确你要检测的物体比如“人”、“车”、“狗”。收集数据找到包含这些物体的图片。标注数据用矩形框检测或多边形分割精确标出每个物体并打上类别标签。训练模型用标注好的数据训练 YOLO 模型让它学习“人”、“车”、“狗”长什么样。部署推理将训练好的模型部署到应用端。这个流程的瓶颈在于“定义类别”。一旦需求变更比如新增一个“滑板车”类别整个流程几乎要重来一遍。模型就像一个只会做固定几道菜的厨师菜谱之外的一概不会。视觉大模型如 Grounding DINO, SAM, CLIP的出现改变了游戏规则。它们的核心思想是“开放词汇”Open-Vocabulary和“提示”Prompting。CLIP通过海量“图像-文本”对进行训练学会了将图像特征和文本特征映射到同一个语义空间。简单说它能理解“文本描述的语义”和“图像视觉内容”之间的关联。Grounding DINO一个结合了 DINO一种自监督视觉模型和“接地”Grounding即文本-图像对齐思想的检测器。它可以直接接受文本描述如“一只棕色的狗”作为输入在图像中定位出对应的区域而无需针对“狗”这个类别进行专门训练。SAM (Segment Anything Model)一个通用的图像分割模型。给它一个“提示”可以是一个点、一个框或者一段文本描述它就能分割出对应的物体或区域。那么YOLO 在这里扮演什么角色YOLO 的最新版本如 YOLOv8, YOLOv10, YOLO26已经演变成一个多任务统一框架不仅支持检测还原生支持分割、分类、姿态估计等。更重要的是Ultralytics 提供的生态极其完善从安装、训练到部署都有非常顺畅的 pipeline。我们可以将 YOLO 视为一个高效、稳定、易用的“执行引擎”。“暴力美学”的融合思路用视觉大模型如 Grounding DINO的开放词汇理解能力将用户的一句自然语言如“戴红色帽子的行人”转化为一个或多个候选区域边界框。然后利用 YOLO特别是其分割版本如 YOLOv8-seg强大的实例分割能力对这些候选区域进行精细化的像素级分割。YOLO 的“暴力”体现在其极致的推理速度和工程化友好度上而大模型的“美学”则体现在其语义理解的灵活性上。两者结合既拥有了“理解任意描述”的智能又保留了“实时响应”的实用性。2. 核心组件拆解YOLO 与视觉大模型如何协同工作要构建这样一个系统我们需要理解几个核心组件及其分工。2.1 YOLO高效精准的“执行者”根据网络搜索材料YOLO 系列仍在快速迭代。YOLO26 作为下一代模型强调了端到端无 NMS 推理和边缘部署优化。对于我们的场景需要关注 YOLO 的以下几个关键特性多任务支持YOLOv8 之后一个模型架构通过不同的头Head支持检测detect、分割segment、分类classify、姿态估计pose等。这为我们后续的流程集成提供了便利。高效的推理引擎YOLO 的核心优势一直是速度。Ultralytics 库提供了优化的 PyTorch 和 ONNX 导出甚至支持 TensorRT 加速能满足实时性要求。易于使用的 APIfrom ultralytics import YOLO几行代码就能完成模型的加载、推理和结果可视化极大降低了开发门槛。在我们的流程中YOLO 将主要负责接收来自上游的“区域建议”并执行高质量的实例分割。2.2 视觉大模型开放世界的“理解者”这里我们主要关注Grounding DINO和SAM。Grounding DINO它是一个开放集目标检测器。你输入一张图片和一段文本描述例如“cat, dog, bicycle”它就能输出图中与这些文本对应的物体的边界框和置信度。它完美解决了“零样本检测”的问题。SAM它是一个通用的分割模型。给它一个提示点、框、掩码或文本它就能输出高质量的分割掩码。SAM 2 和 SAM 3 进一步增强了基于文本提示的分割能力。在我们的流程中视觉大模型特别是 Grounding DINO将扮演“指令解析器”的角色将用户的自然语言转换为图像中待处理区域的边界框。2.3 协同工作流程一个典型的“用户输入一句话自动检测”的流程可以拆解如下用户输入用户提供一张图片和一句文本描述如“找出所有穿白色衬衫的人”。文本理解与区域提名将图片和文本送入Grounding DINO。模型会输出一系列边界框每个框对应文本中提到的概念“穿白色衬衫的人”并带有置信度分数。区域精炼与分割将 Grounding DINO 输出的高置信度边界框作为YOLO 分割模型的输入提示即bbox提示。YOLO 分割模型会基于这些框对每个区域进行更精细的实例分割得到像素级的掩码。结果融合与输出将 YOLO 分割出的掩码与原始图像叠加生成最终的可视化结果。同时可以输出每个分割物体的类别来自文本、置信度和位置信息。为什么不是直接用 SAMSAM 本身也支持文本提示SAM 3 的 CLIP 融合版本。但在实际应用中Grounding DINO 在开放词汇检测任务上通常有更优的表现且其输出的检测框可以作为非常可靠的提示输入给 YOLO 或 SAM 进行分割形成“检测分割”的两阶段流水线在精度和效率上取得平衡。3. 环境准备与工具安装在开始代码实践前我们需要搭建好开发环境。本项目主要使用 Python并依赖 PyTorch 深度学习框架。3.1 基础环境建议使用 Python 3.8 到 3.10 版本。使用 Conda 或 venv 创建独立的虚拟环境是一个好习惯。# 创建并激活虚拟环境 (以 conda 为例) conda create -n open-vision python3.9 conda activate open-vision3.2 安装核心库我们将安装 Ultralytics YOLO 库和 Grounding DINO 的官方实现。SAM 的安装是可选的因为本例中我们用 YOLO 做分割。# 1. 安装 PyTorch (请根据你的CUDA版本访问 https://pytorch.org/ 获取最新命令) # 例如对于 CUDA 11.8 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 2. 安装 Ultralytics YOLO (这将安装 YOLOv8, 同时也支持最新的 YOLO26 等) pip install ultralytics # 3. 安装 Grounding DINO # 首先克隆仓库注意原仓库可能更新以下为示例 git clone https://github.com/IDEA-Research/GroundingDINO.git cd GroundingDINO pip install -e . # 安装其依赖 pip install -r requirements.txt # 回到项目根目录 cd .. # 4. 安装其他辅助库 pip install opencv-python pillow matplotlib supervision重要说明supervision是一个非常有用的计算机视觉工具库简化了检测框和分割掩码的可视化与处理。3.3 下载模型权重YOLO 模型权重Ultralytics 会在首次运行时自动下载。但我们也可以预先指定。例如我们将使用yolov8x-seg.pt分割大模型以获得更好的精度。Grounding DINO 权重需要从官方仓库的 Release 页面手动下载。通常是一个.pth文件。假设我们下载了groundingdino_swint_ogc.pth。将下载的 Grounding DINO 权重文件放在一个合适的目录例如./weights/。4. 核心流程代码实现现在我们来编写核心代码将上述流程串联起来。我们将创建一个名为open_vocab_detector.py的脚本。4.1 导入库与初始化模型# open_vocab_detector.py import cv2 import torch import numpy as np from PIL import Image import supervision as sv from ultralytics import YOLO # Grounding DINO 的导入方式可能因版本略有不同以下是通用方式 import groundingdino.datasets.transforms as T from groundingdino.models import build_model from groundingdino.util.slconfig import SLConfig from groundingdino.util.utils import clean_state_dict, get_phrases_from_posmap # 1. 初始化 Grounding DINO def load_grounding_dino_model(model_config_path, model_checkpoint_path, devicecuda): 加载 Grounding DINO 模型 args SLConfig.fromfile(model_config_path) args.device device model build_model(args) checkpoint torch.load(model_checkpoint_path, map_locationcpu) model.load_state_dict(clean_state_dict(checkpoint[model]), strictFalse) model.eval().to(device) return model def get_grounding_output(model, image, caption, box_threshold0.3, text_threshold0.25): 运行 Grounding DINO 推理 # 图像预处理 transform T.Compose([ T.RandomResize([800], max_size1333), T.ToTensor(), T.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]), ]) image_transformed, _ transform(image, None) image_tensor image_transformed.unsqueeze(0).to(model.device) # 文本预处理 tokenizer model.tokenizer tokenized tokenizer(caption, paddinglongest, return_tensorspt) tokenized {k: v.to(model.device) for k, v in tokenized.items()} # 模型推理 with torch.no_grad(): outputs model(image_tensor, **tokenized) # 后处理提取预测框和短语 prediction_logits outputs[pred_logits].sigmoid()[0] # (nq, 256) prediction_boxes outputs[pred_boxes][0] # (nq, 4) # 根据阈值过滤 logits_filter prediction_logits.max(dim1)[0] box_threshold boxes prediction_boxes[logits_filter] logits prediction_logits[logits_filter] # 提取文本短语 tokenized_caption tokenized[input_ids][0].tolist() phrases [] for logit in logits: # 找到与文本 token 对应的最大 logit 位置 max_idx logit.argmax() # 根据模型实现获取短语这里是一个简化示例 # 实际应使用 get_phrases_from_posmap 等工具函数 phrases.append(caption) # 简化处理实际应为从caption中提取的子短语 # 注意完整的短语提取需要更复杂的处理此处为演示简化。 # 在实际使用中请参考 Grounding DINO 官方 demo 中的 get_phrases_from_posmap 函数。 return boxes.cpu().numpy(), logits.max(dim1)[0].cpu().numpy(), phrases # 2. 初始化 YOLO 分割模型 def load_yolo_seg_model(model_pathyolov8x-seg.pt, devicecuda): 加载 YOLO 分割模型 model YOLO(model_path) model.to(device) return model def run_yolo_segmentation(yolo_model, image, boxes): 使用 YOLO 对指定区域进行分割 # 将边界框转换为 YOLO 可用的格式这里我们使用 YOLO 的预测模式并传入 crops # 更优的做法是将原图和 boxes 一起送入模型但 YOLO 原生支持基于提示的分割尚在完善。 # 作为替代方案我们可以将每个检测框区域裁剪出来分别进行分割再映射回原图。 # 注意这是一种简化实现。对于生产环境需要考虑更高效和精确的集成方式。 h, w image.shape[:2] masks [] confs [] for box in boxes: # box 格式为 [x_center, y_center, width, height]且为归一化坐标 x_center, y_center, bw, bh box x1 int((x_center - bw/2) * w) y1 int((y_center - bh/2) * h) x2 int((x_center bw/2) * w) y2 int((y_center bh/2) * h) # 确保坐标在图像范围内 x1, y1 max(0, x1), max(0, y1) x2, y2 min(w, x2), min(h, y2) if x2 x1 or y2 y1: continue # 裁剪区域 crop image[y1:y2, x1:x2] if crop.size 0: continue # 使用 YOLO 对裁剪区域进行分割 results yolo_model(crop, conf0.25, iou0.7, verboseFalse) # 可以调整置信度和IoU阈值 if results and results[0].masks is not None: # 取置信度最高的实例 max_conf_idx results[0].boxes.conf.argmax() if len(results[0].boxes) 0 else 0 mask results[0].masks.data[max_conf_idx].cpu().numpy() # 将 mask 的坐标转换回原图坐标系 full_mask np.zeros((h, w), dtypenp.uint8) mh, mw mask.shape # 将裁剪区域的 mask 缩放到原图对应位置 resized_mask cv2.resize(mask.astype(np.float32), (x2-x1, y2-y1)) full_mask[y1:y2, x1:x2] (resized_mask 0.5).astype(np.uint8) * 255 masks.append(full_mask) conf results[0].boxes.conf[max_conf_idx].cpu().numpy() if len(results[0].boxes) 0 else 0.5 confs.append(conf) return masks, confs4.2 主流程串联推理与可视化# open_vocab_detector.py (续) def main(image_path, text_prompt, output_pathresult.jpg): 主函数执行开放词汇检测与分割 device cuda if torch.cuda.is_available() else cpu print(f使用设备: {device}) # --- 加载模型 --- print(正在加载 Grounding DINO 模型...) # 请替换为你的配置文件路径和权重路径 gdino_config ./GroundingDINO/groundingdino/config/GroundingDINO_SwinT_OGC.py gdino_checkpoint ./weights/groundingdino_swint_ogc.pth grounding_dino_model load_grounding_dino_model(gdino_config, gdino_checkpoint, device) print(正在加载 YOLO 分割模型...) yolo_seg_model load_yolo_seg_model(devicedevice) # 默认自动下载 yolov8x-seg.pt # --- 读取并处理图像 --- image_pil Image.open(image_path).convert(RGB) image_cv2 cv2.cvtColor(np.array(image_pil), cv2.COLOR_RGB2BGR) image_h, image_w image_cv2.shape[:2] # --- Grounding DINO 阶段文本驱动的检测 --- print(f使用提示词 {text_prompt} 进行开放词汇检测...) boxes, scores, phrases get_grounding_output( grounding_dino_model, image_pil, captiontext_prompt, box_threshold0.35, # 可调整检测阈值 text_threshold0.25 ) print(fGrounding DINO 检测到 {len(boxes)} 个候选区域。) if len(boxes) 0: print(未检测到相关物体。) return # 将归一化框坐标转换为像素坐标 (xywh normalized - xyxy pixels) detections sv.Detections.from_grounding_dino( xyxysv.box_convert_xywh_to_xyxy(boxes * np.array([image_w, image_h, image_w, image_h])), confidencescores, class_idnp.zeros(len(boxes), dtypeint), # Grounding DINO 不输出类别ID我们用0占位 ) # --- YOLO 阶段基于检测框的精细分割 --- print(正在进行精细实例分割...) masks, seg_confs run_yolo_segmentation(yolo_seg_model, image_cv2, boxes) # 注意这里 masks 的长度可能与 boxes 不同因为有些框内可能未分割出有效物体。 # 为了简化演示我们假设一一对应。实际应用中需要更严谨的关联逻辑。 if masks: # 将分割结果添加到 detections 对象中这里简化处理只取第一个mask对应第一个box # 更健壮的做法是根据IoU等指标将mask与box匹配。 detections.mask np.array(masks) # --- 可视化结果 --- print(生成可视化结果...) box_annotator sv.BoxAnnotator() mask_annotator sv.MaskAnnotator() label_annotator sv.LabelAnnotator() # 绘制边界框和标签 labels [f{phrases[i] if ilen(phrases) else obj} {scores[i]:.2f} for i in range(len(detections))] annotated_image box_annotator.annotate(sceneimage_cv2.copy(), detectionsdetections) annotated_image label_annotator.annotate(sceneannotated_image, detectionsdetections, labelslabels) # 绘制分割掩码 if hasattr(detections, mask) and detections.mask is not None: annotated_image mask_annotator.annotate(sceneannotated_image, detectionsdetections) # 保存结果 cv2.imwrite(output_path, annotated_image) print(f结果已保存至: {output_path}) # 可选显示图片 # sv.plot_image(annotated_image, (10, 10)) if __name__ __main__: # 使用示例 image_path ./test_image.jpg # 替换为你的图片路径 text_prompt person wearing white shirt . bicycle . dog # 替换为你的文本提示多个类别用英文句点分隔 main(image_path, text_prompt)5. 运行与效果验证5.1 准备测试素材找一张包含多种物体的图片保存为test_image.jpg放在项目根目录。确保 Grounding DINO 的配置文件和权重文件路径正确代码中的gdino_config和gdino_checkpoint变量。5.2 执行脚本在激活的虚拟环境中运行python open_vocab_detector.py5.3 预期输出与解读程序运行后你将在终端看到类似以下日志使用设备: cuda 正在加载 Grounding DINO 模型... 正在加载 YOLO 分割模型... 使用提示词 person wearing white shirt . bicycle . dog 进行开放词汇检测... Grounding DINO 检测到 3 个候选区域。 正在进行精细实例分割... 生成可视化结果... 结果已保存至: result.jpg生成的result.jpg将是一张标注好的图片彩色半透明掩码覆盖在被分割的物体上例如穿白衬衫的人、自行车、狗。边界框每个被检测物体的外围矩形框。标签在框的附近显示文本提示和置信度例如person wearing white shirt 0.78。如何判断成功基础成功程序无报错运行完毕生成result.jpg。功能成功图片中与文本描述匹配的物体被正确框出并分割。例如文本是“穿白衬衫的人”那么图中所有符合该描述的人都应被高亮。精度评估你可以通过肉眼观察分割边缘是否精细、是否漏检或误检来定性评估效果。如果失败第一步排查哪里模型加载失败检查 Grounding DINO 和 YOLO 的模型文件路径是否正确网络是否通畅YOLO 会自动下载。CUDA 内存不足如果图片太大或模型太大可能会显存溢出。尝试减小图片尺寸在代码中image_pil后添加 resize或使用更小的 YOLO 模型如yolov8n-seg.pt。无检测结果调整get_grounding_output函数中的box_threshold和text_threshold参数降低阈值以检测更多目标提高阈值以减少误检。同时检查文本提示的格式Grounding DINO 通常对英文短语用句点.分隔响应更好。6. 常见问题与排查思路在实际集成和运行中你可能会遇到以下问题问题现象可能原因排查方式解决方案ModuleNotFoundError: No module named groundingdinoGrounding DINO 未正确安装或不在 Python 路径。在 Python 交互环境中import groundingdino测试。确保在GroundingDINO目录下执行了pip install -e .并在正确的虚拟环境中运行脚本。RuntimeError: CUDA out of memory显卡显存不足。使用nvidia-smi查看显存占用。1. 减小输入图像尺寸。2. 使用更小的模型YOLO 用n/s版本Grounding DINO 可用Swint而非SwinB配置。3. 使用 CPU 模式devicecpu但速度会慢很多。Grounding DINO 检测不到任何物体。1. 文本提示不明确或格式不对。2. 检测阈值 (box_threshold) 设置过高。3. 物体在训练数据中不常见。1. 检查文本提示是否为英文名词短语。2. 逐步降低box_threshold(如从 0.3 降到 0.15)。3. 尝试更通用的描述。1. 使用简单、具体的英文单词或短语用.分隔。2. 调整阈值参数。3. 考虑使用更强大的视觉语言模型如 GLIP 或 OWL-ViT进行对比。YOLO 分割结果粗糙或错误。1. 基于裁剪的分割方式导致上下文丢失。2. YOLO 模型在特定物体上精度不足。观察分割掩码是否只覆盖了物体的一部分或者包含了背景。1. 考虑使用原图检测框作为整体输入给 YOLO 的分割模式需等待 YOLO 官方对提示输入更完善的支持。2. 使用更大的 YOLO 分割模型 (x版本)。3. 尝试用 SAM 替代 YOLO 进行分割步骤。处理速度很慢。1. 模型过大。2. 未使用 GPU。3. 循环处理每个框效率低。使用 Python 的time模块对每个函数计时。1. 模型量化如导出为 INT8 的 TensorRT 引擎。2. 确保torch.cuda.is_available()为 True。3. 批量处理将多个裁剪区域拼接成一个 batch 输入 YOLO。短语 (phrases) 显示不正确。代码中短语提取部分被简化。查看输出标签是否都是完整的文本提示而非具体的子短语。实现完整的get_phrases_from_posmap函数参考 Grounding DINO 官方仓库的demo.py。7. 最佳实践与工程化建议将原型转化为稳定、可用的系统需要考虑更多工程细节。7.1 提示工程Prompt Engineering文本提示的质量直接影响 Grounding DINO 的检测效果。具体化“红色双层巴士”比“巴士”更好。使用名词短语通常使用英文的逗号或句点分隔的列表如cat, dog, person riding a bicycle。处理歧义如果“苹果”可能指水果或公司可以尝试更具体的描述如“red apple fruit”或“Apple company logo”。多轮交互对于复杂场景可以设计多轮对话先用大模型检测大类别再对特定区域进行细化描述和检测。7.2 性能优化模型选择精度优先Grounding DINO SwinB YOLOv8x-seg。速度优先Grounding DINO SwinT YOLOv8n-seg。最新技术关注 YOLO26 等新版本它们可能在精度-速度权衡上更有优势。推理优化ONNX/TensorRT 导出将 PyTorch 模型转换为优化后的推理格式可大幅提升速度。模型量化使用 FP16 或 INT8 量化在精度损失可接受的前提下减少内存占用和加速。流水线并行如果处理视频流可以将 Grounding DINO 和 YOLO 放在不同的线程或进程甚至不同的硬件上并行执行。缓存与预热对于固定的文本提示如预定义的检测类别可以预先计算文本特征避免每次推理都进行 tokenize。7.3 错误处理与鲁棒性空结果处理当 Grounding DINO 或 YOLO 未返回任何结果时应有降级策略如返回空列表或尝试其他提示。坐标越界检查确保从归一化坐标转换到像素坐标时不会出现负值或超出图像范围。资源管理使用try...except块捕获 CUDA 内存错误并优雅地回退到 CPU 模式或降低处理分辨率。日志与监控记录每次推理的耗时、检测到的物体数量、置信度分布等便于性能分析和问题排查。7.4 部署考量服务化使用 FastAPI 或 Triton Inference Server 将模型封装成 HTTP 或 gRPC 服务。版本管理对模型权重和代码进行版本控制便于回滚和 A/B 测试。安全与隐私处理用户上传的图片时需考虑数据脱敏、隐私合规。模型本身也可能存在偏见需在应用层面进行审核。8. 总结与进阶方向通过本文的拆解与实践我们实现了一个将 YOLO 的“暴力”执行能力与视觉大模型的“美学”理解能力相结合的方案。它不再是只能识别固定 80 个类的“封闭系统”而是一个能响应用户自然语言指令的“开放视觉智能体”。这种组合的优势在于既利用了 YOLO 系列在工程化、速度和分割精度上的深厚积累又借助 Grounding DINO 等模型突破了类别限制。本文的核心价值点在于清晰的架构认知理解了“开放词汇检测”与“实例分割”两个阶段的分工与协作。可运行的代码流水线提供了一个从零搭建的完整代码示例读者可以替换自己的图片和提示词立即体验。落地的优化思路指出了性能瓶颈和常见的工程化问题并给出了解决方向。如果你想继续深入以下几个方向值得探索端到端模型关注如OWLv2、GLIP等更新、更强的开放词汇检测模型以及SAM 2/3在文本提示分割上的进展。未来可能会出现一个模型同时完成检测和分割。提示自动生成结合大型语言模型LLM让用户输入更自由的指令如“找出图片中所有可能造成危险的物品”由 LLM 将其转化为适合 Grounding DINO 的检测提示词列表。视频流处理将本方案应用于实时视频流并引入跟踪算法如 ByteTrack、BoT-SORT实现跨帧的、基于语言描述的物体跟踪。与 YOLO 生态深度集成密切关注 Ultralytics 框架的更新未来其原生支持可能更完善或许能直接接受文本提示作为输入实现更优雅的集成。技术的“暴力美学”不在于堆砌参数而在于用简洁高效的组合解决原本复杂的问题。YOLO 与视觉大模型的结合正是这一理念的生动体现。希望这篇文章能成为你探索开放世界视觉感知的起点。 30款热门AI模型一站整合DeepSeek/GLM/Claude 随心用限时 5 折。 点击领海量免费额度