YOLO26+SAM3实战教程:从检测到分割,一键搞定目标掩码生成【附源码】
YOLO26+SAM3实战教程:从检测到分割,一键搞定目标掩码生成【附源码】
《博主简介》
小伙伴们好,我是阿旭。
专注于计算机视觉领域,包括目标检测、图像分类、图像分割和目标跟踪等项目开发,提供模型对比实验、答疑辅导等。
《------往期经典推荐------》
二、机器学习实战专栏【链接】,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】
五、YOLOv8改进专栏【链接】,持续更新中~~
六、YOLO性能对比专栏【链接】,持续更新中~
《------正文------》
目录
引言
在计算机视觉任务中,目标检测负责“找得到”物体,而分割负责“分得出”物体的像素级轮廓。今天我们就用YOLO26(极速目标检测)+ SAM3(精准掩码生成)搭建一套实用的流水线,无需从零训练分割模型,就能快速得到干净的二值掩码结果。
这套方案既保留了YOLO26的检测速度,又发挥了SAM3的掩码精度,不管是做数据集构建、背景移除还是视觉质检,都能直接复用,而且代码足够简洁,新手也能轻松上手。
第一步:搭建运行环境
环境混乱是新手踩坑的重灾区,我们用Conda创建独立环境,确保PyTorch、Ultralytics(YOLO/SAM2的核心库)、OpenCV版本匹配,避免“本地能跑、换机器就崩”的问题。
环境配置命令
# 1. 创建名为Yolo-311的Conda环境,指定Python3.11
conda create --name Yolo-311 python=3.11
# 2. 激活该环境(后续安装的包都只在这个环境生效)
conda activate Yolo-311
# 3. 验证CUDA版本(确保后续装的PyTorch适配显卡)
nvcc --version
# 4. 安装支持CUDA 12.4的PyTorch(GPU加速必备)
conda install pytorch==2.5.0 torchvision==0.20.0 torchaudio==2.5.0 pytorch-cuda=12.4 -c pytorch -c nvidia
# 5. 安装指定版本的Ultralytics
pip install ultralytics==8.4.0
# 6. 安装OpenCV(处理图像读写和掩码操作)
pip install opencv-python==4.10.0.84
第二步:用YOLO26完成目标检测,提取边界框
YOLO26在这里的核心作用是“定位”——快速找到图像中的目标,并输出边界框(XYXY格式)。这些边界框会作为SAM3的输入提示,告诉SAM3该聚焦哪些区域做分割。
核心代码

# 导入核心库
from ultralytics import YOLO # YOLO模型核心接口
import cv2 # 图像读写
import numpy as np # 数组和掩码处理
# 1. 加载预训练的YOLO26n模型(轻量化版本,速度快)
model = YOLO("YOLO26n.pt")
# 2. 定义待处理的图像路径(可批量添加)
image_paths = [
"Inbal-Midbar 768.jpg",
"Rahaf.jpg"
]
# 3. 批量读取图像到内存
imgs = [cv2.imread(path) for path in image_paths]
# 4. 运行YOLO26推理(一键检测目标)
print("开始目标检测,提取边界框...")
results = model(imgs)
# 5. 提取每张图的边界框(转XYXY格式的NumPy数组)
bboxes_list = []
for result in results:
# 把YOLO输出的边界框转成可复用的数组格式
boxes = result.boxes.xyxy.cpu().numpy()
bboxes_list.append(boxes)
# 可视化检测结果(快速校验目标是否识别准确)
result.show()
# 打印边界框坐标(调试用,可注释)
for i , bboxes in enumerate(bboxes_list):
print(f"第{i+1}张图的边界框(XYXY格式):")
for bbox in bboxes:
print(f" {bbox}")
这一步的关键是拿到“可靠的边界框”——如果YOLO26没定位准,后续SAM3的分割结果也会跑偏,所以建议先通过result.show()可视化检测结果,确认目标都被框中。
第三步:用SAM3把边界框转成像素级掩码
SAM3是目前最易用的分割模型之一,只需传入“边界框提示”,就能精准分割出目标的轮廓。我们用Ultralytics封装的SAM接口,无需复杂配置,一键就能生成掩码。
核心代码
from ultralytics import SAM # 导入SAM2模型接口
import matplotlib.pyplot as plt # 可视化掩码
# 1. 加载SAM2预训练模型
sam_model = SAM("sam3.pt")
# 2. 批量运行SAM2分割(用YOLO26的边界框做提示)
print("开始用SAM3进行目标分割...")
sam_results = []
for i , img_path in enumerate(image_paths):
# 传入图像路径+对应边界框,生成掩码
result = sam_model(img_path, bboxes=bboxes_list[i])
sam_results.append(result)
第四步:合并掩码,生成二值结果
SAM3会为每个目标生成独立掩码,我们需要把这些掩码合并成一张二值图(目标区域为白色,背景为黑色),方便后续保存和使用。
核心代码
def create_binary_mask(image_path , results):
# 读取原图,匹配掩码尺寸
img = cv2.imread(image_path)
h , w, _ = img.shape
# 创建全黑的空掩码图
mask_img = np.zeros((h, w), dtype=np.uint8)
# 遍历所有掩码,合并成一张图
for result in results:
if result.masks is not None: # 确保掩码存在
for mask in result.masks.data.cpu().numpy():
# 把0-1的掩码值转成0-255的灰度图(白色表示目标)
mask = (mask * 255).astype(np.uint8)
# 按位或运算,合并所有掩码
mask_img = cv2.bitwise_or(mask_img, mask)
return mask_img
# 可视化并保存最终掩码
for i , sam_result in enumerate(sam_results):
# 生成二值掩码
binary_mask = create_binary_mask(image_paths[i], sam_result)
# 可视化掩码(更直观查看效果)
plt.figure(figsize=(6,6))
plt.imshow(binary_mask, cmap='gray') # 灰度显示
plt.axis('off') # 隐藏坐标轴
plt.title(f"第{i+1}张图的二值掩码")
plt.show()
# 保存掩码(路径自动拼接,方便批量处理)
mask_save_path = image_paths[i].replace(".jpg", "_mask.jpg")
cv2.imwrite(mask_save_path, binary_mask)
print(f"第{i+1}张图的掩码已保存至:{mask_save_path}")
最终效果展示
处理后的掩码效果如下(左为掩码,右为原图):
总结
这套流水线的核心逻辑是“分工明确”:YOLO26负责快速定位目标,SAM3负责精准分割轮廓,两者结合既高效又精准。整个流程无需训练,直接用预训练模型就能跑,代码可直接复用在:
- 数据集构建(批量生成目标掩码);
- 背景移除(用掩码抠出目标);
- 视觉质检(检测并分割缺陷区域);
- 其他“先定位、后分割”的计算机视觉场景。
如果需要处理更多图片,只需扩展image_paths列表即可批量运行,新手也能快速上手。

好了,这篇文章就介绍到这里,喜欢的小伙伴感谢给点个赞和关注,更多精彩内容持续更新~~
关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!
更多推荐

所有评论(0)