• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
MKT-porter
博客园    首页    新随笔    联系   管理    订阅  订阅
图像分割 3D-Box-Segment-Anything(5)如何加速

 

1算法

 https://docs.ultralytics.com/zh/models/sam-2/

image

 

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
  • ​​精度保持​​:在多数任务上保持相近性能
 
from mobile_sam import SamPredictor, sam_model_registry mobile_sam = sam_model_registry["vit_t"](checkpoint="./weights/mobile_sam.pt") predictor = SamPredictor(mobile_sam)
 
 

2. ​​EfficientSAM​​ ⭐ 轻量高效

  • ​​特点​​:专为效率设计,采用SAMI预训练方法
  • ​​速度优势​​:比SAM快20倍,比MobileSAM快4倍
  • ​​模型大小​​:仅10-50MB
  • ​​适用场景​​:移动端和边缘设备
 
from efficient_sam import build_efficient_sam efficient_sam = build_efficient_sam() efficient_sam.predict(image, points) # 极快推理
 
 

3. ​​EdgeSAM​​ ⭐ 边缘设备优化

  • ​​优势​​:专门为边缘计算优化,支持ONNX、TensorRT
  • ​​部署友好​​:提供完整的移动端部署方案
  • ​​性能​​:在移动设备上可达实时推理

4. ​​FastSAM​​ ⭐ 实时检测导向

  • ​​方法创新​​:用YOLO式检测替代原版分割思路
  • ​​速度表现​​:比SAM快50倍以上
  • ​​特点​​:更适合框提示的场景检测
  • ​​局限性​​:分割精度略有下降
 
from fastsam import FastSAM, FastSAMPrompt model = FastSAM('./weights/FastSAM.pt') results = model(image, device='cuda', imgsz=1024)
 
 

5. ​​Light-HQSAM​​ ⭐ 精度与速度平衡

  • ​​特点​​:在SAM基础上引入轻量化设计
  • ​​优势​​:更好的精度-速度权衡
  • ​​适用​​:需要较高精度的实时应用

6. ​​SAM 2.0 官方优化版本​​

Meta官方也提供了不同规模的版本:

  • ​​SAM2-ViT-B​​:基础版,速度提升2-3倍
  • ​​SAM2-ViT-S​​:小模型,适合移动端
  • ​​SAM2-ViT-T​​:极小模型,最大速度优化

image

 

 

2 策略

 2-0 模型轻量化与优化

  • ​​使用轻量级版本​​:优先选择 SAM2 的 mobile_sam或 tiny_vitbackbone 版本
  • ​​调整编码器​​:将默认的 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

  

 

posted on 2025-10-22 05:56  MKT-porter  阅读(1)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3