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

Release notes v1.0.0 #4839

Merged
merged 6 commits into from
Sep 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
8 changes: 2 additions & 6 deletions docs/scripts/make_model_zoo_docs.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,13 +90,9 @@
import fiftyone.zoo as foz
{% if 'segment-anything' in name and 'video' in name %}
from fiftyone import ViewField as F
{% endif %}

{% if 'med-sam' in name %}
{% elif 'med-sam' in name %}
from fiftyone import ViewField as F
from fiftyone.utils.huggingface import load_from_hub

dataset = load_from_hub("Voxel51/BTCV-CT-as-video-MedSAM2-dataset")[:2]
{% endif %}

{% if 'imagenet' in name %}
Expand All @@ -117,6 +113,7 @@
.save()
)
{% elif 'med-sam' in name %}
dataset = load_from_hub("Voxel51/BTCV-CT-as-video-MedSAM2-dataset")[:2]

# Retaining detections from a single frame in the middle
# Note that SAM2 only propagates segmentation masks forward in a video
Expand All @@ -126,7 +123,6 @@
.set_field("frames.gt_detections", None)
.save()
)

{% else %}
dataset = foz.load_zoo_dataset(
"coco-2017",
Expand Down
10 changes: 7 additions & 3 deletions docs/source/deprecation.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,23 @@ FiftyOne Deprecation Notices

.. default-role:: code

.. _deprecation-fiftyone-desktop:

FiftyOne Desktop
----------------
*Support ended with 0.25.0*
*Support ended with FiftyOne 0.25.0*

A compatible `fiftyone-desktop https://pypi.org/project/fiftyone-desktop/`_
A compatible `fiftyone-desktop <https://pypi.org/project/fiftyone-desktop>`_
package is no longer available as of `fiftyone==0.25.0`.

Chromium-based browsers, Firefox, or a :ref:`notebook <notebooks>` environment
are recommended for the best FiftyOne experience.

.. _deprecation-python-3.8:

Python 3.8
----------
*Support Ended October 2024*
*Support ended October 1, 2024*

`Python 3.8 <https://devguide.python.org/versions/>`_
transitions to `end-of-life` effective October of 2024. FiftyOne releases after
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions docs/source/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,11 @@ learn how:
:image_src: https://voxel51.com/images/integrations/v7-128.png
:image_title: V7

.. customimagelink::
:image_link: https://github.com/segments-ai/segments-voxel51-plugin
:image_src: https://voxel51.com/images/integrations/segments-128.png
:image_title: Segments

.. customimagelink::
:image_link: integrations/labelbox.html
:image_src: https://voxel51.com/images/integrations/labelbox-128.png
Expand Down
36 changes: 26 additions & 10 deletions docs/source/plugins/developing_plugins.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1774,12 +1774,11 @@ in the App.
Panels can be defined in either Python or JS, and FiftyOne comes with a
number of :ref:`builtin panels <plugins-design-panels>` for common tasks.

Depending on the ``surfaces`` panel config, panels can be scoped to either
the grid or the modal. You can open these panels from the "+" menu, which
is available in both the grid and modal views. Whereas grid panels enable
extensibility at the macro level, allowing you to work with entire datasets,
modal panels provide extensibility at the micro level, focusing on individual
samples and scenarios.
Panels can be scoped to the App's grid view or modal view via their
:ref:`config <panel-config>`. Grid panels enable extensibility at the macro
level, allowing you to work with entire datasets or views, while modal panels
provide extensibility at the micro level, focusing on individual samples and
scenarios.

Panels, like :ref:`operators <developing-operators>`, can make use of the
:mod:`fiftyone.operators.types` module and the
Expand Down Expand Up @@ -1838,10 +1837,9 @@ subsequent sections.
# Whether to allow multiple instances of the panel to be opened
allow_multiple=False,

# Whether the panel should be available in the grid view
# modal view, or both
# Whether the panel should be available in the grid, modal, or both
# Possible values: "grid", "modal", "grid modal"
surfaces="grid modal" # default = "grid"
surfaces="grid", # default = "grid"

# Markdown-formatted text that describes the panel. This is
# rendererd in a tooltip when the help icon in the panel
Expand Down Expand Up @@ -2138,7 +2136,7 @@ Panel config

Every panel must define a
:meth:`config <fiftyone.operators.panel.Panel.config>` property that
defines its name, display name, and other optional metadata about its
defines its name, display name, surfaces, and other optional metadata about its
behavior:

.. code-block:: python
Expand All @@ -2162,8 +2160,26 @@ behavior:

# Whether to allow multiple instances of the panel to be opened
allow_multiple=False,

# Whether the panel should be available in the grid, modal, or both
# Possible values: "grid", "modal", "grid modal"
surfaces="grid", # default = "grid"

# Markdown-formatted text that describes the panel. This is
# rendererd in a tooltip when the help icon in the panel
# title is hovered over
help_markdown="A description of the panel",
)

The ``surfaces`` key defines the panel's scope:

- Grid panels can be accessed from the ``+`` button in the App's
:ref:`grid view <app-fields-sidebar>`, which allows you to build macro
experiences that work with entire datasets or views
- Modal panels can be accessed from the ``+`` button in the App's
:ref:`modal view <app-sample-view>`, which allows you to build interactions
that focus on individual samples and scenarios

.. _panel-execution-context:

Execution context
Expand Down
117 changes: 114 additions & 3 deletions docs/source/release-notes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,125 @@ FiftyOne Release Notes

.. default-role:: code

FiftyOne Teams 2.1.0
--------------------
*Released October 1, 2024*

Includes all updates from :ref:`FiftyOne 1.0.0 <release-notes-v1.0.0>`, plus:

- Super admins can now migrate their deployments to
:ref:`Internal Mode <internal-mode>` via the
:ref:`Super Admin UI <super-admin-ui>`
- Added support for sending user invitations in
:ref:`Internal Mode <internal-mode>`
- Optimized performance of the :ref:`dataset page <teams-homepage>`
- Fixed a BSON serialization bug that could cause errors when cloning or
exporting certain dataset views from the Teams UI

.. _release-notes-v1.0.0:

FiftyOne 1.0.0
--------------
*Released October 1, 2024*

What's New

- The `FiftyOne Brain <https://github.com/voxel51/fiftyone-brain>`_ is now
fully open source. Contributions are welcome!
- Added :ref:`Modal Panels <panel-config>`, bringing the ability to develop and
use panels in the App's sample modal
`#4625 <https://github.com/voxel51/fiftyone/pull/4625>`_
- All datasets now have :ref:`automatically populated <default-sample-fields>`
`created_at` and `last_modified_at` fields on their samples and frames
`#4597 <https://github.com/voxel51/fiftyone/pull/4597>`_
- Added support for loading
:ref:`remotely-sourced zoo datasets <dataset-zoo-remote>` whose
download/preparation instructions are stored in GitHub or public URLs
`#4752 <https://github.com/voxel51/fiftyone/pull/4752>`_
- Added support for loading
:ref:`remotely-sourced zoo models <model-zoo-remote>` whose definitions are
stored in GitHub or public URLs
`#4786 <https://github.com/voxel51/fiftyone/pull/4786>`_
- Added `Med-SAM2 <https://arxiv.org/abs/2408.00874>`_ to the
:ref:`model zoo <model-zoo-med-sam-2-video-torch>`!
`#4733 <https://github.com/voxel51/fiftyone/pull/4733>`_,
`#4828 <https://github.com/voxel51/fiftyone/pull/4828>`_

App

- Added dozens of :ref:`builtin operators <using-operators>` for performing
common operations directly from the App
`#4830 <https://github.com/voxel51/fiftyone/pull/4830>`_
- Label overlays in the grid are now scaled proportionally to grid zoom
`#4747 <https://github.com/voxel51/fiftyone/pull/4747>`_
- Improved support for visualizing and filtering |DynamicEmbeddedDocument| list
fields
`#4833 <https://github.com/voxel51/fiftyone/pull/4833>`_
- Added a new timeline API for synchronizing playback of multiple modal panels
brimoor marked this conversation as resolved.
Show resolved Hide resolved
`#4772 <https://github.com/voxel51/fiftyone/pull/4772>`_
- Improved UI, documentation, and robustness when working with
:ref:`custom color schemes <app-color-schemes-app>`
`#4763 <https://github.com/voxel51/fiftyone/pull/4763>`_
- Fixed a bug where the active group slice was not being persisted when
navigating between groups in the modal
`#4836 <https://github.com/voxel51/fiftyone/pull/4836>`_
- Fixed a bug when selecting samples in grouped datasets in the modal
`#4789 <https://github.com/voxel51/fiftyone/pull/4789>`_
- Fixed :ref:`heatmaps <heatmaps>` rendering for values outside of the `range`
attribute `#4865 <https://github.com/voxel51/fiftyone/pull/4865>`_

Core

- Added support for creating :ref:`summary fields <summary-fields>` to optimize
queries on large datasets with many objects
`#4765 <https://github.com/voxel51/fiftyone/pull/4765>`_
- Dataset fields now have automatically populated `created_at` attributes
`#4730 <https://github.com/voxel51/fiftyone/pull/4730>`_
- Upgraded the
:meth:`delete_samples() <fiftyone.core.dataset.Dataset.delete_samples>`
and :meth:`clear_frames() <fiftyone.core.dataset.Dataset.clear_frames>`
methods to support bulk deletions of 100k+ samples/frames
`#4787 <https://github.com/voxel51/fiftyone/pull/4787>`_
- The :meth:`default_sidebar_groups() <fiftyone.core.odm.dataset.DatasetAppConfig.default_sidebar_groups>`
method now correctly handles datetime fields
`#4815 <https://github.com/voxel51/fiftyone/pull/4815>`_
- Fixed an off-by-one error when converting semantic segmentations to/from
instance segmentations
`#4826 <https://github.com/voxel51/fiftyone/pull/4826>`_
- Protect against infinitely growing content size batchers
`#4806 <https://github.com/voxel51/fiftyone/pull/4806>`_
- Removed the deprecated `remove_sample()` and `remove_samples()` methods from
the |Dataset| class
`#4832 <https://github.com/voxel51/fiftyone/pull/4832>`_
- Deprecated :ref:`Python 3.8 support <deprecation-python-3.8>`

Plugins

- Added
:meth:`ctx.group_slice <fiftyone.operators.executor.ExecutionContext.group_slice>`
to the operator execution context
`#4850 <https://github.com/voxel51/fiftyone/pull/4850>`_
- Added
:meth:`set_group_slice() <fiftyone.operators.operations.Operations.set_group_slice>`
to the operator execution context
`#4844 <https://github.com/voxel51/fiftyone/pull/4844>`_
- Improved styling for :class:`GridView <fiftyone.operators.types.GridView>`
components
`#4764 <https://github.com/voxel51/fiftyone/pull/4764>`_
- A loading error is now displayed in the actions row when operators with
:ref:`placements <operator-placement>` fail to load
`#4714 <https://github.com/voxel51/fiftyone/pull/4714>`_
- Ensure the App loads when plugins fail to load
`#4769 <https://github.com/voxel51/fiftyone/pull/4769>`_

.. _release-notes-v0.25.2:

FiftyOne 0.25.2
---------------
*Released September 19, 2024*

* Require `pymongo<4.9` to fix database connections
* Require `pydicom<3` for :ref:`DICOM datasets <DICOMDataset-import>`

- Require `pymongo<4.9` to fix database connections
- Require `pydicom<3` for :ref:`DICOM datasets <DICOMDataset-import>`

FiftyOne Teams 2.0.1
--------------------
Expand Down
66 changes: 48 additions & 18 deletions docs/source/user_guide/using_datasets.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1635,16 +1635,14 @@ editable at any time:
Summary fields
--------------

Summary fields allow you to efficiently perform queries where directly querying
the underlying field is prohibitively slow due to the number of objects/frames
in the field.
Summary fields allow you to efficiently perform queries on large datasets where
directly querying the underlying field is prohibitively slow due to the number
of objects/frames in the field.

For example, as we'll see below, summary fields are useful for retrieving
samples in a video dataset that contain specific values of interest in at least
one frame.

Use :meth:`create_summary_field() <fiftyone.core.dataset.Dataset.create_summary_field>`
to create a summary field for a given input field path:
For example, suppose you're working on a
:ref:`video dataset <video-datasets>` with frame-level objects, and you're
interested in finding videos that contain specific classes of interest, eg
`person`, in at least one frame:

.. code-block:: python
:linenos:
Expand All @@ -1656,6 +1654,25 @@ to create a summary field for a given input field path:
dataset = foz.load_zoo_dataset("quickstart-video")
dataset.set_field("frames.detections.detections.confidence", F.rand()).save()

session = fo.launch_app(dataset)

.. image:: /images/datasets/quickstart-video.gif
:alt: quickstart-video
:align: center

One approach is to directly query the frame-level field (`frames.detections`
in this case) in the App's sidebar. However, when the dataset is large, such
queries are inefficient, as they cannot
:ref:`leverage indexes <app-indexed-filtering>` and thus require full
collection scans over all frames to retrieve the relevant samples.

A more efficient approach is to first use
:meth:`create_summary_field() <fiftyone.core.dataset.Dataset.create_summary_field>`
to summarize the relevant input field path(s):

.. code-block:: python
:linenos:

# Generate a summary field for object labels
field_name = dataset.create_summary_field("frames.detections.detections.label")

Expand All @@ -1666,15 +1683,6 @@ to create a summary field for a given input field path:
# Generate a summary field for [min, max] confidences
dataset.create_summary_field("frames.detections.detections.confidence")

.. note::

Summary fields are :ref:`read-only <read-only-fields>`, as they are
implicitly derived from the contents of their source field and are not
intended to be directly modified.

They are also :ref:`indexed <app-indexed-filtering>` by default, so
filtering them :ref:`in the App <app-indexed-filtering>` is performant.

Summary fields can be generated for sample-level and frame-level fields, and
the input fields can be either categorical or numeric:

Expand Down Expand Up @@ -1753,6 +1761,28 @@ the input fields can be either categorical or numeric:
]
"""

As the above examples illustrate, summary fields allow you to encode various
types of information at the sample-level that you can directly query to find
samples that contain specific values.

Moreover, summary fields are :ref:`indexed <app-indexed-filtering>` by default
and the App can natively leverage these indexes to provide performant
filtering:

.. image:: /images/datasets/quickstart-video-summary-fields.gif
:alt: quickstart-video-summary-fields
:align: center

.. note::

Summary fields are automatically added to a `summaries`
:ref:`sidebar group <dataset-app-config-sidebar-groups>` in the App for
easy access and organization.

They are also :ref:`read-only <read-only-fields>` by default, as they are
implicitly derived from the contents of their source field and are not
intended to be directly modified.

You can use
:meth:`list_summary_fields() <fiftyone.core.dataset.Dataset.list_summary_fields>`
to list the names of the summary fields on your dataset:
Expand Down
Loading