从0到1全流程使用 segment-anything
一、安装 anaconda
一、下载 anaconda
二、以管理员身份运行安装
1、勾选 Just Me
2、统一安装路径(后续 python 等包也安装至此目录)
3、勾选 add to path
然后安装即可。
三、修改 Anaconda 默认路径及默认缓存路径
Anaconda 默认下载的包、缓存路径为 C 盘,为了防止 C 盘内存大小被占用,可以将路径进行修改。
1、在 C:\Users\用户名 目录下,找到 .condarc 文件
若没有此文件,请先打开 Anaconda Navigator,启动后再关闭,再查看是否存在 .condarc 文件
2、修改 .condarc,修改默认路径
添加 envs_dirs 和 pkgs_dirs ,指定到想要存放的路径
3、打开 Anaconda Prompt,验证修改路径是否成功
若打开 Anaconda Prompt 后,出现 .condarc 打不开的报错问题,则请先删除 .condarc 文件,再次打开 Anaconda Navigator,然后再次修改 .condarc。
输入 conda info 命令,可以看到,package cache 和 envs directories 的首个路径就是我们设置的路径,则说明修改成功。
之后下载的安装包,则会安装到这里指定的路径下。
4、设置路径的权限,防止无权限安装、访问等
对于指定的 envs 文件夹 和 pkgs 文件夹设置用户完全访问、控制权限。
二、搭建虚拟环境
一、打开 Anaconda Prompt
二、输入 conda create -n seganything python=3.8
输入 y 确认:
segment anything 的 python 要求在 3.8及以上
三、安装对应 pytorch、torchvision 版本,与 CUDA 匹配
1、打开控制台,查看自己电脑 CUDA 版本
输入 nvidia-smi,可以看到 CUDA Version 为 12.4
那么安装的 pytorch 版本支持的 CUDA 版本就不能超过 12.4
2、pytorch 官网查找适合版本
需要注意的是 pytorch、CUDA、python、Anaconda 的四个版本都要在相互支持的范围内,且满足 segment anything 的要求:
即:
1、segment anything 要求 python >= 3.8 且 pytorch >= 1.7 且 torchvision >= 0.8
2、通过 create 命令创建虚拟环境时,设置的 python 为 3.8
3、pytorch 也有对 python、cuda 支持的对应版本要求
这里在 pytorch 官网可以点击 install previous versions of Pytorch 查找之前的版本,也可以在当前页面选择对应的版本,复制 Run this Command 对应的命令。
执行命令前,需要在 Anaconda Prompt 中先激活环境:
conda activate seganything
然后执行安装 pytorch 命令 这里选择执行安装最新版本(Stable 2.2.1):
conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia
pytorch 等包 体积较大,耐心等待安装完成。
3、conda list 和 pip list
- conda list命令除了得到当前虚拟环境下的所有已安装的包,还会显示关联环境下的已安装的包;
- pip list命令只显示当前虚拟环境下的所有已安装的包;当关联环境下有某个包,再用conda命令在其他虚拟环境下下载该包时,就会直接关联,无需下载;
- pip list命令得到的结果是conda list得到的结果的子集;
三、下载 segment-anything 源码
打开 cmd 控制台,在相应目录执行 git clone 即可。
四、为项目源码安装依赖库
1、在下载后的源码目录下框下 输入 cmd,打开 cmd 窗口
2、在项目源码目录下激活虚拟环境
conda activate seganything
3、执行 python setup.py install 来安装依赖库
也可以执行github 该源码库的命令:pip install -e .
这里使用 python setup.py install
4、安装必须依赖
1、安装 Visual Studio,准备 C++ 开发环境
pycocotools 依赖于 C++ 开发环境组件,因此需要提前安装 Visual Studio。
安装完成后,要确保勾选了 使用 C++ 的桌面开发,没有勾选则勾选后安装即可。
2、执行 pip 安装命令,安装依赖
执行此命令,采用国内镜像源,加快下载:
pip install opencv-python pycocotools matplotlib onnxruntime onnx -i https://pypi.tuna.tsinghua.edu.cn/simple
至此,所有的基础环境配置、依赖等都已经完成了,可以进行运行、测试、编写代码了。
五、测试代码撰写及使用案例
1、下载 model checkpoint
三个模型比较大,耐心下载。
可以使用开源的 XDown 加速下载:
在源码根目录下新建 checkpoints 文件夹,将下载好的模型文件放入其中。
2、编码
1、添加测试文件夹和图片数据
通过 vscode 打开根目录,打开项目,在根目录下新建 demotest 文件夹,demotest 文件夹下添加一个 building1.jpg、dog1.jpg,用于测试。
根目录下新建 demotest.py,用于写测试代码。
2、设置 vscode 的 python 环境
当 vscode 提示代码中 Import “” could not be resolved 时,应该是 vscode 没有设置为正确的编译环境
在 vscode 中通过 ctrl + shift + p 快捷命令打开搜索框,在搜索框中输入 Python Selecet Interpreter ,在 Select Interpreter 弹窗中选择当前 seganything 虚拟环境对应的 Python 版本,比如这里的 Python 3.8.18
3、写代码
测试的代码如下:
'''
Description:
Author: tianyw
Date: 2024-03-01 14:06:05
LastEditTime: 2024-03-01 15:46:54
LastEditors: tianyw
'''
# 导入必要的包
import os
import sys
import time
import argparse
import cv2
import numpy as np
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
from PIL import Image
# 导入 segment_anything 包
from segment_anything import SamPredictor, sam_model_registry
from segment_anything import SamAutomaticMaskGenerator, sam_model_registry
from segment_anything import sam_model_registry
# 输入必要的参数
# E:\1Study\01AI\01segment\segment-anything\codes\segment-anything
# 模型路径
model_path = r'.\checkpoints\sam_vit_h_4b8939.pth'
# 输入的图片路径
image_path = r'.\demotest\dog1.jpg' # dog1 building1
# 输出的图片路径
output_folder = r'.\demotest\building_prompt_results'
# 确保输出文件夹存在
os.makedirs(output_folder,exist_ok=True)
# 加载模型
sam = sam_model_registry["vit_h"](checkpoint=model_path)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
sam = sam.to(device)
# 输出模型加载完成的 current 时间
current_time1 = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
print("Model loaded done",current_time1)
print("---------------------------------------------")
# 加载图片
image = cv2.imread(image_path)
# 输出图片加载完成的 current 时间
current_time2 = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
print("Image loaded done",current_time2)
print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
# 这里是预测 不用提示词 进行全图分割
mask_generator = SamAutomaticMaskGenerator(sam)
masks = mask_generator.generate(image)
# 使用提示词,进行局部分割
# predictor = SamPredictor(sam)
# predictor.set_image(image)
# masks,scores,logits = predictor.predict(point_coords=None,point_labels=None,box=None,mask_input=None,multimask_output=True,return_logits=True)
# 输出预测完成的 current 时间
current_time3 = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
print("Predict loaded done",current_time3)
print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
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]])
img[m] = color_mask
ax.imshow(img)
# 展示预测结果 img 和 mask
plt.figure(figsize=(20,20))
plt.imshow(image)
show_anns(masks)
plt.axis('off')
plt.show()
3、运行与查看
8G GPU显存可以运行 2k分辨率的图像的推理、分割,分辨率更高会更吃显存。
运行结果:
至此就实现了 segment-anything 的完整使用介绍了。