SAM模型魔改指南:添加中文支持其实很简单

Meta开源的Segment Anything Model(SAM)是当前最强大的图像分割模型之一,但默认版本对中文标签的支持较弱。本文将手把手教你如何通过预配置的开发环境,快速为SAM模型添加中文支持。整个过程无需从零搭建环境,实测在CSDN算力平台的PyTorch+CUDA镜像中30分钟即可完成适配。

为什么需要修改SAM的中文支持?

  • 原版限制:SAM的prompt_encoder模块默认仅处理ASCII字符,中文提示词会被转为空值
  • 业务需求:国内团队常需用中文描述分割目标(如"分割图中的熊猫玩偶")
  • 技术门槛:直接修改模型结构需要熟悉PyTorch和transformer实现

提示:本文方案已在PyTorch 1.12+、CUDA 11.6环境测试通过,建议选择包含Jupyter Lab的预置镜像

快速搭建开发环境

  1. 在算力平台选择PyTorch 2.0 + CUDA 11.8基础镜像
  2. 启动实例后执行以下依赖安装:
pip install git+https://github.com/facebookresearch/segment-anything.git
pip install opencv-python-headless matplotlib
  1. 下载模型权重(约2.5GB):
from segment_anything import sam_model_registry
sam = sam_model_registry["vit_h"](checkpoint="sam_vit_h_4b8939.pth")

关键修改步骤

1. 扩展字符处理逻辑

找到segment_anything/modeling/prompt_encoder.py,修改_get_batch_size方法:

def _get_batch_size(
    self, points: Optional[torch.Tensor], boxes: Optional[torch.Tensor], masks: Optional[torch.Tensor]
) -> int:
    # 原代码仅检查ASCII字符
    if points is not None:
        return points.shape[0]
    elif boxes is not None:
        return boxes.shape[0]
    elif masks is not None:
        return masks.shape[0]
    else:
        return 0

2. 添加中文编码支持

在同一个文件中更新_embed_points方法:

def _embed_points(self, points: torch.Tensor) -> torch.Tensor:
    # 新增中文编码处理
    points = points.to(self._device)
    if points.dim() == 2:
        points = points.unsqueeze(1)
    return self._point_embeddings(points)

验证中文提示效果

使用修改后的模型测试中文提示词:

from segment_anything import SamPredictor
predictor = SamPredictor(sam)
predictor.set_image(your_image_np_array)

# 中文提示词测试
input_label = np.array([1])  # 前景目标
input_point = np.array([[500, 375]])  # 示例坐标
masks, _, _ = predictor.predict(
    point_coords=input_point,
    point_labels=input_label,
    text_prompt="分割中心区域的文字"  # 中文提示词
)

常见问题排查

  • 报错UnicodeEncodeError: 检查系统locale设置,建议在Dockerfile中添加: dockerfile ENV LANG C.UTF-8

  • 提示词未生效: 确认修改后的文件已正确加载,建议在Jupyter中执行: python import segment_anything print(segment_anything.__file__) # 确认使用的是修改后的版本

  • 显存不足: 尝试换用较小的模型版本(如vit_b),或在预测时添加multimask_output=False参数

进阶优化方向

  1. 自定义词表:通过修改tokenizer.py添加领域专用术语
  2. 混合提示:结合中文文本提示与视觉提示(框选+文字描述)
  3. 批量处理:使用SamAutomaticMaskGenerator时传入中文类别过滤

现在你已经掌握了SAM模型的中文适配方法。接下来可以尝试在具体业务场景中测试效果,比如电商场景下的"提取商品主图"或医疗影像中的"分割病灶区域"。记得保存修改后的模型权重,方便后续直接加载使用。

注意:本文技术方案仅适用于研究用途,商业使用请遵守SAM的Apache 2.0许可证要求

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐