[New Feature] Support SAM 2.1 (#59)
* support sam 2.1 * refine config path and ckpt path * update README
This commit is contained in:
@@ -5,12 +5,68 @@
|
||||
# LICENSE file in the root directory of this source tree.
|
||||
|
||||
import logging
|
||||
import os
|
||||
|
||||
import torch
|
||||
from hydra import compose
|
||||
from hydra.utils import instantiate
|
||||
from omegaconf import OmegaConf
|
||||
|
||||
import sam2
|
||||
|
||||
# Check if the user is running Python from the parent directory of the sam2 repo
|
||||
# (i.e. the directory where this repo is cloned into) -- this is not supported since
|
||||
# it could shadow the sam2 package and cause issues.
|
||||
if os.path.isdir(os.path.join(sam2.__path__[0], "sam2")):
|
||||
# If the user has "sam2/sam2" in their path, they are likey importing the repo itself
|
||||
# as "sam2" rather than importing the "sam2" python package (i.e. "sam2/sam2" directory).
|
||||
# This typically happens because the user is running Python from the parent directory
|
||||
# that contains the sam2 repo they cloned.
|
||||
raise RuntimeError(
|
||||
"You're likely running Python from the parent directory of the sam2 repository "
|
||||
"(i.e. the directory where https://github.com/facebookresearch/sam2 is cloned into). "
|
||||
"This is not supported since the `sam2` Python package could be shadowed by the "
|
||||
"repository name (the repository is also named `sam2` and contains the Python package "
|
||||
"in `sam2/sam2`). Please run Python from another directory (e.g. from the repo dir "
|
||||
"rather than its parent dir, or from your home directory) after installing SAM 2."
|
||||
)
|
||||
|
||||
|
||||
HF_MODEL_ID_TO_FILENAMES = {
|
||||
"facebook/sam2-hiera-tiny": (
|
||||
"configs/sam2/sam2_hiera_t.yaml",
|
||||
"sam2_hiera_tiny.pt",
|
||||
),
|
||||
"facebook/sam2-hiera-small": (
|
||||
"configs/sam2/sam2_hiera_s.yaml",
|
||||
"sam2_hiera_small.pt",
|
||||
),
|
||||
"facebook/sam2-hiera-base-plus": (
|
||||
"configs/sam2/sam2_hiera_b+.yaml",
|
||||
"sam2_hiera_base_plus.pt",
|
||||
),
|
||||
"facebook/sam2-hiera-large": (
|
||||
"configs/sam2/sam2_hiera_l.yaml",
|
||||
"sam2_hiera_large.pt",
|
||||
),
|
||||
"facebook/sam2.1-hiera-tiny": (
|
||||
"configs/sam2.1/sam2.1_hiera_t.yaml",
|
||||
"sam2.1_hiera_tiny.pt",
|
||||
),
|
||||
"facebook/sam2.1-hiera-small": (
|
||||
"configs/sam2.1/sam2.1_hiera_s.yaml",
|
||||
"sam2.1_hiera_small.pt",
|
||||
),
|
||||
"facebook/sam2.1-hiera-base-plus": (
|
||||
"configs/sam2.1/sam2.1_hiera_b+.yaml",
|
||||
"sam2.1_hiera_base_plus.pt",
|
||||
),
|
||||
"facebook/sam2.1-hiera-large": (
|
||||
"configs/sam2.1/sam2.1_hiera_l.yaml",
|
||||
"sam2.1_hiera_large.pt",
|
||||
),
|
||||
}
|
||||
|
||||
|
||||
def build_sam2(
|
||||
config_file,
|
||||
@@ -78,39 +134,21 @@ def build_sam2_video_predictor(
|
||||
return model
|
||||
|
||||
|
||||
def build_sam2_hf(model_id, **kwargs):
|
||||
|
||||
def _hf_download(model_id):
|
||||
from huggingface_hub import hf_hub_download
|
||||
|
||||
model_id_to_filenames = {
|
||||
"facebook/sam2-hiera-tiny": ("sam2_hiera_t.yaml", "sam2_hiera_tiny.pt"),
|
||||
"facebook/sam2-hiera-small": ("sam2_hiera_s.yaml", "sam2_hiera_small.pt"),
|
||||
"facebook/sam2-hiera-base-plus": (
|
||||
"sam2_hiera_b+.yaml",
|
||||
"sam2_hiera_base_plus.pt",
|
||||
),
|
||||
"facebook/sam2-hiera-large": ("sam2_hiera_l.yaml", "sam2_hiera_large.pt"),
|
||||
}
|
||||
config_name, checkpoint_name = model_id_to_filenames[model_id]
|
||||
config_name, checkpoint_name = HF_MODEL_ID_TO_FILENAMES[model_id]
|
||||
ckpt_path = hf_hub_download(repo_id=model_id, filename=checkpoint_name)
|
||||
return config_name, ckpt_path
|
||||
|
||||
|
||||
def build_sam2_hf(model_id, **kwargs):
|
||||
config_name, ckpt_path = _hf_download(model_id)
|
||||
return build_sam2(config_file=config_name, ckpt_path=ckpt_path, **kwargs)
|
||||
|
||||
|
||||
def build_sam2_video_predictor_hf(model_id, **kwargs):
|
||||
|
||||
from huggingface_hub import hf_hub_download
|
||||
|
||||
model_id_to_filenames = {
|
||||
"facebook/sam2-hiera-tiny": ("sam2_hiera_t.yaml", "sam2_hiera_tiny.pt"),
|
||||
"facebook/sam2-hiera-small": ("sam2_hiera_s.yaml", "sam2_hiera_small.pt"),
|
||||
"facebook/sam2-hiera-base-plus": (
|
||||
"sam2_hiera_b+.yaml",
|
||||
"sam2_hiera_base_plus.pt",
|
||||
),
|
||||
"facebook/sam2-hiera-large": ("sam2_hiera_l.yaml", "sam2_hiera_large.pt"),
|
||||
}
|
||||
config_name, checkpoint_name = model_id_to_filenames[model_id]
|
||||
ckpt_path = hf_hub_download(repo_id=model_id, filename=checkpoint_name)
|
||||
config_name, ckpt_path = _hf_download(model_id)
|
||||
return build_sam2_video_predictor(
|
||||
config_file=config_name, ckpt_path=ckpt_path, **kwargs
|
||||
)
|
||||
@@ -118,7 +156,7 @@ def build_sam2_video_predictor_hf(model_id, **kwargs):
|
||||
|
||||
def _load_checkpoint(model, ckpt_path):
|
||||
if ckpt_path is not None:
|
||||
sd = torch.load(ckpt_path, map_location="cpu")["model"]
|
||||
sd = torch.load(ckpt_path, map_location="cpu", weights_only=True)["model"]
|
||||
missing_keys, unexpected_keys = model.load_state_dict(sd)
|
||||
if missing_keys:
|
||||
logging.error(missing_keys)
|
||||
|
Reference in New Issue
Block a user