Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file removed notebooks/images/cars.jpg
Binary file not shown.
Binary file removed notebooks/images/groceries.jpg
Binary file not shown.
Binary file removed notebooks/images/truck.jpg
Binary file not shown.
Binary file removed notebooks/videos/bedroom.mp4
Binary file not shown.
Binary file removed notebooks/videos/bedroom/00000.jpg
Binary file not shown.
Binary file removed notebooks/videos/bedroom/00001.jpg
Binary file not shown.
Binary file removed notebooks/videos/bedroom/00002.jpg
Binary file not shown.
Binary file removed notebooks/videos/bedroom/00003.jpg
Binary file not shown.
Binary file removed notebooks/videos/bedroom/00004.jpg
Binary file not shown.
Binary file removed notebooks/videos/bedroom/00005.jpg
Binary file not shown.
Binary file removed notebooks/videos/bedroom/00006.jpg
Binary file not shown.
Binary file removed notebooks/videos/bedroom/00007.jpg
Binary file not shown.
Binary file removed notebooks/videos/bedroom/00008.jpg
Binary file not shown.
Binary file removed notebooks/videos/bedroom/00009.jpg
Binary file not shown.
Binary file removed notebooks/videos/bedroom/00010.jpg
Binary file not shown.
Binary file removed notebooks/videos/bedroom/00011.jpg
Binary file not shown.
Binary file removed notebooks/videos/bedroom/00012.jpg
Binary file not shown.
Binary file removed notebooks/videos/bedroom/00013.jpg
Binary file not shown.
Binary file removed notebooks/videos/bedroom/00014.jpg
Binary file not shown.
Binary file removed notebooks/videos/bedroom/00015.jpg
Binary file not shown.
Binary file removed notebooks/videos/bedroom/00016.jpg
Binary file not shown.
Binary file removed notebooks/videos/bedroom/00017.jpg
Binary file not shown.
Binary file removed notebooks/videos/bedroom/00018.jpg
Binary file not shown.
Binary file removed notebooks/videos/bedroom/00019.jpg
Binary file not shown.
Binary file removed notebooks/videos/bedroom/00020.jpg
Binary file not shown.
Binary file removed notebooks/videos/bedroom/00021.jpg
Binary file not shown.
Binary file removed notebooks/videos/bedroom/00022.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00023.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00024.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00025.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00026.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00027.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00028.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00029.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00030.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00031.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00032.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00033.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00034.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00035.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00036.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00037.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00038.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00039.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00040.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00041.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00042.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00043.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00044.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00045.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00046.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00047.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00048.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00049.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00050.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00051.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00052.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00053.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00054.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00055.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00056.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00057.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00058.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00059.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00060.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00061.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00062.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00063.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00064.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00065.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00066.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00067.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00068.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00069.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00070.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00071.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00072.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00073.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00074.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00075.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00076.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00077.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00078.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00079.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00080.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00081.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00082.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00083.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00084.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00085.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00086.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00087.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00088.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00089.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00090.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00091.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00092.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00093.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00094.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00095.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00096.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00097.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00098.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00099.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00100.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00101.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00102.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00103.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00104.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00105.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00106.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00107.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00108.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00109.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00110.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00111.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00112.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00113.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00114.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00115.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00116.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00117.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00118.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00119.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00120.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00121.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00122.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00123.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00124.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00125.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00126.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00127.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00128.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00129.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00130.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00131.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00132.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00133.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00134.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00135.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00136.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00137.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00138.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00139.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00140.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00141.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00142.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00143.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00144.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00145.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00146.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00147.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00148.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00149.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00150.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00151.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00152.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00153.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00154.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00155.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00156.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00157.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00158.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00159.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00160.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00161.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00162.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00163.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00164.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00165.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00166.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00167.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00168.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00169.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00170.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00171.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00172.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00173.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00174.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00175.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00176.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00177.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00178.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00179.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00180.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00181.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00182.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00183.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00184.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00185.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00186.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00187.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00188.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00189.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00190.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00191.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00192.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00193.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00194.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00195.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00196.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00197.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00198.jpg
Diff not rendered.
Binary file removed notebooks/videos/bedroom/00199.jpg
Diff not rendered.
28 changes: 24 additions & 4 deletions sam2/automatic_mask_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

# Adapted from https://github.com/facebookresearch/segment-anything/blob/main/segment_anything/automatic_mask_generator.py
from typing import Any, Dict, List, Optional, Tuple

from sam2.utils.Track import get_gpu_mem
import numpy as np
import torch
from torchvision.ops.boxes import batched_nms, box_area # type: ignore
Expand Down Expand Up @@ -222,6 +222,7 @@ def generate(self, image: np.ndarray) -> List[Dict[str, Any]]:
return curr_anns

def _generate_masks(self, image: np.ndarray) -> MaskData:
logs = []
orig_size = image.shape[:2]
crop_boxes, layer_idxs = generate_crop_boxes(
orig_size, self.crop_n_layers, self.crop_overlap_ratio
Expand All @@ -230,9 +231,12 @@ def _generate_masks(self, image: np.ndarray) -> MaskData:
# Iterate over image crops
data = MaskData()
for crop_box, layer_idx in zip(crop_boxes, layer_idxs):
before = get_gpu_mem()
crop_data = self._process_crop(image, crop_box, layer_idx, orig_size)
after = get_gpu_mem()
data.cat(crop_data)

logs.append((crop_box, layer_idx, before, after))
print(logs)
# Remove duplicate masks between crops
if len(crop_boxes) > 1:
# Prefer masks from smaller crops
Expand All @@ -259,8 +263,18 @@ def _process_crop(
x0, y0, x1, y1 = crop_box
cropped_im = image[y0:y1, x0:x1, :]
cropped_im_size = cropped_im.shape[:2]
mem_before_embed = get_gpu_mem()
print(
f"[layer {crop_layer_idx} | crop {crop_box}] "
f"before embed: {mem_before_embed:.1f} MB"
)
self.predictor.set_image(cropped_im)

mem_after_embed = get_gpu_mem()
print(
f"[layer {crop_layer_idx} | crop {crop_box}] "
f"after embed: {mem_after_embed:.1f} MB "
f"(+{mem_after_embed - mem_before_embed:.1f} MB)"
)
# Get points for this crop
points_scale = np.array(cropped_im_size)[None, ::-1]
points_for_image = self.point_grids[crop_layer_idx] * points_scale
Expand Down Expand Up @@ -311,13 +325,19 @@ def _process_batch(
in_labels = torch.ones(
in_points.shape[0], dtype=torch.int, device=in_points.device
)
mem_before_fwd = get_gpu_mem()
masks, iou_preds, low_res_masks = self.predictor._predict(
in_points[:, None, :],
in_labels[:, None],
multimask_output=self.multimask_output,
return_logits=True,
)

mem_after_fwd = get_gpu_mem()
print(
f"[batch forward] before={mem_before_fwd:.1f} MB | "
f"after={mem_after_fwd:.1f} MB | "
f"diff={mem_after_fwd - mem_before_fwd:.1f} MB"
)
# Serialize predictions and store in MaskData
data = MaskData(
masks=masks.flatten(0, 1),
Expand Down
19 changes: 19 additions & 0 deletions sam2/utils/Track.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import torch
#Track VRAM
def get_gpu_mem(device=None):
"""
Returns current GPU memory usage (allocated) in MB.
Accurate and efficient.
"""
if not torch.cuda.is_available():
return 0.0

if device is None:
device = torch.cuda.current_device()

torch.cuda.synchronize(device) # ensures accurate timing

stats = torch.cuda.memory_stats(device)
allocated = stats["allocated_bytes.all.current"] / 1024**2

return allocated
37 changes: 17 additions & 20 deletions sam2/utils/amg.py
Original file line number Diff line number Diff line change
Expand Up @@ -203,39 +203,36 @@ def generate_crop_boxes(
im_size: Tuple[int, ...], n_layers: int, overlap_ratio: float
) -> Tuple[List[List[int]], List[int]]:
"""
Generates a list of crop boxes of different sizes. Each layer
has (2**i)**2 boxes for the ith layer.
Generates crop boxes only for the finest (smallest) layer.
The finest layer is the last one: i_layer = n_layers - 1,
which has (2**i_layer)**2 boxes.
"""
crop_boxes, layer_idxs = [], []
im_h, im_w = im_size
short_side = min(im_h, im_w)

# Original image
crop_boxes.append([0, 0, im_w, im_h])
layer_idxs.append(0)


def crop_len(orig_len, n_crops, overlap):
return int(math.ceil((overlap * (n_crops - 1) + orig_len) / n_crops))

for i_layer in range(n_layers):
n_crops_per_side = 2 ** (i_layer + 1)
overlap = int(overlap_ratio * short_side * (2 / n_crops_per_side))
# Only finest layer (last one)
i_layer = n_layers - 1
n_crops_per_side = 2 ** (i_layer + 1)
overlap = int(overlap_ratio * short_side * (2 / n_crops_per_side))

crop_w = crop_len(im_w, n_crops_per_side, overlap)
crop_h = crop_len(im_h, n_crops_per_side, overlap)
crop_w = crop_len(im_w, n_crops_per_side, overlap)
crop_h = crop_len(im_h, n_crops_per_side, overlap)

crop_box_x0 = [int((crop_w - overlap) * i) for i in range(n_crops_per_side)]
crop_box_y0 = [int((crop_h - overlap) * i) for i in range(n_crops_per_side)]
crop_box_x0 = [int((crop_w - overlap) * i) for i in range(n_crops_per_side)]
crop_box_y0 = [int((crop_h - overlap) * i) for i in range(n_crops_per_side)]

# Crops in XYWH format
for x0, y0 in product(crop_box_x0, crop_box_y0):
box = [x0, y0, min(x0 + crop_w, im_w), min(y0 + crop_h, im_h)]
crop_boxes.append(box)
layer_idxs.append(i_layer + 1)
# Crops in XYWH format (only finest layer)
for x0, y0 in product(crop_box_x0, crop_box_y0):
box = [x0, y0, min(x0 + crop_w, im_w), min(y0 + crop_h, im_h)]
crop_boxes.append(box)
layer_idxs.append(i_layer)

return crop_boxes, layer_idxs


def uncrop_boxes_xyxy(boxes: torch.Tensor, crop_box: List[int]) -> torch.Tensor:
x0, y0, _, _ = crop_box
offset = torch.tensor([[x0, y0, x0, y0]], device=boxes.device)
Expand Down