ncut-pytorch


Namencut-pytorch JSON
Version 2.2.7 PyPI version JSON
download
home_pageNone
SummaryNormalized Cut and Spectral Embedding
upload_time2025-10-31 03:08:42
maintainerNone
docs_urlNone
authorNone
requires_python>=3
licenseNone
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            
### [🌐Documentation (old version)](https://ncut-pytorch.readthedocs.io/) | [🤗HuggingFace Demo](https://huggingface.co/spaces/huzey/ncut-pytorch)


## Nyström Normalized Cut

Normalized Cut and spectral embedding, 100x faster than sklean implementation. $O(n)$ time complexity, $O(1)$ space complexity.



https://github.com/user-attachments/assets/cdf53e33-bb34-4a84-b1f4-679b66da1d48




<div align="center">
  Video: Ncut spectral embedding eigenvectors, on SAM features.
</div>


---

## Installation

<div style="text-align:">
    <pre><code class="language-shell">pip install -U ncut-pytorch</code></pre>
</div>


## Quick Start: plain Ncut


```py linenums="1"
import torch
from ncut_pytorch import Ncut

features = torch.rand(1960, 768)
eigvecs = Ncut(n_eig=20).fit_transform(features)
  # (1960, 20)

from ncut_pytorch import kway_ncut
kway_eigvecs = kway_ncut(eigvecs)
cluster_assignment = kway_eigvecs.argmax(1)
cluster_centroids = kway_eigvecs.argmax(0)
```

## Quick Start: Ncut DINOv3 Predictor

```py linenums="1"
from ncut_pytorch.predictor import NcutDinov3Predictor
from PIL import Image

predictor = NcutDinov3Predictor(model_cfg="dinov3_vitl16")
predictor = predictor.to('cuda')

images = [Image.open(f"images/view_{i}.jpg") for i in range(4)]
predictor.set_images(images)

image = predictor.summary(n_segments=[10, 25, 50, 100], draw_border=True)
display(image)

```

![summary](https://github.com/user-attachments/assets/a5d8a966-990b-4f6d-be10-abb00291bee2)



More examples and detailed usage can be found in the `examples` directory.

## Performance

- `ncut_pytorch.Ncut` is $O(n)$ time complexity

- `sklearn.SpectralEmbedding` is $O(n^2)$ time complexity.

#### Setup:

CPU: Intel(R) Core(TM) i9-13900K CPU

RAM: 128 GiB

GPU: RTX 4090 24 GiB

SYSTEM: Ubuntu 22.04.3 LTS

#### Run benchmark:


```shell
pytest unit_tests/bench_speed.py --benchmark-columns=mean,stddev --benchmark-sort=mean
```

#### Results:

```
------------- benchmark 'ncut-pytorch (CPU) vs sklearn': 8 tests ------------
Name (time in ms)                        Mean                StdDev          
-----------------------------------------------------------------------------
test_ncut_cpu_100_data_10_eig          2.5536 (1.0)          0.2782 (1.0)    
test_sklearn_100_data_10_eig           4.0913 (1.60)         1.6749 (6.02)   
test_ncut_cpu_300_data_10_eig          4.9034 (1.92)         1.6575 (5.96)   
test_sklearn_300_data_10_eig          10.1861 (3.99)         3.8870 (13.97)  
test_ncut_cpu_1000_data_10_eig        11.1968 (4.38)         1.7070 (6.13)   
test_ncut_cpu_3000_data_10_eig        38.6101 (15.12)        1.6379 (5.89)   
test_sklearn_1000_data_10_eig        193.5934 (75.81)        8.1933 (29.45)  
test_sklearn_3000_data_10_eig      1,246.4295 (488.11)   1,047.0191 (>1000.0)
-----------------------------------------------------------------------------
```
```
------------- benchmark 'ncut-pytorch (GPU) n_data': 5 tests -------------
Name (time in ms)                         Mean            StdDev          
--------------------------------------------------------------------------
test_ncut_gpu_100_data_10_eig           2.9564 (1.0)      0.1816 (1.0)    
test_ncut_gpu_1000_data_10_eig          4.6938 (1.59)     0.3933 (2.17)   
test_ncut_gpu_10000_data_10_eig        67.9607 (22.98)    4.0902 (22.52)  
test_ncut_gpu_100000_data_10_eig      396.9994 (134.29)   3.6202 (19.93)  
test_ncut_gpu_1000000_data_10_eig     798.4598 (270.08)   1.5704 (8.65)   
--------------------------------------------------------------------------
```
```
------------- benchmark 'ncut-pytorch (GPU) n_eig': 3 tests --------------
Name (time in ms)                         Mean            StdDev          
--------------------------------------------------------------------------
test_ncut_gpu_10000_data_10_eig        67.9607 (1.0)      4.0902 (10.76)  
test_ncut_gpu_10000_data_100_eig       74.0033 (1.09)     0.7856 (2.07)   
test_ncut_gpu_10000_data_1000_eig     179.8690 (2.65)     0.3801 (1.0)    
--------------------------------------------------------------------------
```


#### Run benchmark:

```shell
python unit_tests/bench_memory.py
```

#### Results:

`ncut-pytorch.Ncut` is $O(1)$ space complexity

```
+---------------+------------------------+
| Data Points   |   Peak GPU Memory (MB) |
+===============+========================+
| 1,000         |                   8.14 |
+---------------+------------------------+
| 10,000        |                   0.1  |
+---------------+------------------------+
| 100,000       |                   0.39 |
+---------------+------------------------+
| 1,000,000     |                   0.39 |
+---------------+------------------------+
```



## Citation

```
@misc{yang2024alignedcutvisualconceptsdiscovery,
      title={AlignedCut: Visual Concepts Discovery on Brain-Guided Universal Feature Space}, 
      author={Huzheng Yang and James Gee and Jianbo Shi},
      year={2024},
      eprint={2406.18344},
      archivePrefix={arXiv},
      primaryClass={cs.CV},
      url={https://arxiv.org/abs/2406.18344}, 
}
```

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "ncut-pytorch",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3",
    "maintainer_email": null,
    "keywords": null,
    "author": null,
    "author_email": "Huzheng Yang <huze.yann@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/38/93/f1f9ff6a98398916ebf758831bfddb16b549c350e51acfb80e76cf81874c/ncut_pytorch-2.2.7.tar.gz",
    "platform": null,
    "description": "\n### [\ud83c\udf10Documentation (old version)](https://ncut-pytorch.readthedocs.io/) | [\ud83e\udd17HuggingFace Demo](https://huggingface.co/spaces/huzey/ncut-pytorch)\n\n\n## Nystr\u00f6m Normalized Cut\n\nNormalized Cut and spectral embedding, 100x faster than sklean implementation. $O(n)$ time complexity, $O(1)$ space complexity.\n\n\n\nhttps://github.com/user-attachments/assets/cdf53e33-bb34-4a84-b1f4-679b66da1d48\n\n\n\n\n<div align=\"center\">\n  Video: Ncut spectral embedding eigenvectors, on SAM features.\n</div>\n\n\n---\n\n## Installation\n\n<div style=\"text-align:\">\n    <pre><code class=\"language-shell\">pip install -U ncut-pytorch</code></pre>\n</div>\n\n\n## Quick Start: plain Ncut\n\n\n```py linenums=\"1\"\nimport torch\nfrom ncut_pytorch import Ncut\n\nfeatures = torch.rand(1960, 768)\neigvecs = Ncut(n_eig=20).fit_transform(features)\n  # (1960, 20)\n\nfrom ncut_pytorch import kway_ncut\nkway_eigvecs = kway_ncut(eigvecs)\ncluster_assignment = kway_eigvecs.argmax(1)\ncluster_centroids = kway_eigvecs.argmax(0)\n```\n\n## Quick Start: Ncut DINOv3 Predictor\n\n```py linenums=\"1\"\nfrom ncut_pytorch.predictor import NcutDinov3Predictor\nfrom PIL import Image\n\npredictor = NcutDinov3Predictor(model_cfg=\"dinov3_vitl16\")\npredictor = predictor.to('cuda')\n\nimages = [Image.open(f\"images/view_{i}.jpg\") for i in range(4)]\npredictor.set_images(images)\n\nimage = predictor.summary(n_segments=[10, 25, 50, 100], draw_border=True)\ndisplay(image)\n\n```\n\n![summary](https://github.com/user-attachments/assets/a5d8a966-990b-4f6d-be10-abb00291bee2)\n\n\n\nMore examples and detailed usage can be found in the `examples` directory.\n\n## Performance\n\n- `ncut_pytorch.Ncut` is $O(n)$ time complexity\n\n- `sklearn.SpectralEmbedding` is $O(n^2)$ time complexity.\n\n#### Setup:\n\nCPU: Intel(R) Core(TM) i9-13900K CPU\n\nRAM: 128 GiB\n\nGPU: RTX 4090 24 GiB\n\nSYSTEM: Ubuntu 22.04.3 LTS\n\n#### Run benchmark:\n\n\n```shell\npytest unit_tests/bench_speed.py --benchmark-columns=mean,stddev --benchmark-sort=mean\n```\n\n#### Results:\n\n```\n------------- benchmark 'ncut-pytorch (CPU) vs sklearn': 8 tests ------------\nName (time in ms)                        Mean                StdDev          \n-----------------------------------------------------------------------------\ntest_ncut_cpu_100_data_10_eig          2.5536 (1.0)          0.2782 (1.0)    \ntest_sklearn_100_data_10_eig           4.0913 (1.60)         1.6749 (6.02)   \ntest_ncut_cpu_300_data_10_eig          4.9034 (1.92)         1.6575 (5.96)   \ntest_sklearn_300_data_10_eig          10.1861 (3.99)         3.8870 (13.97)  \ntest_ncut_cpu_1000_data_10_eig        11.1968 (4.38)         1.7070 (6.13)   \ntest_ncut_cpu_3000_data_10_eig        38.6101 (15.12)        1.6379 (5.89)   \ntest_sklearn_1000_data_10_eig        193.5934 (75.81)        8.1933 (29.45)  \ntest_sklearn_3000_data_10_eig      1,246.4295 (488.11)   1,047.0191 (>1000.0)\n-----------------------------------------------------------------------------\n```\n```\n------------- benchmark 'ncut-pytorch (GPU) n_data': 5 tests -------------\nName (time in ms)                         Mean            StdDev          \n--------------------------------------------------------------------------\ntest_ncut_gpu_100_data_10_eig           2.9564 (1.0)      0.1816 (1.0)    \ntest_ncut_gpu_1000_data_10_eig          4.6938 (1.59)     0.3933 (2.17)   \ntest_ncut_gpu_10000_data_10_eig        67.9607 (22.98)    4.0902 (22.52)  \ntest_ncut_gpu_100000_data_10_eig      396.9994 (134.29)   3.6202 (19.93)  \ntest_ncut_gpu_1000000_data_10_eig     798.4598 (270.08)   1.5704 (8.65)   \n--------------------------------------------------------------------------\n```\n```\n------------- benchmark 'ncut-pytorch (GPU) n_eig': 3 tests --------------\nName (time in ms)                         Mean            StdDev          \n--------------------------------------------------------------------------\ntest_ncut_gpu_10000_data_10_eig        67.9607 (1.0)      4.0902 (10.76)  \ntest_ncut_gpu_10000_data_100_eig       74.0033 (1.09)     0.7856 (2.07)   \ntest_ncut_gpu_10000_data_1000_eig     179.8690 (2.65)     0.3801 (1.0)    \n--------------------------------------------------------------------------\n```\n\n\n#### Run benchmark:\n\n```shell\npython unit_tests/bench_memory.py\n```\n\n#### Results:\n\n`ncut-pytorch.Ncut` is $O(1)$ space complexity\n\n```\n+---------------+------------------------+\n| Data Points   |   Peak GPU Memory (MB) |\n+===============+========================+\n| 1,000         |                   8.14 |\n+---------------+------------------------+\n| 10,000        |                   0.1  |\n+---------------+------------------------+\n| 100,000       |                   0.39 |\n+---------------+------------------------+\n| 1,000,000     |                   0.39 |\n+---------------+------------------------+\n```\n\n\n\n## Citation\n\n```\n@misc{yang2024alignedcutvisualconceptsdiscovery,\n      title={AlignedCut: Visual Concepts Discovery on Brain-Guided Universal Feature Space}, \n      author={Huzheng Yang and James Gee and Jianbo Shi},\n      year={2024},\n      eprint={2406.18344},\n      archivePrefix={arXiv},\n      primaryClass={cs.CV},\n      url={https://arxiv.org/abs/2406.18344}, \n}\n```\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Normalized Cut and Spectral Embedding",
    "version": "2.2.7",
    "project_urls": {
        "Documentation": "https://ncut-pytorch.readthedocs.io/",
        "Github": "https://github.com/huzeyann/ncut_pytorch/",
        "PyPI": "https://pypi.org/project/ncut_pytorch/"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d0063b5879d96bfbe8c1b23a91622b2c779499e3d346887a74bc69b62425e89f",
                "md5": "015e8ca7806aac4b7751d40bd3f78291",
                "sha256": "e22e8544b3deb93212236474d994ac5792dea5a5a8e3b5e488c557021399a64f"
            },
            "downloads": -1,
            "filename": "ncut_pytorch-2.2.7-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "015e8ca7806aac4b7751d40bd3f78291",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3",
            "size": 51672,
            "upload_time": "2025-10-31T03:08:41",
            "upload_time_iso_8601": "2025-10-31T03:08:41.500912Z",
            "url": "https://files.pythonhosted.org/packages/d0/06/3b5879d96bfbe8c1b23a91622b2c779499e3d346887a74bc69b62425e89f/ncut_pytorch-2.2.7-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "3893f1f9ff6a98398916ebf758831bfddb16b549c350e51acfb80e76cf81874c",
                "md5": "1b606d120a3fca1d5ddeadf6f4357e50",
                "sha256": "86b33a4ba90507ff20e7e5f53636a90257010387c124294c1f0decbce5579bc3"
            },
            "downloads": -1,
            "filename": "ncut_pytorch-2.2.7.tar.gz",
            "has_sig": false,
            "md5_digest": "1b606d120a3fca1d5ddeadf6f4357e50",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3",
            "size": 44800,
            "upload_time": "2025-10-31T03:08:42",
            "upload_time_iso_8601": "2025-10-31T03:08:42.454925Z",
            "url": "https://files.pythonhosted.org/packages/38/93/f1f9ff6a98398916ebf758831bfddb16b549c350e51acfb80e76cf81874c/ncut_pytorch-2.2.7.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-31 03:08:42",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "huzeyann",
    "github_project": "ncut_pytorch",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "ncut-pytorch"
}
        
Elapsed time: 4.46543s