SAM2实战:在Colab上免费跑通图像与视频分割Demo(含代码)
SAM2实战指南在Colab上快速实现图像与视频分割最近在GitHub上爆火的SAM2模型让不少开发者跃跃欲试。作为Meta推出的第二代万物分割模型它不仅继承了前代SAM的图像分割能力还新增了对视频时序信息的处理。今天我们就来手把手教你如何在Google Colab的免费GPU环境下从零开始跑通SAM2的完整流程。1. 环境准备与模型部署首先打开Google Colab建议使用Chrome浏览器点击新建笔记本在修改→笔记本设置中选择GPU作为硬件加速器。接下来我们需要安装必要的依赖!pip install torch torchvision !pip install opencv-python matplotlib !pip install githttps://github.com/facebookresearch/segment-anything.git安装完成后下载官方提供的预训练模型权重。这里我们使用基础的ViT-H模型import torch import requests model_url https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth model_path /content/sam_vit_h_4b8939.pth response requests.get(model_url) with open(model_path, wb) as f: f.write(response.content)注意模型文件约2.4GB下载可能需要几分钟时间取决于你的网络状况。2. 图像分割实战让我们先从静态图像分割开始。上传一张测试图片到Colab或者使用以下代码下载示例图片from PIL import Image import numpy as np image_url https://images.unsplash.com/photo-1583511655826-05700d52f4d9 img_path /content/dog.jpg img Image.open(requests.get(image_url, streamTrue).raw) img.save(img_path)初始化SAM2模型并进行预测from segment_anything import sam_model_registry, SamPredictor sam_checkpoint /content/sam_vit_h_4b8939.pth model_type vit_h device cuda if torch.cuda.is_available() else cpu sam sam_model_registry[model_type](checkpointsam_checkpoint) sam.to(devicedevice) predictor SamPredictor(sam) image cv2.imread(img_path) image cv2.cvtColor(image, cv2.COLOR_BGR2RGB) predictor.set_image(image)现在我们可以通过点提示或框提示来指定分割目标# 点提示 (x,y)坐标和标签(1:前景, 0:背景) input_point np.array([[500, 375]]) # 示例坐标 input_label np.array([1]) # 框提示 [x1,y1,x2,y2] input_box np.array([425, 300, 575, 450]) masks, scores, logits predictor.predict( point_coordsinput_point, point_labelsinput_label, multimask_outputTrue, )可视化结果import matplotlib.pyplot as plt plt.figure(figsize(10,10)) plt.imshow(image) show_mask(masks[0], plt.gca()) show_points(input_point, input_label, plt.gca()) plt.title(fSegmentation Score: {scores[0]:.3f}, fontsize18) plt.axis(off) plt.show()3. 视频分割进阶SAM2最令人兴奋的特性是其视频处理能力。我们需要先准备一个短视频片段!pip install -q av import av video_url https://example.com/sample.mp4 # 替换为实际视频URL video_path /content/sample.mp4 # 下载示例视频 video_response requests.get(video_url) with open(video_path, wb) as f: f.write(video_response.content)视频分割的核心在于利用记忆模块跟踪对象from segment_anything import SamVideoPredictor video_predictor SamVideoPredictor(sam) # 打开视频文件 container av.open(video_path) # 设置初始提示第一帧 first_frame next(container.decode(video0)) first_image first_frame.to_image() input_box np.array([100, 100, 400, 400]) # 示例框 # 处理整个视频 video_predictor.set_image(first_image) masks, _, _ video_predictor.predict(boxinput_box) for frame in container.decode(video0): frame_image frame.to_image() masks, _, _ video_predictor.predict( boxinput_box, imageframe_image, update_memoryTrue ) # 可视化处理...4. 性能优化技巧在Colab的免费GPU上运行大型模型时这些技巧可以帮助你获得更好的体验内存管理使用del及时释放不再需要的变量定期调用torch.cuda.empty_cache()对于长视频考虑分段处理速度优化# 启用半精度推理 sam.half() predictor SamPredictor(sam) # 减小输入尺寸 predictor.set_image(image, image_formatRGB, image_size(512,512))常用参数调整参数说明推荐值multimask_output是否输出多个可能掩码Truepred_iou_thresh掩码质量阈值0.88stability_score_thresh稳定性阈值0.95crop_n_layers裁剪层数1crop_n_points_downscale_factor裁剪点下采样因子25. 常见问题解决Q: 遇到CUDA内存不足错误怎么办尝试减小输入图像尺寸关闭其他占用GPU的Colab标签页重启运行时并仅运行必要代码Q: 分割结果不理想如何改进尝试组合使用点和框提示调整提示位置确保覆盖目标特征增加负样本点label0排除背景Q: 如何处理低质量/模糊视频# 预处理帧 frame cv2.GaussianBlur(frame, (3,3), 0) frame cv2.resize(frame, (0,0), fx0.5, fy0.5)在实际项目中我发现最实用的技巧是先用框提示确定大致区域再用点提示进行精细调整。对于快速移动的物体适当降低记忆更新的频率如每3帧更新一次反而能获得更稳定的跟踪效果。