第一次接触计算机视觉项目部署时,那种既兴奋又忐忑的心情至今记忆犹新。作为Meta AI开源的"分割一切"模型,Segment Anything Model(SAM)确实让图像分割技术变得前所未有的简单。但对于刚入门的开发者来说,从零开始配置环境到成功运行第一个示例,中间可能会遇到各种意想不到的问题。本文将手把手带你用PyCharm和Python 3.8在Windows系统上完整部署SAM模型,避开我当初踩过的所有坑。
在开始之前,我们需要确保开发环境配置正确。不同于简单的Python脚本运行,计算机视觉项目对硬件和软件环境都有特定要求。
提示:如果没有独立显卡,可以使用CPU模式运行,但速度会明显下降。
推荐使用Anaconda创建独立的Python环境,避免与系统Python产生冲突:
bash复制conda create -n sam_env python=3.8
conda activate sam_env
安装PyTorch时,需要特别注意CUDA版本匹配。以下是常见组合:
| PyTorch版本 | 推荐CUDA版本 | 适用显卡架构 |
|---|---|---|
| 1.12.1 | 11.3 | Turing+ |
| 1.13.1 | 11.7 | Ampere |
| 2.0.0 | 11.8 | Ampere |
对于大多数用户,建议使用以下命令安装PyTorch:
bash复制pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113
首先克隆官方仓库到本地:
bash复制git clone https://github.com/facebookresearch/segment-anything.git
cd segment-anything
SAM提供了三种不同规模的预训练模型:
下载模型权重后,建议将其放在项目根目录下的checkpoints文件夹中。
安装项目依赖时,特别注意matplotlib的版本问题:
bash复制pip install opencv-python pycocotools matplotlib==3.5.3 onnxruntime onnx
pip install -e .
为什么必须使用matplotlib 3.5.3?因为SAM的示例代码中使用了ax.set_autoscale_on(False)方法,这在matplotlib 3.6.0及以上版本中行为发生了变化,会导致可视化异常。
在PyCharm中打开项目后,按Ctrl+Alt+S打开设置,选择Python解释器:
添加Conda环境→现有环境sam_env环境中的python.exe对于Jupyter notebook示例,建议转换为Python脚本运行:
bash复制jupyter nbconvert --to script notebooks/predictor_example.ipynb
然后在PyCharm中创建运行配置时,注意设置以下参数:
PYTHONPATH=${PROJECT_DIR}错误信息示例:
code复制RuntimeError: CUDA out of memory.
解决方案:
python复制import torch
torch.cuda.empty_cache()
如果遇到类似AttributeError: module 'numpy' has no attribute 'int'的错误,通常是因为numpy版本过高。可以降级到1.23.5:
bash复制pip install numpy==1.23.5
当图像显示为纯色或错位时,检查:
python复制image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
使用SAM处理多张图像时,可以复用模型实例提高效率:
python复制predictor = SamPredictor(sam)
for image_path in image_list:
image = cv2.imread(image_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
predictor.set_image(image)
# 进行预测...
将模型导出为ONNX格式可以跨平台部署:
python复制import torch
from segment_anything import sam_model_registry
sam = sam_model_registry["vit_b"](checkpoint="sam_vit_b_01ec64.pth")
dummy_input = {
"image": torch.randn(1, 3, 1024, 1024),
"point_coords": torch.randint(low=0, high=1024, size=(1, 1, 2)),
"point_labels": torch.randint(low=0, high=1, size=(1, 1)),
}
torch.onnx.export(sam, dummy_input, "sam_model.onnx")
手动选择分割点时,可以通过调整point_labels来优化结果:
python复制input_point = np.array([[x1, y1], [x2, y2]]) # 多个点
input_label = np.array([1, 0]) # 1表示包含,0表示排除
在实际项目中,我发现将vit_b模型与适当的后处理结合,能在精度和速度间取得很好的平衡。对于768x768分辨率的图像,在RTX 3060显卡上可以达到约5FPS的处理速度,完全满足大多数应用场景的需求。