> ## Documentation Index
> Fetch the complete documentation index at: https://felimet-hub.jmcores.com/llms.txt
> Use this file to discover all available pages before exploring further.

# SAM2 影像分割標註工具

> 基於 Meta SAM2 模型的 Windows 桌面影像分割標註應用程式，透過互動式點擊即可對影像目標進行快速分割遮罩生成，支援 CUDA GPU 加速推論，並提供 PyInstaller 封裝執行檔與從源碼建置兩種安裝方式，可整合至既有影像處理與標註工作流程。

export const OptionPicker = ({options = [], lang = "zh", label}) => {
  const t = lang === "en" ? {
    pick: label || "Pick an option to compare",
    rec: "Recommended"
  } : {
    pick: label || "點選項目比較",
    rec: "推薦"
  };
  const opts = Array.isArray(options) ? options : [];
  const [sel, setSel] = useState(0);
  if (opts.length === 0) return null;
  const idx = Math.min(sel, opts.length - 1);
  const cur = opts[idx];
  const css = `
  .op-root{--op-bg:#FAF8F3;--op-surface:rgba(0,0,0,0.025);--op-border:rgba(0,0,0,0.09);--op-text:#2b2722;--op-dim:#6f6a62;--op-faint:#8a8378;--op-accent:#bf7551;border:1px solid var(--op-border);border-radius:14px;background:var(--op-bg);color:var(--op-text);overflow:hidden;}
  .dark .op-root{--op-bg:#1b1a18;--op-surface:rgba(255,255,255,0.03);--op-border:rgba(255,255,255,0.08);--op-text:#e7e3da;--op-dim:#a8a299;--op-faint:#8a8378;--op-accent:#cf8a68;}
  .op-head{padding:12px 16px 11px;border-bottom:1px solid var(--op-border);font-size:12.5px;color:var(--op-dim);display:flex;align-items:center;gap:8px;}
  .op-head-ic{color:var(--op-accent);flex-shrink:0;}
  .op-tabs{display:flex;gap:8px;padding:14px 16px 4px;flex-wrap:wrap;}
  .op-tab{position:relative;flex:1 1 130px;min-width:120px;text-align:left;background:transparent;border:1px solid var(--op-border);border-radius:11px;padding:11px 13px;cursor:pointer;color:inherit;font:inherit;transition:border-color .15s,background .15s,box-shadow .15s;}
  .op-tab:hover{background:var(--op-surface);}
  .op-tab-on{border-color:rgba(191,117,81,.5);background:rgba(191,117,81,.07);box-shadow:0 0 0 3px rgba(191,117,81,.1);}
  .op-tab-name{font-size:14.5px;font-weight:600;line-height:1.3;}
  .op-tab-on .op-tab-name{color:var(--op-accent);}
  .op-badge{display:inline-block;margin-top:6px;font-size:10.5px;font-weight:700;letter-spacing:.4px;text-transform:uppercase;padding:2px 7px;border-radius:20px;background:rgba(191,117,81,.14);color:var(--op-accent);}
  .op-rec{position:absolute;top:10px;right:11px;font-size:10px;font-weight:700;letter-spacing:.3px;text-transform:uppercase;color:var(--op-accent);}
  .op-body{padding:6px 16px 16px;}
  .op-specs{border:1px solid var(--op-border);border-radius:10px;overflow:hidden;margin-bottom:11px;}
  .op-row{display:flex;border-top:1px solid var(--op-border);font-size:13px;}
  .op-row:first-child{border-top:none;}
  .op-k{width:42%;flex-shrink:0;padding:8px 12px;color:var(--op-dim);background:var(--op-surface);}
  .op-v{flex:1 1 0;min-width:0;padding:8px 12px;font-weight:500;}
  .op-note{font-size:13px;line-height:1.6;color:var(--op-dim);padding:0 2px;}
  `;
  return <div className="op-root">
      <style>{css}</style>
      <div className="op-head"><svg className="op-head-ic" xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="m12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83Z" /><path d="m22 17.65-9.17 4.16a2 2 0 0 1-1.66 0L2 17.65" /><path d="m22 12.65-9.17 4.16a2 2 0 0 1-1.66 0L2 12.65" /></svg>{t.pick}</div>
      <div className="op-tabs">
        {opts.map((o, i) => <button key={i} type="button" className={"op-tab" + (i === idx ? " op-tab-on" : "")} onClick={() => setSel(i)}>
            {o.recommend && <span className="op-rec">★ {t.rec}</span>}
            <div className="op-tab-name">{o.name}</div>
            {o.badge && <span className="op-badge">{o.badge}</span>}
          </button>)}
      </div>
      <div className="op-body">
        <div className="op-specs">
          {(cur.specs || []).map((row, i) => <div className="op-row" key={i}>
              <div className="op-k">{row[0]}</div>
              <div className="op-v">{row[1]}</div>
            </div>)}
        </div>
        {cur.note && <div className="op-note">{cur.note}</div>}
      </div>
    </div>;
};

`SAM2` · `Python` · `Computer Vision` · `Annotation` · `Windows` · `CUDA`

## 專案概述

基於 Meta Segment Anything Model 2（SAM2）開發的 Windows 桌面標註應用程式。使用者透過點擊互動即可對影像目標產生分割遮罩，無需手動描邊。提供直接執行的封裝執行檔（`.exe`），也可從源碼以 PyInstaller 自行建置，產出 `dist/SAM2_Annotation_Tool` 可執行目錄。主要用於需要大量標註資料的電腦視覺研究場景。

## 核心功能

* 以點擊互動驅動 SAM2 零樣本（zero-shot）分割，快速生成目標遮罩
* 支援單張影像中多個目標區域連續標註
* 標註結果可匯出供後續訓練流程使用
* 提供封裝執行檔，不需另行建置 Python 環境即可啟動
* 支援多種 SAM2 模型大小（tiny / small / base\_plus / large）以平衡速度與精度

## 快速開始

兩種安裝方式，先比較再往下看細節：

<OptionPicker
  label="點選安裝方式比較"
  options={[
{
name: "封裝執行檔", badge: "一般使用者", recommend: true,
specs: [["Python 環境", "不需"], ["建置步驟", "否"], ["GPU", "建議 NVIDIA 6 GB+"], ["取得方式", "下載 Release zip"], ["適合", "一般使用者、標註人員"]],
note: "解壓即用，不需 Python 環境，最低門檻參與標註。"
},
{
name: "從源碼建置", badge: "開發者",
specs: [["Python 環境", "需 3.9+ 與 CUDA PyTorch"], ["建置步驟", "PyInstaller（setup.py）"], ["GPU", "需 NVIDIA + CUDA"], ["取得方式", "git clone + pip install -e"], ["適合", "要改碼、自訂流程"]],
note: "可改原始碼、自行打包，適合開發者整合進既有流程。"
}
]}
/>

### 方式一：使用封裝執行檔（建議一般使用者）

<Steps>
  <Step title="下載封裝版本">
    從 Release 頁面下載最新的 `SAM2_Annotation_Tool.zip`，解壓縮至任意目錄。
  </Step>

  <Step title="執行應用程式">
    執行解壓縮資料夾中的 `SAM2_Annotation_Tool.exe`，直接進入標註介面，無需安裝 Python。
  </Step>
</Steps>

### 方式二：從源碼建置（適合開發者）

<Steps>
  <Step title="安裝 Python 與 PyTorch（CUDA）">
    安裝 Python 3.9 以上版本，並以 CUDA wheel 安裝 PyTorch：

    ```bash theme={null}
    pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118
    ```
  </Step>

  <Step title="安裝其他依賴套件">
    ```bash theme={null}
    pip install matplotlib numpy pillow pyinstaller tqdm
    ```
  </Step>

  <Step title="複製 SAM2 儲存庫並安裝">
    ```bash theme={null}
    git clone https://github.com/facebookresearch/sam2.git
    cd sam2
    pip install -e .
    ```
  </Step>

  <Step title="下載模型權重">
    ```bash theme={null}
    cd checkpoints
    ./download_ckpts.sh
    ```

    或手動從 [SAM2 官方儲存庫](https://github.com/facebookresearch/sam2) 下載所需的 `.pt` 權重檔。
  </Step>

  <Step title="執行封裝腳本">
    ```bash theme={null}
    python setup.py
    ```

    完成後可執行檔位於 `dist/SAM2_Annotation_Tool` 目錄。
  </Step>
</Steps>

## 注意事項

<Warning>
  建議使用具備 NVIDIA GPU（顯存 6 GB 以上）並支援 CUDA 的 Windows 10/11（64 位元）主機執行。無 GPU 時仍可以 CPU 模式啟動，但推論速度會顯著下降。若出現記憶體不足錯誤，改用較小的模型（如 `sam2.1_hiera_tiny.pt`）或縮小輸入影像尺寸。確認 PyTorch 能否偵測 CUDA：

  ```python theme={null}
  import torch
  print(torch.cuda.is_available())
  ```
</Warning>

## 實際應用面

適合需要建立自訂影像分割資料集的研究情境，例如牛隻個體輪廓標註、農業場域目標區域標記，或任何需要快速產生像素級遮罩的電腦視覺任務。封裝版本讓非 Python 使用者也能直接參與標註作業，降低資料收集的門檻。

## 相關連結

* GitHub：[felimet/SAM2\_Annotation\_Tool](https://github.com/felimet/SAM2_Annotation_Tool)
* SAM2 官方儲存庫：[facebookresearch/sam2](https://github.com/facebookresearch/sam2)
