1算法
https://docs.ultralytics.com/zh/models/sam-2/
import cv2 from ultralytics import SAM import numpy as np ''' SAM 2 tiny sam2_t.pt 实例分割 ✅ ❌ ❌ ❌ SAM 2 small sam2_s.pt 实例分割 ✅ ❌ ❌ ❌ SAM 2 基础 sam2_b.pt 实例分割 ✅ ❌ ❌ ❌ SAM 2 大型 sam2_l.pt 实例分割 ✅ ❌ ❌ ❌ SAM 2.1 tiny sam2.1_t.pt 实例分割 ✅ ❌ ❌ ❌ SAM 2.1 small sam2.1_s.pt 实例分割 ✅ ❌ ❌ ❌ SAM 2.1 base sam2.1_b.pt 实例分割 ✅ ❌ ❌ ❌ SAM 2.1 large sam2.1_l.pt 实例分割 ✅ ❌ ❌ ❌ ''' # 1. 加载模型 model = SAM("sam2_l.pt") # 2. 读取输入图像 image_path = "npu2pm.JPG" image = cv2.imread(image_path) if image is None: raise FileNotFoundError(f"无法加载图像: {image_path}") # 3. 定义提示框 (格式: [x1, y1, x2, y2]) bbox = [100, 100, 200, 200] # 示例边界框 # 4. 运行推理 #results = model(image, bboxes=[bbox]) results = model(image) # 5. 获取分割结果 masks = results[0].masks # 获取所有掩码 if masks is None: raise RuntimeError("未检测到分割结果") # 6. 可视化处理 # 创建透明叠加层 overlay = image.copy() alpha = 0.5 # 透明度 # 绘制分割结果 (默认取第一个掩码) mask = masks.data[0].cpu().numpy().astype(np.uint8) * 255 contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cv2.drawContours(overlay, contours, -1, (0, 255, 0), 2) # 绿色轮廓 # 绘制原始提示框 cv2.rectangle(overlay, (bbox[0], bbox[1]), (bbox[2], bbox[3]), (255, 0, 0), 2) # 蓝色框 # 合并原始图像和叠加层 visualization = cv2.addWeighted(overlay, alpha, image, 1 - alpha, 0) # 7. 显示结果 cv2.imshow("SAM Segmentation Result", visualization) cv2.waitKey(0) cv2.destroyAllWindows() # 8. 保存结果 output_path = "output_segmentation.jpg" cv2.imwrite(output_path, visualization) print(f"结果已保存至: {output_path}") # 可选:保存掩码本身 mask_output_path = "output_mask.png" cv2.imwrite(mask_output_path, mask) print(f"掩码已保存至: {mask_output_path}")
目前有多个针对速度优化的SAM变体版本,以下是主流的快速版SAM模型:
1. MobileSAM ⭐ 最推荐
- 特点:将SAM的ViT-H图像编码器替换为更轻量的TinyViT
- 速度提升:比原始SAM快4-5倍
- 模型大小:从原始SAM的2.4GB降至40MB
- 精度保持:在多数任务上保持相近性能
2. EfficientSAM ⭐ 轻量高效
- 特点:专为效率设计,采用SAMI预训练方法
- 速度优势:比SAM快20倍,比MobileSAM快4倍
- 模型大小:仅10-50MB
- 适用场景:移动端和边缘设备
2. EfficientSAM ⭐ 轻量高效
- 特点:专为效率设计,采用SAMI预训练方法
- 速度优势:比SAM快20倍,比MobileSAM快4倍
- 模型大小:仅10-50MB
- 适用场景:移动端和边缘设备
目前有多个针对速度优化的SAM变体版本,以下是主流的快速版SAM模型:
1. MobileSAM ⭐ 最推荐
- 特点:将SAM的ViT-H图像编码器替换为更轻量的TinyViT
- 速度提升:比原始SAM快4-5倍
- 模型大小:从原始SAM的2.4GB降至40MB
- 精度保持:在多数任务上保持相近性能
2. EfficientSAM ⭐ 轻量高效
- 特点:专为效率设计,采用SAMI预训练方法
- 速度优势:比SAM快20倍,比MobileSAM快4倍
- 模型大小:仅10-50MB
- 适用场景:移动端和边缘设备
3. EdgeSAM ⭐ 边缘设备优化
- 优势:专门为边缘计算优化,支持ONNX、TensorRT
- 部署友好:提供完整的移动端部署方案
- 性能:在移动设备上可达实时推理
4. FastSAM ⭐ 实时检测导向
- 方法创新:用YOLO式检测替代原版分割思路
- 速度表现:比SAM快50倍以上
- 特点:更适合框提示的场景检测
- 局限性:分割精度略有下降
5. Light-HQSAM ⭐ 精度与速度平衡
- 特点:在SAM基础上引入轻量化设计
- 优势:更好的精度-速度权衡
- 适用:需要较高精度的实时应用
6. SAM 2.0 官方优化版本
Meta官方也提供了不同规模的版本:
- SAM2-ViT-B:基础版,速度提升2-3倍
- SAM2-ViT-S:小模型,适合移动端
- SAM2-ViT-T:极小模型,最大速度优化
2 策略
2-0 模型轻量化与优化
- 使用轻量级版本:优先选择 SAM2 的
mobile_sam
或tiny_vit
backbone 版本 - 调整编码器:将默认的 ViT-H 替换为更小的 ViT-B 或 ViT-T
- 自定义模型尺寸:通过减少 Transformer 层数和注意力头数来裁剪模型
2-1分辨率和尺度自适应处理
- 根据无人机飞行高度动态调整处理分辨率
- 高空:低分辨率快速扫描
- 低空:高精度分割关键区域
分辨率调整策略
- 将输入图像分辨率从 1024x1024 降至 512x512 或 768x768
- 采用渐进式编码:先低分辨率快速检测,感兴趣区域再高精度分割
- 对无人机视频流使用帧采样(如每3帧处理1帧)
2-2 目标框检测 然后精细化分割
ROI聚焦技术
- 先用轻量级检测器(YOLO等)定位地标大致区域
- 只对候选区域运行 SAM2 精细分割
- 减少需要处理的像素数量
def cascade_detection_pipeline(frame): # 1. 先用FastSAM/YOLO快速定位地标 bboxes = fast_detector(frame) # 2. 对候选区域用MobileSAM精细分割 for bbox in bboxes: roi = extract_roi(frame, bbox) mask = mobile_sam.segment(roi) return results