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

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

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 如何获得更清晰的分割边界?
自动分割有时边界会比较粗糙。你可以结合点选和框选模式进行后处理精修。
- 先用自动或框选模式得到一个大致的掩码。
- 在结果不够精确的边缘部分,添加几个前景点(物体上)和背景点(非物体上)。
- 用这些点作为新的提示,让模型再次预测,结果通常会精准很多。
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_b换vit_t),缩小输入图片尺寸,或者在CPU上运行(将device设为"cpu",但速度会慢)。
-
报错:
No module named ‘segment_anything’- 原因:库没安装成功。
- 解决:重新执行安装命令
pip install git+https://github.com/facebookresearch/segment-anything.git。
-
问题:分割结果有很多零碎小块
- 原因:自动分割参数过于敏感。
- 解决:调整
mask_generator的参数,如提高pred_iou_thresh和stability_score_thresh,或增大min_mask_region_area。
5. 总结
好了,到这里你已经成功在CSDN星图的Miniconda-Python3.10环境上,部署并玩转了Segment Anything模型。我们来回顾一下关键步骤:
- 部署环境:在星图平台一键启动Miniconda-Python3.10镜像。
- 安装依赖:通过几条命令安装PyTorch、Segment Anything库和预训练模型。
- 运行代码:我们编写并运行了从自动分割到交互式分割(点选、框选)的完整代码。
- 掌握技巧:学习了如何优化分割效果和处理大图等实用技巧。
这个组合(Miniconda镜像 + Segment Anything)的强大之处在于,它把复杂的环境配置和模型部署简化到了极致。你无需关心底层驱动、CUDA版本冲突,只需专注于你的创意和应用本身。无论是想快速验证一个分割想法,还是作为更大项目的一个组件,这套流程都能让你高效起步。
赶紧去找张有趣的图片,试试让它“分割一切”吧!你可以尝试分割你的宠物、房间的摆设,或者任何一张网络图片,看看这个AI的识别能力到底有多神奇。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
更多推荐
所有评论(0)