Intro

안녕하세요. 이번 포스팅에서는 6월에 발표된 두개의 논문에 대해 가볍게 다뤄볼까 합니다. 바로 Meta의 SAM(Segment Anything Model)에서 파생된 FastSAM과 MobileSAM 입니다.

SAM은 23년 7월 7일 기준 35.8K의 star가 달릴 만큼 많은 화제가 되었으며 현재 다양한 모델들과 결합되고 있습니다.(Grounding-SAM, Track-Anything, Caption-Anything 등)

SAM은 이미지 인코더, 프롬프트 인코더, 마스크 디코더로 이루어져 있으며 이미지와 프롬프트(점, 박스, 텍스트)를 받아 원하는 객체, 혹은 모든 객체를 segmentation 할 수 있는 기술입니다.

SAM은 SA-1B 대규모 데이터셋에 의해 학습 되었으며 객체가 무엇인지는 예측하지 않기 때문에 다양한 도메인에서 굳이 fine-tuning을 하지 않아도 잘 동작한다는 장점이 있습니다.

하지만 SAM의 이미지 인코더는 ViT-H,L,B 모델을 사용하기 때문에 생각보다 많은 연산을 요구합니다.

그래서 SAM의 이미지 임베딩을 위한 인코더를 경량화 하는것을 목표로 FastSAM과 MobileSAM이 탄생하였으며 이로 인해 수십배 빠르게 마스크를 생성할 수 있게 되었습니다.

FastSAM과 MobileSAM에 대해 빠르게 알아보고 gpu가 아닌 cpu에서 사용했을때 어느정도의 성능이 나오는지 실험해 보겠습니다.


How Works?

FastSAM

FastSAM은 중국의 여러 연구소에서 함께 발표한 논문으로 YOLACT(Instance segmentation)를 활용한 YOLOv8-seg 모델을 기반으로 작동합니다.

Transformer가 아닌 CNN 기반 backbone과 여러 레이어를 거쳐 모든 마스크를 예측한뒤 NMS를 적용하고 post processing 단계에서 프롬프트에 맞는 마스크만 추출하는 아이디어입니다.

FastSAM은 SAM의 학습 데이터인 SA-1B에서 단 2%만 활용하여 학습하였고 NVIDIA GeForce RTX 3090 기준 약 50배 빠른 런타임 속도로 추론할 수 있다고 합니다.

파라미터 개수는 파격적으로 줄지는 않았지만 실제 속도는 매우 빨라진 것 같습니다.(SAM(Vit-B)-136M, FastSAM-68M)


MobileSAM

MobileSAM은 경희대학교에서 발표한 논문으로 SAM의 구조에서 이미지 인코더 부분만 TinyViT 로 변경한 모델입니다.

TinyViT(5M)는 ‘Fast Pretraining Distillation for Small Vision Transformers’ 논문에서 제안된 Distillation을 활용해 ViT를 경량화시킨 모델이며 SAM의 이미지 인코더인 ViT-H(632M) 보다 약 120배 적은 파라미터 수를 가지고 있습니다.

FastSAM의 총 파라미터 수가 68M인 반면에 MobileSAM은 9.66M 인 것을 보면 얼마나 적은 파라미터인지 체감할 수 있습니다.

MobileSAM은 SAM의 구조를 그대로 가져왔기 때문에 Original SAM의 output과 굉장히 비슷하고 속도도 FastSAM보다 더 빠르다고 주장합니다.

정말 MobileSAM의 성능이 cpu에서도 FastSAM에 비해 좋을지 한번 테스트 해보겠습니다.


FastSAM vs MobileSAM

실험환경

OS: macOS
메모리: 16GB
칩: Apple M2 CPU(8 core)


result:

Model parameter 1 point prompt
SAM-B 136M 7.02s
FastSAM-s 11M 1.12s
FastSAM-x(default) 68M 2.99
MobileSAM 9.66M 1.43s
Image 1

SAM-B

Image 2

MobileSAM


Image 1

FastSAM-s

Image 2

FastSAM-x


MobileSAM 저자가 언급한 것 처럼 제 맥북환경에서도 FastSAM-x(default) 보다 MobileSAM의 추론속도가 더 빨랐습니다. 하지만 위 이미지에서는 MobileSAM 보다 FastSAM-x 의 마스킹 결과가 더 좋아보입니다. 심지어 SAM-B에서도 고양이의 꼬리는 마스킹 하지 못했네요.

이미지 전체를 마스킹한 결과는 아래와 같습니다.

Image 1

SAM-B

Image 2

MobileSAM


Image 1

FastSAM-s

Image 2

FastSAM-x


FastSAM-s의 결과는 좋지 않지만 FastSAM-x와 MobileSAM의 성능은 SAM-B와 견줄만큼 괜찮아 보입니다. 마스킹 해야 할 객체가 어렵지 않다면 FastSAM-x와 MobileSAM이 SAM을 충분히 대체 할 수 있을 것 같습니다.

만약 OpenVINO 같은 툴로 조금만 더 가속화 한다면 gpu 없이도 내부적으로 CPU를 활용한 라벨링 툴로 활용해도 되겠네요.


END

이번 포스팅에서는 Segment Anything Model의 경량화 버전인 FastSAM과 MobileSAM에 대해 가볍게 알아보았습니다.

FastSAM, MobileSAM의 경량화 모델은 Single GPU에서 12ms(83 FPS)를 달성하여 real-time에서 사용할 수 있게 되었습니다.

CPU에서도 유의미하게 속도 향상이 이루어졌지만 아직까지는 SAM 계열을 CPU에서 real-time으로 마스킹하기는 어려워 보입니다.

SAM이 발표된 이후로 이로부터 파생된 모델들이 쏟아져 나오며 점점 더 좋은 성능의 모델이 생기는 것을 보면 오픈소스의 힘은 참 대단한 것 같습니다.

마이크로소프트와 페이스북이 오픈소스에 힘쓰는 상황이 아이러니하지만 개인적으로 오픈소스의 영향에 대해 긍정적으로 생각하는 사람으로써 이런 문화가 계속해서 더 발전했으면 좋겠네요.

Reference

업데이트:

댓글남기기