active-vision 0.3.0__tar.gz → 0.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. active_vision-0.4.0/.github/workflows/docs.yml +44 -0
  2. active_vision-0.4.0/.github/workflows/pypi.yaml +27 -0
  3. active_vision-0.4.0/.gitignore +186 -0
  4. active_vision-0.4.0/.python-version +1 -0
  5. {active_vision-0.3.0/src/active_vision.egg-info → active_vision-0.4.0}/PKG-INFO +78 -23
  6. active_vision-0.3.0/PKG-INFO → active_vision-0.4.0/README.md +44 -37
  7. active_vision-0.4.0/assets/data_flywheel.gif +0 -0
  8. active_vision-0.4.0/assets/labeling_ui.png +0 -0
  9. active_vision-0.4.0/assets/logo.png +0 -0
  10. active_vision-0.4.0/assets/zero_shot_ui.png +0 -0
  11. active_vision-0.4.0/docs/active_learning.md +2154 -0
  12. active_vision-0.4.0/docs/active_learning.md.bak +2154 -0
  13. active_vision-0.4.0/docs/active_learning_files/active_learning_12_4.png +0 -0
  14. active_vision-0.4.0/docs/active_learning_files/active_learning_14_3.png +0 -0
  15. active_vision-0.4.0/docs/active_learning_files/active_learning_14_6.png +0 -0
  16. active_vision-0.4.0/docs/active_learning_files/active_learning_38_0.png +0 -0
  17. active_vision-0.4.0/docs/active_learning_files/active_learning_7_0.png +0 -0
  18. active_vision-0.4.0/docs/active_learning_files/image-2.png +0 -0
  19. active_vision-0.4.0/docs/overrides/main.html +11 -0
  20. active_vision-0.4.0/docs/preparing_data.md +525 -0
  21. active_vision-0.4.0/docs/preparing_data.md.bak +525 -0
  22. active_vision-0.4.0/docs/quickstart.md +2505 -0
  23. active_vision-0.4.0/docs/quickstart.md.bak +2505 -0
  24. active_vision-0.4.0/docs/quickstart_files/image-2.png +0 -0
  25. active_vision-0.4.0/docs/quickstart_files/quickstart_25_0.png +0 -0
  26. active_vision-0.4.0/docs/quickstart_files/quickstart_30_4.png +0 -0
  27. active_vision-0.4.0/docs/quickstart_files/quickstart_32_3.png +0 -0
  28. active_vision-0.4.0/docs/quickstart_files/quickstart_32_6.png +0 -0
  29. active_vision-0.4.0/docs/quickstart_files/quickstart_9_0.png +0 -0
  30. active_vision-0.4.0/docs/train.md +484 -0
  31. active_vision-0.4.0/docs/train.md.bak +484 -0
  32. active_vision-0.4.0/docs/train_files/train_3_0.png +0 -0
  33. active_vision-0.4.0/docs/train_files/train_5_3.png +0 -0
  34. active_vision-0.4.0/docs/train_files/train_5_6.png +0 -0
  35. active_vision-0.4.0/mkdocs.yml +96 -0
  36. active_vision-0.4.0/nbs/00_create_dataset.ipynb +899 -0
  37. active_vision-0.4.0/nbs/02_inference_unlabeled.ipynb +1855 -0
  38. active_vision-0.4.0/nbs/03_retrain_model.ipynb +1893 -0
  39. active_vision-0.4.0/nbs/04_relabel_loop.ipynb +2148 -0
  40. active_vision-0.4.0/nbs/05_retrain_larger.ipynb +648 -0
  41. active_vision-0.4.0/nbs/dog_food_dataset/00_eda.ipynb +940 -0
  42. active_vision-0.4.0/nbs/dog_food_dataset/01_label.ipynb +737 -0
  43. active_vision-0.4.0/nbs/dog_food_dataset/02_train.ipynb +647 -0
  44. active_vision-0.4.0/nbs/download_hf_dataset.ipynb +394 -0
  45. active_vision-0.4.0/nbs/end-to-end.ipynb +2198 -0
  46. active_vision-0.4.0/nbs/eurosat_rgb/00_eda.ipynb +1038 -0
  47. active_vision-0.4.0/nbs/eurosat_rgb/01_label.ipynb +1205 -0
  48. active_vision-0.4.0/nbs/eurosat_rgb/02_train.ipynb +665 -0
  49. active_vision-0.4.0/nbs/eurosat_rgb/03_train_all.ipynb +617 -0
  50. active_vision-0.4.0/nbs/fastai_hooks.ipynb +60892 -0
  51. active_vision-0.4.0/nbs/get_embeddings.ipynb +3924 -0
  52. active_vision-0.4.0/nbs/gradio_annotator.ipynb +333 -0
  53. active_vision-0.4.0/nbs/imagenette/active_learning.ipynb +3034 -0
  54. active_vision-0.4.0/nbs/imagenette/iterate.ipynb +1304 -0
  55. active_vision-0.4.0/nbs/imagenette/preparing_data.ipynb +764 -0
  56. active_vision-0.4.0/nbs/imagenette/quickstart.ipynb +3551 -0
  57. active_vision-0.4.0/nbs/imagenette/train.ipynb +674 -0
  58. active_vision-0.4.0/nbs/initial_sampling.ipynb +3200 -0
  59. active_vision-0.4.0/nbs/oxford_iiit_pets/00_eda.ipynb +1352 -0
  60. active_vision-0.4.0/nbs/oxford_iiit_pets/01_label.ipynb +869 -0
  61. active_vision-0.4.0/nbs/oxford_iiit_pets/02_train.ipynb +682 -0
  62. active_vision-0.4.0/nbs/oxford_iiit_pets/03_train_vit.ipynb +1208 -0
  63. active_vision-0.4.0/nbs/oxford_iiit_pets/plot_pred_conf_ranked.ipynb +401 -0
  64. active_vision-0.4.0/nbs/oxford_iiit_pets/testing.ipynb +756 -0
  65. active_vision-0.4.0/pyproject.toml +61 -0
  66. active_vision-0.4.0/src/active_vision/__init__.py +3 -0
  67. {active_vision-0.3.0 → active_vision-0.4.0}/src/active_vision/core.py +364 -74
  68. active_vision-0.4.0/uv.lock +4307 -0
  69. active_vision-0.3.0/pyproject.toml +0 -19
  70. active_vision-0.3.0/setup.cfg +0 -4
  71. active_vision-0.3.0/src/active_vision/__init__.py +0 -3
  72. active_vision-0.3.0/src/active_vision.egg-info/SOURCES.txt +0 -10
  73. active_vision-0.3.0/src/active_vision.egg-info/dependency_links.txt +0 -1
  74. active_vision-0.3.0/src/active_vision.egg-info/requires.txt +0 -11
  75. active_vision-0.3.0/src/active_vision.egg-info/top_level.txt +0 -1
  76. {active_vision-0.3.0 → active_vision-0.4.0}/LICENSE +0 -0
  77. /active_vision-0.3.0/README.md → /active_vision-0.4.0/docs/index.md +0 -0
@@ -0,0 +1,44 @@
1
+ name: docs
2
+ on:
3
+ push:
4
+ branches:
5
+ - main
6
+ jobs:
7
+ deploy:
8
+ runs-on: ubuntu-latest
9
+ steps:
10
+ - uses: actions/checkout@v4
11
+ with:
12
+ fetch-depth: 0
13
+ - uses: actions/setup-python@v5
14
+ with:
15
+ python-version: "3.12"
16
+
17
+ - name: Install dependencies
18
+ run: |
19
+ python -m pip install --upgrade pip
20
+ pip install --no-deps ".[docs]"
21
+ pip install jupyter ipykernel livereload nbconvert nbformat sphinx watchdog mkdocs \
22
+ mkdocs-git-revision-date-plugin mkdocs-git-revision-date-localized-plugin \
23
+ "mkdocs-jupyter>=0.24.0" "mkdocs-material>=9.1.3" mkdocs-pdf-export-plugin \
24
+ mkdocstrings mkdocstrings-crystal mkdocstrings-python-legacy pygments \
25
+ pymdown-extensions mkdocs-mermaid2-plugin ansi2html
26
+
27
+ - name: Generate docs
28
+ run: |
29
+ cp README.md docs/index.md
30
+
31
+ jupyter nbconvert nbs/imagenette/quickstart.ipynb --to markdown --output-dir docs/
32
+ sed -i 's/\x1b\[[0-9;]*m//g' docs/quickstart.md
33
+
34
+ jupyter nbconvert nbs/imagenette/preparing_data.ipynb --to markdown --output-dir docs/
35
+ sed -i 's/\x1b\[[0-9;]*m//g' docs/preparing_data.md
36
+
37
+ jupyter nbconvert nbs/imagenette/active_learning.ipynb --to markdown --output-dir docs/
38
+ sed -i 's/\x1b\[[0-9;]*m//g' docs/active_learning.md
39
+
40
+ jupyter nbconvert nbs/imagenette/train.ipynb --to markdown --output-dir docs/
41
+ sed -i 's/\x1b\[[0-9;]*m//g' docs/train.md
42
+
43
+ - name: Deploy
44
+ run: mkdocs gh-deploy --force
@@ -0,0 +1,27 @@
1
+ name: pypi
2
+
3
+ on:
4
+ release:
5
+ types: [created]
6
+
7
+ jobs:
8
+ deploy:
9
+ runs-on: ubuntu-latest
10
+
11
+ steps:
12
+ - uses: actions/checkout@v4
13
+ - name: Set up Python
14
+ uses: actions/setup-python@v5
15
+ with:
16
+ python-version: "3.x"
17
+ - name: Install dependencies
18
+ run: |
19
+ python -m pip install --upgrade pip
20
+ pip install setuptools wheel twine build
21
+ - name: Build and publish
22
+ env:
23
+ TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }}
24
+ TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
25
+ run: |
26
+ python -m build
27
+ twine upload dist/*
@@ -0,0 +1,186 @@
1
+ # models
2
+ models/
3
+ *.pkl
4
+ *.pth
5
+ *.pkl
6
+
7
+ # Data
8
+ data/
9
+ *.parquet
10
+ *.csv
11
+
12
+ private/
13
+
14
+ .DS_Store
15
+
16
+ # Byte-compiled / optimized / DLL files
17
+ __pycache__/
18
+ *.py[cod]
19
+ *$py.class
20
+
21
+ # C extensions
22
+ *.so
23
+
24
+ # Distribution / packaging
25
+ .Python
26
+ build/
27
+ develop-eggs/
28
+ dist/
29
+ downloads/
30
+ eggs/
31
+ .eggs/
32
+ lib/
33
+ lib64/
34
+ parts/
35
+ sdist/
36
+ var/
37
+ wheels/
38
+ share/python-wheels/
39
+ *.egg-info/
40
+ .installed.cfg
41
+ *.egg
42
+ MANIFEST
43
+
44
+ # PyInstaller
45
+ # Usually these files are written by a python script from a template
46
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
47
+ *.manifest
48
+ *.spec
49
+
50
+ # Installer logs
51
+ pip-log.txt
52
+ pip-delete-this-directory.txt
53
+
54
+ # Unit test / coverage reports
55
+ htmlcov/
56
+ .tox/
57
+ .nox/
58
+ .coverage
59
+ .coverage.*
60
+ .cache
61
+ nosetests.xml
62
+ coverage.xml
63
+ *.cover
64
+ *.py,cover
65
+ .hypothesis/
66
+ .pytest_cache/
67
+ cover/
68
+
69
+ # Translations
70
+ *.mo
71
+ *.pot
72
+
73
+ # Django stuff:
74
+ *.log
75
+ local_settings.py
76
+ db.sqlite3
77
+ db.sqlite3-journal
78
+
79
+ # Flask stuff:
80
+ instance/
81
+ .webassets-cache
82
+
83
+ # Scrapy stuff:
84
+ .scrapy
85
+
86
+ # Sphinx documentation
87
+ docs/_build/
88
+
89
+ # PyBuilder
90
+ .pybuilder/
91
+ target/
92
+
93
+ # Jupyter Notebook
94
+ .ipynb_checkpoints
95
+
96
+ # IPython
97
+ profile_default/
98
+ ipython_config.py
99
+
100
+ # pyenv
101
+ # For a library or package, you might want to ignore these files since the code is
102
+ # intended to run in multiple environments; otherwise, check them in:
103
+ # .python-version
104
+
105
+ # pipenv
106
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
107
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
108
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
109
+ # install all needed dependencies.
110
+ #Pipfile.lock
111
+
112
+ # UV
113
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
114
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
115
+ # commonly ignored for libraries.
116
+ #uv.lock
117
+
118
+ # poetry
119
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
120
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
121
+ # commonly ignored for libraries.
122
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
123
+ #poetry.lock
124
+
125
+ # pdm
126
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
127
+ #pdm.lock
128
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
129
+ # in version control.
130
+ # https://pdm.fming.dev/latest/usage/project/#working-with-version-control
131
+ .pdm.toml
132
+ .pdm-python
133
+ .pdm-build/
134
+
135
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
136
+ __pypackages__/
137
+
138
+ # Celery stuff
139
+ celerybeat-schedule
140
+ celerybeat.pid
141
+
142
+ # SageMath parsed files
143
+ *.sage.py
144
+
145
+ # Environments
146
+ .env
147
+ .venv
148
+ env/
149
+ venv/
150
+ ENV/
151
+ env.bak/
152
+ venv.bak/
153
+
154
+ # Spyder project settings
155
+ .spyderproject
156
+ .spyproject
157
+
158
+ # Rope project settings
159
+ .ropeproject
160
+
161
+ # mkdocs documentation
162
+ /site
163
+
164
+ # mypy
165
+ .mypy_cache/
166
+ .dmypy.json
167
+ dmypy.json
168
+
169
+ # Pyre type checker
170
+ .pyre/
171
+
172
+ # pytype static type analyzer
173
+ .pytype/
174
+
175
+ # Cython debug symbols
176
+ cython_debug/
177
+
178
+ # PyCharm
179
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
180
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
181
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
182
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
183
+ #.idea/
184
+
185
+ # PyPI configuration file
186
+ .pypirc
@@ -0,0 +1 @@
1
+ 3.12
@@ -1,10 +1,11 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: active-vision
3
- Version: 0.3.0
3
+ Version: 0.4.0
4
4
  Summary: Active learning for computer vision.
5
- Requires-Python: >=3.10
6
- Description-Content-Type: text/markdown
5
+ Project-URL: Homepage, https://github.com/dnth/active-vision
6
+ Project-URL: Bug Tracker, https://github.com/dnth/active-vision/issues
7
7
  License-File: LICENSE
8
+ Requires-Python: >=3.10
8
9
  Requires-Dist: accelerate>=1.2.1
9
10
  Requires-Dist: datasets>=3.2.0
10
11
  Requires-Dist: fastai>=2.7.18
@@ -15,15 +16,59 @@ Requires-Dist: loguru>=0.7.3
15
16
  Requires-Dist: seaborn>=0.13.2
16
17
  Requires-Dist: timm>=1.0.13
17
18
  Requires-Dist: transformers>=4.48.0
18
- Requires-Dist: xinfer>=0.3.2
19
+ Provides-Extra: dev
20
+ Requires-Dist: black>=22.0; extra == 'dev'
21
+ Requires-Dist: flake8>=4.0; extra == 'dev'
22
+ Requires-Dist: isort>=5.0; extra == 'dev'
23
+ Requires-Dist: pytest>=7.0; extra == 'dev'
24
+ Provides-Extra: docs
25
+ Requires-Dist: ansi2html; extra == 'docs'
26
+ Requires-Dist: ipykernel; extra == 'docs'
27
+ Requires-Dist: jupyter; extra == 'docs'
28
+ Requires-Dist: livereload; extra == 'docs'
29
+ Requires-Dist: mkdocs; extra == 'docs'
30
+ Requires-Dist: mkdocs-git-revision-date-localized-plugin; extra == 'docs'
31
+ Requires-Dist: mkdocs-git-revision-date-plugin; extra == 'docs'
32
+ Requires-Dist: mkdocs-jupyter>=0.24.0; extra == 'docs'
33
+ Requires-Dist: mkdocs-material>=9.1.3; extra == 'docs'
34
+ Requires-Dist: mkdocs-mermaid2-plugin; extra == 'docs'
35
+ Requires-Dist: mkdocs-pdf-export-plugin; extra == 'docs'
36
+ Requires-Dist: mkdocstrings; extra == 'docs'
37
+ Requires-Dist: mkdocstrings-crystal; extra == 'docs'
38
+ Requires-Dist: mkdocstrings-python-legacy; extra == 'docs'
39
+ Requires-Dist: nbconvert; extra == 'docs'
40
+ Requires-Dist: nbformat; extra == 'docs'
41
+ Requires-Dist: pygments; extra == 'docs'
42
+ Requires-Dist: pymdown-extensions; extra == 'docs'
43
+ Requires-Dist: sphinx; extra == 'docs'
44
+ Requires-Dist: watchdog; extra == 'docs'
45
+ Provides-Extra: zero-shot
46
+ Requires-Dist: x-infer>=0.3.2; extra == 'zero-shot'
47
+ Description-Content-Type: text/markdown
19
48
 
20
49
  [![Python Version](https://img.shields.io/badge/python-3.10%2B-blue?style=for-the-badge&logo=python&logoColor=white)](https://pypi.org/project/active-vision/)
21
50
  [![PyPI](https://img.shields.io/pypi/v/active-vision?style=for-the-badge&logo=pypi&logoColor=white)](https://pypi.org/project/active-vision/)
22
51
  [![Downloads](https://img.shields.io/pepy/dt/active-vision?style=for-the-badge&logo=pypi&logoColor=white&label=Downloads&color=purple)](https://pypi.org/project/active-vision/)
23
52
  [![License](https://img.shields.io/badge/License-Apache%202.0-green.svg?style=for-the-badge&logo=apache&logoColor=white)](https://github.com/dnth/active-vision/blob/main/LICENSE)
24
53
 
54
+ [colab_badge]: https://img.shields.io/badge/Open%20In-Colab-blue?style=for-the-badge&logo=google-colab
55
+ [kaggle_badge]: https://img.shields.io/badge/Open%20In-Kaggle-blue?style=for-the-badge&logo=kaggle
56
+
25
57
  <p align="center">
26
58
  <img src="https://raw.githubusercontent.com/dnth/active-vision/main/assets/logo.png" alt="active-vision">
59
+ <br />
60
+ <br />
61
+ <a href="https://dnth.github.io/active-vision" target="_blank" rel="noopener noreferrer"><strong>Explore the docs »</strong></a>
62
+ <br />
63
+ <a href="#️-quickstart" target="_blank" rel="noopener noreferrer">Quickstart</a>
64
+ ·
65
+ <a href="https://github.com/dnth/active-vision/issues/new?assignees=&labels=Feature+Request&projects=&template=feature_request.md" target="_blank" rel="noopener noreferrer">Feature Request</a>
66
+ ·
67
+ <a href="https://github.com/dnth/active-vision/issues/new?assignees=&labels=bug&projects=&template=bug_report.md" target="_blank" rel="noopener noreferrer">Report Bug</a>
68
+ ·
69
+ <a href="https://github.com/dnth/active-vision/discussions" target="_blank" rel="noopener noreferrer">Discussions</a>
70
+ ·
71
+ <a href="https://dicksonneoh.com/" target="_blank" rel="noopener noreferrer">About</a>
27
72
  </p>
28
73
 
29
74
  The goal of this project is to create a framework for the active learning loop for computer vision. The diagram below shows a general workflow of how the active learning loop works.
@@ -89,41 +134,51 @@ pip install -e .
89
134
  > uv pip install active-vision
90
135
  > ```
91
136
 
92
- ## 🛠️ Usage
93
- See the [notebook](./nbs/04_relabel_loop.ipynb) for a complete example.
94
-
95
- Be sure to prepared 3 subsets of the dataset:
96
- - [Initial samples](./nbs/initial_samples.parquet): A dataframe of a labeled images to train an initial model. If you don't have any labeled data, you can label some images yourself.
97
- - [Unlabeled samples](./nbs/unlabeled_samples.parquet): A dataframe of *unlabeled* images. We will continuously sample from this set using active learning strategies.
98
- - [Evaluation samples](./nbs/evaluation_samples.parquet): A dataframe of *labeled* images. We will use this set to evaluate the performance of the model. This is the test set, DO NOT use it for active learning. Split this out in the beginning.
137
+ ## 🚀 Quickstart
99
138
 
100
- As a toy example I created the above 3 datasets from the imagenette dataset.
139
+ [![Open In Colab][colab_badge]](https://colab.research.google.com/github/dnth/active-vision/blob/main/nbs/imagenette/quickstart.ipynb)
140
+ [![Open In Kaggle][kaggle_badge]](https://kaggle.com/kernels/welcome?src=https://github.com/dnth/active-vision/blob/main/nbs/imagenette/quickstart.ipynb)
101
141
 
102
142
  ```python
103
143
  from active_vision import ActiveLearner
104
- import pandas as pd
105
144
 
106
- # Create an active learner instance with a model
107
- al = ActiveLearner("resnet18")
145
+ # Create an active learner instance
146
+ al = ActiveLearner(name="cycle-1")
147
+
148
+ # Load model
149
+ al.load_model(model="resnet18", pretrained=True)
108
150
 
109
151
  # Load dataset
110
152
  train_df = pd.read_parquet("training_samples.parquet")
111
- al.load_dataset(df, filepath_col="filepath", label_col="label")
153
+ al.load_dataset(train_df, filepath_col="filepath", label_col="label", batch_size=8)
112
154
 
113
155
  # Train model
114
- al.train(epochs=3, lr=1e-3)
156
+ al.train(epochs=10, lr=5e-3, head_tuning_epochs=3)
115
157
 
116
158
  # Evaluate the model on a *labeled* evaluation set
117
159
  accuracy = al.evaluate(eval_df, filepath_col="filepath", label_col="label")
118
160
 
161
+ # Get summary of the active learning cycle
162
+ al.summary()
163
+
119
164
  # Get predictions from an *unlabeled* set
120
165
  pred_df = al.predict(filepaths)
121
166
 
122
- # Sample low confidence predictions from unlabeled set
123
- uncertain_df = al.sample_uncertain(pred_df, num_samples=10)
167
+ # Sample images using a combination of active learning strategies
168
+ samples = al.sample_combination(
169
+ pred_df,
170
+ num_samples=50,
171
+ combination={
172
+ "least-confidence": 0.4,
173
+ "ratio-of-confidence": 0.2,
174
+ "entropy": 0.2,
175
+ "model-based-outlier": 0.1,
176
+ "random": 0.1,
177
+ },
178
+ )
124
179
 
125
180
  # Launch a Gradio UI to label the low confidence samples, save the labeled samples to a file
126
- al.label(uncertain_df, output_filename="uncertain")
181
+ al.label(samples, output_filename="combination.parquet")
127
182
  ```
128
183
 
129
184
  ![Gradio UI](https://raw.githubusercontent.com/dnth/active-vision/main/assets/labeling_ui.png)
@@ -136,8 +191,8 @@ Once complete, the labeled samples will be save into a new df.
136
191
  We can now add the newly labeled data to the training set.
137
192
 
138
193
  ```python
139
- # Add newly labeled data to training set and save as a new file active_labeled
140
- al.add_to_train_set(labeled_df, output_filename="active_labeled")
194
+ # Add newly labeled data to the dataset
195
+ al.add_to_dataset(labeled_df, output_filename="active_labeled.parquet")
141
196
  ```
142
197
 
143
198
  Repeat the process until the model is good enough. Use the dataset to train a larger model and deploy.
@@ -1,29 +1,26 @@
1
- Metadata-Version: 2.2
2
- Name: active-vision
3
- Version: 0.3.0
4
- Summary: Active learning for computer vision.
5
- Requires-Python: >=3.10
6
- Description-Content-Type: text/markdown
7
- License-File: LICENSE
8
- Requires-Dist: accelerate>=1.2.1
9
- Requires-Dist: datasets>=3.2.0
10
- Requires-Dist: fastai>=2.7.18
11
- Requires-Dist: gradio>=5.12.0
12
- Requires-Dist: ipykernel>=6.29.5
13
- Requires-Dist: ipywidgets>=8.1.5
14
- Requires-Dist: loguru>=0.7.3
15
- Requires-Dist: seaborn>=0.13.2
16
- Requires-Dist: timm>=1.0.13
17
- Requires-Dist: transformers>=4.48.0
18
- Requires-Dist: xinfer>=0.3.2
19
-
20
1
  [![Python Version](https://img.shields.io/badge/python-3.10%2B-blue?style=for-the-badge&logo=python&logoColor=white)](https://pypi.org/project/active-vision/)
21
2
  [![PyPI](https://img.shields.io/pypi/v/active-vision?style=for-the-badge&logo=pypi&logoColor=white)](https://pypi.org/project/active-vision/)
22
3
  [![Downloads](https://img.shields.io/pepy/dt/active-vision?style=for-the-badge&logo=pypi&logoColor=white&label=Downloads&color=purple)](https://pypi.org/project/active-vision/)
23
4
  [![License](https://img.shields.io/badge/License-Apache%202.0-green.svg?style=for-the-badge&logo=apache&logoColor=white)](https://github.com/dnth/active-vision/blob/main/LICENSE)
24
5
 
6
+ [colab_badge]: https://img.shields.io/badge/Open%20In-Colab-blue?style=for-the-badge&logo=google-colab
7
+ [kaggle_badge]: https://img.shields.io/badge/Open%20In-Kaggle-blue?style=for-the-badge&logo=kaggle
8
+
25
9
  <p align="center">
26
10
  <img src="https://raw.githubusercontent.com/dnth/active-vision/main/assets/logo.png" alt="active-vision">
11
+ <br />
12
+ <br />
13
+ <a href="https://dnth.github.io/active-vision" target="_blank" rel="noopener noreferrer"><strong>Explore the docs »</strong></a>
14
+ <br />
15
+ <a href="#️-quickstart" target="_blank" rel="noopener noreferrer">Quickstart</a>
16
+ ·
17
+ <a href="https://github.com/dnth/active-vision/issues/new?assignees=&labels=Feature+Request&projects=&template=feature_request.md" target="_blank" rel="noopener noreferrer">Feature Request</a>
18
+ ·
19
+ <a href="https://github.com/dnth/active-vision/issues/new?assignees=&labels=bug&projects=&template=bug_report.md" target="_blank" rel="noopener noreferrer">Report Bug</a>
20
+ ·
21
+ <a href="https://github.com/dnth/active-vision/discussions" target="_blank" rel="noopener noreferrer">Discussions</a>
22
+ ·
23
+ <a href="https://dicksonneoh.com/" target="_blank" rel="noopener noreferrer">About</a>
27
24
  </p>
28
25
 
29
26
  The goal of this project is to create a framework for the active learning loop for computer vision. The diagram below shows a general workflow of how the active learning loop works.
@@ -89,41 +86,51 @@ pip install -e .
89
86
  > uv pip install active-vision
90
87
  > ```
91
88
 
92
- ## 🛠️ Usage
93
- See the [notebook](./nbs/04_relabel_loop.ipynb) for a complete example.
94
-
95
- Be sure to prepared 3 subsets of the dataset:
96
- - [Initial samples](./nbs/initial_samples.parquet): A dataframe of a labeled images to train an initial model. If you don't have any labeled data, you can label some images yourself.
97
- - [Unlabeled samples](./nbs/unlabeled_samples.parquet): A dataframe of *unlabeled* images. We will continuously sample from this set using active learning strategies.
98
- - [Evaluation samples](./nbs/evaluation_samples.parquet): A dataframe of *labeled* images. We will use this set to evaluate the performance of the model. This is the test set, DO NOT use it for active learning. Split this out in the beginning.
89
+ ## 🚀 Quickstart
99
90
 
100
- As a toy example I created the above 3 datasets from the imagenette dataset.
91
+ [![Open In Colab][colab_badge]](https://colab.research.google.com/github/dnth/active-vision/blob/main/nbs/imagenette/quickstart.ipynb)
92
+ [![Open In Kaggle][kaggle_badge]](https://kaggle.com/kernels/welcome?src=https://github.com/dnth/active-vision/blob/main/nbs/imagenette/quickstart.ipynb)
101
93
 
102
94
  ```python
103
95
  from active_vision import ActiveLearner
104
- import pandas as pd
105
96
 
106
- # Create an active learner instance with a model
107
- al = ActiveLearner("resnet18")
97
+ # Create an active learner instance
98
+ al = ActiveLearner(name="cycle-1")
99
+
100
+ # Load model
101
+ al.load_model(model="resnet18", pretrained=True)
108
102
 
109
103
  # Load dataset
110
104
  train_df = pd.read_parquet("training_samples.parquet")
111
- al.load_dataset(df, filepath_col="filepath", label_col="label")
105
+ al.load_dataset(train_df, filepath_col="filepath", label_col="label", batch_size=8)
112
106
 
113
107
  # Train model
114
- al.train(epochs=3, lr=1e-3)
108
+ al.train(epochs=10, lr=5e-3, head_tuning_epochs=3)
115
109
 
116
110
  # Evaluate the model on a *labeled* evaluation set
117
111
  accuracy = al.evaluate(eval_df, filepath_col="filepath", label_col="label")
118
112
 
113
+ # Get summary of the active learning cycle
114
+ al.summary()
115
+
119
116
  # Get predictions from an *unlabeled* set
120
117
  pred_df = al.predict(filepaths)
121
118
 
122
- # Sample low confidence predictions from unlabeled set
123
- uncertain_df = al.sample_uncertain(pred_df, num_samples=10)
119
+ # Sample images using a combination of active learning strategies
120
+ samples = al.sample_combination(
121
+ pred_df,
122
+ num_samples=50,
123
+ combination={
124
+ "least-confidence": 0.4,
125
+ "ratio-of-confidence": 0.2,
126
+ "entropy": 0.2,
127
+ "model-based-outlier": 0.1,
128
+ "random": 0.1,
129
+ },
130
+ )
124
131
 
125
132
  # Launch a Gradio UI to label the low confidence samples, save the labeled samples to a file
126
- al.label(uncertain_df, output_filename="uncertain")
133
+ al.label(samples, output_filename="combination.parquet")
127
134
  ```
128
135
 
129
136
  ![Gradio UI](https://raw.githubusercontent.com/dnth/active-vision/main/assets/labeling_ui.png)
@@ -136,8 +143,8 @@ Once complete, the labeled samples will be save into a new df.
136
143
  We can now add the newly labeled data to the training set.
137
144
 
138
145
  ```python
139
- # Add newly labeled data to training set and save as a new file active_labeled
140
- al.add_to_train_set(labeled_df, output_filename="active_labeled")
146
+ # Add newly labeled data to the dataset
147
+ al.add_to_dataset(labeled_df, output_filename="active_labeled.parquet")
141
148
  ```
142
149
 
143
150
  Repeat the process until the model is good enough. Use the dataset to train a larger model and deploy.
Binary file