From 100afe6dd82bf3ab362943a43d027530d24a11d5 Mon Sep 17 00:00:00 2001 From: "Jeremy A. Prescott" Date: Thu, 14 Sep 2023 16:23:01 +0200 Subject: [PATCH] Jeremy lig 3948 make ssl docs more distinct (#1394) closes lig-3948 - replace logos to highlight we are talking about `Lightly SSL` and not about `"Lightly"` - replace all self-references to `lightly` with `Lightly SSL` or clarify when needed that its `Lightly Worker` - add banner referring to the `Lightly Worker` docs - pimp footer and add link to github and worker docs --- README.md | 12 ++++--- docs/logos/lightly_SSL_logo_crop.png | Bin 0 -> 30830 bytes .../lightly_SSL_logo_crop_white_text.png | Bin 0 -> 16755 bytes docs/source/_templates/footer.html | 8 ++++- docs/source/_templates/layout.html | 30 ++++++++++++++++ docs/source/conf.py | 6 ++-- docs/source/docker/advanced/datapool.rst | 6 ++-- .../docker/advanced/datasource_metadata.rst | 14 ++++---- .../advanced/datasource_predictions.rst | 26 +++++++------- .../advanced/load_model_from_checkpoint.rst | 4 +-- docs/source/docker/advanced/object_level.rst | 18 +++++----- docs/source/docker/advanced/overview.rst | 2 +- .../docker/configuration/configuration.rst | 12 +++---- .../docker/examples/datasets_in_the_wild.rst | 2 +- .../docker/getting_started/first_steps.rst | 19 +++++----- .../hardware_recommendations.rst | 4 +-- .../docker/getting_started/selection.rst | 18 +++++----- docs/source/docker/getting_started/setup.rst | 16 ++++----- docs/source/docker/integration/overview.rst | 2 +- docs/source/docker/known_issues_faq.rst | 8 ++--- docs/source/docker/overview.rst | 2 +- .../configuration/configuration.rst | 2 +- .../getting_started/first_steps.rst | 2 +- .../docker_archive/known_issues_faq.rst | 2 +- docs/source/docker_archive/overview.rst | 4 +-- docs/source/getting_started/advanced.rst | 24 ++++++------- docs/source/getting_started/benchmarks.rst | 2 +- .../getting_started/command_line_tool.rst | 12 +++---- .../getting_started/distributed_training.rst | 4 +-- docs/source/getting_started/install.rst | 12 +++---- .../getting_started/lightly_at_a_glance.rst | 16 ++++----- docs/source/getting_started/main_concepts.rst | 20 +++++------ docs/source/index.rst | 31 ++++++++-------- docs/source/lightly.cli.rst | 2 +- docs/source/tutorials/package.rst | 4 +-- docs/source/tutorials/platform.rst | 4 +-- .../source/tutorials/structure_your_input.rst | 34 +++++++++--------- 37 files changed, 212 insertions(+), 172 deletions(-) create mode 100644 docs/logos/lightly_SSL_logo_crop.png create mode 100644 docs/logos/lightly_SSL_logo_crop_white_text.png diff --git a/README.md b/README.md index 4a7bea998..587b4945f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -![Lightly Logo](docs/logos/lightly_logo_crop.png) +![Lightly SSL self-supervised learning Logo](docs/logos/lightly_SSL_logo_crop.png) ![GitHub](https://img.shields.io/github/license/lightly-ai/lightly) ![Unit Tests](https://github.com/lightly-ai/lightly/workflows/Unit%20Tests/badge.svg) @@ -7,19 +7,21 @@ [![Downloads](https://static.pepy.tech/badge/lightly)](https://pepy.tech/project/lightly) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) -Lightly is a computer vision framework for self-supervised learning. +Lightly SSL is a computer vision framework for self-supervised learning. - [Documentation](https://docs.lightly.ai/self-supervised-learning/) - [Github](https://github.com/lightly-ai/lightly) - [Discord](https://discord.gg/xvNJW94) (We have weekly paper sessions!) -We also built a whole platform on top, with additional features for active learning -and data curation. If you're interested in the platform, check out [lightly.ai](https://www.lightly.ai). +We've also built a whole platform on top, with additional features for active learning +and [data curation](https://docs.lightly.ai/docs/what-is-lightly). If you're interested in the +Lightly Worker Solution to easily process millions of samples and run [powerful algorithms](https://docs.lightly.ai/docs/selection) +on your data, check out [lightly.ai](https://www.lightly.ai). It's free to get started! ## Features -This framework offers the following features: +This self-supervised learning framework offers the following features: - Modular framework, which exposes low-level building blocks such as loss functions and model heads. diff --git a/docs/logos/lightly_SSL_logo_crop.png b/docs/logos/lightly_SSL_logo_crop.png new file mode 100644 index 0000000000000000000000000000000000000000..62028eaf2c2853ad3a9abc708f310d7b57e64c30 GIT binary patch literal 30830 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 Zn);?y8M}|?@#`W0Ica673JK$&{{uTe(j))? literal 0 HcmV?d00001 diff --git a/docs/source/_templates/footer.html b/docs/source/_templates/footer.html index 86060f5ef..217e11623 100644 --- a/docs/source/_templates/footer.html +++ b/docs/source/_templates/footer.html @@ -26,7 +26,13 @@ {%- else %} {% set copyright = copyright|e %} - © {% trans %}Copyright{% endtrans %} {{ copyright_year }}, {{ copyright }} + © {% trans %}Copyright{% endtrans %} {{ copyright_year }} +  | {{ copyright }} +  |  + Lightly SSL source code + Source Code + +  | Lightly Worker Solution documentation {%- endif %} {%- endif %} diff --git a/docs/source/_templates/layout.html b/docs/source/_templates/layout.html index bcf32e9f5..e39f8042f 100644 --- a/docs/source/_templates/layout.html +++ b/docs/source/_templates/layout.html @@ -8,6 +8,36 @@ We need this to override the footer --> {%- block content %} + +
+ Looking to easily do active learning on millions of samples? See our Lighly Worker docs. +
{% if theme_style_external_links|tobool %} -Check the installation of lightly ------------------------------------ -To see if the lightly command-line tool was installed correctly, you can run the -following command which will print the installed lightly version: +Check the installation of Lightly SSL +------------------------------------- +To see if the Lightly SSL command-line tool was installed correctly, you can run the +following command which will print the version of the installed Lightly SSL package: .. code-block:: bash lightly-version -If lightly was installed correctly, you should see something like this: +If Lightly SSL was installed correctly, you should see something like this: .. code-block:: bash diff --git a/docs/source/getting_started/distributed_training.rst b/docs/source/getting_started/distributed_training.rst index e1b140c28..30daefd7b 100644 --- a/docs/source/getting_started/distributed_training.rst +++ b/docs/source/getting_started/distributed_training.rst @@ -3,7 +3,7 @@ Distributed Training ==================== -Lightly supports training your model on multiple GPUs using Pytorch Lightning +Lightly SSL supports training your model on multiple GPUs using Pytorch Lightning and Distributed Data Parallel (DDP) training. You can find reference implementations for all our models in the :ref:`models` section. @@ -12,7 +12,7 @@ Training with multiple gpus is also available from the command line: :ref:`cli-t For details on distributed training we recommend the following pages: - `Pytorch Distributed Overview `_ -- `Pytorch Lightning Multi-GPU Training `_ +- `Pytorch Lightning Multi-GPU Training `_ There are different levels of synchronization for distributed training. One can diff --git a/docs/source/getting_started/install.rst b/docs/source/getting_started/install.rst index e05f61fc8..20f5e7fa7 100644 --- a/docs/source/getting_started/install.rst +++ b/docs/source/getting_started/install.rst @@ -4,24 +4,24 @@ Installation Supported Python versions ------------------------- -Lightly requires Python 3.6+. We recommend installing Lighlty in a Linux or OSX environment. +Lightly SSL requires Python 3.6+. We recommend installing Lightly SSL in a Linux or OSX environment. .. _rst-installing: -Installing Lightly ------------------- +Installing Lightly SSL +---------------------- -You can install Lightly and its dependencies from PyPi with: +You can install Lightly SSL and its dependencies from PyPi with: .. code-block:: bash pip install lightly -We strongly recommend that you install Lightly in a dedicated virtualenv, to avoid conflicting with your system packages. +We strongly recommend that you install Lightly SSL in a dedicated virtualenv, to avoid conflicting with your system packages. Dependencies ------------ -Lightly currently uses `PyTorch `_ as the underlying deep learning framework. +Lightly SSL currently uses `PyTorch `_ as the underlying deep learning framework. On top of PyTorch we use `Hydra `_ for managing configurations and `PyTorch Lightning `_ for training models. diff --git a/docs/source/getting_started/lightly_at_a_glance.rst b/docs/source/getting_started/lightly_at_a_glance.rst index e4b4af2f6..78361da69 100644 --- a/docs/source/getting_started/lightly_at_a_glance.rst +++ b/docs/source/getting_started/lightly_at_a_glance.rst @@ -3,14 +3,14 @@ Self-supervised learning ======================== -Lightly is a computer vision framework for training deep learning models using self-supervised learning. +Lightly SSL is a computer vision framework for training deep learning models using self-supervised learning. The framework can be used for a wide range of useful applications such as finding the nearest neighbors, similarity search, transfer learning, or data analytics. -How Lightly Works ------------------ -The flexible design of Lightly makes it easy to integrate in your Python code. Lightly is built +How Lightly SSL Works +--------------------- +The flexible design of Lightly SSL makes it easy to integrate in your Python code. Lightly SSL is built completely around PyTorch and the different pieces can be put together to fit *your* requirements. Data and Transformations @@ -219,12 +219,12 @@ Furthermore, the ResNet backbone can be used for transfer and few-shot learning. Self-supervised learning does not require labels for a model to be trained on. Lightly, however, supports the use of additional labels. For example, if you train a model on a folder 'cats' with subfolders 'Maine Coon', 'Bengal' and 'British Shorthair' - Lightly automatically returns the enumerated labels as a list. + Lightly SSL automatically returns the enumerated labels as a list. -Lightly in Three Lines ----------------------------------------- +Lightly SSL in Three Lines +-------------------------- -Lightly also offers an easy-to-use interface. The following lines show how the package can +Lightly SSL also offers an easy-to-use interface. The following lines show how the package can be used to train a model with self-supervision and create embeddings with only three lines of code. diff --git a/docs/source/getting_started/main_concepts.rst b/docs/source/getting_started/main_concepts.rst index a891539b3..245009287 100644 --- a/docs/source/getting_started/main_concepts.rst +++ b/docs/source/getting_started/main_concepts.rst @@ -6,18 +6,18 @@ Main Concepts Self-Supervised Learning ------------------------ -The figure below shows an overview of the different concepts used by the Lightly package +The figure below shows an overview of the different concepts used by the Lightly SSL package and a schema of how they interact. The expressions in **bold** are explained further below. .. figure:: images/lightly_overview.png - :align: center - :alt: Lightly Overview + :align: center + :alt: Lightly SSL Overview - Overview of the different concepts used by the Lightly package and how they interact. + Overview of the different concepts used by the Lightly SSL package and how they interact. * **Dataset** - In Lightly, datasets are accessed through :py:class:`~lightly.data.dataset.LightlyDataset`. + In Lightly SSL, datasets are accessed through :py:class:`~lightly.data.dataset.LightlyDataset`. You can create a :py:class:`~lightly.data.dataset.LightlyDataset` from a directory of images or videos, or directly from a `torchvision dataset `_. You can learn more about this in our tutorial: @@ -36,7 +36,7 @@ below. * **Collate Function** The collate function aggregates the views of multiple images into a single batch. - You can use the default collate function. Lightly also provides a + You can use the default collate function. Lightly SSL also provides a :py:class:`~lightly.data.multi_view_collate.MultiViewCollate` * **Dataloader** @@ -56,7 +56,7 @@ below. They project the outputs of the backbone, commonly called *embeddings*, *representations*, or *features*, into a new space in which the loss is calculated. This has been found to be hugely beneficial instead of directly calculating the loss - on the embeddings. Lightly provides common :py:mod:`~lightly.models.modules.heads` + on the embeddings. Lightly SSL provides common :py:mod:`~lightly.models.modules.heads` that can be added to any backbone. * **Model** @@ -71,17 +71,17 @@ below. * :ref:`sphx_glr_tutorials_package_tutorial_simsiam_esa.py` * **Loss** - The loss function plays a crucial role in self-supervised learning. Lightly provides + The loss function plays a crucial role in self-supervised learning. Lightly SSL provides common loss functions in the :py:mod:`~lightly.loss` module. * **Optimizer** - With Lightly, you can use any `PyTorch optimizer `_ + With Lightly SSL, you can use any `PyTorch optimizer `_ to train your model. * **Training** The model can either be trained using a plain `PyTorch training loop `_ or with a dedicated framework such as `PyTorch Lightning `_. - Lightly lets you choose what is best for you. Check out our :ref:`models ` and + Lightly SSL lets you choose what is best for you. Check out our :ref:`models ` and `tutorials `_ sections on how to train models with PyTorch or PyTorch Lightning. diff --git a/docs/source/index.rst b/docs/source/index.rst index c4e02bf77..d99066d75 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -4,36 +4,37 @@ contain the root `toctree` directive. -.. image:: ../logos/lightly_logo_crop.png - :width: 600 - :alt: Lightly +.. image:: ../logos/lightly_SSL_logo_crop.png + :width: 600 + :align: center + :alt: Lightly SSL Self-Supervised Learning Documentation =================================== .. note:: These pages document the Lightly self-supervised learning library. - If you are looking for Lightly Worker Solution to easily process millions - of samples and run powerful active learning algorithms on your data - please follow - `Lightly Worker documentation `_. + If you are looking for the Lightly Worker Solution with + advanced `active learning algorithms `_ and + `selection strategies `_ to select the best samples + within millions of unlabeled images or video frames stored in your cloud storage or locally, + please follow our `Lightly Worker documentation `_. -Lightly is a computer vision framework for self-supervised learning. +Lightly SSL is a computer vision framework for self-supervised learning. -With Lightly you can train deep learning models using self-supervision. +With Lightly SSL you can train deep learning models using self-supervision. This means, that you don’t require any labels to train a model. -Lightly has been built to help you understand and work with large unlabeled +Lightly SSL has been built to help you understand and work with large unlabeled datasets. It is built on top of PyTorch and therefore fully compatible with other frameworks such as Fast.ai. -Lightly -------- +Lightly AI +---------- - `Homepage `_ -- `Web-App `_ -- `Documentation `_ -- `Lightly Solution Documentation (Lightly Worker & API) `_ +- `Lightly Worker Solution Documentation `_ +- `Lightly Platform `_ - `Github `_ - `Discord `_ (We have weekly paper sessions!) diff --git a/docs/source/lightly.cli.rst b/docs/source/lightly.cli.rst index 62996119e..44861d86d 100644 --- a/docs/source/lightly.cli.rst +++ b/docs/source/lightly.cli.rst @@ -35,7 +35,7 @@ lightly.cli .config.config.yaml ------------------- -The default settings for all command line tools in the lightly Python package are stored in a YAML config file. +The default settings for all command line tools in the Lightly SSL Python package are stored in a YAML config file. The config file is distributed along with the Python package and can be adapted to fit custom requirements. The arguments are grouped into namespaces. For example, everything related to the embedding model is grouped under diff --git a/docs/source/tutorials/package.rst b/docs/source/tutorials/package.rst index 1b0e2904f..3aff3d9a7 100644 --- a/docs/source/tutorials/package.rst +++ b/docs/source/tutorials/package.rst @@ -3,11 +3,11 @@ Python Package =================================== -With the lightly framework you can use the power of self-supervised learning +With the Lightly SSL framework you can use the power of self-supervised learning for computervision with ease. Here we show you tutorials to help you work with the Python library. -Since lightly is built on top of `PyTorch `_ +Since Lightly SSL is built on top of `PyTorch `_ and `PyTorch Lightning `_ you might want to have a look at the two frameworks to understand basic concepts. diff --git a/docs/source/tutorials/platform.rst b/docs/source/tutorials/platform.rst index b7b499457..3e580cac5 100644 --- a/docs/source/tutorials/platform.rst +++ b/docs/source/tutorials/platform.rst @@ -9,8 +9,8 @@ Platform These tutorials use a deprecated workflow of the Lightly Solution and will be removed in the future. Please refer to the `new documentation and tutorials `_ instead. -Lightly is more than just a framework for self-supervised learning. We built a complete data curation platform on top. -Use the embeddings generated using the lightly framework and use them to curate your dataset. Collaborate with your friends +Lightly SSL is more than just a framework for self-supervised learning. We built a complete data curation platform on top. +Use the embeddings generated using the Lightly SSL framework and use them to curate your dataset. Collaborate with your friends and share the curated data with your favorite data labeling partner. In this tutorial series, you will learn how to get the most out of the platform. diff --git a/docs/source/tutorials/structure_your_input.rst b/docs/source/tutorials/structure_your_input.rst index 7994f7b11..138fe3943 100644 --- a/docs/source/tutorials/structure_your_input.rst +++ b/docs/source/tutorials/structure_your_input.rst @@ -3,8 +3,8 @@ Tutorial 1: Structure Your Input ================================ -The `lightly Python package `_ can process image datasets to generate embeddings -or to upload data to the `Lightly platform `_. In this tutorial you will learn how to structure +The `Lightly SSL Python package `_ can process image datasets to generate embeddings +or to upload data to the `Lightly Platform `_. In this tutorial you will learn how to structure your image dataset such that it is understood by our framework. You can also skip this tutorial and jump right into training a model: @@ -18,8 +18,8 @@ Supported File Types Images ^^^^^^^^^^^^^^^^^^^^^ -Since lightly uses `Pillow `_ -for image loading it also supports all the image formats supported by +Since Lightly SSL uses `Pillow `_ +for image loading, it also supports all the image formats supported by `Pillow `_. - .jpg, .png, .tiff and @@ -28,7 +28,7 @@ for image loading it also supports all the image formats supported by Videos ^^^^^^^^^^^^^^^^^^^^^ -To load videos directly lightly uses +To load videos directly, Lightly SSL uses `torchvision `_ and `PyAV `_. The following formats are supported. @@ -46,7 +46,7 @@ Flat Directory Containing Images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ You can store all images of interest in a single folder without additional hierarchy. For example below, -lightly will load all filenames and images in the directory `data/`. Additionally, it will assign all images +Lightly SSL will load all filenames and images in the directory `data/`. Additionally, it will assign all images a placeholder label. .. code-block:: bash @@ -58,7 +58,7 @@ a placeholder label. ... +--- img-N.jpg -For the structure above, lightly will understand the input as follows: +For the structure above, Lightly SSL will understand the input as follows: .. code-block:: python @@ -80,7 +80,7 @@ Directory with Subdirectories Containing Images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ You can give structure to your input directory by collecting the input images in subdirectories. In this case, -the filenames loaded by lightly are with respect to the "root directory" `data/`. Furthermore, lightly assigns +the filenames loaded by Lightly SSL are with respect to the "root directory" `data/`. Furthermore, Lightly SSL assigns each image a so-called "weak-label" indicating to which subdirectory it belongs. .. code-block:: bash @@ -106,7 +106,7 @@ each image a so-called "weak-label" indicating to which subdirectory it belongs. ... +-- img-N10.jpg -For the structure above, lightly will understand the input as follows: +For the structure above, Lightly SSL will understand the input as follows: .. code-block:: python @@ -136,9 +136,9 @@ For the structure above, lightly will understand the input as follows: Video Folder Datasets --------------------- -The lightly Python package allows you to work `directly` on video data, without having +The Lightly SSL Python package allows you to work `directly` on video data, without having to exctract the frames first. This can save a lot of disk space as video files are -typically strongly compressed. Using lightly on video data is as simple as pointing +typically strongly compressed. Using Lightly SSL on video data is as simple as pointing the software at an input directory where one or more videos are stored. The package will automatically detect all video files and index them so that each frame can be accessed. @@ -173,8 +173,8 @@ also work on video data. Give it a try! Embedding Files --------------- -Embeddings generated by the lightly Python package are typically stored in a `.csv` file and can then be uploaded to the -Lightly platform from the command line. If the embeddings were generated with the lightly command-line tool, they have +Embeddings generated by the Lightly SSL Python package are typically stored in a `.csv` file and can then be uploaded to the +Lightly Platform from the command line. If the embeddings were generated with the Lightly SSL command-line tool, they have the correct format already. You can also save your own embeddings in a `.csv` file to upload them. In that case, make sure the file meets the format @@ -234,7 +234,7 @@ The code shown above will produce the following `.csv` file: - 0.2 - 0 -.. note:: Note that lightly automatically creates "weak" labels for datasets +.. note:: Note that Lightly SSL automatically creates "weak" labels for datasets with subfolders. Each subfolder corresponds to one weak label. The labels are called "weak" since they might not be used for a task you want to solve with ML directly but still can be relevant to group @@ -245,7 +245,7 @@ Advanced usage of Embeddings ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ In some cases you want to enrich the embeddings with additional information. -The lightly csv scheme is very simple and can be easily extended. +The Lightly SSL csv scheme is very simple and can be easily extended. For example, you can add your own embeddings to the existing embeddings. This could be useful if you have additional meta information about each sample. @@ -258,7 +258,7 @@ To add custom embeddings you need to add more embedding columns to the .csv file Make sure you keep the enumeration of the embeddings in correct order. -Here you see an embedding from lightly with a 2-dimensional embedding vector. +Here you see an embedding from Lightly SSL with a 2-dimensional embedding vector. .. list-table:: lightly_embeddings.csv :widths: 50 50 50 50 @@ -319,7 +319,7 @@ We can now append our embedding vector to the .csv file. Next Steps ----------------- -Now that you understand the various data formats lightly supports you can +Now that you understand the various data formats Lightly SSL supports you can start training a model: - :ref:`lightly-moco-tutorial-2`