一、FastSAM介绍
1.简介
由美国Meta公司提出的能够“分割一切”的视觉基础大模型SAM引起了较大影响,为探索通用视觉大模型提供了一个新的方向。
2023年6月22日,中科院自动化所的研究团队针对“分割一切”任务,提出了FastSAM方法。中科院自动化所团队提出的FastSAM,对“分割一切”这一通用视觉任务的算法设计范式进行了重新思考,设计了“全实例分割+基于指令的掩码输出”两阶段算法。
FastSAM通过引入人工先验的结构设计,大幅降低了原Transformer结构在该通用感知任务上的计算冗余,实现了50倍加速,这一“快速”的特点,有利于视觉基础大模型的行业落地,有利于工业化应用落地。
项目地址:GitHub - CASIA-IVA-Lab/FastSAM: Fast Segment Anything
2.设计方法
FastSAM在每个阶段进行了任务和方法协同的方法设计:
(1)第一阶段,利用图像中大多数物体只占据图像局部区域的特点,采用天然具备局部连接特点的卷积算子进行全实例分割网络构建。该结构相较Transformer结构更加紧致,计算成本更低,但依旧保持对物体或图像区域的表示和判别能力。
(2)第二阶段,采用物理空间匹配和图文对齐空间匹配的策略进行基于指令的掩码输出。基于上一阶段的全实例分割掩码:对于基于位置点指令,将该点的位置所关联的最优分割区域进行输出,支持多点模式、背景点抑制;对于基于位置框的指令,将包围框匹配到的最大IoU的分割掩码进行输出;对于文本指令,利用图文对齐网络CLIP将掩码图像区域与文本指令映射到同一个空间,进行相似性计算,进而输出最相似区域。
基于此方法结构,FastSAM在SAM团队开源的SA-1B数据集上随机挑选了2%的图片进行训练就取得了和SAM可匹配的效果,并且速度相较最常用的32×32指令版本的SAM提升了50倍,实现了实时的“分割一切”。
二、环境部署
1.安装 conda
wget https://mirrors.bfsu.edu.cn/anaconda/archive/Anaconda3-2022.10-Linux-x86_64.sh --no-check-certificate
bash Anaconda3-2022.10-Linux-x86_64.sh
输入 yes 表示同意,确认安装的路径,一般直接回车安装在默认的 /home/你的名字/anaconda3,很快就安装完毕。输入 yes 来确认使用 conda init 来启动,如果现在输入 conda,会显示找不到命令,需要启动已经修改环境变量,输入以下命令(以后都不用再 source 了,因为启动 Ubuntu 会自动 source)
source ~/.bashrc
这时候会发现出现了 (base)。
2.安装FastSAM环境
conda create -n FastSAM python=3.9
conda activate FastSAM
cd FastSAM
pip install -r requirements.txt
pip install git+https://github.com/openai/CLIP.git
模型下载:链接:https://pan.baidu.com/s/1PF6i5jzlxM7-4Sc3-fDFSw 密码:iuh1
放在./weights/下,修改为FastSAM.pt 。
三、测试运行
python Inference.py --model_path ./weights/FastSAM.pt --img_path ./images/dogs.jpg
python Inference.py --model_path ./weights/FastSAM.pt --img_path ./images/dogs.jpg --text_prompt "the yellow dog"
from fastsam import FastSAM, FastSAMPrompt
model = FastSAM('./weights/FastSAM.pt')
IMAGE_PATH = './images/dogs.jpg'
DEVICE = 'cpu'
everything_results = model(IMAGE_PATH, device=DEVICE, retina_masks=True, imgsz=1024, conf=0.4, iou=0.9,)
prompt_process = FastSAMPrompt(IMAGE_PATH, everything_results, device=DEVICE)
# everything prompt
ann = prompt_process.everything_prompt()
# bbox default shape [0,0,0,0] -> [x1,y1,x2,y2]
ann = prompt_process.box_prompt(bbox=[200, 200, 300, 300])
# text prompt
ann = prompt_process.text_prompt(text='a photo of a dog')
# point prompt
# points default [[0,0]] [[x1,y1],[x2,y2]]
# point_label default [0] [1,0] 0:background, 1:foreground
ann = prompt_process.point_prompt(points=[[620, 360]], pointlabel=[1])
prompt_process.plot(annotations=ann,output_path='./output/dog.jpg',)