1. 从一张“抠不干净”的图说起Gemini 2.5 这次升级里最让我意外的不是文本推理而是它把图像分割做成了对话式能力。简单说你不再需要标注框、掩码文件或者专门的 CV 模型只要用自然语言描述“把左边那只被遮挡的橘猫抠出来保留胡须”它就能返回对应的分割区域。对于做智能硬件、内容工具、电商素材处理的人来说这意味着图像分割从“训练一个模型”变成了“写一句提示词”。这篇内容聚焦 Gemini 2.5 图像分割能力在对话指令下的落地路径从 API 接入、提示词设计到分割结果验证。我会给出可复制的config.toml骨架和 TaoToken 统一 Key 配置示例并完整演示一次分割调用与结果校验。适合已经会写 Python、想快速把语义分割接进自己工作流的人也适合刚接触多模态 API、想找一个能跑通的最小闭环的开发者。需要先说明一点Gemini 2.5 的图像分割不是传统意义上的像素级 mask 输出它更偏向“语义区域定位 边界描述 可选掩码”。所以验证环节不能只看返回文本还要把区域坐标或掩码叠加回原图确认。下面所有操作都基于 TaoToken 的统一接入方式你不需要分别维护多家 Key。2. TaoToken 前置统一 Key 与 config.toml 骨架TaoToken 在这里的角色是统一 API 入口。你注册后拿到一个 Key就可以在同一个配置里切换 Gemini 2.5、Claude、GPT 等模型不用为每个厂商单独写一套鉴权逻辑。对图像分割这种需要反复调试提示词的场景统一 Key 能省掉大量切换成本。先到官网注册并创建 API Keyhttps://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentapi-keys创建完成后把 Key 写进环境变量不要硬编码进代码。Linux/macOS 下export TAOTOKEN_API_KEYsk-你的实际KeyWindows PowerShell$env:TAOTOKEN_API_KEYsk-你的实际Key接下来是config.toml骨架。这个文件负责声明模型、API 地址、超时和图像分割相关参数。你可以直接复制# config.toml [api] base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY timeout_seconds 120 [model] name gemini-2.5-pro max_output_tokens 4096 temperature 0.2 [image] input_path ./samples/street.jpg output_dir ./outputs save_mask true save_overlay true [segmentation] prompt 分割出画面中所有被遮挡的行人保留其可见轮廓忽略广告牌上的人像 return_format json几个参数说明。base_url固定为https://taotoken.net/api不要加 UTM 后缀。temperature设 0.2 是为了让分割描述更稳定太高会导致同一张图每次返回的区域描述漂移。save_mask和save_overlay分别控制是否保存掩码和叠加图调试阶段建议都开。注意api_key_env写的是环境变量名不是 Key 本身。这样配置文件可以进 GitKey 不会泄露。3. 可复制配置对话指令驱动的分割调用配置写好后用 Python 发起一次分割请求。核心思路是把图像转成 base64和提示词一起发给 Gemini 2.5然后解析返回的区域描述与掩码数据。先安装依赖pip install requests pillow tomli下面是完整调用脚本segment.pyimport base64 import json import os import tomli import requests from PIL import Image, ImageDraw with open(config.toml, rb) as f: cfg tomli.load(f) api_key os.environ[cfg[api][api_key_env]] base_url cfg[api][base_url] model cfg[model][name] with open(cfg[image][input_path], rb) as img: img_b64 base64.b64encode(img.read()).decode() prompt cfg[segmentation][prompt] payload { model: model, messages: [ { role: user, content: [ {type: text, text: prompt}, { type: image_url, image_url: {url: fdata:image/jpeg;base64,{img_b64}} } ] } ], temperature: cfg[model][temperature], max_tokens: cfg[model][max_output_tokens] } headers { Authorization: fBearer {api_key}, Content-Type: application/json } resp requests.post( f{base_url}/v1/chat/completions, headersheaders, jsonpayload, timeoutcfg[api][timeout_seconds] ) resp.raise_for_status() result resp.json() print(json.dumps(result, ensure_asciiFalse, indent2))这段代码跑通后你会拿到一个 JSON 响应。Gemini 2.5 的图像分割结果通常包含三部分区域描述、边界框坐标、以及可选的掩码引用。不同版本返回字段可能略有差异所以下一步要做结果校验不能直接信任文本。提示词设计上我建议遵循“主体 关系 排除条件”的结构。比如“分割出画面中所有被遮挡的行人保留其可见轮廓忽略广告牌上的人像”就比“把行人抠出来”稳定得多。关系词被遮挡、相邻、位于左侧和排除条件忽略、不包含能显著减少误分割。4. 验证请求把分割结果叠加回原图拿到响应后先做一次结构校验再做视觉校验。结构校验检查返回里有没有区域坐标或掩码字段视觉校验把坐标画回原图人眼确认边界是否合理。下面这段代码读取上一步的result解析区域并生成叠加图import re def parse_regions(resp_json): content resp_json[choices][0][message][content] # 尝试从返回文本中提取 JSON 块 match re.search(r\{.*\}, content, re.S) if not match: raise ValueError(未找到结构化分割结果) return json.loads(match.group()) regions parse_regions(result) print(识别到区域数量:, len(regions.get(objects, []))) img Image.open(cfg[image][input_path]).convert(RGB) draw ImageDraw.Draw(img) for obj in regions.get(objects, []): box obj.get(bbox) label obj.get(label, unknown) if box: draw.rectangle(box, outlinered, width3) draw.text((box[0], box[1] - 12), label, fillred) out_path os.path.join(cfg[image][output_dir], overlay.jpg) os.makedirs(cfg[image][output_dir], exist_okTrue) img.save(out_path) print(叠加图已保存:, out_path)跑完后打开outputs/overlay.jpg重点看三件事被遮挡行人的可见轮廓是否被完整框住广告牌上的人像是否被正确排除边界框有没有把相邻物体误吞进去。如果发现漏分割优先调整提示词里的关系词而不是调 temperature。成功结果的特征是区域数量与你的预期一致边界框贴合可见轮廓排除条件生效。如果返回的是掩码而非 bbox把draw.rectangle换成掩码叠加即可逻辑一样。5. 本篇常见错排查5.1 返回 401 或鉴权失败先确认环境变量名和config.toml里的api_key_env一致。常见错误是 Key 复制时带了空格或者用了旧 Key。重新到 API Keys 页面生成一个再试。https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentapi-keys5.2 返回内容里没有结构化区域Gemini 2.5 有时会把分割结果写成自然语言段落而不是 JSON。解决办法是在提示词末尾加一句“请以 JSON 格式返回包含 objects 数组每个元素含 label 和 bbox”。如果仍然不稳定把temperature降到 0.1。5.3 图像过大导致超时base64 编码后图像体积会膨胀约 33%。如果原图超过 4MB建议先压缩到 1920px 宽再发送。可以在脚本里加一段 PIL 缩放img Image.open(path) if img.width 1920: ratio 1920 / img.width img img.resize((1920, int(img.height * ratio)))5.4 分割区域漂移同一张图多次调用结果不一致通常是 temperature 太高或提示词太模糊。把提示词改成“主体 关系 排除条件”结构temperature 设 0.1 到 0.2 之间。实测下来这个区间对分割任务最稳。5.5 掩码与 bbox 对不上如果返回同时含掩码和 bbox以掩码为准。bbox 只是粗略范围掩码才是像素级结果。叠加时先画掩码再用 bbox 做辅助标注。6. 把分割接进你的工作流跑通单次调用后下一步是把它接进实际流程。如果你只是验证模型能力可以直接用模型对话页面快速试提示词https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentmodel-chat如果你要长期做图像处理、批量分割或者把分割能力接进 Agent 工作流建议用 Coding Plan 管理调用配额和模型切换https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcoding-plan接入细节和字段说明以官方文档为准https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdoc最后留一个我踩过的坑批量处理时不要并发太高Gemini 2.5 的图像分割对单次请求的 token 消耗比纯文本大得多并发 3 到 5 路比较稳。先把单张图的提示词调稳再放大批量比一上来就压测要省时间。