Latest commit

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

PromptCCD: Learning Gaussian Mixture Prompt Pool for Continual Category Discovery [ECCV 2024]

Fernando Julio Cendra1, Bingchen Zhao2, Kai Han1

1Visual AI Lab, The University of Hong Kong 2The University of Edinburgh

pagearXiv

In Continual Category Discovery (CCD), the model receives the labelled set at the initial stage and is tasked to discover categories from the unlabelled data in the subsequent stages. There are two major challenges in CCD:

  • Category Discovery for both known and novel categories in the unlabelled data.
  • Catastrophic forgetting, a well-known issue in continual learning.

PromptCCD proposes a simple yet effective prompting framework for Continual Category Discovery (CCD). At the core of PromptCCD lies the Gaussian Mixture Prompting (GMP) module, which acts as a dynamic pool of prompts that updates over time to facilitate representation learning and prevent forgetting during category discovery by guiding foundation model with its prompt.

Environment

The environment can be easily installed through conda and pip. After cloning this repository, run the following command:

$ conda create -n promptccd python=3.10
$ conda activate promptccd
$ pip install scipy scikit-learn seaborn tensorboard kmeans-pytorch tensorboard opencv-python tqdm pycave timm
$ conda install pytorch==2.1.2 torchvision==0.16.2 pytorch-cuda=12.1 -c pytorch -c nvidia

*After setting up the environment, it’s recommended to restart the kernel.

Data & Setup

Please refer to README-data.md for more information regarding how to prepare and structure the datasets.

Training

Please refer to README-config.md for more information regarding the model configuration.

The configuration files for training and testing can be access at config/%DATASET%/*.yaml, organized based on different training datasets, and prompt module type. For example, to train PromptCCDw/GMP where C (number of categories) is known on CIFAR100, run:

$ CUDA_VISIBLE_DEVICES=%GPU_INDEX% python main.py \
--config "config/cifar100/cifar100_promptccd_w_gmp.yaml" \
--train

The training script will generate a directory in exp/%SAVE_PATH% where %SAVE_PATH% can be specified in the "configs/%DATASET%/*.yaml" file. All necessary outputs, e.g., training ckpt, learned gmm for each stage, and experiment results, are stored inside the directory.

The file structure should be:

promptccd
├── config/
| └── %DATASET%/
: └── *.yaml (model configuration)
|
└── exp/
└── %SAVE PATH%/
├── *.yaml (copied model configurations)
├── gmm/
├── model/ (training ckpt for each stage)
├── pred_labels/ (predicted labels from unlabelled images)
├── log_Kmeans_eval_stage_%STAGE%.txt
└── log_SS-Kmeans_test_stage_%STAGE%_w_ccd_metrics.txt

Testing

To replicate our results reported in the paper, copy the relative path of the *.yaml file stored in the %SAVE_PATH%, i.e., your saved training path and run:

$ CUDA_VISIBLE_DEVICES=%GPU_INDEX% python main.py \
--config "exp/%SAVE_PATH%/*.yaml" \
--test

*To obtain the overall Average ACC results, you need to average the CCD results from all stages as indicated in your test logs. For example:

All Acc: 0.7387 | Old Acc: 0.8102 | New Acc: 0.6886 <-- stage 1
All Acc: 0.6389 | Old Acc: 0.7190 | New Acc: 0.6236 <-- stage 2
All Acc: 0.5830 | Old Acc: 0.7095 | New Acc: 0.5608 <-- stage 3

The Average ACC: All Avg. Acc: 65.35 | Old Avg. Acc: 74.62 | New Avg. Acc: 62.43

Acknowledgement

Our code is developed based on GCD and GPC repositories.

License

This project is under the CC BY-NC-SA 4.0 license. See LICENSE for details.

Citation

@inproceedings{cendra2024promptccd,
author = {Fernando Julio Cendra and Bingchen Zhao and Kai Han},
title = {PromptCCD: Learning Gaussian Mixture Prompt Pool for Continual Category Discovery},
booktitle = {European Conference on Computer Vision (ECCV)},
year = {2024}
}

About

[ECCV2024] PromptCCD: Learning Gaussian Mixture Prompt Pool for Continual Category Discovery

Resources

Stars

31 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

PromptCCD: Learning Gaussian Mixture Prompt Pool for Continual Category Discovery [ECCV 2024]

Fernando Julio Cendra1, Bingchen Zhao2, Kai Han1

1Visual AI Lab, The University of Hong Kong 2The University of Edinburgh

pagearXiv

In Continual Category Discovery (CCD), the model receives the labelled set at the initial stage and is tasked to discover categories from the unlabelled data in the subsequent stages. There are two major challenges in CCD:

  • Category Discovery for both known and novel categories in the unlabelled data.
  • Catastrophic forgetting, a well-known issue in continual learning.

PromptCCD proposes a simple yet effective prompting framework for Continual Category Discovery (CCD). At the core of PromptCCD lies the Gaussian Mixture Prompting (GMP) module, which acts as a dynamic pool of prompts that updates over time to facilitate representation learning and prevent forgetting during category discovery by guiding foundation model with its prompt.

Environment

The environment can be easily installed through conda and pip. After cloning this repository, run the following command:

$ conda create -n promptccd python=3.10
$ conda activate promptccd
$ pip install scipy scikit-learn seaborn tensorboard kmeans-pytorch tensorboard opencv-python tqdm pycave timm
$ conda install pytorch==2.1.2 torchvision==0.16.2 pytorch-cuda=12.1 -c pytorch -c nvidia

*After setting up the environment, it’s recommended to restart the kernel.

Data & Setup

Please refer to README-data.md for more information regarding how to prepare and structure the datasets.

Training

Please refer to README-config.md for more information regarding the model configuration.

The configuration files for training and testing can be access at config/%DATASET%/*.yaml, organized based on different training datasets, and prompt module type. For example, to train PromptCCDw/GMP where C (number of categories) is known on CIFAR100, run:

$ CUDA_VISIBLE_DEVICES=%GPU_INDEX% python main.py \
--config "config/cifar100/cifar100_promptccd_w_gmp.yaml" \
--train

The training script will generate a directory in exp/%SAVE_PATH% where %SAVE_PATH% can be specified in the "configs/%DATASET%/*.yaml" file. All necessary outputs, e.g., training ckpt, learned gmm for each stage, and experiment results, are stored inside the directory.

The file structure should be:

promptccd
├── config/
| └── %DATASET%/
: └── *.yaml (model configuration)
|
└── exp/
└── %SAVE PATH%/
├── *.yaml (copied model configurations)
├── gmm/
├── model/ (training ckpt for each stage)
├── pred_labels/ (predicted labels from unlabelled images)
├── log_Kmeans_eval_stage_%STAGE%.txt
└── log_SS-Kmeans_test_stage_%STAGE%_w_ccd_metrics.txt

Testing

To replicate our results reported in the paper, copy the relative path of the *.yaml file stored in the %SAVE_PATH%, i.e., your saved training path and run:

$ CUDA_VISIBLE_DEVICES=%GPU_INDEX% python main.py \
--config "exp/%SAVE_PATH%/*.yaml" \
--test

*To obtain the overall Average ACC results, you need to average the CCD results from all stages as indicated in your test logs. For example:

All Acc: 0.7387 | Old Acc: 0.8102 | New Acc: 0.6886 <-- stage 1
All Acc: 0.6389 | Old Acc: 0.7190 | New Acc: 0.6236 <-- stage 2
All Acc: 0.5830 | Old Acc: 0.7095 | New Acc: 0.5608 <-- stage 3

The Average ACC: All Avg. Acc: 65.35 | Old Avg. Acc: 74.62 | New Avg. Acc: 62.43

Acknowledgement

Our code is developed based on GCD and GPC repositories.

License

This project is under the CC BY-NC-SA 4.0 license. See LICENSE for details.

Citation

@inproceedings{cendra2024promptccd,
author = {Fernando Julio Cendra and Bingchen Zhao and Kai Han},
title = {PromptCCD: Learning Gaussian Mixture Prompt Pool for Continual Category Discovery},
booktitle = {European Conference on Computer Vision (ECCV)},
year = {2024}
}

About

[ECCV2024] PromptCCD: Learning Gaussian Mixture Prompt Pool for Continual Category Discovery

Resources

Stars

31 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

PromptCCD: Learning Gaussian Mixture Prompt Pool for Continual Category Discovery [ECCV 2024]

Fernando Julio Cendra1, Bingchen Zhao2, Kai Han1

1Visual AI Lab, The University of Hong Kong 2The University of Edinburgh

pagearXiv

In Continual Category Discovery (CCD), the model receives the labelled set at the initial stage and is tasked to discover categories from the unlabelled data in the subsequent stages. There are two major challenges in CCD:

  • Category Discovery for both known and novel categories in the unlabelled data.
  • Catastrophic forgetting, a well-known issue in continual learning.

PromptCCD proposes a simple yet effective prompting framework for Continual Category Discovery (CCD). At the core of PromptCCD lies the Gaussian Mixture Prompting (GMP) module, which acts as a dynamic pool of prompts that updates over time to facilitate representation learning and prevent forgetting during category discovery by guiding foundation model with its prompt.

Environment

The environment can be easily installed through conda and pip. After cloning this repository, run the following command:

$ conda create -n promptccd python=3.10
$ conda activate promptccd
$ pip install scipy scikit-learn seaborn tensorboard kmeans-pytorch tensorboard opencv-python tqdm pycave timm
$ conda install pytorch==2.1.2 torchvision==0.16.2 pytorch-cuda=12.1 -c pytorch -c nvidia

*After setting up the environment, it’s recommended to restart the kernel.

Data & Setup

Please refer to README-data.md for more information regarding how to prepare and structure the datasets.

Training

Please refer to README-config.md for more information regarding the model configuration.

The configuration files for training and testing can be access at config/%DATASET%/*.yaml, organized based on different training datasets, and prompt module type. For example, to train PromptCCDw/GMP where C (number of categories) is known on CIFAR100, run:

$ CUDA_VISIBLE_DEVICES=%GPU_INDEX% python main.py \
--config "config/cifar100/cifar100_promptccd_w_gmp.yaml" \
--train

The training script will generate a directory in exp/%SAVE_PATH% where %SAVE_PATH% can be specified in the "configs/%DATASET%/*.yaml" file. All necessary outputs, e.g., training ckpt, learned gmm for each stage, and experiment results, are stored inside the directory.

The file structure should be:

promptccd
├── config/
| └── %DATASET%/
: └── *.yaml (model configuration)
|
└── exp/
└── %SAVE PATH%/
├── *.yaml (copied model configurations)
├── gmm/
├── model/ (training ckpt for each stage)
├── pred_labels/ (predicted labels from unlabelled images)
├── log_Kmeans_eval_stage_%STAGE%.txt
└── log_SS-Kmeans_test_stage_%STAGE%_w_ccd_metrics.txt

Testing

To replicate our results reported in the paper, copy the relative path of the *.yaml file stored in the %SAVE_PATH%, i.e., your saved training path and run:

$ CUDA_VISIBLE_DEVICES=%GPU_INDEX% python main.py \
--config "exp/%SAVE_PATH%/*.yaml" \
--test

*To obtain the overall Average ACC results, you need to average the CCD results from all stages as indicated in your test logs. For example:

All Acc: 0.7387 | Old Acc: 0.8102 | New Acc: 0.6886 <-- stage 1
All Acc: 0.6389 | Old Acc: 0.7190 | New Acc: 0.6236 <-- stage 2
All Acc: 0.5830 | Old Acc: 0.7095 | New Acc: 0.5608 <-- stage 3

The Average ACC: All Avg. Acc: 65.35 | Old Avg. Acc: 74.62 | New Avg. Acc: 62.43

Acknowledgement

Our code is developed based on GCD and GPC repositories.

License

This project is under the CC BY-NC-SA 4.0 license. See LICENSE for details.

Citation

@inproceedings{cendra2024promptccd,
author = {Fernando Julio Cendra and Bingchen Zhao and Kai Han},
title = {PromptCCD: Learning Gaussian Mixture Prompt Pool for Continual Category Discovery},
booktitle = {European Conference on Computer Vision (ECCV)},
year = {2024}
}

About

[ECCV2024] PromptCCD: Learning Gaussian Mixture Prompt Pool for Continual Category Discovery

Resources

Stars

31 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

PromptCCD: Learning Gaussian Mixture Prompt Pool for Continual Category Discovery [ECCV 2024]

Fernando Julio Cendra1, Bingchen Zhao2, Kai Han1

1Visual AI Lab, The University of Hong Kong 2The University of Edinburgh

pagearXiv

In Continual Category Discovery (CCD), the model receives the labelled set at the initial stage and is tasked to discover categories from the unlabelled data in the subsequent stages. There are two major challenges in CCD:

  • Category Discovery for both known and novel categories in the unlabelled data.
  • Catastrophic forgetting, a well-known issue in continual learning.

PromptCCD proposes a simple yet effective prompting framework for Continual Category Discovery (CCD). At the core of PromptCCD lies the Gaussian Mixture Prompting (GMP) module, which acts as a dynamic pool of prompts that updates over time to facilitate representation learning and prevent forgetting during category discovery by guiding foundation model with its prompt.

Environment

The environment can be easily installed through conda and pip. After cloning this repository, run the following command:

$ conda create -n promptccd python=3.10
$ conda activate promptccd
$ pip install scipy scikit-learn seaborn tensorboard kmeans-pytorch tensorboard opencv-python tqdm pycave timm
$ conda install pytorch==2.1.2 torchvision==0.16.2 pytorch-cuda=12.1 -c pytorch -c nvidia

*After setting up the environment, it’s recommended to restart the kernel.

Data & Setup

Please refer to README-data.md for more information regarding how to prepare and structure the datasets.

Training

Please refer to README-config.md for more information regarding the model configuration.

The configuration files for training and testing can be access at config/%DATASET%/*.yaml, organized based on different training datasets, and prompt module type. For example, to train PromptCCDw/GMP where C (number of categories) is known on CIFAR100, run:

$ CUDA_VISIBLE_DEVICES=%GPU_INDEX% python main.py \
--config "config/cifar100/cifar100_promptccd_w_gmp.yaml" \
--train

The training script will generate a directory in exp/%SAVE_PATH% where %SAVE_PATH% can be specified in the "configs/%DATASET%/*.yaml" file. All necessary outputs, e.g., training ckpt, learned gmm for each stage, and experiment results, are stored inside the directory.

The file structure should be:

promptccd
├── config/
| └── %DATASET%/
: └── *.yaml (model configuration)
|
└── exp/
└── %SAVE PATH%/
├── *.yaml (copied model configurations)
├── gmm/
├── model/ (training ckpt for each stage)
├── pred_labels/ (predicted labels from unlabelled images)
├── log_Kmeans_eval_stage_%STAGE%.txt
└── log_SS-Kmeans_test_stage_%STAGE%_w_ccd_metrics.txt

Testing

To replicate our results reported in the paper, copy the relative path of the *.yaml file stored in the %SAVE_PATH%, i.e., your saved training path and run:

$ CUDA_VISIBLE_DEVICES=%GPU_INDEX% python main.py \
--config "exp/%SAVE_PATH%/*.yaml" \
--test

*To obtain the overall Average ACC results, you need to average the CCD results from all stages as indicated in your test logs. For example:

All Acc: 0.7387 | Old Acc: 0.8102 | New Acc: 0.6886 <-- stage 1
All Acc: 0.6389 | Old Acc: 0.7190 | New Acc: 0.6236 <-- stage 2
All Acc: 0.5830 | Old Acc: 0.7095 | New Acc: 0.5608 <-- stage 3

The Average ACC: All Avg. Acc: 65.35 | Old Avg. Acc: 74.62 | New Avg. Acc: 62.43

Acknowledgement

Our code is developed based on GCD and GPC repositories.

License

This project is under the CC BY-NC-SA 4.0 license. See LICENSE for details.

Citation

@inproceedings{cendra2024promptccd,
author = {Fernando Julio Cendra and Bingchen Zhao and Kai Han},
title = {PromptCCD: Learning Gaussian Mixture Prompt Pool for Continual Category Discovery},
booktitle = {European Conference on Computer Vision (ECCV)},
year = {2024}
}

About

[ECCV2024] PromptCCD: Learning Gaussian Mixture Prompt Pool for Continual Category Discovery

Resources

Stars

31 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

PromptCCD: Learning Gaussian Mixture Prompt Pool for Continual Category Discovery [ECCV 2024]

Fernando Julio Cendra1, Bingchen Zhao2, Kai Han1

1Visual AI Lab, The University of Hong Kong 2The University of Edinburgh

pagearXiv

In Continual Category Discovery (CCD), the model receives the labelled set at the initial stage and is tasked to discover categories from the unlabelled data in the subsequent stages. There are two major challenges in CCD:

  • Category Discovery for both known and novel categories in the unlabelled data.
  • Catastrophic forgetting, a well-known issue in continual learning.

PromptCCD proposes a simple yet effective prompting framework for Continual Category Discovery (CCD). At the core of PromptCCD lies the Gaussian Mixture Prompting (GMP) module, which acts as a dynamic pool of prompts that updates over time to facilitate representation learning and prevent forgetting during category discovery by guiding foundation model with its prompt.

Environment

The environment can be easily installed through conda and pip. After cloning this repository, run the following command:

$ conda create -n promptccd python=3.10
$ conda activate promptccd
$ pip install scipy scikit-learn seaborn tensorboard kmeans-pytorch tensorboard opencv-python tqdm pycave timm
$ conda install pytorch==2.1.2 torchvision==0.16.2 pytorch-cuda=12.1 -c pytorch -c nvidia

*After setting up the environment, it’s recommended to restart the kernel.

Data & Setup

Please refer to README-data.md for more information regarding how to prepare and structure the datasets.

Training

Please refer to README-config.md for more information regarding the model configuration.

The configuration files for training and testing can be access at config/%DATASET%/*.yaml, organized based on different training datasets, and prompt module type. For example, to train PromptCCDw/GMP where C (number of categories) is known on CIFAR100, run:

$ CUDA_VISIBLE_DEVICES=%GPU_INDEX% python main.py \
--config "config/cifar100/cifar100_promptccd_w_gmp.yaml" \
--train

The training script will generate a directory in exp/%SAVE_PATH% where %SAVE_PATH% can be specified in the "configs/%DATASET%/*.yaml" file. All necessary outputs, e.g., training ckpt, learned gmm for each stage, and experiment results, are stored inside the directory.

The file structure should be:

promptccd
├── config/
| └── %DATASET%/
: └── *.yaml (model configuration)
|
└── exp/
└── %SAVE PATH%/
├── *.yaml (copied model configurations)
├── gmm/
├── model/ (training ckpt for each stage)
├── pred_labels/ (predicted labels from unlabelled images)
├── log_Kmeans_eval_stage_%STAGE%.txt
└── log_SS-Kmeans_test_stage_%STAGE%_w_ccd_metrics.txt

Testing

To replicate our results reported in the paper, copy the relative path of the *.yaml file stored in the %SAVE_PATH%, i.e., your saved training path and run:

$ CUDA_VISIBLE_DEVICES=%GPU_INDEX% python main.py \
--config "exp/%SAVE_PATH%/*.yaml" \
--test

*To obtain the overall Average ACC results, you need to average the CCD results from all stages as indicated in your test logs. For example:

All Acc: 0.7387 | Old Acc: 0.8102 | New Acc: 0.6886 <-- stage 1
All Acc: 0.6389 | Old Acc: 0.7190 | New Acc: 0.6236 <-- stage 2
All Acc: 0.5830 | Old Acc: 0.7095 | New Acc: 0.5608 <-- stage 3

The Average ACC: All Avg. Acc: 65.35 | Old Avg. Acc: 74.62 | New Avg. Acc: 62.43

Acknowledgement

Our code is developed based on GCD and GPC repositories.

License

This project is under the CC BY-NC-SA 4.0 license. See LICENSE for details.

Citation

@inproceedings{cendra2024promptccd,
author = {Fernando Julio Cendra and Bingchen Zhao and Kai Han},
title = {PromptCCD: Learning Gaussian Mixture Prompt Pool for Continual Category Discovery},
booktitle = {European Conference on Computer Vision (ECCV)},
year = {2024}
}

About

[ECCV2024] PromptCCD: Learning Gaussian Mixture Prompt Pool for Continual Category Discovery

Resources

Stars

31 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

PromptCCD: Learning Gaussian Mixture Prompt Pool for Continual Category Discovery [ECCV 2024]

Fernando Julio Cendra1, Bingchen Zhao2, Kai Han1

1Visual AI Lab, The University of Hong Kong 2The University of Edinburgh

pagearXiv

In Continual Category Discovery (CCD), the model receives the labelled set at the initial stage and is tasked to discover categories from the unlabelled data in the subsequent stages. There are two major challenges in CCD:

  • Category Discovery for both known and novel categories in the unlabelled data.
  • Catastrophic forgetting, a well-known issue in continual learning.

PromptCCD proposes a simple yet effective prompting framework for Continual Category Discovery (CCD). At the core of PromptCCD lies the Gaussian Mixture Prompting (GMP) module, which acts as a dynamic pool of prompts that updates over time to facilitate representation learning and prevent forgetting during category discovery by guiding foundation model with its prompt.

Environment

The environment can be easily installed through conda and pip. After cloning this repository, run the following command:

$ conda create -n promptccd python=3.10
$ conda activate promptccd
$ pip install scipy scikit-learn seaborn tensorboard kmeans-pytorch tensorboard opencv-python tqdm pycave timm
$ conda install pytorch==2.1.2 torchvision==0.16.2 pytorch-cuda=12.1 -c pytorch -c nvidia

*After setting up the environment, it’s recommended to restart the kernel.

Data & Setup

Please refer to README-data.md for more information regarding how to prepare and structure the datasets.

Training

Please refer to README-config.md for more information regarding the model configuration.

The configuration files for training and testing can be access at config/%DATASET%/*.yaml, organized based on different training datasets, and prompt module type. For example, to train PromptCCDw/GMP where C (number of categories) is known on CIFAR100, run:

$ CUDA_VISIBLE_DEVICES=%GPU_INDEX% python main.py \
--config "config/cifar100/cifar100_promptccd_w_gmp.yaml" \
--train

The training script will generate a directory in exp/%SAVE_PATH% where %SAVE_PATH% can be specified in the "configs/%DATASET%/*.yaml" file. All necessary outputs, e.g., training ckpt, learned gmm for each stage, and experiment results, are stored inside the directory.

The file structure should be:

promptccd
├── config/
| └── %DATASET%/
: └── *.yaml (model configuration)
|
└── exp/
└── %SAVE PATH%/
├── *.yaml (copied model configurations)
├── gmm/
├── model/ (training ckpt for each stage)
├── pred_labels/ (predicted labels from unlabelled images)
├── log_Kmeans_eval_stage_%STAGE%.txt
└── log_SS-Kmeans_test_stage_%STAGE%_w_ccd_metrics.txt

Testing

To replicate our results reported in the paper, copy the relative path of the *.yaml file stored in the %SAVE_PATH%, i.e., your saved training path and run:

$ CUDA_VISIBLE_DEVICES=%GPU_INDEX% python main.py \
--config "exp/%SAVE_PATH%/*.yaml" \
--test

*To obtain the overall Average ACC results, you need to average the CCD results from all stages as indicated in your test logs. For example:

All Acc: 0.7387 | Old Acc: 0.8102 | New Acc: 0.6886 <-- stage 1
All Acc: 0.6389 | Old Acc: 0.7190 | New Acc: 0.6236 <-- stage 2
All Acc: 0.5830 | Old Acc: 0.7095 | New Acc: 0.5608 <-- stage 3

The Average ACC: All Avg. Acc: 65.35 | Old Avg. Acc: 74.62 | New Avg. Acc: 62.43

Acknowledgement

Our code is developed based on GCD and GPC repositories.

License

This project is under the CC BY-NC-SA 4.0 license. See LICENSE for details.

Citation

@inproceedings{cendra2024promptccd,
author = {Fernando Julio Cendra and Bingchen Zhao and Kai Han},
title = {PromptCCD: Learning Gaussian Mixture Prompt Pool for Continual Category Discovery},
booktitle = {European Conference on Computer Vision (ECCV)},
year = {2024}
}

About

[ECCV2024] PromptCCD: Learning Gaussian Mixture Prompt Pool for Continual Category Discovery

Resources

Stars

31 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

PromptCCD: Learning Gaussian Mixture Prompt Pool for Continual Category Discovery [ECCV 2024]

Fernando Julio Cendra1, Bingchen Zhao2, Kai Han1

1Visual AI Lab, The University of Hong Kong 2The University of Edinburgh

pagearXiv

In Continual Category Discovery (CCD), the model receives the labelled set at the initial stage and is tasked to discover categories from the unlabelled data in the subsequent stages. There are two major challenges in CCD:

  • Category Discovery for both known and novel categories in the unlabelled data.
  • Catastrophic forgetting, a well-known issue in continual learning.

PromptCCD proposes a simple yet effective prompting framework for Continual Category Discovery (CCD). At the core of PromptCCD lies the Gaussian Mixture Prompting (GMP) module, which acts as a dynamic pool of prompts that updates over time to facilitate representation learning and prevent forgetting during category discovery by guiding foundation model with its prompt.

Environment

The environment can be easily installed through conda and pip. After cloning this repository, run the following command:

$ conda create -n promptccd python=3.10
$ conda activate promptccd
$ pip install scipy scikit-learn seaborn tensorboard kmeans-pytorch tensorboard opencv-python tqdm pycave timm
$ conda install pytorch==2.1.2 torchvision==0.16.2 pytorch-cuda=12.1 -c pytorch -c nvidia

*After setting up the environment, it’s recommended to restart the kernel.

Data & Setup

Please refer to README-data.md for more information regarding how to prepare and structure the datasets.

Training

Please refer to README-config.md for more information regarding the model configuration.

The configuration files for training and testing can be access at config/%DATASET%/*.yaml, organized based on different training datasets, and prompt module type. For example, to train PromptCCDw/GMP where C (number of categories) is known on CIFAR100, run:

$ CUDA_VISIBLE_DEVICES=%GPU_INDEX% python main.py \
--config "config/cifar100/cifar100_promptccd_w_gmp.yaml" \
--train

The training script will generate a directory in exp/%SAVE_PATH% where %SAVE_PATH% can be specified in the "configs/%DATASET%/*.yaml" file. All necessary outputs, e.g., training ckpt, learned gmm for each stage, and experiment results, are stored inside the directory.

The file structure should be:

promptccd
├── config/
| └── %DATASET%/
: └── *.yaml (model configuration)
|
└── exp/
└── %SAVE PATH%/
├── *.yaml (copied model configurations)
├── gmm/
├── model/ (training ckpt for each stage)
├── pred_labels/ (predicted labels from unlabelled images)
├── log_Kmeans_eval_stage_%STAGE%.txt
└── log_SS-Kmeans_test_stage_%STAGE%_w_ccd_metrics.txt

Testing

To replicate our results reported in the paper, copy the relative path of the *.yaml file stored in the %SAVE_PATH%, i.e., your saved training path and run:

$ CUDA_VISIBLE_DEVICES=%GPU_INDEX% python main.py \
--config "exp/%SAVE_PATH%/*.yaml" \
--test

*To obtain the overall Average ACC results, you need to average the CCD results from all stages as indicated in your test logs. For example:

All Acc: 0.7387 | Old Acc: 0.8102 | New Acc: 0.6886 <-- stage 1
All Acc: 0.6389 | Old Acc: 0.7190 | New Acc: 0.6236 <-- stage 2
All Acc: 0.5830 | Old Acc: 0.7095 | New Acc: 0.5608 <-- stage 3

The Average ACC: All Avg. Acc: 65.35 | Old Avg. Acc: 74.62 | New Avg. Acc: 62.43

Acknowledgement

Our code is developed based on GCD and GPC repositories.

License

This project is under the CC BY-NC-SA 4.0 license. See LICENSE for details.

Citation

@inproceedings{cendra2024promptccd,
author = {Fernando Julio Cendra and Bingchen Zhao and Kai Han},
title = {PromptCCD: Learning Gaussian Mixture Prompt Pool for Continual Category Discovery},
booktitle = {European Conference on Computer Vision (ECCV)},
year = {2024}
}

About

[ECCV2024] PromptCCD: Learning Gaussian Mixture Prompt Pool for Continual Category Discovery

Resources

Stars

31 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

PromptCCD: Learning Gaussian Mixture Prompt Pool for Continual Category Discovery [ECCV 2024]

Fernando Julio Cendra1, Bingchen Zhao2, Kai Han1

1Visual AI Lab, The University of Hong Kong 2The University of Edinburgh

pagearXiv

In Continual Category Discovery (CCD), the model receives the labelled set at the initial stage and is tasked to discover categories from the unlabelled data in the subsequent stages. There are two major challenges in CCD:

  • Category Discovery for both known and novel categories in the unlabelled data.
  • Catastrophic forgetting, a well-known issue in continual learning.

PromptCCD proposes a simple yet effective prompting framework for Continual Category Discovery (CCD). At the core of PromptCCD lies the Gaussian Mixture Prompting (GMP) module, which acts as a dynamic pool of prompts that updates over time to facilitate representation learning and prevent forgetting during category discovery by guiding foundation model with its prompt.

Environment

The environment can be easily installed through conda and pip. After cloning this repository, run the following command:

$ conda create -n promptccd python=3.10
$ conda activate promptccd
$ pip install scipy scikit-learn seaborn tensorboard kmeans-pytorch tensorboard opencv-python tqdm pycave timm
$ conda install pytorch==2.1.2 torchvision==0.16.2 pytorch-cuda=12.1 -c pytorch -c nvidia

*After setting up the environment, it’s recommended to restart the kernel.

Data & Setup

Please refer to README-data.md for more information regarding how to prepare and structure the datasets.

Training

Please refer to README-config.md for more information regarding the model configuration.

The configuration files for training and testing can be access at config/%DATASET%/*.yaml, organized based on different training datasets, and prompt module type. For example, to train PromptCCDw/GMP where C (number of categories) is known on CIFAR100, run:

$ CUDA_VISIBLE_DEVICES=%GPU_INDEX% python main.py \
--config "config/cifar100/cifar100_promptccd_w_gmp.yaml" \
--train

The training script will generate a directory in exp/%SAVE_PATH% where %SAVE_PATH% can be specified in the "configs/%DATASET%/*.yaml" file. All necessary outputs, e.g., training ckpt, learned gmm for each stage, and experiment results, are stored inside the directory.

The file structure should be:

promptccd
├── config/
| └── %DATASET%/
: └── *.yaml (model configuration)
|
└── exp/
└── %SAVE PATH%/
├── *.yaml (copied model configurations)
├── gmm/
├── model/ (training ckpt for each stage)
├── pred_labels/ (predicted labels from unlabelled images)
├── log_Kmeans_eval_stage_%STAGE%.txt
└── log_SS-Kmeans_test_stage_%STAGE%_w_ccd_metrics.txt

Testing

To replicate our results reported in the paper, copy the relative path of the *.yaml file stored in the %SAVE_PATH%, i.e., your saved training path and run:

$ CUDA_VISIBLE_DEVICES=%GPU_INDEX% python main.py \
--config "exp/%SAVE_PATH%/*.yaml" \
--test

*To obtain the overall Average ACC results, you need to average the CCD results from all stages as indicated in your test logs. For example:

All Acc: 0.7387 | Old Acc: 0.8102 | New Acc: 0.6886 <-- stage 1
All Acc: 0.6389 | Old Acc: 0.7190 | New Acc: 0.6236 <-- stage 2
All Acc: 0.5830 | Old Acc: 0.7095 | New Acc: 0.5608 <-- stage 3

The Average ACC: All Avg. Acc: 65.35 | Old Avg. Acc: 74.62 | New Avg. Acc: 62.43

Acknowledgement

Our code is developed based on GCD and GPC repositories.

License

This project is under the CC BY-NC-SA 4.0 license. See LICENSE for details.

Citation

@inproceedings{cendra2024promptccd,
author = {Fernando Julio Cendra and Bingchen Zhao and Kai Han},
title = {PromptCCD: Learning Gaussian Mixture Prompt Pool for Continual Category Discovery},
booktitle = {European Conference on Computer Vision (ECCV)},
year = {2024}
}

About

[ECCV2024] PromptCCD: Learning Gaussian Mixture Prompt Pool for Continual Category Discovery

Resources

Stars

31 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages