ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

YOLOv10 仓库中的 FastSAMPrompt 详解:四种提示交互与掩码生成的源码级指南

YOLOv10 仓库中的 FastSAMPrompt 详解:四种提示交互与掩码生成的源码级指南 YOLOv10 仓库中的 FastSAMPrompt 详解四种提示交互与掩码生成的源码级指南【免费下载链接】yolov10YOLOv10: Real-Time End-to-End Object Detection [NeurIPS 2024]项目地址: https://gitcode.com/GitHub_Trending/yo/yolov10本篇技术指南以 docs/en/reference/models/fastsam/prompt.md 所指向的FastSAMPrompt类为绝对核心结合其源码 ultralytics/models/fastsam/prompt.py 与推理管线系统讲解 FastSAM 提示引导prompt-guided分割的完整工作方式。读完本文你将掌握everything_prompt、box_prompt、point_prompt、text_prompt四种提示模式的调用方法、底层实现原理IoU 选择、前景/背景点布尔合成、CLIP 文本检索以及如何把分割结果可视化输出。一、FastSAMPrompt 在整个 FastSAM 流程中的位置FastSAMFast Segment Anything Model将分割一切任务解耦为两个串行阶段全实例分割all-instance segmentation与提示引导选择prompt-guided selection。第一阶段由 YOLOv8-seg 风格的检测分割头完成为图像中所有实例生成掩码第二阶段则根据用户给出的提示框、点、文本输出对应的感兴趣区域。FastSAMPrompt正是负责第二阶段的 Prompt 处理类。从仓库结构看这一分工在源码层面非常清晰ultralytics/models/fastsam/model.py 中的FastSAM类把task固定为segment其task_map将预测器映射为FastSAMPredictorultralytics/models/fastsam/predict.py 中的FastSAMPredictor继承自DetectionPredictor在postprocess中完成 NMS、掩码解码与缩放产出带masks的Results对象随后FastSAMPrompt(source, results, device)接收这个Results在其上执行各类提示交互见 ultralytics/models/fastsam/init.py 的导出列表。也就是说FastSAMPrompt的输入是模型已经分割出的所有实例掩码它的工作不是重新分割而是根据提示在已有掩码中挑选、合并或过滤。二、类的初始化source、results 与 CLIP 依赖class FastSAMPrompt: def __init__(self, source, results, devicecuda) - None: self.device device self.results results self.source source try: import clip except ImportError: from ultralytics.utils.checks import check_requirements check_requirements(githttps://github.com/openai/CLIP.git) import clip self.clip clip对应 prompt.py#L26-L40三个核心属性为属性类型含义devicestr计算设备cuda或cpu默认cudaresultslist[Results]来自 FastSAM 推理的分割结果含masks、boxes、orig_img等sourcestr/Path输入图片路径用于后续裁剪与保存命名clipmoduleOpenAI CLIP仅text_prompt需要初始化时惰性导入需要特别说明的是 CLIP 依赖仓库采用先尝试import clip失败则通过check_requirements自动安装的惰性策略。因此只使用box_prompt、point_prompt、everything_prompt时不需要 CLIP只有调用text_prompt才会触发clip.load(ViT-B/32, ...)。这也解释了为什么 FastSAM 官方使用中会单独要求安装 CLIP见 docs/en/models/fast-sam.md。三、四种提示模式从调用到源码原理3.1 everything_prompt直接返回全部掩码def everything_prompt(self): return self.results对应 prompt.py#L355-L357。这是最简单的一档不做任何选择把第一阶段分割出的所有实例掩码原样返回用于分割一切场景。3.2 box_prompt基于 IoU 的框选掩码def box_prompt(self, bbox): if self.results[0].masks is not None: assert bbox[2] ! 0 and bbox[3] ! 0 ... masks self.results[0].masks.data # 坐标缩放掩码尺寸与原始图尺寸不一致时按比例换算 if h ! target_height or w ! target_width: bbox [int(bbox[0] * w / target_width), ...] # 边界裁剪到掩码尺寸内 bbox_area (bbox[3] - bbox[1]) * (bbox[2] - bbox[0]) masks_area torch.sum(masks[:, bbox[1]:bbox[3], bbox[0]:bbox[2]], dim(1, 2)) orig_masks_area torch.sum(masks, dim(1, 2)) union bbox_area orig_masks_area - masks_area iou masks_area / union max_iou_index torch.argmax(iou) self.results[0].masks.data torch.tensor(np.array([masks[max_iou_index].cpu().numpy()])) return self.results对应 prompt.py#L284-L317其核心逻辑是坐标对齐掩码张量的 H/W 与原始图尺寸往往不一致推理时做了 resize因此先把用户框[x1, y1, x2, y2]按比例缩放到掩码坐标系再取整并裁剪到[0, w]、[0, h]范围内IoU 计算对每个候选掩码计算其与用户框的交集面积masks_area再通过union bbox_area orig_masks_area - masks_area求并集得到 IoU掩码选择torch.argmax(iou)选出与用户框重叠度最高的那个掩码替换results[0].masks.data并返回。注意assert bbox[2] ! 0 and bbox[3] ! 0意味着框的宽高不能为 0同时source是目录时会抛出ValueError因为该模式依赖单张原图做坐标映射。3.3 point_prompt前景/背景点的布尔合成def point_prompt(self, points, pointlabel): if self.results[0].masks is not None: masks self._format_results(self.results[0], 0) # 同样先做坐标缩放 onemask np.zeros((h, w)) for annotation in masks: mask annotation[segmentation] for i, point in enumerate(points): if mask[point[1], point[0]] 1 and pointlabel[i] 1: onemask mask # 前景点命中的掩码做加法 if mask[point[1], point[0]] 1 and pointlabel[i] 0: onemask - mask # 背景点命中的掩码做减法 onemask onemask 1 self.results[0].masks.data torch.tensor(np.array([onemask])) return self.results对应 prompt.py#L319-L340。pointlabel的约定与官方用法一致1表示前景foreground0表示背景background。实现上是掩码级布尔运算——遍历所有候选掩码凡是命中前景点的掩码累加进onemask凡是命中背景点的掩码被减去最后以 1阈值化从而把被前景点选中但被背景点排除的区域剔除。这种设计与 FastSAM 官方用法完全对应point_label [1,0]分别标注正负点可参考 docs/en/models/fast-sam.md 中的命令示例。3.4 text_promptCLIP 跨模态文本检索def text_prompt(self, text): if self.results[0].masks is not None: format_results self._format_results(self.results[0], 0) cropped_boxes, cropped_images, not_crop, filter_id, annotations self._crop_image(format_results) clip_model, preprocess self.clip.load(ViT-B/32, deviceself.device) scores self.retrieve(clip_model, preprocess, cropped_boxes, text, deviceself.device) max_idx scores.argsort()[-1] max_idx sum(np.array(filter_id) int(max_idx)) self.results[0].masks.data torch.tensor(np.array([annotations[max_idx][segmentation]])) return self.results对应 prompt.py#L342-L353其流程分为四步_format_results把Results转为带segmentation、bbox、score、area的注解列表_crop_image按每个掩码的外接框裁剪出物体图像面积小于 100 像素的掩码会先被filter_id过滤掉retrieveprompt.py#L247-L258对裁剪图与文本分别用 CLIP 编码归一化后做点积得到相似度再对得分做softmax取相似度最高的裁剪图对应的掩码作为最终结果max_idx sum(np.array(filter_id) int(max_idx))用于补偿被过滤项对索引的偏移。因此text_prompt(a photo of a dog)的实质是用 CLIP 在所有候选物体裁剪图中检索与文本语义最匹配的一个返回其掩码。这也是 FastSAMPrompt 唯一依赖 CLIP 的功能。四、内部辅助方法注解格式化、掩码转框与图像裁剪这四个私有/静态方法构成了上述提示模式的公共底座均在 prompt.py 中实现方法位置作用_format_results(result, filter0)L58-L76把掩码张量逐张取出mask 1.0打包成含id、segmentation、bbox、score、area的注解字典列表filter可过滤像素数过小的掩码_get_bbox_from_mask(mask)L78-L94用cv2.findContours找外轮廓cv2.boundingRect得到[x1, y1, x2, y2]多轮廓时取包围所有轮廓的最小外接范围_segment_image(image, bbox)L42-L56把 bbox 内像素拷贝到新图像bbox 外置为白色背景相当于抠图_crop_image(format_results)L260-L282遍历注解过滤面积 ≤ 100 的掩码为每个掩码生成裁剪图与对应 bbox当掩码尺寸与原图不一致时先 resize 原图其中_crop_image的掩码尺寸对齐逻辑ori_w ! mask_w时image.resize((mask_w, mask_h))保证了 CLIP 输入与掩码坐标系一致是text_prompt正确工作的前提。五、可视化输出plot 与 fast_show_maskplot方法prompt.py#L96-L178接收annotations与output目录逐张把掩码、框、点叠加到原图上并保存参数默认值说明bboxNone叠加绘制的边界框[x1, y1, x2, y2]points/point_labelNone叠加绘制的前景黄y/背景品红m点mask_random_colorTrue掩码使用随机颜色better_qualityTrue对掩码做形态学MORPH_CLOSE3×3与MORPH_OPEN8×8改善边缘质量retinaFalse是否使用原始分辨率掩码False 时先cv2.resize回原图尺寸with_contoursTrue是否绘制掩码轮廓蓝色描边透明度 0.8fast_show_maskprompt.py#L180-L245是底层的 matplotlib 渲染函数它会按面积升序排序掩码、再用 argmax 叠加小面积掩码在下层保证大掩码覆盖小掩码的正确遮挡关系random_colorFalse时使用统一的深天蓝[30, 144, 255]配色透明度固定 0.6。保存路径为Path(output) / os.path.basename(ann.path)因此plot(annotationsann, output./)会把结果写回原文件名所在目录并使用bbox_inchestight、transparentTrue输出透明背景 PNG。六、端到端实战从推理到四种提示与可视化以下示例继承自仓库文档 docs/en/models/fast-sam.md并结合上文源码给出参数注释from ultralytics import FastSAM from ultralytics.models.fastsam import FastSAMPrompt # 1. 定义推理源仓库自带示例图ultralytics/assets/bus.jpg source ultralytics/assets/bus.jpg # 2. 创建 FastSAM 模型FastSAM-s.pt 或 FastSAM-x.pt model FastSAM(FastSAM-s.pt) # 3. 全实例分割推理 # imgsz1024: 输入分辨率conf0.4: 置信度阈值iou0.9: NMS 阈值 # retina_masksTrue: 保留高分辨率掩码便于后续框/点提示精确定位 everything_results model(source, devicecpu, retina_masksTrue, imgsz1024, conf0.4, iou0.9) # 4. 构造 Prompt 处理对象 prompt_process FastSAMPrompt(source, everything_results, devicecpu) # 5. 四种提示模式按需任选其一注意顺序会覆盖前一次选择 ann prompt_process.everything_prompt() # 全部掩码 ann prompt_process.box_prompt(bbox[200, 200, 300, 300]) # 框 [x1,y1,x2,y2] ann prompt_process.text_prompt(texta photo of a dog) # 文本 ann prompt_process.point_prompt(points[[200, 200]], pointlabel[1]) # 点 [x,y]label 1前景 0背景 # 6. 可视化输出到当前目录 prompt_process.plot(annotationsann, output./)CLI 等价用法仅全实例分割不涉及提示交互yolo segment predict modelFastSAM-s.pt sourceultralytics/assets/bus.jpg imgsz640上述关键推理参数均定义在 ultralytics/cfg/default.yaml 中conf为检测置信度阈值预测默认 0.25iou为 NMS 阈值默认 0.7FastSAM 示例常用 0.9 以抑制重复框imgsz默认 640retina_masks默认 False置 True 后FastSAMPredictor.postprocess走ops.process_mask_native原生分辨率分支见 ultralytics/models/fastsam/predict.py。七、使用约束与常见陷阱综合源码与文档使用FastSAMPrompt时有几点必须注意单类别限制FastSAM 只支持单类实例分割所有目标都会被识别为同一类。因此自建数据集验证时需要把所有类别 ID 统一转为 0且官方只支持预训练权重推理FastSAM构造函数中.yaml/.yml模型文件会被直接 assert 拒绝见 ultralytics/models/fastsam/model.py#L27不支持训练source 不能是目录box_prompt、point_prompt、text_prompt内部依赖单张原图做坐标映射与裁剪传入目录会抛出ValueErroris a directory, not a valid source for this function坐标坐标系所有提示坐标框、点均以原始输入图像分辨率为准方法内部会自动缩放到掩码坐标系因此务必保证retina_masksTrue时掩码质量足够、或提供与原图匹配的输入尺寸text_prompt 的依赖首次调用会触发 CLIP 自动安装githttps://github.com/openai/CLIP.git需要网络环境否则请预先安装prompt 的覆盖语义box_prompt以最大 IoU 选单个掩码point_prompt以布尔合成合并/剔除多个掩码text_prompt返回语义最匹配的单个掩码——后一次调用会覆盖results[0].masks.data如需保留各次结果应先复制结果对象。八、小结从参考文档到源码的实现闭环docs/en/reference/models/fastsam/prompt.md是FastSAMPrompt类的 API 参考入口而完整的行为契约全部落在 ultralytics/models/fastsam/prompt.py 的 340 余行实现中。理解该类的关键是把握住两条主线数据流FastSAMPredictor.postprocess产出全实例掩码 →FastSAMPrompt通过_format_results/_crop_image组织注解 → 四种*_prompt方法各自用 IoU、布尔运算或 CLIP 相似度筛选掩码 →plot/fast_show_mask渲染输出依赖边界框与点提示完全基于几何运算OpenCV torch文本提示才引入 CLIP 跨模态检索这决定了不同场景下的最小依赖集。对于需要把 FastSAM 接入交互式标注、目标计数或图像检索管线的开发者可直接基于本文的源码定位prompt.py、predict.py与实战示例改造复用相关的预测模式细节可进一步参考 docs/en/modes/predict.md 与 docs/en/models/fast-sam.md。【免费下载链接】yolov10YOLOv10: Real-Time End-to-End Object Detection [NeurIPS 2024]项目地址: https://gitcode.com/GitHub_Trending/yo/yolov10创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表