Python3.10语义分割实战:Segment Anything镜像部署教程

想试试Meta那个火遍全网的Segment Anything模型吗?就是那个号称能“分割一切”的AI。今天,我就带你从零开始,在CSDN星图平台的Miniconda-Python3.10镜像上,一步步把它跑起来。整个过程就像搭积木,跟着做,你也能轻松玩转这个强大的图像分割工具。

我们用的环境是Miniconda-Python3.10,这是个非常轻便的Python环境管理器。它的好处是能让你创建一个干净、独立的“小房间”来运行Segment Anything,不用担心和你电脑上其他Python项目打架,特别适合做这种需要特定版本依赖的AI实验。

1. 环境准备与快速启动

首先,你需要在CSDN星图平台找到并启动这个镜像。操作很简单,就像点个外卖。

1.1 启动Miniconda-Python3.10镜像

  1. 访问CSDN星图镜像广场,搜索“Miniconda-Python3.10”。
  2. 点击“立即部署”,选择合适的资源配置(对于跑Segment Anything,建议选择带GPU的规格,速度会快很多)。
  3. 等待片刻,镜像实例就创建好了。你会看到两种访问方式:JupyterLabSSH。我们推荐使用JupyterLab,因为它有图形界面,操作更直观。

JupyterLab访问入口

进入JupyterLab后,你会看到一个类似文件管理器的界面。在这里,你可以新建Python代码文件,或者直接打开终端。

JupyterLab界面

1.2 一键安装Segment Anything依赖

环境启动后,我们首先要安装Segment Anything模型所需的“零件”。打开一个终端(Terminal),或者新建一个代码单元格,执行下面的命令。

这些命令会做三件事:安装PyTorch(深度学习框架)、安装Segment Anything的官方代码库、下载预训练好的模型文件。

# 1. 安装PyTorch(如果实例有GPU,请使用CUDA版本以获得加速)
# 以下命令安装的是CPU版本,适合所有环境。如果你确认有GPU,可以访问PyTorch官网获取对应的CUDA安装命令。
pip install torch torchvision torchaudio

# 2. 安装Segment Anything官方库及其他必要工具
pip install git+https://github.com/facebookresearch/segment-anything.git
pip install opencv-python-headless pillow matplotlib

# 3. 下载预训练模型(选择一个即可,模型越大效果越好但速度越慢)
# 我们以中等大小的‘vit_b’模型为例,你可以根据需要下载其他模型
# vit_h (超大): https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth
# vit_l (大): https://dl.fbaipublicfiles.com/segment_anything/sam_vit_l_0b3195.pth
# vit_b (中): https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth

# 使用wget命令下载模型文件到当前目录
wget https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth

执行完这些命令,所有准备工作就完成了。接下来,我们就可以开始写代码,让模型“动”起来。

2. 快速上手:分割你的第一张图片

理论不多说,直接上代码看效果。下面这段完整的Python脚本,实现了加载模型并对一张图片进行“一切分割”。

import numpy as np
import torch
import matplotlib.pyplot as plt
import cv2
from segment_anything import sam_model_registry, SamAutomaticMaskGenerator

# 设置设备,优先使用GPU
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"使用设备: {device}")

# 1. 加载模型
model_type = "vit_b" # 与你下载的模型类型对应
sam_checkpoint = "./sam_vit_b_01ec64.pth" # 模型文件路径

sam = sam_model_registry[model_type](checkpoint=sam_checkpoint)
sam.to(device=device)
print("模型加载完毕!")

# 2. 初始化自动掩码生成器
mask_generator = SamAutomaticMaskGenerator(sam)

# 3. 读取并预处理图片
# 这里我们使用一张自带的示例图片,你可以替换成你自己的图片路径
# 例如:image = cv2.imread('你的图片.jpg')
image = cv2.imread('path/to/your/image.jpg') # 请先准备一张图片并修改路径
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # OpenCV读取的是BGR格式,转为RGB

# 4. 生成分割掩码
print("正在分割图片,请稍候...")
masks = mask_generator.generate(image)
print(f"分割完成!共发现 {len(masks)} 个对象。")

# 5. 可视化结果
def show_anns(anns):
    if len(anns) == 0:
        return
    sorted_anns = sorted(anns, key=(lambda x: x['area']), reverse=True)
    ax = plt.gca()
    ax.set_autoscale_on(False)

    img = np.ones((sorted_anns[0]['segmentation'].shape[0], sorted_anns[0]['segmentation'].shape[1], 4))
    img[:,:,3] = 0
    for ann in sorted_anns:
        m = ann['segmentation']
        color_mask = np.concatenate([np.random.random(3), [0.35]]) # 随机颜色,35%透明度
        img[m] = color_mask
    ax.imshow(img)

plt.figure(figsize=(20, 20))
plt.imshow(image)
show_anns(masks)
plt.axis('off')
plt.title(f'Segment Anything 分割结果 (共{len(masks)}个区域)', fontsize=16)
plt.show()

把上面代码中的 ‘path/to/your/image.jpg’ 换成你实际图片的路径,然后运行。稍等一会儿,你就能看到模型把图片里的每一个物体、甚至物体的不同部分,都用不同颜色的半透明区域标出来了。这就是“分割一切”的魅力!

3. 核心功能玩转:三种分割模式

Segment Anything提供了三种交互方式,适应不同场景。我们来逐一试试。

3.1 自动分割一切(全自动)

上面的例子就是这种模式。模型会自己分析图片,找出所有可能是有意义的区域。适合快速浏览图片内容,或者你不知道具体要分割什么的时候。

# 使用更精细的参数控制自动分割
mask_generator_2 = SamAutomaticMaskGenerator(
    model=sam,
    points_per_side=32, # 在图片每条边上生成的点数,越多越密集
    pred_iou_thresh=0.86, # 预测掩码质量的阈值,越高要求越严
    stability_score_thresh=0.92, # 稳定性得分阈值
    crop_n_layers=1, # 是否对图片裁剪后多次预测,0为不裁剪
    crop_n_points_downscale_factor=2,
    min_mask_region_area=100, # 最小掩码区域面积,过滤太小的碎片
)

masks_detailed = mask_generator_2.generate(image)
print(f"精细分割得到 {len(masks_detailed)} 个区域。")

3.2 点选模式(我指哪,你分哪)

这是最常用的交互方式。你在物体上点几个点(前景点),或者在背景上点几个点(背景点),模型就能精确分割出你指的那个物体。

from segment_anything import SamPredictor
from IPython.display import display, HTML

# 切换到预测器模式
predictor = SamPredictor(sam)
predictor.set_image(image) # 为当前图片设置图像嵌入

# 模拟输入点:假设我们想分割图片中某个物体
# 格式为 (x, y) 坐标 和 标签 (1=前景, 0=背景)
input_point = np.array([[500, 300]]) # 在坐标(500,300)处点一个前景点
input_label = np.array([1]) # 标签为1(前景)

# 进行预测
masks, scores, logits = predictor.predict(
    point_coords=input_point,
    point_labels=input_label,
    multimask_output=True, # 输出多个可能的结果供选择
)

# 展示三个最可能的结果
for i, (mask, score) in enumerate(zip(masks, scores)):
    plt.figure(figsize=(10,10))
    plt.imshow(image)
    show_mask(mask, plt.gca())
    plt.scatter(input_point[:, 0], input_point[:, 1], color='red', marker='*', s=200, edgecolor='white', linewidth=2.5)
    plt.title(f"Mask {i+1}, Score: {score:.3f}", fontsize=18)
    plt.axis('off')
    plt.show()

3.3 框选模式(画个框,圈出来)

如果你能大致框出物体范围,用这个模式最直接。模型会根据你画的矩形框,分割出框内的主要物体。

# 模拟输入框:格式为 [x_min, y_min, x_max, y_max]
input_box = np.array([400, 200, 800, 600]) # 定义一个矩形框

# 使用框进行预测(也可以结合点一起用)
mask_box, scores_box, logits_box = predictor.predict(
    point_coords=None,
    point_labels=None,
    box=input_box[None, :], # 增加一个批次维度
    multimask_output=False, # 框选通常只输出一个最佳结果
)

plt.figure(figsize=(10,10))
plt.imshow(image)
show_mask(mask_box[0], plt.gca())
show_box(input_box, plt.gca())
plt.title(f"Box Prompt Segmentation", fontsize=18)
plt.axis('off')
plt.show()

4. 实用技巧与常见问题

掌握了基本操作,再来点提升体验的小技巧。

4.1 如何获得更清晰的分割边界?

自动分割有时边界会比较粗糙。你可以结合点选和框选模式进行后处理精修

  1. 先用自动或框选模式得到一个大致的掩码。
  2. 在结果不够精确的边缘部分,添加几个前景点(物体上)和背景点(非物体上)。
  3. 用这些点作为新的提示,让模型再次预测,结果通常会精准很多。

4.2 处理大尺寸图片

模型对输入图片尺寸有限制。如果图片太大,需要先缩放。

def prepare_image(image, long_side=1024):
    # 等比例缩放,长边为 long_side
    h, w = image.shape[:2]
    scale = long_side / max(h, w)
    new_h, new_w = int(h * scale), int(w * scale)
    resized_image = cv2.resize(image, (new_w, new_h), interpolation=cv2.INTER_LINEAR)
    return resized_image, scale

# 使用缩放后的图片进行分割
small_image, scale = prepare_image(original_big_image)
masks_small = mask_generator.generate(small_image)
# 注意:得到的掩码坐标也是基于缩放后图片的,如需映射回原图,需要处理坐标变换。

4.3 常见报错与解决

  • 报错:CUDA out of memory

    • 原因:图片太大或模型太大,GPU内存不够。
    • 解决:换用更小的模型(如 vit_bvit_t),缩小输入图片尺寸,或者在CPU上运行(将 device 设为 "cpu",但速度会慢)。
  • 报错:No module named ‘segment_anything’

    • 原因:库没安装成功。
    • 解决:重新执行安装命令 pip install git+https://github.com/facebookresearch/segment-anything.git
  • 问题:分割结果有很多零碎小块

    • 原因:自动分割参数过于敏感。
    • 解决:调整 mask_generator 的参数,如提高 pred_iou_threshstability_score_thresh,或增大 min_mask_region_area

5. 总结

好了,到这里你已经成功在CSDN星图的Miniconda-Python3.10环境上,部署并玩转了Segment Anything模型。我们来回顾一下关键步骤:

  1. 部署环境:在星图平台一键启动Miniconda-Python3.10镜像。
  2. 安装依赖:通过几条命令安装PyTorch、Segment Anything库和预训练模型。
  3. 运行代码:我们编写并运行了从自动分割到交互式分割(点选、框选)的完整代码。
  4. 掌握技巧:学习了如何优化分割效果和处理大图等实用技巧。

这个组合(Miniconda镜像 + Segment Anything)的强大之处在于,它把复杂的环境配置和模型部署简化到了极致。你无需关心底层驱动、CUDA版本冲突,只需专注于你的创意和应用本身。无论是想快速验证一个分割想法,还是作为更大项目的一个组件,这套流程都能让你高效起步。

赶紧去找张有趣的图片,试试让它“分割一切”吧!你可以尝试分割你的宠物、房间的摆设,或者任何一张网络图片,看看这个AI的识别能力到底有多神奇。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐