Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

All sampled images in image list #88

Merged
merged 22 commits into from
Sep 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
016eb26
feat: show all images in list
PaulHax Jul 31, 2024
f1e4126
feat(embeddings): selection of points filters list
PaulHax Aug 2, 2024
e270bf3
refactor(object_detector): remove images_manager dependency
PaulHax Aug 5, 2024
fcf285f
refactor: move image modules into images folder
PaulHax Aug 5, 2024
ae799ea
refactor: use BufferCache for images
PaulHax Aug 5, 2024
1ea5b3e
refactor: use BufferCache for annotations
PaulHax Aug 6, 2024
0d069b8
refactor: clean dead code
PaulHax Aug 6, 2024
b0cdc75
fix(embeddings): add transformed img point as computed
PaulHax Aug 6, 2024
db06424
chore(ci): run tests without depending on linters
PaulHax Aug 6, 2024
43fb47b
fix(image_list): respect client side sorting and filtering
PaulHax Aug 6, 2024
e134291
fix(ScatterPlot): correct is_transformed in hover
PaulHax Aug 6, 2024
212b3e1
fix(image_list): paginate grid view
PaulHax Aug 7, 2024
cd40813
perf(object_detector): reuse last successful batch size
PaulHax Aug 7, 2024
ff39067
refactor: remove images_manager
PaulHax Aug 21, 2024
c6714bf
fix: flush transformed images to state before detection
PaulHax Aug 21, 2024
da6ed4b
fix(images): actually call on_clear callback in BufferCache
PaulHax Aug 29, 2024
eca1556
Merge branch 'main' into all-images
PaulHax Aug 30, 2024
71759f5
feat(image_list): hide dependant columns when transforms disabled
PaulHax Aug 30, 2024
30b700f
refactor(images): use lru_cache for image functions
PaulHax Sep 3, 2024
220a07e
refactor(ScatterPlot): rename props to use points
PaulHax Sep 4, 2024
f2ee488
refactor: reorder images.py and doc object_detector
PaulHax Sep 4, 2024
d3bd004
refactor(annotations): move logic from images.py
PaulHax Sep 5, 2024
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
3 changes: 0 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,6 @@ jobs:
run: npm run eslint

unit_tests:
needs:
- linters_python
- linters_vue
runs-on: ubuntu-latest
name: ubuntu-latest-tests-python${{ matrix.python-version}}
strategy:
Expand Down
65 changes: 22 additions & 43 deletions src/nrtk_explorer/app/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

from trame.widgets import html
from trame_server.utils.namespace import Translator
from nrtk_explorer.library import images_manager
from nrtk_explorer.library.filtering import FilterProtocol
from nrtk_explorer.library.dataset import get_dataset, get_image_fpath

Expand Down Expand Up @@ -56,9 +55,6 @@ def __init__(self, server=None):

self.ctrl.get_image_fpath = lambda i: get_image_fpath(i, self.state.current_dataset)

self.context["image_objects"] = {}
self.context["images_manager"] = images_manager.ImagesManager()

self.state.collapse_dataset = False
self.state.collapse_embeddings = False
self.state.collapse_filter = False
Expand All @@ -71,22 +67,10 @@ def __init__(self, server=None):
self.state.vertical_split = VERTICAL_SPLIT_DEFAULT_VALUE
self.state.client_only("horizontal_split", "vertical_split")

transforms_translator = Translator()
transforms_translator.add_translation(
"feature_extraction_model", "current_transforms_model"
)

self._transforms_app = TransformsApp(
server=self.server.create_child_server(translator=transforms_translator)
)

embeddings_translator = Translator()
embeddings_translator.add_translation(
"feature_extraction_model", "current_embeddings_model"
)
self._transforms_app = TransformsApp(server=self.server.create_child_server())

self._embeddings_app = EmbeddingsApp(
server=self.server.create_child_server(translator=embeddings_translator),
server=self.server.create_child_server(),
)

filtering_translator = Translator()
Expand All @@ -95,7 +79,6 @@ def __init__(self, server=None):
server=self.server.create_child_server(translator=filtering_translator),
)

self._embeddings_app.set_on_select(self._transforms_app.set_selected_dataset_ids)
self._transforms_app.set_on_transform(self._embeddings_app.on_run_transformations)
self._embeddings_app.set_on_hover(self._transforms_app.on_image_hovered)
self._transforms_app.set_on_hover(self._embeddings_app.on_image_hovered)
Expand All @@ -112,7 +95,13 @@ def __init__(self, server=None):
self.state.num_images_disabled = True
self.state.random_sampling = False
self.state.random_sampling_disabled = True
self.state.images_id = []
self.state.dataset_ids = []
self.state.hovered_id = None

def clear_hovered(**kwargs):
self.state.hovered_id = None

self.state.change("dataset_ids")(clear_hovered)

self._build_ui()

Expand All @@ -126,27 +115,32 @@ def on_server_ready(self, *args, **kwargs):

def on_dataset_change(self, **kwargs):
# Reset cache
self.context.images_manager = images_manager.ImagesManager()
self.context.dataset = get_dataset(self.state.current_dataset, force_reload=True)
self.state.num_images_max = len(self.context.dataset.imgs)
self.state.random_sampling_disabled = False
self.state.num_images_disabled = False
self.state.dataset_ids = []

categories = {}
for category in self.context.dataset.cats.values():
categories[category["id"]] = category
self.state.annotation_categories = categories

self.reload_images()

def on_filter_apply(self, filter: FilterProtocol[Iterable[int]], **kwargs):
selected_indices = []
for index, image_id in enumerate(self.state.images_ids):
selected_ids = []
for dataset_id in self.state.dataset_ids:
image_annotations_categories = [
annotation["category_id"]
for annotation in self.context.dataset.anns.values()
if annotation["image_id"] == image_id
if annotation["image_id"] == int(dataset_id)
]
include = filter.evaluate(image_annotations_categories)
if include:
selected_indices.append(index)
selected_ids.append(dataset_id)

self._embeddings_app.on_select(selected_indices)
self._embeddings_app.on_select(selected_ids)

def on_num_images_change(self, **kwargs):
self.reload_images()
Expand All @@ -155,33 +149,18 @@ def on_random_sampling_change(self, **kwargs):
self.reload_images()

def reload_images(self):
categories = {}
for category in self.context.dataset.cats.values():
categories[category["id"]] = category

images = list(self.context.dataset.imgs.values())

selected_images = []
if self.state.num_images:
if self.state.random_sampling:
selected_images = random.sample(images, self.state.num_images)
selected_images = random.sample(images, min(len(images), self.state.num_images))
else:
selected_images = images[: self.state.num_images]
else:
selected_images = images

paths = list()
for image in selected_images:
paths.append(
os.path.join(
os.path.dirname(self.state.current_dataset),
image["file_name"],
)
)

self.context.paths = paths
self.state.annotation_categories = categories
self.state.images_ids = [img["id"] for img in selected_images]
self.state.dataset_ids = [str(img["id"]) for img in selected_images]

def _build_ui(self):
extra_args = {}
Expand Down
Loading
Loading