The open-source tool for building high-quality datasets and computer vision models

Overview

 

The open-source tool for building high-quality datasets and computer vision models.


WebsiteDocsTry it NowTutorialsExamplesBlogCommunity

PyPI python PyPI version Downloads Build License Slack Medium Mailing list Twitter

FiftyOne


FiftyOne is an open source ML tool created by Voxel51 that helps you build high-quality datasets and computer vision models.

With FiftyOne, you can search, sort, filter, visualize, analyze, and improve your datasets without excess wrangling or writing custom scripts. It also provides powerful functionality for analyzing your models, allowing you to understand their strengths and weaknesses, visualize, diagnose, and correct their failure modes, and more. FiftyOne is designed to be lightweight and easily integrate into your existing CV/ML workflows.

You can get involved by joining our Slack community, reading our blog on Medium, and following us on social media:

Slack Medium Twitter LinkedIn Facebook

Installation

You can install the latest stable version of FiftyOne via pip:

pip install fiftyone

Consult the installation guide for troubleshooting and other information about getting up-and-running with FiftyOne.

Quickstart

Dive right into FiftyOne by launching the quickstart:

fiftyone quickstart

This command will download a small dataset, launch the App, and print some suggestions for exploring the dataset.

You can also check out this Colab notebook to try some common workflows with the quickstart dataset, or run through this Colab notebok for a more detailed overview of FiftyOne.

Documentation

Full documentation for FiftyOne is available online. In particular, see these resources:

Examples

Check out the fiftyone-examples repository for open source and community-contributed examples of using FiftyOne.

Contributing to FiftyOne

FiftyOne is open source and community contributions are welcome!

Check out the contribution guide to learn how to get involved.

Installing from source

This section explains how to install the latest development version of FiftyOne from source.

The instructions below are for macOS and Linux systems. Windows users may need to make adjustments.

Prerequisites

You will need:

  • Python (3.6 or newer)
  • Node.js - on Linux, we recommend using nvm to install an up-to-date version.
  • Yarn - once Node.js is installed, you can install Yarn via npm install -g yarn
  • On Linux, you will need at least the openssl and libcurl packages. On Debian-based distributions, you will need to install libcurl4 or libcurl3 instead of libcurl, depending on the age of your distribution. For example:
# Ubuntu 18.04
sudo apt install libcurl4 openssl

# Fedora 32
sudo dnf install libcurl openssl

Installation

We strongly recommend that you install FiftyOne in a virtual environment to maintain a clean workspace. The install script is only supported in POSIX-based systems (e.g. Mac and Linux).

  1. Clone the repository:
git clone --recursive https://github.com/voxel51/fiftyone
cd fiftyone
  1. Run the installation script:
bash install.bash

NOTE: The install script adds to your nvm settings in your ~/.bashrc or ~/.bash_profile, which is needed for installing and building the App. When you pull in new changes to the App, you will need to run yarn build-web in the ./app directory.

  1. If you want to use the fiftyone.brain package, you will need to install it separately after installing FiftyOne:
pip install fiftyone-brain

Customizing your ETA installation

Installing FiftyOne from source includes an ETA lite installation, which should be sufficient for most users. If you want a full ETA installation, or wish to otherwise customize your ETA installation, see here.

Developer installation

If you would like to contribute to FiftyOne, you should perform a developer installation using the -d flag of the install script:

bash install.bash -d

Upgrading your source installation

To upgrade an existing source installation to the bleeding edge, simply pull the latest develop branch and rerun the install script:

git checkout develop
git pull
bash install.bash [-d]

Generating documentation

See the docs guide for information on building and contributing to the documentation.

Uninstallation

You can uninstall FiftyOne as follows:

pip uninstall fiftyone fiftyone-brain fiftyone-db fiftyone-desktop

Citation

If you use FiftyOne in your research, feel free to cite the project (but only if you love it 😊 ):

@article{moore2020fiftyone,
  title={FiftyOne},
  author={Moore, B. E. and Corso, J. J.},
  journal={GitHub. Note: https://github.com/voxel51/fiftyone},
  year={2020}
}
Comments
  • Targets, Player51 tooltips, new click behavior

    Targets, Player51 tooltips, new click behavior

    Resolves #816, Resolves #709, Resolves #843, Resolves #818, Resolves https://github.com/voxel51/fiftyone/issues/725.

    Changelog:

    • Adds a detailed tooltip to display labels info in Player51's expanded sample view
    • Adds an API for storing + using mask targets for Segmentation fields in the App and evaluation API
    • Single-clicks now open the modal, and samples can be selected with top-left checkbox
    • Arrow up/down rotates z-order of overlays (objects)
    • The z-order of object in the media player follows the order in which the fields were selected (most recent on top)

    TODO:

    • Ensure only visible objects are a part of z-order rotation from wheel, arrow down, and arrow up events
    • Add IDs to Classifications
    • Test Video edge cases
    • Fix initial movement flicker when tooltip first appears.
    • Prevent sample grid from scrolling from arrow down/up events when rotating z-order
    • Retain z-order rotation after mouse move
    • Skipping filtered objects in the tooltip is broken, it was working...have to fix it again

    I'd like to add z-order rotation of field groups from checkbox toggling, but that can come as a separate PR.

    NOTE:

    I decided to only include one object result in a tooltip, as the tooltip is already quite large when attributes are included. Also, we have the opportunity to include the tooltip in the sample grid, as well...I've left the enabled in the grid (for discussion)

    Quickstart to testing:

    cd ./app
    yarn install && yarn build-web
    
    import fiftyone as fo
    import fiftyone.zoo as foz
    
    model = foz.load_zoo_model("deeplabv3-resnet101-coco-torch")
    dataset = foz.load_zoo_dataset("quickstart")
    dataset = dataset.limit(10)
    dataset = dataset.clone("tooltip-testing")
    dataset.apply_model(model, "segmentations")
    dataset.persistent = True
    
    for s in dataset:
        s["polyline"] = fo.Polyline(points=[[(0.5, 0.5), (0, 0.5), (0.5, 0)]], closed=True, filled=True)
        s["keypoints"] = fo.Keypoints(keypoints=[fo.Keypoint(label="cat", target=2, points=[[0.5, 0.5]])])
        s["classification"] = fo.Classification(label="testing", target=1)
        s.save()
    
    dataset.default_mask_targets = {i: "idx-%d" % i for i in range(0, 256)}
    
    session = fo.Session(dataset=dataset)
    
    feature app core 
    opened by benjaminpkane 29
  • Object selection

    Object selection

    What changes are proposed in this pull request?

    Initial support for selecting individual objects in the media viewer

    image

    Selecting all objects in a frame is also supported for videos. More selection options are in progress.

    How is this patch tested? If it is not, please explain why.

    Locally

    Release Notes

    Is this a user-facing change that should be mentioned in the release notes?

    • [ ] No. You can skip the rest of this section.
    • [x] Yes. Give a description of this change to be included in the release notes for FiftyOne users.

    What areas of FiftyOne does this PR affect?

    • [x] App: FiftyOne application changes
    • [ ] Build: Build and test infrastructure changes
    • [ ] Core: Core fiftyone Python library changes
    • [ ] Documentation: FiftyOne documentation changes
    • [ ] Other
    feature app 
    opened by lethosor 28
  • Looker

    Looker

    Summary

    Reorganizes the app codebase, splitting the project into three packages (and more later, likely)

    • app - core react app
    • desktop - desktop package wrapping the core app package
    • looker - image and video visualizer supporting canvas overlay labels, video labels are streamed

    Deprecates player51

    Issues

    • Resolves #991
    • Resolves #940
    • Resolves #390
    • Resolves #844
    • Resolves #907
    • Resolves #1073
    • Resolves #1021
    • Resolves #622
    • Resolves #659
    • Resolves #1140
    enhancement feature app 
    opened by benjaminpkane 23
  • Automatic notebook screenshots

    Automatic notebook screenshots

    Introduces automatic screenshot replacement for the previously shown app cell in notebooks. The IFRAME is replaced with a standalone HTML handle that contains the screenshot and a small hover interaction that displays a reactivation button. Switching to an HTML handle removes the need for the server to be running, and allows for exporting a notebook to HTML with screenshots intact.

    feature app 
    opened by benjaminpkane 23
  • Adding a Heatmap label type

    Adding a Heatmap label type

    Adds a Heatmap label type that can be used to store array data whose values are interpreted as continuous values along an App-configurable colormap.

    Heatmap is similar but distinct from the existing Segmentation label type, which stores categorical array data whose pixels correspond to (eg) string labels rather than numerical intensity-like data.

    The optional Heatmap.range parameter allows the user to specify the intended dynamic range of a heatmap. If not specified, a range of [0, 1] will be assumed if the array contains floating points values and [0, 255] if the heatmap contains integer values.

    In "color by field" mode in the App, heatmaps are rendered in a single color with opacity proportional to the absolute value of the pixel value. So, for example, when range=[0, 1], 0 is 0% transparent and 1 is 100% opaque, while when range=[-50, 100], -50 is 50% opaque, 0 is 0% opaque, and 100 is 100% opaque.

    In "color by value" mode, heatmaps are instead rendered with a fixed transparency using a colorscale that can be configured via the new colorscale property of the App config.

    Since plotly is already a strict dependency of FiftyOne, we use it to handle colorscale -> colormap generation, as they already provide quite sophisticated support for that. The colorscale App config parameter can be set to any named plotly colorscale like "viridis" (there are many), but the user could even set this to a completely custom colorscale during execution and AppConfig.get_colormap() would handle it. See the added user guide docs for details and examples.

    Simple usage

    import numpy as np
    import fiftyone as fo
    
    sample = fo.Sample(
        filepath="/path/to/image.png",
        heatmap=fo.Heatmap(map=np.random.random(size=(64, 64))),
    )
    
    print(sample)
    

    Image example

    import numpy as np
    import fiftyone as fo
    import fiftyone.zoo as foz
    
    def make_heatmap(metadata):
        height = metadata.height // 2
        width = metadata.width // 2
        x, y = np.meshgrid(np.linspace(-1, 1, width), np.linspace(-1, 1, height))
    
        sign = np.sign(np.random.randn())
        x0, y0 = np.random.random(2) - 0.5
        heatmap = sign * np.exp(-np.sqrt((x - x0) ** 2 + (y - y0) ** 2))
    
        return fo.Heatmap(map=heatmap, range=[-1, 1])
    
    dataset = foz.load_zoo_dataset("quickstart").select_fields().clone()
    dataset.compute_metadata()
    
    for sample in dataset:
        sample["heatmap"] = make_heatmap(sample.metadata)
        sample.save()
    
    session = fo.launch_app(dataset)
    
    # Select `Settings -> Color by value` in the App
    # Heatmaps will now be rendered using your default colorscale (printed below)
    print(session.config.colorscale)
    
    # Switch to a different named colorscale
    session.config.colorscale = "RdBu"
    session.refresh()
    
    # Use a custom colorscale
    session.config.colorscale = [
        [0.00, "rgb(166,206,227)"],
        [0.25, "rgb(31,120,180)"],
        [0.45, "rgb(178,223,138)"],
        [0.65, "rgb(51,160,44)"],
        [0.85, "rgb(251,154,153)"],
        [1.00, "rgb(227,26,28)"],
    ]
    session.refresh()
    

    Video example

    import numpy as np
    import fiftyone as fo
    import fiftyone.zoo as foz
    
    def drift(z):
        znew = ((z + 0.3 * np.random.randn() + 1) % 2) - 1
        return 0.9 * z + 0.1 * znew
    
    def dancing_normal(h, w, n):
        x, y = np.meshgrid(np.linspace(-1, 1, w), np.linspace(-1, 1, h))
        x0, y0 = 0, 0
    
        maps = []
        for _ in range(n):
            x0, y0 = drift(x0), drift(y0)
            heatmap = np.exp(-np.sqrt((x - x0) ** 2 + (y - y0) ** 2))  # float heatmap
            # heatmap = np.round(255 * heatmap).astype(np.uint8)  # integer heatmap
            maps.append(heatmap)
    
        return maps
    
    dataset = foz.load_zoo_dataset("quickstart-video", max_samples=1).select_fields().clone()
    dataset.compute_metadata()
    
    sample = dataset.first()
    
    height = sample.metadata.frame_height // 16
    width = sample.metadata.frame_width // 16
    num_frames = len(sample.frames)
    heatmaps = dancing_normal(height, width, num_frames)
    
    for frame, heatmap in zip(sample.frames.values(), heatmaps):
        frame["heatmap"] = fo.Heatmap(map=heatmap)
    
    sample.save()
    
    session = fo.launch_app(dataset)
    
    feature 
    opened by brimoor 22
  • Adds string and boolean field filters in the sidebar

    Adds string and boolean field filters in the sidebar

    Resolves https://github.com/voxel51/fiftyone/issues/827, Resolves https://github.com/voxel51/fiftyone/issues/833.

    Also addresses points 1 and 2 from https://github.com/voxel51/fiftyone/issues/803.

    Very happy with this refactor. Lots of technical debt has been banished.

    • Adds string and boolean field filters in the sidebar
    • Adds color by label support for classification and scalar field bubbles in the sample grid

    Needs more testing, I have yet to test video and classifications. The implementation is complete. though.

    feature app 
    opened by benjaminpkane 21
  • Adding support for date and datetime fields

    Adding support for date and datetime fields

    Resolves https://github.com/voxel51/fiftyone/issues/1144 Resolves #1335

    Adds support for storing date information in FiftyOne datasets by directly populating sample or embedded document fields with date or datetime instances.

    Timezones and date-based queries are naturally supported 🎵👂

    Timezone example

    Timezone handling is pretty clean:

    from datetime import datetime, timedelta
    import pytz
    
    import fiftyone as fo
    
    # These are all the epoch
    date1 = datetime(1970, 1, 1, 0, 0, 0)
    utcdate1 = date1.replace(tzinfo=pytz.utc)
    date2 = utcdate1.astimezone(pytz.timezone("US/Eastern"))
    date3 = utcdate1.astimezone(pytz.timezone("US/Pacific"))
    
    # FiftyOne treats naive datetimes as UTC implicitly
    sample1 = fo.Sample(filepath="image1.png", date=date1)
    
    # FiftyOne accepts timezone-aware datetimes too
    sample2 = fo.Sample(filepath="image2.png", date=date2)
    sample3 = fo.Sample(filepath="image3.png", date=date3)
    
    dataset = fo.Dataset()
    dataset.add_samples([sample1, sample2, sample3])
    
    fo.config.timezone = "US/Eastern"
    dataset.reload()
    
    print(sample1.date.tzinfo.zone == "US/Eastern")  # True
    print((sample1.date - utcdate1).total_seconds())  # 0.0
    print((sample1.date - sample2.date).total_seconds())  # 0.0
    print((sample1.date - sample3.date).total_seconds())  # 0.0
    
    fo.config.timezone = None
    dataset.reload()
    
    print(sample1.date.tzinfo is None)  # True
    print((sample1.date - date1).total_seconds())  # 0.0
    print((sample1.date - sample2.date).total_seconds())  # 0.0
    print((sample1.date - sample3.date).total_seconds())  # 0.0
    

    Dataset view example

    And of course, support for date-based dataset views is there, too!

    from datetime import datetime, timedelta
    
    import fiftyone as fo
    from fiftyone import ViewField as F
    
    dataset = fo.Dataset()
    dataset.add_samples(
        [
            fo.Sample(
                filepath="image1.png",
                creation_date=datetime(2021, 8, 24, 1, 0, 0),
            ),
            fo.Sample(
                filepath="image2.png",
                creation_date=datetime(2021, 8, 24, 2, 0, 0),
            ),
            fo.Sample(
                filepath="image3.png",
                creation_date=datetime(2021, 8, 24, 3, 0, 0),
            ),
        ]
    )
    
    query_date = datetime(2021, 8, 24, 2, 1, 0)
    query_delta = timedelta(minutes=30)
    
    # Samples with creation date after 2021-08-24 02:01:00
    view = dataset.match(F("creation_date") > query_date)
    print(view)
    
    # Samples with creation date within 30 minutes of 2021-08-24 02:01:00
    view = dataset.match(abs(F("creation_date") - query_date) < query_delta)
    print(view)
    

    App filtering example

    from datetime import date, datetime, timedelta
    import fiftyone as fo
    import fiftyone.zoo as foz
    
    dataset = foz.load_zoo_dataset("quickstart").select_fields().clone()
    
    today = date.today()
    now = datetime.utcnow()
    
    for idx, sample in enumerate(dataset):
        # Date-only
        sample["dates"] = today - timedelta(days=idx)
    
        # Date and time
        sample["ms"] = now - timedelta(milliseconds=idx)
        sample["seconds"] = now - timedelta(seconds=idx)
        sample["minutes"] = now - timedelta(minutes=idx)
        sample["hours"] = now - timedelta(hours=idx)
        sample["days"] = now - timedelta(days=idx)
        sample["weeks"] = now - timedelta(weeks=idx)
        sample.save()
    
    session = fo.launch_app(dataset)
    
    feature 
    opened by brimoor 20
  • FiftyOne needs a lite ETA install, which can be performed via pip

    FiftyOne needs a lite ETA install, which can be performed via pip

    (this issue belongs in ETA, but I'm adding it here first for visibility, as FiftyOne is the primary user of this needed install improvement)

    FiftyOne currently performs a full ETA install (https://github.com/voxel51/eta/blob/develop/install.bash), which includes the following items:

    • base machine packages
      • should be moved out of the pip install component of the ETA install and instead moved to a startup script or some other appropriate place
    • basic python requirements
    • pip install eta
    • ffmpeg
      • not needed right now, but will be needed when we start to work with videos. however, perhaps FiftyOne should be in charge of installing this and never ETA
    • imagemagick
      • probably never needed, used only by a few methods in eta.core.image that we'd never be calling
    • tensorflow
      • not needed for fiftyone; user will install if they need TF for either fiftyone or eta package reasons
    • submodules, including tensorflow/models
      • not needed for fiftyone

    ETA needs a lite install process that installs what FiftyOne needs and nothing else, which can be accomplished via pip install.

    To preserve functionality for existing users, ETA also needs a full install that can be accomplished via pip install

    setup 
    opened by brimoor 18
  • Dataset Zoo and MVP SDK interface

    Dataset Zoo and MVP SDK interface

    This PR is pretty big, but it accomplishes the following two goals:

    • establishes a FiftyOne Dataset Zoo
    • implements a functioning prototype interface that users can use to engage with their datasets

    Run the example code in examples/interface.py and let me know what you think.

    FiftyOne Dataset Zoo

    A Dataset Zoo is established in FiftyOne that enables users to download any of a collection of datasets using the syntax:

    import fiftyone.core.data as fod
    
    fod.load_zoo_dataset("cifar10")
    

    Behind the scenes, it grabs datasets using either the TF Zoo or the PyTorch Zoo, depending on which package is installed on the user's machine. All datasets are stored on disk in eta.core.datasets.LabeledImageDataset format.

    Prototype Dataset interface

    My goal here was to have a working example of performing the following tasks:

    • loading a dataset with ground truth annotations into FiftyOne
    • allowing the user to iterate over (image, ImageLabels) pairs in the dataset, where the labels are either the ground truth labels or a set of predicted labels
    • allowing the user to select a specific frame attribute and iterate over the (img, label) pairs in the dataset, as would be fed to a classifier during training
    • allowing the user to register a new model against the dataset
    • allowing the user to iterate over (image, sample ID) pairs so they can add new predictions to the dataset

    To accomplish this, I implemented prototype versions of the following classes:

    • fiftyone.experimental.data.Dataset: the underlying class that stores all information about the dataset, including paths to the raw images on disk, ground truth annotations, one or more sets of predicted labels, and additional metadata accompanying all of these items, such as sample hardness, annotation correctness, etc

    fiftyone.experimental.contexts.DatasetContext: classes that represent specific contexts into the dataset. Examples include: - ImageContext: pulls only the images from the dataset. Iterating over this yields imgs - LabeledImageContext: pulls images and a particular set of ImageLabels (e.g., ground truth) from the dataset. Iterating over contexts of this kind yield (img, ImageLabels) pairs - ImageClassificationContext: pulls images and a particular frame attribute from a LabeledImageContext from the dataset. Iterating over contexts of this kind yield (img, label) pairs - ModelContext: pulls a specific model from the dataset, so that additional predictions can be added to samples. Iterating over context of this kind yield (img, sample ID) pairs

    fiftyone.experimental.views.DatasetView: classes that allow read-only operations to be performed on a DatasetContext. These allow things like sorting by X, shuffling, removing specific samples (from the view, not the underlying dataset), iterating over the samples in the view, and exporting the current state of the view as a dataset on disk

    To achieve a functional prototype of the above, my fiftyone.experimental.data.Dataset class has an actual implementation. This, of course, will be thrown out and grafted onto the MongoDB interface.

    Again, see examples/interface.py to see this functionality in action.

    I'm not sure that there needs to be a difference between DatasetContexts and DatasetViews. But, there is the interesting distinction to be made that one may want a "read-only" playground that DatasetViews offer where any slicing and dicing of the dataset is not permanent.

    Key Design Principles

    • all images are stored on disk
    • image paths and labels are stored in-memory (anticipating MongoDB being grafted onto this work in the backend)
    • don't import tensorflow or torch unless the user specifically requests functionality that requires them
    feature 
    opened by brimoor 18
  • App enhancements

    App enhancements

    Ready for review. Jupyter needs a bug to be fixed, though. Will resolve tomorrow.

    Resolves #799 , #804, #781, #780

    • Fields are now properly filtered when selected or exclude stages exist in the view. Includes video dataset support
    • Selecting and only showing or hiding samples in the App now works as one would expect
    • Color pool and player51 options Show confidence and Show attributes are now config and session options (needs cleanup)
    bug enhancement app 
    opened by benjaminpkane 17
  • Adding support for creating datasets and launching the dashboard via the CLI

    Adding support for creating datasets and launching the dashboard via the CLI

    Now you can do stuff like this via the CLI:

    $ fiftyone datasets list
    cifar10-test
    
    $ fiftyone datasets delete cifar10-test
    Dataset 'cifar10-test' deleted
    
    $ fiftyone datasets list
    No datasets found
    
    $ fiftyone zoo load cifar10 --splits test
    Split 'test' already downloaded
    Loading 'cifar10' split 'test'
    Adding samples...
     100% |███████████████████████████| 10000/10000 [6.2s elapsed, 0s remaining, 1.7K samples/s]        
    Dataset 'cifar10-test' created
    
    $ fiftyone datasets list
    cifar10-test
    
    $ fiftyone datasets info cifar10-test
    Name:           cifar10-test
    Persistent:     True
    Num samples:    10000
    Tags:           ['test']
    Sample fields:
        filepath:     fiftyone.core.fields.StringField
        tags:         fiftyone.core.fields.ListField(fiftyone.core.fields.StringField)
        metadata:     fiftyone.core.fields.EmbeddedDocumentField(fiftyone.core.metadata.Metadata)
        ground_truth: fiftyone.core.fields.EmbeddedDocumentField(fiftyone.core.labels.Classification)
    
    $ fiftyone dashboard launch cifar10-test
    Dashboard launched
    
    To exit, type ctrl + c
    

    Remote sessions are also supported:

    (From remote machine)

    $ fiftyone dashboard launch cifar10-test --remote
    You have launched a remote dashboard on port 5151. To connect to this dashboard
    from another machine, issue the following command:
    
    fiftyone dashboard connect --destination [<username>@]<hostname> --port 5151
    
    where `[<username>@]<hostname>` refers to your current machine. Alternatively,
    you can manually configure port forwarding on another machine as follows:
    
    ssh -N -L 5151:127.0.0.1:5151 [<username>@]<hostname>
    
    and then connect to the dashboard on that machine using either
    `fiftyone dashboard connect` or from Python via `fiftyone.launch_dashboard()`.
    
    To exit, type ctrl + c
    

    (From local machine)

    $ fiftyone dashboard connect --destination [<username>@]<hostname> --port 5151
    Dashboard launched
    
    To exit, type ctrl + c
    
    feature 
    opened by brimoor 16
  • [BUG] CSV Exporter has too many double quotes in list fields

    [BUG] CSV Exporter has too many double quotes in list fields

    System information

    • OS Platform and Distribution (e.g., Linux Ubuntu 16.04): Mac OSX A1 chip
    • Python version (python --version): 3.10.8
    • FiftyOne version (fiftyone --version): develop
    • FiftyOne installed from (pip or source): source

    Commands to reproduce

    As thoroughly as possible, please provide the Python and/or shell commands used to encounter the issue. Application steps can be described in the next section.

    import fiftyone as fo
    import fiftyone.zoo as foz
    
    dataset = foz.load_zoo_dataset("quickstart")
    view = dataset.limit(2)
    view.export(
      dataset_type=fo.types.CSVDataset,
      export_dir="/tmp/csv_export_test",
      fields=[
        "filepath",
        "tags",
        "ground_truth.detections.tags",
        "ground_truth.detections.label"
      ]
    )
    

    Describe the problem

    CSV Exporter quotes list fields one too many times so that if read in by a CSV reader, the whole list will be surrounded by double quotes.

    Above code generates this:

    filepath,tags,ground_truth.detections.tags,ground_truth.detections.label
    000880.jpg,"""validation""","""[],[],[]""","""bird,bird,bird"""
    

    Vs. expected:

    filepath,tags,ground_truth.detections.tags,ground_truth.detections.label
    000880.jpg,"validation","[],[],[]","bird,bird,bird"
    

    What areas of FiftyOne does this bug affect?

    • [ ] App: FiftyOne application issue
    • [x] Core: Core Python library issue
    • [ ] Server: FiftyOne server issue

    Willingness to contribute

    The FiftyOne Community encourages bug fix contributions. Would you or another member of your organization be willing to contribute a fix for this bug to the FiftyOne codebase?

    • [x] Yes. I can contribute a fix for this bug independently
    • [ ] Yes. I would be willing to contribute a fix for this bug with guidance from the FiftyOne community
    • [ ] No. I cannot contribute a bug fix at this time
    bug 
    opened by swheaton 2
  • [FR] Integrate pull request preview environments

    [FR] Integrate pull request preview environments

    Instructions

    Thank you for submitting an issue. Please refer to our issue policy for information on what types of issues we address.

    Proposal Summary

    I would like to support FiftyOne by implementing Uffizzi preview environments. Disclaimer: I work on Uffizzi.

    Uffizzi is a Open Source full stack previews engine and our platform is available completely free for FiftyOne (and all open source projects). This will provide maintainers with preview environments of every PR in the cloud, which enables faster iterations and reduces time to merge. You can see the open source repos which are currently using Uffizzi over here

    Uffizzi is purpose-built for the task of previewing PRs and it integrates with your workflow to deploy preview environments in the background without any manual steps for maintainers or contributors.

    We can go ahead and create an Initial PoC for you right away if you think there is value in this proposal.

    TODO:

    • [ ] Intial PoC

    Motivation

    • What is the use case for this feature? You will be able to preview every change made to fiftyone before the PR is merged. The server and the app will be previewed together at all times in this case.

    • Why is this use case valuable to support for FiftyOne users in general?

    • Why is this use case valuable to support for your project(s) or organization?

    • Why is it currently difficult to achieve this use case?

    What areas of FiftyOne does this feature affect?

    • [x] App: FiftyOne application
    • [ ] Core: Core fiftyone Python library
    • [x] Server: FiftyOne server

    Details

    Use this section to include any additional information about the feature. If you have a proposal for how to implement this feature, please include it here.

    Willingness to contribute

    The FiftyOne Community welcomes contributions! Would you or another member of your organization be willing to contribute an implementation of this feature?

    • [x] Yes. I can contribute this feature independently
    • [ ] Yes. I would be willing to contribute this feature with guidance from the FiftyOne community
    • [ ] No. I cannot contribute this feature at this time
    feature 
    opened by waveywaves 0
  • 3d/iou

    3d/iou

    New branch (branching off of bugfix/3d for 3d IoU computation. Added in a few unit tests. Haven't added a unit test for rotated bounding boxes yet, but everything seems to work as expected so far.

    This supersedes the old 3d iou and detection evaluation branch (also I pulled develop into that one instead of merging it in so the branch was unwieldy. As such, I've closed that PR: https://github.com/voxel51/fiftyone/pull/2340

    Release Notes

    Along with the other 3d changes, these evaluation methods expect the 3d bounding box to be given with location being the centroid of the cuboid.

    Is this a user-facing change that should be mentioned in the release notes?

    • [ ] No. You can skip the rest of this section.
    • [x] Yes. Give a description of this change to be included in the release notes for FiftyOne users.

    (Details in 1-2 sentences. You can just refer to another PR with a description if this PR is part of a larger change.)

    evaluate_detections() now supports 3d bounding boxes.

    What areas of FiftyOne does this PR affect?

    • [ ] App: FiftyOne application changes
    • [ ] Build: Build and test infrastructure changes
    • [x] Core: Core fiftyone Python library changes
    • [ ] Documentation: FiftyOne documentation changes
    • [ ] Other
    opened by jacobmarks 1
  • CHEAT SHEET: FO terminology

    CHEAT SHEET: FO terminology

    First draft of cheat sheet introducing the basic terminology in FO. Would love to get this into the 0.19 release! This is higher priority than the filtering and view stages cheat sheets :)

    Once we get this, and the filtering and view stages cheat sheets approved, we can create a new section in the docs for cheat sheets.

    • [ ] No. You can skip the rest of this section.
    • [ ] Yes. Give a description of this change to be included in the release notes for FiftyOne users.

    (Details in 1-2 sentences. You can just refer to another PR with a description if this PR is part of a larger change.)

    What areas of FiftyOne does this PR affect?

    • [ ] App: FiftyOne application changes
    • [ ] Build: Build and test infrastructure changes
    • [ ] Core: Core fiftyone Python library changes
    • [x] Documentation: FiftyOne documentation changes
    • [ ] Other
    opened by jacobmarks 0
  • add support for rgb overlays

    add support for rgb overlays

    Resolves #1730.

    Change log

    • Adds support for visualizing RGB segmentations in the App
    • Adds support for RGB segmentations in evaluate_segmentations()
    • Adds support for passing RGB mask targets to objects_to_segmentations()
    • Adds a new transform_segmentations() utility to transform existing masks between grayscale <> RGB

    Example usage

    import fiftyone as fo
    import fiftyone.zoo as foz
    import fiftyone.utils.labels as foul
    
    mask_targets = {"#FF6D04": "person", "#499CEF": "cat", "#6D04FF": "dog"}
    
    dataset = foz.load_zoo_dataset(
        "coco-2017",
        split="validation",
        label_types=["segmentations"],
        classes=["person", "cat", "dog"],
        label_field="instances",
        max_samples=25,
        only_matching=True,
    )
    
    foul.objects_to_segmentations(
        dataset,
        "instances",
        "segmentations",
        mask_targets=mask_targets,
    )
    
    dataset.default_mask_targets = mask_targets
    
    # Test in-database RGB segmentations in App
    session = fo.launch_app(dataset)
    
    foul.export_segmentations(
        dataset, "segmentations", "/tmp/segmentations", overwrite=True
    )
    
    # Test on-disk RGB segmentations in App
    session.refresh()
    
    # Test evaluating RGB segmentations
    dataset.rename_sample_field("segmentations", "ground_truth")
    dataset.clone_sample_field("ground_truth", "predictions")
    
    results1 = dataset.evaluate_segmentations(
        "predictions", gt_field="ground_truth", mask_targets=mask_targets
    )
    results1.print_report()
    
    results2 = dataset.evaluate_segmentations("predictions", gt_field="ground_truth")
    results2.print_report()
    
    # Convert to grayscale
    targets_map = {"#FF6D04": 1, "#499CEF": 2, "#6D04FF": 3}
    foul.import_segmentations(dataset, "ground_truth")
    foul.transform_segmentations(dataset, "ground_truth", targets_map)
    foul.transform_segmentations(
        dataset, "predictions", targets_map, update_mask_targets=True
    )
    
    # Edit grayscale values
    foul.transform_segmentations(
        dataset, "predictions", {1: 70, 2: 140, 3: 210}, update_mask_targets=True
    )
    
    # Convert back to RGB
    foul.transform_segmentations(
        dataset, "predictions", {70: "#FF6D04", 140: "#499CEF", 210: "#6D04FF"}
    )
    
    feature 
    opened by sashankaryal 1
Releases(v0.18.0)
  • v0.18.0(Nov 10, 2022)

    What's Changed

    • Release v0.17.0 by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2073
    • Merging v0.17 release into develop by @brimoor in https://github.com/voxel51/fiftyone/pull/2099
    • [HOTFIX] Release v0.17.1 (patch Python 3.7) by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2100
    • Main into develop by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2102
    • [HOTFIX] Backward Compatible App by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2103
    • Merging develop into main by @brimoor in https://github.com/voxel51/fiftyone/pull/2108
    • Fixes #1669 by @NeoKish in https://github.com/voxel51/fiftyone/pull/2107
    • Move plugin imports by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2109
    • Updating docs header/footer by @brimoor in https://github.com/voxel51/fiftyone/pull/2118
    • Fix documentation download links by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2116
    • YOLOv5DatasetExporter: Add flag to use export_dir for path value by @karsil in https://github.com/voxel51/fiftyone/pull/2114
    • Add option to import COCO annotation id by @dlangenk in https://github.com/voxel51/fiftyone/pull/2122
    • New Isolated Dataset Component by @ritch in https://github.com/voxel51/fiftyone/pull/2052
    • improve plugin install docs by @ritch in https://github.com/voxel51/fiftyone/pull/2125
    • Typo fixes by @oguz-hanoglu in https://github.com/voxel51/fiftyone/pull/2132
    • Dataset Reloading on Click by @ritch in https://github.com/voxel51/fiftyone/pull/2129
    • avoid using router context by @ritch in https://github.com/voxel51/fiftyone/pull/2137
    • fix worker fetch params by @ritch in https://github.com/voxel51/fiftyone/pull/2138
    • add test app for dataset embed component by @ritch in https://github.com/voxel51/fiftyone/pull/2139
    • Fix JSON/Help outside click handling by @ritch in https://github.com/voxel51/fiftyone/pull/2136
    • Fixing select_by() ID bug by @brimoor in https://github.com/voxel51/fiftyone/pull/2140
    • Automatic Docker address + moving instructions to the docs by @brimoor in https://github.com/voxel51/fiftyone/pull/2141
    • Adding schema() aggregation by @brimoor in https://github.com/voxel51/fiftyone/pull/1137
    • add note to plugin docs by @ritch in https://github.com/voxel51/fiftyone/pull/2148
    • add interpolation option for image resizing by @HoopsMcann in https://github.com/voxel51/fiftyone/pull/2128
    • Fix detectron2 tutorial by @ehofesmann in https://github.com/voxel51/fiftyone/pull/2152
    • Fix view expression sort documentation by @ehofesmann in https://github.com/voxel51/fiftyone/pull/2150
    • use 5151 local address instead of localhost by @ritch in https://github.com/voxel51/fiftyone/pull/2160
    • fix: create annotation run crashes if some but not all samples are labeled by @oddeirikigland in https://github.com/voxel51/fiftyone/pull/2145
    • only warn when plugin re-registered by @ritch in https://github.com/voxel51/fiftyone/pull/2159
    • DB config cleanup by @brimoor in https://github.com/voxel51/fiftyone/pull/2179
    • Update cvat.rst by @andife in https://github.com/voxel51/fiftyone/pull/2177
    • Update to MongoDB 6.0.2 for m1 Macs by @kaixi-wang in https://github.com/voxel51/fiftyone/pull/2165
    • Fix relay compilation and ensure future compilations in builds by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2182
    • add support for readOnly mode by @ritch in https://github.com/voxel51/fiftyone/pull/2181
    • Minor fixes to contributing.md by @NeoKish in https://github.com/voxel51/fiftyone/pull/2183
    • Handling grouped collections when sampling frames by @brimoor in https://github.com/voxel51/fiftyone/pull/2144
    • Refactor merge_samples() to safely cleanup in case of errors by @brimoor in https://github.com/voxel51/fiftyone/pull/2135
    • Fix qdrant tutorial by @kaixi-wang in https://github.com/voxel51/fiftyone/pull/2188
    • add info to dataset by @lauralindy in https://github.com/voxel51/fiftyone/pull/2198
    • Theme Refresh (with new light mode) by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2156
    • Fixes mutation of label tags from patches views in the App by @brimoor in https://github.com/voxel51/fiftyone/pull/2200
    • Support cuda devices for CLIP zoo model by @ehofesmann in https://github.com/voxel51/fiftyone/pull/2201
    • Update detection.py by @jacobmarks in https://github.com/voxel51/fiftyone/pull/2199
    • App bug reports by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2115
    • use theme based color for action row tooltip text by @imanjra in https://github.com/voxel51/fiftyone/pull/2202
    • Transparent looker background by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2207
    • Minor fixes to fiftyone/README.md by @NeoKish in https://github.com/voxel51/fiftyone/pull/2206
    • Optimizing tagging implementations by @brimoor in https://github.com/voxel51/fiftyone/pull/2203
    • fix flashlight clipping from height overflow by @imanjra in https://github.com/voxel51/fiftyone/pull/2212
    • Fix unset media field by @ritch in https://github.com/voxel51/fiftyone/pull/2217
    • reduce sidebar margin to fix left vertical edge by @imanjra in https://github.com/voxel51/fiftyone/pull/2211
    • looker arrow styles enhancements by @imanjra in https://github.com/voxel51/fiftyone/pull/2221
    • More intuitive behavior of exists() for frame fields by @brimoor in https://github.com/voxel51/fiftyone/pull/2209
    • More tagging optimization by @brimoor in https://github.com/voxel51/fiftyone/pull/2208
    • Allow frame views to edit source frame filepaths by @brimoor in https://github.com/voxel51/fiftyone/pull/2193
    • Remove old session client by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2225
    • fix typo in colorscale route by @kaixi-wang in https://github.com/voxel51/fiftyone/pull/2226
    • Upgrade server and MongoDB python requirements by @j053y in https://github.com/voxel51/fiftyone/pull/2215
    • Downgrade starlette by @j053y in https://github.com/voxel51/fiftyone/pull/2231
    • Update CVAT integration and docs to point to app.cvat.ai by @ehofesmann in https://github.com/voxel51/fiftyone/pull/2228
    • fix range slider value label style by @imanjra in https://github.com/voxel51/fiftyone/pull/2224
    • update view bar colors on theme change by @imanjra in https://github.com/voxel51/fiftyone/pull/2232
    • remove redundant font family styles by @imanjra in https://github.com/voxel51/fiftyone/pull/2233
    • fix label tag text color in light theme by @imanjra in https://github.com/voxel51/fiftyone/pull/2235
    • action row popover content color enhancements by @imanjra in https://github.com/voxel51/fiftyone/pull/2237
    • Migration using removed pymongo method by @j053y in https://github.com/voxel51/fiftyone/pull/2240
    • fix toggling field not capturing click some times by @imanjra in https://github.com/voxel51/fiftyone/pull/2234
    • fix json panel styles in light theme by @imanjra in https://github.com/voxel51/fiftyone/pull/2223
    • fix json/help panel not closing on control click by @imanjra in https://github.com/voxel51/fiftyone/pull/2242
    • Build 404 for SPA intex.html handling by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2243
    • fix looker3d controls styles in light theme by @imanjra in https://github.com/voxel51/fiftyone/pull/2236
    • Add Field Description and Info to App by @ritch in https://github.com/voxel51/fiftyone/pull/2241
    • Optimizing ordered select implementation by @brimoor in https://github.com/voxel51/fiftyone/pull/2227
    • Export state from dataset module by @ritch in https://github.com/voxel51/fiftyone/pull/2214
    • toggle sidebar entry only on clicking header by @imanjra in https://github.com/voxel51/fiftyone/pull/2247
    • Custom embedded fields in the App by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2239
    • Adding support for dynamic embedded document field schemas by @brimoor in https://github.com/voxel51/fiftyone/pull/1825
    • Sync router state by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2230
    • Adding support for field descriptions by @brimoor in https://github.com/voxel51/fiftyone/pull/2216
    • fix toggle error when click start event is unset by @imanjra in https://github.com/voxel51/fiftyone/pull/2251
    • Field desc fixups by @ritch in https://github.com/voxel51/fiftyone/pull/2252
    • Fix typo in get_dataloader by @kaixi-wang in https://github.com/voxel51/fiftyone/pull/2259
    • Add support for configuring the default App theme by @brimoor in https://github.com/voxel51/fiftyone/pull/2253
    • update color scheme on theme update by @imanjra in https://github.com/voxel51/fiftyone/pull/2263
    • App sidebar mode and optimizations by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2191
    • Strawberry kwargs by @brimoor in https://github.com/voxel51/fiftyone/pull/2266
    • Documenting app config resets by @brimoor in https://github.com/voxel51/fiftyone/pull/2269
    • Sidebar resets by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2271
    • Removed extra title by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2274

    New Contributors

    • @NeoKish made their first contribution in https://github.com/voxel51/fiftyone/pull/2107
    • @karsil made their first contribution in https://github.com/voxel51/fiftyone/pull/2114
    • @dlangenk made their first contribution in https://github.com/voxel51/fiftyone/pull/2122
    • @oguz-hanoglu made their first contribution in https://github.com/voxel51/fiftyone/pull/2132
    • @HoopsMcann made their first contribution in https://github.com/voxel51/fiftyone/pull/2128
    • @oddeirikigland made their first contribution in https://github.com/voxel51/fiftyone/pull/2145
    • @andife made their first contribution in https://github.com/voxel51/fiftyone/pull/2177
    • @kaixi-wang made their first contribution in https://github.com/voxel51/fiftyone/pull/2165
    • @lauralindy made their first contribution in https://github.com/voxel51/fiftyone/pull/2198
    • @jacobmarks made their first contribution in https://github.com/voxel51/fiftyone/pull/2199

    Full Changelog: https://github.com/voxel51/fiftyone/compare/v0.17.0...v0.18.0

    Source code(tar.gz)
    Source code(zip)
  • desktop-v0.24.0(Nov 10, 2022)

  • db-v0.4.0(Nov 8, 2022)

  • v0.17.2(Sep 21, 2022)

    What's Changed

    • [HOTFIX] Release v0.17.1 (patch Python 3.7) by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2100

    Full Changelog: https://github.com/voxel51/fiftyone/compare/v0.17.0...v0.17.2

    Source code(tar.gz)
    Source code(zip)
  • desktop-v0.23.2(Sep 21, 2022)

  • v0.17.1(Sep 20, 2022)

  • desktop-v0.23.1(Sep 20, 2022)

  • v0.17.0(Sep 19, 2022)

    What's Changed

    • Releases v0.16.3 and v0.16.4 by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1896
    • Release v0.16.5 by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1907
    • Fix custom_parser implementation in recipe by @idow09 in https://github.com/voxel51/fiftyone/pull/1909
    • Adding support for serializing Aggregations by @brimoor in https://github.com/voxel51/fiftyone/pull/1911
    • Adding support for customizing the output location of to_frames() by @neuralsyn in https://github.com/voxel51/fiftyone/pull/1798
    • Fix bug when loading group ids in CVAT video tasks by @ehofesmann in https://github.com/voxel51/fiftyone/pull/1917
    • Handle sample tags with "." in App by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1924
    • [BUG] Resolve bug when uploading to projects in CVAT by @ehofesmann in https://github.com/voxel51/fiftyone/pull/1926
    • Fix result alignment in App by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1930
    • Fix refresh after in App view change by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1931
    • Fix App mask targets by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1943
    • Fix App masks by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1949
    • Plugins + Groups by @ritch in https://github.com/voxel51/fiftyone/pull/1954
    • Adding quantiles aggregation by @brimoor in https://github.com/voxel51/fiftyone/pull/1937
    • Pinned Samples by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1963
    • Move point cloud plugin and settings by @ritch in https://github.com/voxel51/fiftyone/pull/1968
    • Merge Dataset media fields into Plugins and Groups by @ritch in https://github.com/voxel51/fiftyone/pull/1969
    • [WIP] Adding support for serializing and deserializing dynamic non-JSON fields by @brimoor in https://github.com/voxel51/fiftyone/pull/1938
    • Merge latest branch into plugins-and-groups by @ritch in https://github.com/voxel51/fiftyone/pull/1972
    • Fix session views by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1980
    • update tabulate to 0.8.10 for source install by @imanjra in https://github.com/voxel51/fiftyone/pull/1979
    • CVAT Annotate attribute documentation update by @geoffrp in https://github.com/voxel51/fiftyone/pull/1973
    • GeoJSONField Map Plot by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1976
    • #1951 and #1952 by @brimoor in https://github.com/voxel51/fiftyone/pull/1953
    • Fixing #1966 by @brimoor in https://github.com/voxel51/fiftyone/pull/1967
    • Adding weighted_sample() and balanced_sample() utils by @brimoor in https://github.com/voxel51/fiftyone/pull/1925
    • Passing attributes through during label coercions by @brimoor in https://github.com/voxel51/fiftyone/pull/1993
    • v0.17.0rc0 by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2003
    • Adding plotly v5 support! by @brimoor in https://github.com/voxel51/fiftyone/pull/1981
    • CVAT optimizations by @ehofesmann in https://github.com/voxel51/fiftyone/pull/1944
    • Extending stats() method to sample collections by @brimoor in https://github.com/voxel51/fiftyone/pull/1940
    • Groups (adding App support) by @ritch in https://github.com/voxel51/fiftyone/pull/1955
    • Adding new_ids=True option to Dataset.add_collection() by @brimoor in https://github.com/voxel51/fiftyone/pull/1927
    • Bug fixes by @brimoor in https://github.com/voxel51/fiftyone/pull/1922
    • Label studio integration by @Rusteam in https://github.com/voxel51/fiftyone/pull/1848
    • Adding support for writing transformed images/videos to new location/field by @brimoor in https://github.com/voxel51/fiftyone/pull/2007
    • Label studio updates by @ehofesmann in https://github.com/voxel51/fiftyone/pull/2006
    • Save context tweaks by @brimoor in https://github.com/voxel51/fiftyone/pull/2012
    • Adding ipywidgets<8 requirement by @brimoor in https://github.com/voxel51/fiftyone/pull/2011
    • Package-wide logging config by @brimoor in https://github.com/voxel51/fiftyone/pull/2009
    • Adding a dataset save context by @j053y in https://github.com/voxel51/fiftyone/pull/1727
    • Fix Issue #1903 path variable by @victor1cea in https://github.com/voxel51/fiftyone/pull/2016
    • Adding client compatibility versions by @brimoor in https://github.com/voxel51/fiftyone/pull/2017
    • add mediafield support to looker3d by @ritch in https://github.com/voxel51/fiftyone/pull/2022
    • Fix documentation builds by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2023
    • Error handling for Looker3D by @ritch in https://github.com/voxel51/fiftyone/pull/2015
    • common json panel for 2d/3d lookers by @ritch in https://github.com/voxel51/fiftyone/pull/2021
    • Release v0.16.6 by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2008
    • refactor tooltips for 3d by @ritch in https://github.com/voxel51/fiftyone/pull/2024
    • Fix README slack links by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2031
    • Merging v0.16.6 into groups by @brimoor in https://github.com/voxel51/fiftyone/pull/2034
    • Don't include runs when merging collections by @brimoor in https://github.com/voxel51/fiftyone/pull/2030
    • Adding option to export per-sample JSON in FiftyOneDataset format by @brimoor in https://github.com/voxel51/fiftyone/pull/2028
    • Groups zoo fixes by @brimoor in https://github.com/voxel51/fiftyone/pull/2039
    • Fixing match_frames() bug by @brimoor in https://github.com/voxel51/fiftyone/pull/2029
    • Remove old session module by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2041
    • Adding grouped dataset importer/exporter interfaces by @brimoor in https://github.com/voxel51/fiftyone/pull/2035
    • Groups cleaning and video fix by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2046
    • Fix group session updates by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2026
    • Looker3d: add color by instance and label support by @ritch in https://github.com/voxel51/fiftyone/pull/2045
    • Looker3d hotkeys by @ritch in https://github.com/voxel51/fiftyone/pull/2032
    • Keep app_config in sync with dataset schema changes by @brimoor in https://github.com/voxel51/fiftyone/pull/2043
    • Adding support for linking directly to imported subpackage contents by @brimoor in https://github.com/voxel51/fiftyone/pull/2048
    • Optimizing group selection in server get_view() by @brimoor in https://github.com/voxel51/fiftyone/pull/2055
    • Improving groups migration by @brimoor in https://github.com/voxel51/fiftyone/pull/2053
    • Fixing custom embedded documents regression by @brimoor in https://github.com/voxel51/fiftyone/pull/2051
    • Persistent group slice in expanded view by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2025
    • Bugfixes for Groups/Looker3D by @ritch in https://github.com/voxel51/fiftyone/pull/2056
    • Adding plugins docs/env var by @brimoor in https://github.com/voxel51/fiftyone/pull/2061
    • Update install.rst by @GeorgePearse in https://github.com/voxel51/fiftyone/pull/2068
    • Fixing select_by() bug by @brimoor in https://github.com/voxel51/fiftyone/pull/2059
    • Adding rel_dir to export() and draw_labels() by @brimoor in https://github.com/voxel51/fiftyone/pull/2060
    • Add CLIP to the model zoo by @Rusteam in https://github.com/voxel51/fiftyone/pull/1691
    • Group statistics and tagging mode by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2038
    • Fix Colab sessions and screenshotting by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2069
    • Update evaluate detections notebook to use only_matches=False when filtering labels by @ehofesmann in https://github.com/voxel51/fiftyone/pull/2071
    • Fix CVAT bug when checking if a task exists by @ehofesmann in https://github.com/voxel51/fiftyone/pull/2070
    • Add Detectron2 tutorial by @ehofesmann in https://github.com/voxel51/fiftyone/pull/2054
    • Load all COCO label types by default by @brimoor in https://github.com/voxel51/fiftyone/pull/1869
    • Removing cv2 colab fix by @brimoor in https://github.com/voxel51/fiftyone/pull/2058
    • Session group slice by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2044
    • Resolve Labelstudio task_map key error by @ehofesmann in https://github.com/voxel51/fiftyone/pull/2074
    • CLIP tweaks by @brimoor in https://github.com/voxel51/fiftyone/pull/2072
    • Looker3D Settings Issue by @ritch in https://github.com/voxel51/fiftyone/pull/2075
    • Fix Looker3D escape sequence by @ritch in https://github.com/voxel51/fiftyone/pull/2076
    • fix pinned sample not clearing by @ritch in https://github.com/voxel51/fiftyone/pull/2081
    • Add Qdrant Tutorial by @ehofesmann in https://github.com/voxel51/fiftyone/pull/2082
    • fix L3D hotkey targeting by @ritch in https://github.com/voxel51/fiftyone/pull/2083
    • App groups fixes by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2079
    • Don't regenerate IDs when copying Group instances by @brimoor in https://github.com/voxel51/fiftyone/pull/2086
    • Fix CVAT task id bug and add task download progress bar by @ehofesmann in https://github.com/voxel51/fiftyone/pull/2087
    • Update Qdrant tutorial by @ehofesmann in https://github.com/voxel51/fiftyone/pull/2089
    • Tagging simplification and server tests by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2093
    • Adding support for grouped datasets by @brimoor in https://github.com/voxel51/fiftyone/pull/1765
    • Use UUIDs in dataset collection names by @brimoor in https://github.com/voxel51/fiftyone/pull/2097

    New Contributors

    • @idow09 made their first contribution in https://github.com/voxel51/fiftyone/pull/1909
    • @imanjra made their first contribution in https://github.com/voxel51/fiftyone/pull/1979
    • @geoffrp made their first contribution in https://github.com/voxel51/fiftyone/pull/1973
    • @GeorgePearse made their first contribution in https://github.com/voxel51/fiftyone/pull/2068

    Full Changelog: https://github.com/voxel51/fiftyone/compare/v0.16.5...v0.17.0

    Source code(tar.gz)
    Source code(zip)
  • desktop-v0.23.0(Sep 19, 2022)

  • v0.16.6(Aug 25, 2022)

    What's Changed

    • Releases v0.16.3 and v0.16.4 by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1896
    • Release v0.16.5 by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1907
    • Fix custom_parser implementation in recipe by @idow09 in https://github.com/voxel51/fiftyone/pull/1909
    • Adding support for serializing Aggregations by @brimoor in https://github.com/voxel51/fiftyone/pull/1911
    • Adding support for customizing the output location of to_frames() by @neuralsyn in https://github.com/voxel51/fiftyone/pull/1798
    • Fix bug when loading group ids in CVAT video tasks by @ehofesmann in https://github.com/voxel51/fiftyone/pull/1917
    • Handle sample tags with "." in App by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1924
    • [BUG] Resolve bug when uploading to projects in CVAT by @ehofesmann in https://github.com/voxel51/fiftyone/pull/1926
    • Fix result alignment in App by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1930
    • Fix refresh after in App view change by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1931
    • Fix App mask targets by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1943
    • Fix App masks by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1949
    • Adding quantiles aggregation by @brimoor in https://github.com/voxel51/fiftyone/pull/1937
    • [WIP] Adding support for serializing and deserializing dynamic non-JSON fields by @brimoor in https://github.com/voxel51/fiftyone/pull/1938
    • Fix session views by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1980
    • update tabulate to 0.8.10 for source install by @imanjra in https://github.com/voxel51/fiftyone/pull/1979
    • CVAT Annotate attribute documentation update by @geoffrp in https://github.com/voxel51/fiftyone/pull/1973
    • #1951 and #1952 by @brimoor in https://github.com/voxel51/fiftyone/pull/1953
    • Fixing #1966 by @brimoor in https://github.com/voxel51/fiftyone/pull/1967
    • Adding weighted_sample() and balanced_sample() utils by @brimoor in https://github.com/voxel51/fiftyone/pull/1925
    • Passing attributes through during label coercions by @brimoor in https://github.com/voxel51/fiftyone/pull/1993
    • Adding plotly v5 support! by @brimoor in https://github.com/voxel51/fiftyone/pull/1981
    • CVAT optimizations by @ehofesmann in https://github.com/voxel51/fiftyone/pull/1944
    • Extending stats() method to sample collections by @brimoor in https://github.com/voxel51/fiftyone/pull/1940
    • Adding new_ids=True option to Dataset.add_collection() by @brimoor in https://github.com/voxel51/fiftyone/pull/1927
    • Bug fixes by @brimoor in https://github.com/voxel51/fiftyone/pull/1922
    • Label studio integration by @Rusteam in https://github.com/voxel51/fiftyone/pull/1848
    • Adding support for writing transformed images/videos to new location/field by @brimoor in https://github.com/voxel51/fiftyone/pull/2007
    • Label studio updates by @ehofesmann in https://github.com/voxel51/fiftyone/pull/2006
    • Save context tweaks by @brimoor in https://github.com/voxel51/fiftyone/pull/2012
    • Adding ipywidgets<8 requirement by @brimoor in https://github.com/voxel51/fiftyone/pull/2011
    • Package-wide logging config by @brimoor in https://github.com/voxel51/fiftyone/pull/2009
    • Adding a dataset save context by @j053y in https://github.com/voxel51/fiftyone/pull/1727
    • Fix Issue #1903 path variable by @victor1cea in https://github.com/voxel51/fiftyone/pull/2016
    • Adding client compatibility versions by @brimoor in https://github.com/voxel51/fiftyone/pull/2017
    • Fix documentation builds by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/2023

    New Contributors

    • @idow09 made their first contribution in https://github.com/voxel51/fiftyone/pull/1909
    • @imanjra made their first contribution in https://github.com/voxel51/fiftyone/pull/1979
    • @geoffrp made their first contribution in https://github.com/voxel51/fiftyone/pull/1973

    Full Changelog: https://github.com/voxel51/fiftyone/compare/v0.16.5...v0.16.6

    Source code(tar.gz)
    Source code(zip)
  • desktop-v0.22.2(Aug 25, 2022)

  • v0.16.5(Jun 24, 2022)

  • desktop-v0.22.1(Jun 24, 2022)

  • v0.16.4(Jun 21, 2022)

    What's Changed

    • Fix App frame fields by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1899

    Full Changelog: https://github.com/voxel51/fiftyone/compare/v0.16.3...v0.16.4

    Source code(tar.gz)
    Source code(zip)
  • v0.16.3(Jun 20, 2022)

    What's Changed

    • Docs tweaks by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1797
    • Release v0.16.1 by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1796
    • adding filename exception logging for failed xml parsing by @neuralsyn in https://github.com/voxel51/fiftyone/pull/1793
    • bump matplotlib to latest by @ritch in https://github.com/voxel51/fiftyone/pull/1774
    • Fix App page views by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1805
    • change esc ordering for videos by @ritch in https://github.com/voxel51/fiftyone/pull/1810
    • OpenLABEL importer updates by @ehofesmann in https://github.com/voxel51/fiftyone/pull/1812
    • FFmpeg App Error by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1801
    • Bump httpx from 0.7.7 to 0.23.0 in /requirements by @dependabot in https://github.com/voxel51/fiftyone/pull/1813
    • Add keyboard shortcut to temporarily hide all labels in the App by @ritch in https://github.com/voxel51/fiftyone/pull/1779
    • Release v0.16.2 by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1808
    • Fixing DB field bug by @brimoor in https://github.com/voxel51/fiftyone/pull/1824
    • App v0.16.0 bugs by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1828
    • add concurrent app+backend run script by @ritch in https://github.com/voxel51/fiftyone/pull/1800
    • Add utility to convert classifications to detections by @ehofesmann in https://github.com/voxel51/fiftyone/pull/1842
    • Update how CVAT task and project pages are requested by @ehofesmann in https://github.com/voxel51/fiftyone/pull/1839
    • Fix bug when using zoo models with newest version of Torchvision by @ehofesmann in https://github.com/voxel51/fiftyone/pull/1838
    • Always use fork for multiprocessing on macOS by @brimoor in https://github.com/voxel51/fiftyone/pull/1844
    • Update docs to match new quickstart attribute format by @ehofesmann in https://github.com/voxel51/fiftyone/pull/1857
    • Let shard enumeration start from 0 by @laserK3000 in https://github.com/voxel51/fiftyone/pull/1859
    • Stop passing classes and default_classes to export and evaluation methods by @brimoor in https://github.com/voxel51/fiftyone/pull/1858
    • Fix JSON view nested values by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1880
    • Fix selection and expansion for bad media files by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1882
    • Serialize views as BSON by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1879
    • updates FIFTYONE_DEFAULT_APP_ADDRESS documentation by @findtopher in https://github.com/voxel51/fiftyone/pull/1891
    • Adds the ability to upload and download group ids from CVAT by @ehofesmann in https://github.com/voxel51/fiftyone/pull/1876
    • Remove thumbnail frame classifications by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1877
    • eliminate non-XML or non-TXT files from CVAT, KITTI, CVATVideo by @victor1cea in https://github.com/voxel51/fiftyone/pull/1884
    • Bringing back the current section highlight! by @brimoor in https://github.com/voxel51/fiftyone/pull/1861
    • Adding support for label field dicts when importing labeled datasets by @brimoor in https://github.com/voxel51/fiftyone/pull/1864
    • Adding dataset tags by @brimoor in https://github.com/voxel51/fiftyone/pull/1845
    • Big Picture script by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1892
    • Maintain active dataset fields by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1878
    • Fix expanded view filtered tagging by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1834
    • Nullable GraphQL API by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1829
    • App issues by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1875
    • App distributions fixes by @benjaminpkane in https://github.com/voxel51/fiftyone/pull/1817

    New Contributors

    • @ritch made their first contribution in https://github.com/voxel51/fiftyone/pull/1774
    • @laserK3000 made their first contribution in https://github.com/voxel51/fiftyone/pull/1859
    • @victor1cea made their first contribution in https://github.com/voxel51/fiftyone/pull/1884

    Full Changelog: https://github.com/voxel51/fiftyone/compare/v0.16.2...v0.16.3

    Source code(tar.gz)
    Source code(zip)
  • desktop-v0.22.0(Jun 20, 2022)

  • v0.16.2(Jun 2, 2022)

  • desktop-v0.21.2(Jun 2, 2022)

  • v0.16.1(May 26, 2022)

  • desktop-v0.21.1(May 26, 2022)

  • v0.16.0(May 24, 2022)

  • desktop-v0.21.0(May 24, 2022)

  • v0.15.1(Apr 26, 2022)

  • desktop-v0.20.1(Apr 26, 2022)

  • desktop-v0.20.0(Apr 26, 2022)

  • v0.15.0.2(Apr 24, 2022)

  • desktop-v0.19.5(Apr 11, 2022)

  • v0.15.0.1(Mar 24, 2022)

  • desktop-v0.19.4(Mar 24, 2022)

  • v0.15.0(Mar 23, 2022)

An easy to use burndown chart generator for GitHub Project Boards.

Burndown Chart for GitHub Projects An easy to use burndown chart generator for GitHub Project Boards. Table of Contents Features Installation Assumpti

Joseph Hale 15 Dec 28, 2022
Automatically generate GitHub activity!

Commit Bot Automatically generate GitHub activity! We've all wanted to be the developer that commits every day, but that requires a lot of work. Let's

Ricky 4 Jun 07, 2022
A script written in Python that generate output custom color (HEX or RGB input to x1b hexadecimal)

ColorShell ─ 1.5 Planned for v2: setup.sh for setup alias This script converts HEX and RGB code to x1b x1b is code for colorize outputs, works on ou

Riley 4 Oct 31, 2021
Schema validation for Xarray objects

xarray-schema Schema validation for Xarray installation This package is in the early stages of development. Install it from source: pip install git+gi

carbonplan 22 Oct 31, 2022
Area-weighted venn-diagrams for Python/matplotlib

Venn diagram plotting routines for Python/Matplotlib Routines for plotting area-weighted two- and three-circle venn diagrams. Installation The simples

Konstantin Tretyakov 400 Dec 31, 2022
PyFlow is a general purpose visual scripting framework for python

PyFlow is a general purpose visual scripting framework for python. State Base structure of program implemented, such things as packages disco

1.8k Jan 07, 2023
A python wrapper for creating and viewing effects for Matt Parker's christmas tree.

Christmas Tree Visualizer A python wrapper for creating and viewing effects for Matt Parker's christmas tree. Displays py or csv effect files and allo

4 Nov 22, 2022
Automatically visualize your pandas dataframe via a single print! 📊 💡

A Python API for Intelligent Visual Discovery Lux is a Python library that facilitate fast and easy data exploration by automating the visualization a

Lux 4.3k Dec 28, 2022
Visualize the bitcoin blockchain from your local node

Project Overview A new feature in Bitcoin Core 0.20 allows users to dump the state of the blockchain (the UTXO set) using the command dumptxoutset. I'

18 Sep 11, 2022
3D plotting and mesh analysis through a streamlined interface for the Visualization Toolkit (VTK)

PyVista Deployment Build Status Metrics Citation License Community 3D plotting and mesh analysis through a streamlined interface for the Visualization

PyVista 1.6k Jan 08, 2023
plotly scatterplots which show molecule images on hover!

molplotly Plotly scatterplots which show molecule images on hovering over the datapoints! Required packages: pandas rdkit jupyter_dash ➡️ See example.

150 Dec 28, 2022
Generate visualizations of GitHub user and repository statistics using GitHub Actions.

GitHub Stats Visualization Generate visualizations of GitHub user and repository statistics using GitHub Actions. This project is currently a work-in-

JoelImgu 3 Dec 14, 2022
Flow-based visual scripting for Python

A simple visual node editor for Python Ryven combines flow-based visual scripting with Python. It gives you absolute freedom for your nodes and a simp

Leon Thomm 3.1k Jan 06, 2023
High performance, editable, stylable datagrids in jupyter and jupyterlab

An ipywidgets wrapper of regular-table for Jupyter. Examples Two Billion Rows Notebook Click Events Notebook Edit Events Notebook Styling Notebook Pan

J.P. Morgan Chase 75 Dec 15, 2022
Sprint planner considering JIRA issues and google calendar meetings schedule.

Sprint planner Sprint planner is a Python script for planning your Jira tasks based on your calendar availability. Installation Use the package manage

Apptension 2 Dec 05, 2021
Python script for writing text on github contribution chart.

Github Contribution Drawer Python script for writing text on github contribution chart. Requirements Python 3.X Getting Started Create repository Put

Steven 0 May 27, 2022
Insert SVGs into matplotlib

Insert SVGs into matplotlib

Andrew White 35 Dec 29, 2022
Visual Python is a GUI-based Python code generator, developed on the Jupyter Notebook environment as an extension.

Visual Python is a GUI-based Python code generator, developed on the Jupyter Notebook environment as an extension.

Visual Python 564 Jan 03, 2023
Alternative layout visualizer for ZSA Moonlander keyboard

General info This is a keyboard layout visualizer for ZSA Moonlander keyboard (because I didn't find their Oryx or their training tool particularly us

10 Jul 19, 2022
Personal IMDB Graphs with Bokeh

Personal IMDB Graphs with Bokeh Do you like watching movies and also rate all of them in IMDB? Would you like to look at your IMDB stats based on your

2 Dec 15, 2021