前言
最近在研究图像处理的过程中,接触到了 Meta 开源的图像分割项目,看了他们官网的 demo 演示,感觉很神奇。上传一张图片,点击一下就能将点击的物体切割出来,很类似自动物体识别,智能抠图。于是决定深入研究学习一番。要研究学习一个模型,必不可少地要用到 GPU 计算。
环境准备
登录云服务平台,创建 GPU 实例。 规格选择如下: 镜像选择:PyTorch 2.3.0, Python 3.10.14, 系统 Ubuntu-22.04, CUDA 版本:12.1。
内置了 CUDA,可自由选择 PyTorch,Python CUDA 版本,节省手动配置时间。
注意:segment-anything 模型的要求 python>=3.8 , pytorch>=1.7, torchvision>=0.8。
实例创建成功后,点击操作栏的 JupyterLab 打开实例中已安装的 Jupyter,或使用访问链接和密码访问服务器终端。

Segment Anything 模型介绍
Segment Anything Model(SAM)可根据输入提示(如点或方框)生成高质量的对象遮罩,并可用于为图像中的所有对象生成遮罩。该模型已在一个包含 1100 万张图像和 11 亿个遮罩的数据集上进行过训练,在各种分割任务中都具有很强的零样本性能。

配置环境
进入 GPU 实例的终端,部署 Segment Anything 模型。 要在实例中安装 Segment Anything 模型,有两种方式: 第一种:在实例的终端中执行下面的命令
pip install git+https://github.com/facebookresearch/segment-anything.git
第二种:你也可以执行下面的命令来安装
git clone [email protected]:facebookresearch/segment-anything.git cd segment-anything; pip install -e .
安装还需要安装相关的依赖库
pip install opencv-python pycocotools matplotlib onnxruntime onnx
环境安装过程如下图所示。
通过上面的步骤,我们已经安装好了模型运行的环境。
下载模型,运行模型
安装好模型的运行环境后,我们需要下载官方训练好的分隔模型,一共有三个,分别是:
- 大杯 模型类型为
vit_h - 中杯 模型类型为
vit_l - 小杯 模型类型为
vit_b这里以大杯 ViT-H SAM model 模型为例,使用浏览器下载,大概有 2.4G。然后将其上传到云平台的文件存储。
如果直接在实例中下载,会比较漫长。通过上传到文件存储就会自动挂载到实例中,这里存储的根文件对应到实例中目录 /root/shared-storage。
文件上传成功后,我们可以在实例的终端中看到这些文件。如下图:
文件和服务都准备好后,我们下面开始测试一下模型,处理分割一些文件。
测试模型
我们使用上传的模型,对一张图片进行分割,然后分割后的图片,放到一个目录里。
原始图片 de.png。
然后我们进入 segment-anything 的目录,执行下面的指令。
python scripts/amg.py --checkpoint /root/shared-storage/sam_vit_h_4b8939.pth --model-type vit_h --input /root/shared-storage/de.png --output /home/imgoutput
使用 sam_vit_h_4b8939.pth 模型将 de.png 图片进行分割,分割后的图片存放在/home/imgoutput 目录中。 执行过程如下:
进入/home/imgoutput 目录,可以看到有一个 de 目录,de 就是图片的名称。
一张图片分割了 39 个图片,我们看一下这些分割的图片是什么样的。分割后的图片如下图:
文件 matedata.csv 的内容如下:
到这里我们已经成功地将模型部署到 GPU 的实例中了。
运行一次该模型,消耗的资源还是比较小的,在实例的监控图上,基本看不到资源的负载太大的起伏如下图:

运行 Demo
上面我们已经使用模型将图片分割出来了,那么下面看一下,该如何使用官方提供的 demo,查看一个图片的分割块。 这个 demo 简单展示了如何使用 Segment Anything 模型切割出来的数据,展示效果如下: 下面我教大家将该 demo 运行起来。 首先在 jupyter 中运行下面的代码,
import numpy as np
import cv2
from segment_anything import SamPredictor, sam_model_registry
checkpoint = "/root/shared-storage/sam_vit_h_4b8939.pth"
model_type = "vit_h"
sam = sam_model_registry[model_type](checkpoint=checkpoint)
sam.to(device='cuda')
predictor = SamPredictor(sam)
image = cv2.imread('/root/shared-storage/de.png')
predictor.set_image(image)
image_embedding = predictor.get_image_embedding().cpu().numpy()
np.save("de_embedding.npy", image_embedding)
运行后会生成一个 de_embedding.npy 文件将该文件下载到本地,并放在 segment-anythingdemo/src/assets/data/ 目录中。
然后再运行以下指令导出 web 使用的 onnx 模型
python scripts/export_onnx_model.py --checkpoint /root/shared-storage/sam_vit_h_4b8939.pth --model-type vit_h --output /root/shared-storage/sam_vit_h_onnx_example.onnx
正常运行完成后,将 /root/shared-storage/sam_vit_h_onnx_example.onnx 文件放置在项目目录 segment-anything/demo/model/sam_vit_h_onnx_example.onnx
然后在 demo 目录 修改 App.tsx 的引用文件路径。
最后在 demo 目录运行
yarn && yarn start
浏览器打开启动的服务,一般是 http://localhost:8081/ 看一下动态效果图:
鼠标放置在某一色块上,该色块就会被增加一层阴影,标识被识别,分割出来啦。如果要做成官网那种交互效果还需要花点前端的功夫。
如果有人需要,我也可以努力尝试做出官方的效果。

总结
通过部署 Segment Anything 模型,我们了解了平台的使用方法,平台的各种资源使用,实例规格,也知道了在部署 Segment Anything 模型需要注意哪些事项。再部署模型后,后续我们可以集成一个后端开发框架,让用户上传图片,然后进行图片切割,做成一个智能抠图的产品或服务。

