1.安装anaconda及配置python环境
在官网Download Anaconda Distribution | Anaconda下载anaconda 2.6.3版本(强烈建议装在除C盘以外的盘),然后配置环境变量:此电脑-属性-高级系统设置-环境变量。详细python环境配置可参考:
2.安装pycharm用于调试代码
同样在官网下载:感谢您下载 PyCharm Community Edition!,推荐安装社区版。
3.安装cuda和cuDNN
sam2模型的部署和训练需要gpu加速,推荐下载cuda11.8版本,设定安装位置,并下载深度神经网络库 (cuDNN) 。cuda安装完成后将cuDNN覆盖在cuda根目录。
官网cuda11.8可能会打不开网页,cuDNN下载需要注册账号。文章末尾提供下载地址。
完成安装后可以在python输入以下指令判断是否能使用gpu加速。
import torch
print(torch.cuda.is_available())
或者检查环境变量中是否有CUDA_PATH。
4.新建和激活虚拟环境:
为防止anaconda将虚拟环境新建在c盘默认盘,可以在C:\user\username中找到.condarc文件,用记事本打开,添加如下语句:
envs_dirs:
- F:\Anaconda\envs
在anaconda prompt面板输入以下指令,环境可以使用其他命名,自己认识就行。
conda create -n sam2
conda activate sam2
确保环境配置为sam2虚拟环境。(左边括号里的base变为sam2)。
同时,pytcharm中的编译器也需要修改,随便新建一个python文件,选择设置-项目名-python解释器-添加解释器-添加本地解释器-系统解释器-找到创建的虚拟环境的地址中的python.exe确定并应用。
5.为了加快包的下载速度,可为conda和pip的下载渠道设置成清华源
此时虚拟环境中是没有任何包的,需要借助pip和conda工具进行下载安装。
conda下载渠道改为清华源:在C:\user\username文件夹修改.condarc文件:
channels:
- defaults
show_channel_urls: true
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
pip需要修改pip.int文件,请输入以下指令:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
接下来的包的安装请在anaconda prompt中的sam2虚拟环境中完成,避免包被安装在默认盘c盘。例如:
6.安装pytorch
pytorch是深度学习框架,需要下载与cuda11.8适配的gpu版本。
在anaconda prompt输入一下指令:
pip install torch==2.6.0+cu118 torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
由于在官网下载,速度可能会非常慢,而国内源下载并没有gpu版本的pytorch,所以可能要下很久。
8.下载segment-anything-2-main项目文件和模型
源码地址:
https://github.com/facebookresearch/segment-anything-2
考虑到国内可能登不上github,可直接在文章末尾链接下载。
该项目文件夹中,sam2文件夹为核心代码,notebooks中包含官方演示代码,setup.py用于搭建sam2环境。
下载之后记住项目的路径,后续代码的运行、脚本编写、模型训练都可以在此处进行。
官方提供了4种大小的SAM2模型,下载地址如下:
https://dl.fbaipublicfiles.com/segment_anything_2/072824/sam2_hiera_tiny.pt
https://dl.fbaipublicfiles.com/segment_anything_2/072824/sam2_hiera_small.pt
https://dl.fbaipublicfiles.com/segment_anything_2/072824/sam2_hiera_base_plus.pt
https://dl.fbaipublicfiles.com/segment_anything_2/072824/sam2_hiera_large.pt
可以在项目文件夹新建weights文件夹用于保存模型文件,后续的代码中输入路径进行模型调用。
9.安装其他sam2支持包。
输入以下指令将anaconda prompt路径修改到sam2文件的地址:
cd /d F:\project\segment-anything-2-main
再输入以下指令以调用setup.py文件以配置sam2环境并安装相关包:
pip install -e .
继续修改地址以找到requirements.txt文件以继续安装其他包:
cd /d F:\project\segment-anything-2-main\sav_dataset
pip install -r requirements.txt
如果运行时发现缺少hydra包可以尝试:
pip install hydra-core --upgrade
后续如果仍然不能运行,比如在代码import部分报错,请使用pip单独安装缺漏的包。
10.在项目文件夹新建python文件,使用pycharm打开并输入以下代码测试能否运行:
import os
os.environ["KMP_DUPLICATE_LIB_OK"] = "True"
import torch
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
from sam2.build_sam import build_sam2
from sam2.sam2_image_predictor import SAM2ImagePredictor
np.random.seed(3)
def show_mask(mask, ax, random_color=False, borders = True):
if random_color:
color = np.concatenate([np.random.random(3), np.array([0.6])], axis=0)
else:
color = np.array([30/255, 144/255, 255/255, 0.6])
h, w = mask.shape[-2:]
mask = mask.astype(np.uint8)
mask_image = mask.reshape(h, w, 1) * color.reshape(1, 1, -1)
if borders:
import cv2
contours, _ = cv2.findContours(mask,cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
# Try to smooth contours
contours = [cv2.approxPolyDP(contour, epsilon=0.01, closed=True) for contour in contours]
mask_image = cv2.drawContours(mask_image, contours, -1, (1, 1, 1, 0.5), thickness=2)
ax.imshow(mask_image)
def show_points(coords, labels, ax, marker_size=375):
pos_points = coords[labels==1]
neg_points = coords[labels==0]
ax.scatter(pos_points[:, 0], pos_points[:, 1], color='green', marker='*', s=marker_size, edgecolor='white', linewidth=1.25)
ax.scatter(neg_points[:, 0], neg_points[:, 1], color='red', marker='*', s=marker_size, edgecolor='white', linewidth=1.25)
def show_box(box, ax):
x0, y0 = box[0], box[1]
w, h = box[2] - box[0], box[3] - box[1]
ax.add_patch(plt.Rectangle((x0, y0), w, h, edgecolor='green', facecolor=(0, 0, 0, 0), lw=2))
def show_masks(image, masks, scores, point_coords=None, box_coords=None, input_labels=None, borders=True):
for i, (mask, score) in enumerate(zip(masks, scores)):
plt.figure(figsize=(10, 10))
plt.imshow(image)
show_mask(mask, plt.gca(), borders=borders)
if point_coords is not None:
assert input_labels is not None
show_points(point_coords, input_labels, plt.gca())
if box_coords is not None:
# boxes
show_box(box_coords, plt.gca())
if len(scores) > 1:
plt.title(f"Mask {i+1}, Score: {score:.3f}", fontsize=18)
plt.axis('off')
plt.show()
if __name__ == "__main__":
device = torch.device("cuda")
image = Image.open(r"notebooks\images\truck.jpg")
image = np.array(image.convert("RGB"))
sam2_checkpoint = r"checkpoints\sam2.1_hiera_large.pt"
model_cfg = r"configs\sam2.1\sam2.1_hiera_l.yaml"
sam2_model = build_sam2(model_cfg, sam2_checkpoint, device=device)
predictor = SAM2ImagePredictor(sam2_model)
predictor.set_image(image)
input_point = np.array([[500, 375]])#通过一个像素点快速选中需要识别的区域
input_label = np.array([1])
masks, scores, logits = predictor.predict(
point_coords=input_point,
point_labels=input_label,
multimask_output=True,
)
sorted_ind = np.argsort(scores)[::-1]
masks = masks[sorted_ind]
scores = scores[sorted_ind]
logits = logits[sorted_ind]
show_masks(image, masks, scores, point_coords=input_point, input_labels=input_label, borders=True)
运行后生成三张图片。
第一张结果为:
模型部署完成。
资源下载:
通过网盘分享的文件:cuda+cudnn+sam2
链接: https://pan.baidu.com/s/1PiLfswMyJIHPAvjjeZsXjQ?pwd=fbqj 提取码: fbqj