超全超详细使用SAM进行高效图像分割标注(GPU加速推理)
一、前言
👉 在计算机视觉任务中,图像分割 是重要的基础工作,但人工标注往往耗时耗力。Meta推出的 SAM(Segment Anything Model),大幅提升了分割效率和精度,让标注工作更加轻松。本篇博客将详细介绍如何安装、配置并使用 SAM
进行辅助标注,力求做到保姆级细致讲解。
💡 SAM(Segment Anything Model) 是一款通用分割模型,具备以下特点:
- 高效分割: 基于点、框等提示快速生成分割结果。
- 通用性强: 支持多种图像类型(如自然图像、医疗图像等)。
- 易用性: 开源实现,兼容PyTorch等主流框架。
二、安装与环境配置
1、源码下载
方法一:从官网直接下载(推荐)
-
打开 ISAT_with_segment_anything 的 GitHub 官方页面。
-
点击页面上的 “Code” 按钮,选择 “Download ZIP” 直接下载。
- 下载完后,建议将压缩包解压到 D 盘或 E 盘等非系统盘并重命名为
sam
,以免因系统权限问题引发错误。
方法二:通过 Git 克隆源码(适合有一定基础的用户)
-
打开终端或命令提示符,输入以下命令:
git clone https://github.com/facebookresearch/ISAT_with_segment_anything.git
-
为方便管理,可将克隆的文件夹重命名为
sam
:mv ISAT_with_segment_anything sam
-
使用以下命令切换到
sam
文件夹:cd sam
2、环境配置
2.1 创建sam
环境
conda create -n sanm python=3.8 # 创建python版本3.8名为sam的conda环境
conda activate sam # 激活创建的sam环境
2.2 配置Pytorch环境
YOLOv5可以在GPU或CPU环境下运行,但推荐在GPU上运行以加快训练速度。
检查NVIDIA GPU及其CUDA支持情况
nvidia-smi
是NVIDIA驱动自带的命令行工具,可以查看显卡的CUDA支持情况和驱动信息。打开命令提示符(或CMD),输入:
nvidia-smi
如果系统输出了显卡信息,并显示CUDA版本(例如CUDA Version: 12.7),则表明显卡支持CUDA同时支持GPU,否则不支持GPU 。
方式一:使用Conda安装(推荐)
-
打开 Previous PyTorch Versions | PyTorch 官网,选择<= CUDA Version 的Conda命令并复制(若不支持GPU则选择 CPU 的Conda命令)。
-
在终端中执行对应的安装命令,以安装PyTorch和CUDA / CPU支持。
-
安装完成后,可以在终端中输入
conda list pytorch
检查安装情况:(本教程仅展示CUDA版本的安装结果)
pytorch 2.3.0
:这是安装的PyTorch版本,适用于Python 3.8,并支持CUDA 12.1和cuDNN 8。pytorch-cuda 12.1
:这是安装的CUDA支持包,指明CUDA版本为12.1。pytorch-mutex 1.0
:这是一个互斥包,用来确保在同一环境中只启用一种加速方式(如CUDA),避免安装冲突。
方式二:使用Pip安装
- 打开 Previous PyTorch Versions | PyTorch 官网,选择<= CUDA Version 的Pip命令并复制(若不支持GPU则选择 CPU 的Pip命令)。
-
在终端中执行对应的安装命令,以安装PyTorch和CUDA / CPU支持。
-
安装完成后,可以在终端中输入
pip list
检查安装情况。
torch 2.3.0
:核心库(版本2.3.0),用于构建和训练神经网络。torchaudio 2.3.0
:音频处理库(版本2.3.0),为音频数据的加载、预处理和增强提供了工具torchvision 0.18.0
:计算机视觉库(版本0.18.0),包含了常用的图像数据集、数据增强和预训练模型。
- 下载安装CUDA支持的
torch
+torchvision
+torchaudio
(仅GPU版本需要)。- 打开网址 https://download.pytorch.org/whl/torch_stable.html
- 选择与上面对应版本的
torch
并下载至本地
cu121:表示此安装包支持 CUDA 12.1,也就是说,这个版本的 PyTorch 可以利用带有 CUDA 12.1 的 NVIDIA GPU 进行计算加速。
torch-2.3.0+cu121:说明这是 PyTorch 2.3.0 版本的安装包,并且这个版本支持 CUDA 12.1。在 PyTorch 中,不同 CUDA 版本对应不同的 GPU 支持,确保安装的 PyTorch 版本兼容设备的 CUDA 版本很重要。
cp38-cp38:表示该安装包是针对 Python 3.8(“cp38”代表 CPython 3.8)的版本。这里的 cp38-cp38 意味着此包适用于 Python 3.8 的 CPython 解释器(CPython 是 Python 的标准实现)。
win_amd64:表示该安装包适用于 Windows 操作系统,并支持 64位架构(AMD64)。如果您的系统是 Windows 64 位,这个包是兼容的。
- 在终端中输入以下命令以安装指定的
.whl
文件(请将路径替换为您下载的.whl
文件的实际保存位置)
pip install D:\torch_gpu\torch-2.3.0+cu121-cp38-cp38-win_amd64.whl
torchvision
与torchaudio
安装方式同理- 安装完毕后再次在终端中输入
pip list
检查安装情况,如果输出结果中显示类似以下内容,则表明安装成功
2.3 Pycharm中加载SAM环境
- 在Pycharm中打开sam项目
- 打开设置 - - > 项目: sam- - > python解释器 - - > 添加解释器 (Add Interpreter) - - > 添加本地解释器 (ADD Local Interpreter…)
- 选择Conda环境 - - > 浏览Anaconda目录下\Library\bin\conda.bat - - > 加载环境 - - > 使用现有环境 - - > 选择sam - - > 点击确定
2.4 安装SAM依赖项
- 打开Pycharm本地终端
- 使用以下命令安装其他依赖项:
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
- 安装完毕后发现出现警告
Package requirement 'opencv python headless' is not satisfied
,直接点击Ignore requirements
(忽略需求)即可,只要依赖包安装正确,就可以放心使用😊。
2.5 下载Segment anything预训练模型:
-
Pycharm本地终端输入如下命令运行
sam
:python main.py
-
软件提供了便捷的 模型管理界面,可以通过以下路径打开:
- [菜单栏] → [SAM] → [模型管理]
- 你可以直接点击 download 从国内链接获取预训练模型文件,方便快捷。
- 自动保存到以下目录
sam/ISAT/checkpoints
预训练模型权重对比
模型 | 预训练模型权重 | 内存 | 大小 |
---|---|---|---|
SAM | sam_vit_h_4b8939.pth | 7305M | 2.6G |
sam_vit_l_0b3195.pth | 5855M | 2.6G | |
sam_vit_b_01ec64.pth | 4149M | 375M | |
SAM-HQ | sam_hq_vit_h.pth | 7393M | 2.6G |
sam_hq_vit_l.pth | 5939M | 1.3G | |
sam_hq_vit_b.pth | 4207M | 379M | |
sam_hq_vit_tiny.pth | 1463M | 43M | |
Mobile-SAM | mobile_sam.pt | 1375M | 40M |
Edge-SAM | edge_sam.pth | 960M | 39M |
edge_sam_3x.pth | 960M | 39M | |
SAM-Med | sam-med2d_b.pth | 1500M | 2.4G |
SAM2 | sam2_hiera_large.pt | 4000M | 900M |
sam2_hiera_base_plus.pt | 4000M | 324M | |
sam2_hiera_small.pt | 3000M | 185M | |
sam2_hiera_tiny.pt | 2400M | 156M |
三、如何使用SAM进行辅助标注?
1、打开SAM
软件
- 方法一(推荐):Pycharm本地终端输入如下命令运行
sam
:python main.py
- 方法二:直接运行
main.py
2、选择预训练模型
- 软件提供了便捷的 模型管理界面,可以通过以下路径打开:
- [菜单栏] → [SAM] → [模型管理]
- 在模型列表中,模型名称前出现 对勾√ 标志,表示该模型已被选定并正在使用
3、标注流程
- 打开图片(文件夹),可以通过以下路径打开:
- [菜单栏] → [文件] → [图片文件夹]
- 修改
JSON
保存路径,可以通过以下路径修改:- [菜单栏] → [文件] → [标签文件夹]
-
添加新类别,可以通过以下路径打开:
- [菜单栏] → [文件] → [设置]
- [菜单栏] → [文件] → [设置]
-
点击
Segment anything
图标
- 左侧选择标签以后,点击标注对象,然后点击
E
保存标注
4、快捷方法
- 开启自动保存,可以通过以下路径打开:
- [菜单栏] → [编辑] → [自动保存]
- 使用快捷键,可以通过以下路径查看:
- [菜单栏] → [帮助] → [快捷键]
四、SAM
生成的 JSON 格式文件详解
sam
的标注结果以 JSON 文件格式保存,包含了标注图像的相关元数据以及每个标注区域的详细信息。以下是 JSON 文件的主要结构及其说明:
{
"info": {
"description": "ISAT",
"folder": "C:/Users/Natsu/Desktop/apple/img",
"name": "apple_9.jpg",
"width": 500,
"height": 750,
"depth": 3,
"note": ""
},
"objects": [
{
"category": "apple",
"group": 1,
"segmentation": [
[
185.0,
241.0
],
[
146.0,
251.0
],
[
122.0,
264.0
],
[
94.0,
286.0
],
[
55.0,
328.0
],
[
30.0,
370.0
],
[
15.0,
404.0
],
[
8.0,
429.0
],
[
4.0,
454.0
],
[
3.0,
471.0
],
[
5.0,
494.0
],
[
11.0,
502.0
],
[
41.0,
514.0
],
[
59.0,
517.0
],
[
91.0,
534.0
],
[
107.0,
539.0
],
[
123.0,
547.0
],
[
142.0,
552.0
],
[
151.0,
560.0
],
[
179.0,
575.0
],
[
209.0,
596.0
],
[
220.0,
601.0
],
[
228.0,
609.0
],
[
238.0,
613.0
],
[
247.0,
612.0
],
[
295.0,
596.0
],
[
329.0,
578.0
],
[
365.0,
552.0
],
[
394.0,
523.0
],
[
412.0,
495.0
],
[
424.0,
456.0
],
[
428.0,
429.0
],
[
428.0,
402.0
],
[
421.0,
369.0
],
[
411.0,
346.0
],
[
390.0,
315.0
],
[
371.0,
300.0
],
[
330.0,
284.0
],
[
327.0,
278.0
],
[
319.0,
272.0
],
[
257.0,
245.0
],
[
230.0,
240.0
]
],
"area": 113431.5,
"layer": 1.0,
"bbox": [
2.500862813412503,
239.41731436741662,
428.5,
613.4969418673368
],
"iscrowd": false,
"note": ""
}
]
}
1. 顶层字段结构
{
"info": { ... },
"objects": [ ... ]
}
info
:存储与图像相关的元数据信息,例如图像路径、尺寸等。objects
:存储图像中每个标注对象的详细信息,以数组形式存在,每个对象是一个字典。
2. info
字段解析
"info": {
"description": "ISAT",
"folder": "C:/Users/Natsu/Desktop/apple/img",
"name": "apple_9.jpg",
"width": 500,
"height": 750,
"depth": 3,
"note": ""
}
description
:任务描述,通常表示工具或项目名称(例如 “ISAT”)。folder
:图像所在文件夹的路径。name
:图像文件名。width
:图像宽度(像素)。height
:图像高度(像素)。depth
:图像深度(通常为 3,表示 RGB 图像)。note
:可附加的备注信息,默认为空字符串。
3. objects
字段解析
objects
是一个数组,每个元素代表一个标注对象,包含以下字段:
"objects": [
{
"category": "apple",
"group": 1,
"segmentation": [ ... ],
"area": 113431.5,
"layer": 1.0,
"bbox": [ ... ],
"iscrowd": false,
"note": ""
}
]
字段说明:
category
:标注对象的类别名称(如"apple"
)。group
:分组编号,用于标识同一类别的不同实例。segmentation
:对象轮廓的坐标点数组,每组坐标[x, y]
表示一个点。- 示例:
"segmentation": [ [185.0, 241.0], [146.0, 251.0], ... ]
- 示例:
area
:标注对象的像素面积,用于描述区域大小。layer
:图层信息,通常为浮点数,表示对象所在图层。bbox
:对象的边界框,格式为[x_min, y_min, x_max, y_max]
,表示对象的包围矩形。- 示例:
"bbox": [2.5, 239.4, 428.5, 613.5]
- 示例:
iscrowd
:布尔值,表示对象是否为密集型区域(false
表示非密集型)。note
:备注信息,默认空字符串。