SAM 方法调研
Segment anything 方法提出这么久了(震惊,提出都快一年了),针对它改进的哪些方法是更快更好的,适合边缘端侧部署的呢?
在这里,占个坑,汇总整理记录一下
方法记录
SAM 2023.4
project:https://segment-anything.com/
Paper:https://arxiv.org/abs/2304.02643
SAM 提供的模型目前分为 ViT-B,ViT-L,ViT-H,默认为 ViT-H。主要是 image encoder 的区别。
数据集:SA-1B。包括 10 亿个掩码和 1100 万张图像
模型结构如上图 1(b)。prompt 经过 prompt encoder, 图像经过 image encoder。两部分 embedding 融合后的特征经过一个 lightweight mask decoder 得到最终的 mask。
ViT-H image encoder 是 452 ms,SegEvery 1616 ms (32*32)
参考:https://juejin.cn/post/7245838232012996668
基于 SAM 相关的项目整理汇总:https://zhuanlan.zhihu.com/p/630529550 (包括目标检测,图像修复...)
值得强调的是:
目前官方放出代码(Demo)的输入 Prompt 是点,框,出最后的任意实例 mask,这个简称为 SegAny
另一种模式是不需要提示词,直接输出图像中所有合适的实例 mask,这个简称为 SegEvery
(text prompt 效果没有放出来,想要有这个效果的可以参考 Grounded-SAM)这两种模式是有区别的,下面的很多方法在自己论文里讲的很标题党,什么 7 倍,40 倍的,都是有前提条件的。
我会根据实际情况公平比对。
FastSAM 2023.6.21
Code:https://github.com/CASIA-IVA-Lab/FastSAM
Demo:https://replicate.com/casia-iva-lab/fastsam
Paper:https://arxiv.org/pdf/2306.12156
轻量级 CNN 模型(YOLOv8-x)+ Seg 分支作为模型架构,在 2% 的 SA-1B 数据集上训练。
网络结构和 SAM 没有什么关系
整个流程分为全实例分割和提示引导选择两个阶段。图像分成多个小块,CNN 检测器对每个小块进行检测,检测到的对象边界框输入到实例分割模型,生成对象的实例掩码,所有掩码组合就是完整的图像分割掩码。
Point 输入:点与第一阶段的 mask 进行匹配
Box 输入:IoU 最大的 mask 即为匹配结果
Text 输入:利用 CLIP 将 mask 区域和 text 映射到同一空间,相似性计算,输出最相似区域
效果:
SegEvery 实现了 50 倍(32×32)的运行速度提升,另外具备文本引导的效果(CLIP)
优势在于任何模式都是一样的时间,因为它就是 YOLOv8 + Seg,第一次就输出全部 mask 了
参考:https://blog.csdn.net/a486259/article/details/131453794
MobileSAM 2023.6.27
Code:https://github.com/ChaoningZhang/MobileSAM
Paper:https://arxiv.org/pdf/2306.14289.pdf
原始 SAM 中的 image encoder 太重了,所以 MobileSAM 在这方面做文章:
解耦 encoder 和 decoder,采用更轻量型的 Encoder 替换 SAM 的重量级 Encoder,在 1% 数据训练。
作者将 image encoder 和 mask encoder 进行解耦:
将 ViT-H 的知识蒸馏到轻量级图像编码器 TinyViT, 缩小 image encoder
然后,finetune mask encoder 来对齐蒸馏小的 image encoder
效果:SegAny 模式大约需要 10 ms 比 FastSAM 快 4 倍,体积小 7 倍(论文里强调的快 4 倍就是这个前提)
SegEvery 模式比不过 FastSAM,人家是固定的 40 ms 出结果,MobileSAM 没说要多久,按它的方法设定大概需要 8+1600 = 1608 ms。
定性结果上,MobileSAM 输出的 mask 质量比 FastSAM 更好
参考:https://blog.csdn.net/amusi1994/article/details/131467638
EfficientSAM 2023.12.1
Code:https://github.com/yformer/EfficientSAM
Meta 公司出的,
出发点和 MobileSAM 一样,用更轻量化的 encoder 替换 ViT-H,但是训练方式用的不一样。
利用掩码自编码器以 SAM 图像编码器的特征嵌入作为重建目标在 ImageNet-1K 上预训练 SAMI。SAMI 预训练完成后,丢弃解码器,将轻量级编码器作为 EfficientSAM 的图像编码器,在 SA-1B 上进行微调。
效果:
SegAny 模式,用了一种新的方式来比较效率,在有一个 box prompt 的前提下,算法每秒处理图像数。
速度和质量都好于 MobileSAM
(人家 FastSAM 和 MobileSAM 都直接给出了大致的运行 time,到你这又用了新的标准)
看上图吞吐量略小于其他两个方法,那 SegEvery 模式的运行速度自然也是比不过它们。
CVPR 2024 录用,555 满分论文。
参考(标题党)文章:加快20倍!Meta重磅提出EfficientSAM:快速分割一切!-CSDN博客
RepViT-SAM 2023.12.10
Project:https://jameslahm.github.io/repvit-sam/
Code:https://github.com/THU-MIG/RepViT
Paper:https://arxiv.org/abs/2312.05760
MobileSAM 采用的 TinyViT 还是有大量内存和计算开销。RepViT 将 ViT 的设计融入 CNN,在移动设备上实现了性能和延迟的平衡
所以本办法将 RepViT 的 RepViT-M2.3 作为图像编码器提取图像特征,采用 1% 的 SA-1B 数据进行训练。(训练过程和 MobileSAM 一样)
在应用方面,该方案进行了多种任务适配,如 Mask 预测、边缘检测。
效果
给出了在 iPhone 上的运行时间
运行效率和效果比 MobileSAM 好,不过可惜同一时刻,EdgeSAM 登场了。
EdgeSAM 2023.12.11
Project:https://www.mmlab-ntu.com/project/edgesam/
Code:https://github.com/chongzhou96/EdgeSAM
Paper:https://arxiv.org/abs/2312.06660
EdgeSAM 采用和 RepViT-SAM 一样的 image encoder :RepViT。但是它还做了额外的改进。
分析不同蒸馏策略并证实:任务不可知的编码器蒸馏难以学习到 SAM 所具备的全部知识
提出:循环使用 bbox 与 point 提示词,同时对提示词编码器与 Mak 解码器进行蒸馏,以便于蒸馏模型能够准确的学习到提示词与 Mask 之间的复杂关系。
参考:【论文解读】EdgeSam:可在手机上运行的轻量化SAM
SegAny 模式,速度和精度都是比 MobileSAM 高,无法和 EfficientSAM 完全进行定量的公平对比。
SegEvery 模式,速度还是传统的 encoder + decoder = 5 + 1024 * 1 = 1029ms
(https://github.com/chongzhou96/EdgeSAM/issues/5)
作者放出来的 demo video 看上去效果很好,基本完成了在移动端上交互得到 mask 的需求。
结果比 RepViT-SAM 更好
MobileSAMv2 2023.12.15
Code:https://github.com/ChaoningZhang/MobileSAM
解决 SAM 中 SegEvery 的效率瓶颈 mask decoder,采用了具有对象感知的框提示,替代默认的网格搜索点提示
核心就是用目标检测算法(YOLOv8)的边界框作为提示框来进行分割
区别于 MobileSAM(目标是更快的 SegAny),MobileSAMv2 目的就是更快的 SegEvery
SegEvery 模式需要 47 + 50 = 97ms(320 个目标)。比 MobileSAM 快 16 倍
所以如果目的就是 SegEvery 要更快,那么就是在 FastSAM 和 MobileSAMv2 之间选
TinySAM 23.12.22
Code:https://github.com/xinghaochen/TinySAM
Demo:https://openxlab.org.cn/apps/detail/shuh15/TinySAM
Paper:https://arxiv.org/abs/2312.13789
网络架构没有变化
全阶段知识蒸馏,模型后量化,层次化分割
SegEvery 模式是一个分层策略,如上图所示,替代了原来的 32*32 的点网格采样,减少了 50% 的候选对象,大致为 512 个目标。
效果:
SegEvery 模式。精度上比 FastSAM 和 MobileSAM 好,速度比 MobileSAM 好,大致为 930 ms
据称比 sam 的 everything 推理加速两倍
EfficientViT-SAM 2024.2.7
https://github.com/mit-han-lab/efficientvit
【论文阅读】【二维图像分割】EfficientViT-SAM: Accelerated Segment Anything Model Without Performance Loss
截止 2024 年 2 月 24 号, 目前看上去又快又好的方法
总结
目前移动端部署有现成代码的:MobileSAM
目前看上去在移动端上 Demo 效果最好的:EdgeSAM
目前看上去性能最好的:EfficientViT-SAM
接下来我会根据它们实际的效果做尽量公平的对比
版权声明: 本文为 InfoQ 作者【AI阿辉】的原创文章。
原文链接:【http://xie.infoq.cn/article/6e7b861ce095225dfc80caf7f】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论