From a64edfc5bad6038984a14d8835fabad660bded95 Mon Sep 17 00:00:00 2001 From: IgorSusmelj Date: Thu, 9 Jun 2022 16:13:12 +0200 Subject: [PATCH] Rework docs (#830) * Philipp clean up docs archive old docs (#819) * Make changes to makefile and index * Archive docker docs * Rework getting started section (#820) * Rework getting started section * Rename docker to worker * Add support for setting dataset type (#822) * Philipp lig 1200 clean up docs first steps (#821) * Rework getting started section * Streamline workflows * Use api workflow client to create dataset * Update FAQ (#824) * Igor lig 1201 clean up docs advanced (#823) * Rearrange docs based on new setup * Update datapool * Update datapool example * Disable pretagging in datapool example * Update pretagging * Use Lightly Worker instead of docker * Update active learning * Implement feedback * Philipp lig 1204 clean up docs examples (#825) * Rework datasets in the wild * Rework examples overview * Rework academic datsets * Igor lig 1203 clean up docs configuration (#826) * Update configuration * Make sure we use Lightly Worker * Implement feedback * Philipp lig 1202 clean up docs integration (#827) * Rework dagster tutorial * Drop the other integration parts * Add default thumbnail suffix (#828) * Igor lig 1231 finish cleanup docs (#829) * Align docs and add missing changes * Rename to register worker * Remove input volume mapping * Update overview section * Make sure we use Lightly Worker * Move bracket to new line Co-authored-by: philippmwirth Co-authored-by: Philipp Wirth <65946090+philippmwirth@users.noreply.github.com> Co-authored-by: philippmwirth --- docs/Makefile | 2 + .../docker/advanced/active_learning.rst | 47 +- .../python_run_active_learning.py | 77 +- .../python_run_datapool_example.py | 125 +++ .../code_examples/python_run_object_level.py | 77 +- .../python_run_object_level_pretagging.py | 76 +- .../code_examples/python_run_pretagging.py | 124 +++ .../python_run_sequence_selection.py | 124 +++ docs/source/docker/advanced/datapool.rst | 152 ++-- .../advanced/datasource_predictions.rst | 6 +- .../webapp-embedding-after-2nd-docker.png | Bin docs/source/docker/advanced/object_level.rst | 65 +- docs/source/docker/advanced/overview.rst | 1 - docs/source/docker/advanced/pretagging.rst | 57 +- .../docker/advanced/sequence_selection.rst | 37 +- .../docker/configuration/configuration.rst | 61 +- .../docker/examples/academic_datasets.rst | 212 +++-- .../docker/examples/datasets_in_the_wild.rst | 177 +++-- docs/source/docker/examples/overview.rst | 6 +- .../docker/getting_started/first_steps.rst | 725 ++++++++---------- docs/source/docker/getting_started/setup.rst | 139 +++- .../source/docker/integration/dagster_aws.rst | 316 +++----- docs/source/docker/integration/overview.rst | 3 +- docs/source/docker/known_issues_faq.rst | 12 +- docs/source/docker/overview.rst | 17 +- .../advanced/active_learning.rst | 340 ++++++++ .../active_learning_worker_config.txt | 21 + .../object_level_worker_config.txt | 24 + .../object_level_worker_config_pretagging.txt | 24 + .../python_run_active_learning.py | 74 ++ .../code_examples/python_run_object_level.py | 75 ++ .../python_run_object_level_pretagging.py | 76 ++ .../docker_archive/advanced/datapool.rst | 101 +++ .../advanced/datasource_metadata.rst | 233 ++++++ .../advanced/datasource_predictions.rst | 477 ++++++++++++ .../advanced/images/bdd100k_demo_metadata.jpg | Bin 0 -> 140542 bytes .../object_level_vehicle_car_cluster.jpg | Bin 0 -> 245381 bytes .../object_level_vehicle_crops_examples.jpg | Bin 0 -> 297289 bytes .../images/object_level_vehicle_examples.jpg | Bin 0 -> 295446 bytes ...object_level_vehicle_motorbike_cluster.jpg | Bin 0 -> 256424 bytes .../object_level_vehicle_truck_cluster.jpg | Bin 0 -> 251617 bytes .../images/sequence_selection_pca.png | Bin 0 -> 112907 bytes .../advanced/meta_information.rst | 0 .../docker_archive/advanced/object_level.rst | 291 +++++++ .../docker_archive/advanced/overview.rst | 16 + .../docker_archive/advanced/pretagging.rst | 140 ++++ .../advanced/sequence_selection.rst | 78 ++ .../webapp_default_lightly_config.txt | 41 + .../webapp_default_worker_config.txt | 21 + .../configuration/configuration.rst | 254 ++++++ .../images/histograms_overview.png | Bin 0 -> 165099 bytes .../examples/academic_datasets.rst | 115 +++ .../examples/datasets_in_the_wild.rst | 182 +++++ .../docker_archive/examples/overview.rst | 11 + .../getting_started/first_steps.rst | 629 +++++++++++++++ .../hardware_recommendations.rst | 90 +++ .../images/colab_embeddings_example.png | Bin 0 -> 46523 bytes .../images/docker_runs_overview.png | Bin 0 -> 60655 bytes .../images/docker_workers_overview_empty.png | Bin 0 -> 191709 bytes .../docker_workers_overview_registered.png | Bin 0 -> 200010 bytes .../images/histogram_before_after.jpg | Bin 0 -> 108831 bytes .../docker_archive/getting_started/setup.rst | 138 ++++ .../images/lightly_docker_overview.png | Bin 0 -> 97929 bytes .../integration/dagster_aws.rst | 507 ++++++++++++ .../integration/docker_trigger_from_api.rst | 0 .../integration/docker_with_datasource.rst | 0 .../integration/examples/create_dataset.py | 35 + .../integration/examples/trigger_job.py | 67 ++ .../integration/images/aws-s3-bucket-list.png | Bin 0 -> 63360 bytes .../images/schedule-compute-run-config.png | Bin 0 -> 132636 bytes .../images/schedule-compute-run.png | Bin 0 -> 82838 bytes .../webapp-embedding-after-2nd-docker.png | Bin 0 -> 69880 bytes .../images/webapp-explore-after-docker.jpg | Bin 0 -> 87434 bytes .../docker_archive/integration/overview.rst | 12 + .../integration/s3fs-fuse.rst | 0 .../docker_archive/known_issues_faq.rst | 161 ++++ docs/source/docker_archive/overview.rst | 80 ++ docs/source/index.rst | 2 +- lightly/api/api_workflow_datasets.py | 40 +- lightly/api/api_workflow_datasources.py | 8 +- 80 files changed, 5889 insertions(+), 1112 deletions(-) create mode 100644 docs/source/docker/advanced/code_examples/python_run_datapool_example.py create mode 100644 docs/source/docker/advanced/code_examples/python_run_pretagging.py create mode 100644 docs/source/docker/advanced/code_examples/python_run_sequence_selection.py rename docs/source/docker/{integration => advanced}/images/webapp-embedding-after-2nd-docker.png (100%) create mode 100644 docs/source/docker_archive/advanced/active_learning.rst create mode 100644 docs/source/docker_archive/advanced/code_examples/active_learning_worker_config.txt create mode 100644 docs/source/docker_archive/advanced/code_examples/object_level_worker_config.txt create mode 100644 docs/source/docker_archive/advanced/code_examples/object_level_worker_config_pretagging.txt create mode 100644 docs/source/docker_archive/advanced/code_examples/python_run_active_learning.py create mode 100644 docs/source/docker_archive/advanced/code_examples/python_run_object_level.py create mode 100644 docs/source/docker_archive/advanced/code_examples/python_run_object_level_pretagging.py create mode 100644 docs/source/docker_archive/advanced/datapool.rst create mode 100644 docs/source/docker_archive/advanced/datasource_metadata.rst create mode 100644 docs/source/docker_archive/advanced/datasource_predictions.rst create mode 100644 docs/source/docker_archive/advanced/images/bdd100k_demo_metadata.jpg create mode 100644 docs/source/docker_archive/advanced/images/object_level_vehicle_car_cluster.jpg create mode 100644 docs/source/docker_archive/advanced/images/object_level_vehicle_crops_examples.jpg create mode 100644 docs/source/docker_archive/advanced/images/object_level_vehicle_examples.jpg create mode 100644 docs/source/docker_archive/advanced/images/object_level_vehicle_motorbike_cluster.jpg create mode 100644 docs/source/docker_archive/advanced/images/object_level_vehicle_truck_cluster.jpg create mode 100644 docs/source/docker_archive/advanced/images/sequence_selection_pca.png rename docs/source/{docker => docker_archive}/advanced/meta_information.rst (100%) create mode 100644 docs/source/docker_archive/advanced/object_level.rst create mode 100644 docs/source/docker_archive/advanced/overview.rst create mode 100644 docs/source/docker_archive/advanced/pretagging.rst create mode 100644 docs/source/docker_archive/advanced/sequence_selection.rst create mode 100644 docs/source/docker_archive/code_examples/webapp_default_lightly_config.txt create mode 100644 docs/source/docker_archive/code_examples/webapp_default_worker_config.txt create mode 100644 docs/source/docker_archive/configuration/configuration.rst create mode 100644 docs/source/docker_archive/configuration/images/histograms_overview.png create mode 100644 docs/source/docker_archive/examples/academic_datasets.rst create mode 100644 docs/source/docker_archive/examples/datasets_in_the_wild.rst create mode 100644 docs/source/docker_archive/examples/overview.rst create mode 100644 docs/source/docker_archive/getting_started/first_steps.rst create mode 100644 docs/source/docker_archive/getting_started/hardware_recommendations.rst create mode 100644 docs/source/docker_archive/getting_started/images/colab_embeddings_example.png create mode 100644 docs/source/docker_archive/getting_started/images/docker_runs_overview.png create mode 100644 docs/source/docker_archive/getting_started/images/docker_workers_overview_empty.png create mode 100644 docs/source/docker_archive/getting_started/images/docker_workers_overview_registered.png create mode 100644 docs/source/docker_archive/getting_started/images/histogram_before_after.jpg create mode 100644 docs/source/docker_archive/getting_started/setup.rst create mode 100644 docs/source/docker_archive/images/lightly_docker_overview.png create mode 100644 docs/source/docker_archive/integration/dagster_aws.rst rename docs/source/{docker => docker_archive}/integration/docker_trigger_from_api.rst (100%) rename docs/source/{docker => docker_archive}/integration/docker_with_datasource.rst (100%) create mode 100644 docs/source/docker_archive/integration/examples/create_dataset.py create mode 100644 docs/source/docker_archive/integration/examples/trigger_job.py create mode 100644 docs/source/docker_archive/integration/images/aws-s3-bucket-list.png create mode 100644 docs/source/docker_archive/integration/images/schedule-compute-run-config.png create mode 100644 docs/source/docker_archive/integration/images/schedule-compute-run.png create mode 100644 docs/source/docker_archive/integration/images/webapp-embedding-after-2nd-docker.png create mode 100644 docs/source/docker_archive/integration/images/webapp-explore-after-docker.jpg create mode 100644 docs/source/docker_archive/integration/overview.rst rename docs/source/{docker => docker_archive}/integration/s3fs-fuse.rst (100%) create mode 100644 docs/source/docker_archive/known_issues_faq.rst create mode 100644 docs/source/docker_archive/overview.rst diff --git a/docs/Makefile b/docs/Makefile index 189b60547..95f708852 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -11,6 +11,7 @@ DATADIR = _data PACKAGESOURCE = source/tutorials_source/package PLATFORMSOURCE = source/tutorials_source/platform DOCKERSOURCE = source/docker +DOCKER_ARCHIVE_SOURCE = source/docker_archive GETTING_STARTED_IMAGES = source/getting_started/resources @@ -57,6 +58,7 @@ download-noplot: # download images and report for docker wget -N https://storage.googleapis.com/datasets_boris/resources.zip -P $(DATADIR);\ unzip $(ZIPOPTS) $(DATADIR)/resources.zip -d $(DOCKERSOURCE);\ + unzip $(ZIPOPTS) $(DATADIR)/resources.zip -d $(DOCKER_ARCHIVE_SOURCE); \ # pizza dataset @if [ ! -d $(PLATFORMSOURCE)/pizzas/salami ]; then \ diff --git a/docs/source/docker/advanced/active_learning.rst b/docs/source/docker/advanced/active_learning.rst index 81aba4fd5..c36a93a3c 100644 --- a/docs/source/docker/advanced/active_learning.rst +++ b/docs/source/docker/advanced/active_learning.rst @@ -19,7 +19,7 @@ Prerequisites -------------- In order to do active learning with Lightly, you will need the following things: -- The installed Lightly docker (see :ref:`ref-docker-setup`) +- The installed Lightly Worker (see :ref:`ref-docker-setup`) - A dataset with a configured datasource (see :ref:`ref-docker-with-datasource-datapool`) - Your predictions uploaded to the datasource (see :ref:`ref-docker-datasource-predictions`) @@ -33,7 +33,7 @@ In order to do active learning with Lightly, you will need the following things: Selection ------------------------- Once you have everything set up as described above, you can do an active learning -iteration by specifying the following three things in your Lightly docker config: +iteration by specifying the following three things in your Lightly Worker config: - `method` - `active_learning.task_name` @@ -41,39 +41,18 @@ iteration by specifying the following three things in your Lightly docker config Here's an example of how to configure an active learning run: +.. literalinclude:: code_examples/python_run_active_learning.py -.. tabs:: - .. tab:: Web App +After running the code we have to make sure we have a running Lightly Worker +to process the job. +We can start a Lightly Worker using the following command - **Trigger the Job** - - To trigger a new job you can click on the schedule run button on the dataset - overview as shown in the screenshot below: - - .. figure:: ../integration/images/schedule-compute-run.png - - After clicking on the button you will see a wizard to configure the parameters - for the job. - - .. figure:: ../integration/images/schedule-compute-run-config.png - - In this example we have to set the `active_learning.task_name` parameter - in the docker config. Additionally, we set the `method` to `coral` which - simultaneously considers the diversity and the active learning scores of - the samples. All other settings are default values. The - resulting docker config should look like this: - - .. literalinclude:: code_examples/active_learning_worker_config.txt - :caption: Docker Config - :language: javascript - - The Lightly config remains unchanged. - - .. tab:: Python Code - - .. literalinclude:: code_examples/python_run_active_learning.py +.. code-block:: console + docker run --rm --gpus all -it \ + -v /docker-output:/home/output_dir lightly/worker:latest \ + token=YOUR_TOKEN worker.worker_id=YOUR_WORKER_ID After the worker has finished its job you can see the selected images with their active learning score in the web-app. @@ -86,12 +65,12 @@ Active Learning with Custom Scores (not recommended as of March 2022) This is not recommended anymore as of March 2022 and will be deprecated in the future! -For running an active learning step with the Lightly docker, we need to perform +For running an active learning step with the Lightly Worker, we need to perform 3 steps: -1. Create an `embeddings.csv` file. You can use your own models or the Lightly docker for this. +1. Create an `embeddings.csv` file. You can use your own models or the Lightly Worker for this. 2. Add your active learning scores as an additional column to the embeddings file. -3. Use the Lightly docker to perform an active learning iteration on the scores. +3. Use the Lightly Worker to perform an active learning iteration on the scores. Learn more about the concept of active learning :ref:`lightly-active-learning-scorers`. diff --git a/docs/source/docker/advanced/code_examples/python_run_active_learning.py b/docs/source/docker/advanced/code_examples/python_run_active_learning.py index c5955d1be..519c02855 100644 --- a/docs/source/docker/advanced/code_examples/python_run_active_learning.py +++ b/docs/source/docker/advanced/code_examples/python_run_active_learning.py @@ -1,7 +1,67 @@ +import json import lightly +from lightly.openapi_generated.swagger_client.models.dataset_type import DatasetType +from lightly.openapi_generated.swagger_client.models.datasource_purpose import DatasourcePurpose # Create the Lightly client to connect to the API. -client = lightly.api.ApiWorkflowClient(token="TOKEN", dataset_id="DATASET_ID") +client = lightly.api.ApiWorkflowClient(token="YOUR_TOKEN") + +# Create a new dataset on the Lightly Platform. +client.create_dataset('pedestrian-videos-datapool', + dataset_type=DatasetType.VIDEOS) + +# Pick one of the following three blocks depending on where your data is +# AWS S3 +# Input bucket +client.set_s3_config( + resource_path="s3://bucket/input/", + region='eu-central-1', + access_key='S3-ACCESS-KEY', + secret_access_key='S3-SECRET-ACCESS-KEY', + purpose=DatasourcePurpose.INPUT +) +# Output bucket +client.set_s3_config( + resource_path="s3://bucket/output/", + region='eu-central-1', + access_key='S3-ACCESS-KEY', + secret_access_key='S3-SECRET-ACCESS-KEY', + purpose=DatasourcePurpose.LIGHTLY +) + + +# or Google Cloud Storage +# Input bucket +client.set_gcs_config( + resource_path="gs://bucket/input/", + project_id="PROJECT-ID", + credentials=json.dumps(json.load(open('credentials_read.json'))), + purpose=DatasourcePurpose.INPUT +) +# Output bucket +client.set_gcs_config( + resource_path="gs://bucket/output/", + project_id="PROJECT-ID", + credentials=json.dumps(json.load(open('credentials_write.json'))), + purpose=DatasourcePurpose.LIGHTLY +) + + +# or Azure Blob Storage +# Input bucket +client.set_azure_config( + container_name='my-container/input/', + account_name='ACCOUNT-NAME', + sas_token='SAS-TOKEN', + purpose=DatasourcePurpose.INPUT +) +# Output bucket +client.set_azure_config( + container_name='my-container/output/', + account_name='ACCOUNT-NAME', + sas_token='SAS-TOKEN', + purpose=DatasourcePurpose.LIGHTLY +) # Schedule the docker run with # - "active_learning.task_name" set to your task name @@ -15,19 +75,14 @@ "enable_training": False, "pretagging": False, "pretagging_debug": False, - "method": "coral", + "method": "coral", # we use the coral method here "stopping_condition": { "n_samples": 0.1, "min_distance": -1 }, - "scorer": "object-frequency", - "scorer_config": { - "frequency_penalty": 0.25, - "min_score": 0.9 - }, - "active_learning": { - "task_name": "my-classification-task", - "score_name": "uncertainty_margin" + "active_learning": { # here we specify our active learning parameters + "task_name": "my-classification-task", # set the task + "score_name": "uncertainty_margin" # set the score } }, lightly_config={ @@ -71,4 +126,4 @@ 'rr_prob': 0 } } -) \ No newline at end of file +) diff --git a/docs/source/docker/advanced/code_examples/python_run_datapool_example.py b/docs/source/docker/advanced/code_examples/python_run_datapool_example.py new file mode 100644 index 000000000..610050128 --- /dev/null +++ b/docs/source/docker/advanced/code_examples/python_run_datapool_example.py @@ -0,0 +1,125 @@ +import json +import lightly +from lightly.openapi_generated.swagger_client.models.dataset_type import DatasetType +from lightly.openapi_generated.swagger_client.models.datasource_purpose import DatasourcePurpose + +# Create the Lightly client to connect to the API. +client = lightly.api.ApiWorkflowClient(token="YOUR_TOKEN") + +# Create a new dataset on the Lightly Platform. +client.create_dataset('pedestrian-videos-datapool', + dataset_type=DatasetType.VIDEOS) + +# Pick one of the following three blocks depending on where your data is +# AWS S3 +# Input bucket +client.set_s3_config( + resource_path="s3://bucket/input/", + region='eu-central-1', + access_key='S3-ACCESS-KEY', + secret_access_key='S3-SECRET-ACCESS-KEY', + purpose=DatasourcePurpose.INPUT +) +# Output bucket +client.set_s3_config( + resource_path="s3://bucket/output/", + region='eu-central-1', + access_key='S3-ACCESS-KEY', + secret_access_key='S3-SECRET-ACCESS-KEY', + purpose=DatasourcePurpose.LIGHTLY +) + + +# or Google Cloud Storage +# Input bucket +client.set_gcs_config( + resource_path="gs://bucket/input/", + project_id="PROJECT-ID", + credentials=json.dumps(json.load(open('credentials_read.json'))), + purpose=DatasourcePurpose.INPUT +) +# Output bucket +client.set_gcs_config( + resource_path="gs://bucket/output/", + project_id="PROJECT-ID", + credentials=json.dumps(json.load(open('credentials_write.json'))), + purpose=DatasourcePurpose.LIGHTLY +) + + +# or Azure Blob Storage +# Input bucket +client.set_azure_config( + container_name='my-container/input/', + account_name='ACCOUNT-NAME', + sas_token='SAS-TOKEN', + purpose=DatasourcePurpose.INPUT +) +# Output bucket +client.set_azure_config( + container_name='my-container/output/', + account_name='ACCOUNT-NAME', + sas_token='SAS-TOKEN', + purpose=DatasourcePurpose.LIGHTLY +) + + +# Schedule the compute run using our custom config. +# We show here the full default config so you can easily edit the +# values according to your needs. +client.schedule_compute_worker_run( + worker_config={ + 'enable_corruptness_check': True, + 'remove_exact_duplicates': True, + 'enable_training': False, + 'pretagging': False, + 'pretagging_debug': False, + 'method': 'coreset', + 'stopping_condition': { + 'n_samples': -1, + 'min_distance': 0.05 # we set the min_distance to 0.05 in this example + } + }, + lightly_config={ + 'loader': { + 'batch_size': 128, + 'shuffle': True, + 'num_workers': -1, + 'drop_last': True + }, + 'model': { + 'name': 'resnet-18', + 'out_dim': 128, + 'num_ftrs': 32, + 'width': 1 + }, + 'trainer': { + 'gpus': 1, + 'max_epochs': 1, + 'precision': 16 + }, + 'criterion': { + 'temperature': 0.5 + }, + 'optimizer': { + 'lr': 1, + 'weight_decay': 0.00001 + }, + 'collate': { + 'input_size': 64, + 'cj_prob': 0.8, + 'cj_bright': 0.7, + 'cj_contrast': 0.7, + 'cj_sat': 0.7, + 'cj_hue': 0.2, + 'min_scale': 0.15, + 'random_gray_scale': 0.2, + 'gaussian_blur': 0.0, + 'kernel_size': 0.1, + 'vf_prob': 0, + 'hf_prob': 0.5, + 'rr_prob': 0 + } + } +) + diff --git a/docs/source/docker/advanced/code_examples/python_run_object_level.py b/docs/source/docker/advanced/code_examples/python_run_object_level.py index 1f779d3bf..e49f48929 100644 --- a/docs/source/docker/advanced/code_examples/python_run_object_level.py +++ b/docs/source/docker/advanced/code_examples/python_run_object_level.py @@ -1,16 +1,73 @@ +import json import lightly +from lightly.openapi_generated.swagger_client.models.dataset_type import DatasetType +from lightly.openapi_generated.swagger_client.models.datasource_purpose import DatasourcePurpose # Create the Lightly client to connect to the API. -client = lightly.api.ApiWorkflowClient(token="TOKEN", dataset_id="DATASET_ID") +client = lightly.api.ApiWorkflowClient(token="YOUR_TOKEN") + +# Create a new dataset on the Lightly Platform. +client.create_dataset('dataset-name', + dataset_type=DatasetType.IMAGES) + +# Pick one of the following three blocks depending on where your data is +# AWS S3 +# Input bucket +client.set_s3_config( + resource_path="s3://bucket/input/", + region='eu-central-1', + access_key='S3-ACCESS-KEY', + secret_access_key='S3-SECRET-ACCESS-KEY', + purpose=DatasourcePurpose.INPUT +) +# Output bucket +client.set_s3_config( + resource_path="s3://bucket/output/", + region='eu-central-1', + access_key='S3-ACCESS-KEY', + secret_access_key='S3-SECRET-ACCESS-KEY', + purpose=DatasourcePurpose.LIGHTLY +) + + +# or Google Cloud Storage +# Input bucket +client.set_gcs_config( + resource_path="gs://bucket/input/", + project_id="PROJECT-ID", + credentials=json.dumps(json.load(open('credentials_read.json'))), + purpose=DatasourcePurpose.INPUT +) +# Output bucket +client.set_gcs_config( + resource_path="gs://bucket/output/", + project_id="PROJECT-ID", + credentials=json.dumps(json.load(open('credentials_write.json'))), + purpose=DatasourcePurpose.LIGHTLY +) + + +# or Azure Blob Storage +# Input bucket +client.set_azure_config( + container_name='my-container/input/', + account_name='ACCOUNT-NAME', + sas_token='SAS-TOKEN', + purpose=DatasourcePurpose.INPUT +) +# Output bucket +client.set_azure_config( + container_name='my-container/output/', + account_name='ACCOUNT-NAME', + sas_token='SAS-TOKEN', + purpose=DatasourcePurpose.LIGHTLY +) # Schedule the docker run with the "object_level.task_name" argument set. # All other settings are default values and we show them so you can easily edit # the values according to your need. client.schedule_compute_worker_run( worker_config={ - "object_level": { - "task_name": "vehicles_object_detections" - }, "enable_corruptness_check": True, "remove_exact_duplicates": True, "enable_training": False, @@ -18,18 +75,12 @@ "pretagging_debug": False, "method": "coreset", "stopping_condition": { - "n_samples": 0.1, + "n_samples": 0.1, # stopping condition is now based on objects "min_distance": -1 }, - "scorer": "object-frequency", - "scorer_config": { - "frequency_penalty": 0.25, - "min_score": 0.9 + "object_level": { # used for object level workflow + "task_name": "vehicles_object_detections" }, - "active_learning": { - "task_name": "", - "score_name": "uncertainty_margin" - } }, lightly_config={ 'loader': { diff --git a/docs/source/docker/advanced/code_examples/python_run_object_level_pretagging.py b/docs/source/docker/advanced/code_examples/python_run_object_level_pretagging.py index 8e5903112..69cb224ad 100644 --- a/docs/source/docker/advanced/code_examples/python_run_object_level_pretagging.py +++ b/docs/source/docker/advanced/code_examples/python_run_object_level_pretagging.py @@ -1,7 +1,68 @@ +import json import lightly +from lightly.openapi_generated.swagger_client.models.dataset_type import DatasetType +from lightly.openapi_generated.swagger_client.models.datasource_purpose import DatasourcePurpose # Create the Lightly client to connect to the API. -client = lightly.api.ApiWorkflowClient(token="TOKEN", dataset_id="DATASET_ID") +client = lightly.api.ApiWorkflowClient(token="YOUR_TOKEN") + +# Create a new dataset on the Lightly Platform. +client.create_dataset('dataset-name', + dataset_type=DatasetType.IMAGES) + + +# Pick one of the following three blocks depending on where your data is +# AWS S3 +# Input bucket +client.set_s3_config( + resource_path="s3://bucket/input/", + region='eu-central-1', + access_key='S3-ACCESS-KEY', + secret_access_key='S3-SECRET-ACCESS-KEY', + purpose=DatasourcePurpose.INPUT +) +# Output bucket +client.set_s3_config( + resource_path="s3://bucket/output/", + region='eu-central-1', + access_key='S3-ACCESS-KEY', + secret_access_key='S3-SECRET-ACCESS-KEY', + purpose=DatasourcePurpose.LIGHTLY +) + + +# or Google Cloud Storage +# Input bucket +client.set_gcs_config( + resource_path="gs://bucket/input/", + project_id="PROJECT-ID", + credentials=json.dumps(json.load(open('credentials_read.json'))), + purpose=DatasourcePurpose.INPUT +) +# Output bucket +client.set_gcs_config( + resource_path="gs://bucket/output/", + project_id="PROJECT-ID", + credentials=json.dumps(json.load(open('credentials_write.json'))), + purpose=DatasourcePurpose.LIGHTLY +) + + +# or Azure Blob Storage +# Input bucket +client.set_azure_config( + container_name='my-container/input/', + account_name='ACCOUNT-NAME', + sas_token='SAS-TOKEN', + purpose=DatasourcePurpose.INPUT +) +# Output bucket +client.set_azure_config( + container_name='my-container/output/', + account_name='ACCOUNT-NAME', + sas_token='SAS-TOKEN', + purpose=DatasourcePurpose.LIGHTLY +) # Schedule the docker run with the "object_level.task_name" argument set to # "lightly_pretagging" and with "pretagging" set to True. @@ -9,9 +70,6 @@ # the values according to your need. client.schedule_compute_worker_run( worker_config={ - "object_level": { - "task_name": "lightly_pretagging" - }, "enable_corruptness_check": True, "remove_exact_duplicates": True, "enable_training": False, @@ -22,14 +80,8 @@ "n_samples": 0.1, "min_distance": -1 }, - "scorer": "object-frequency", - "scorer_config": { - "frequency_penalty": 0.25, - "min_score": 0.9 - }, - "active_learning": { - "task_name": "", - "score_name": "uncertainty_margin" + "object_level": { + "task_name": "lightly_pretagging" } }, lightly_config={ diff --git a/docs/source/docker/advanced/code_examples/python_run_pretagging.py b/docs/source/docker/advanced/code_examples/python_run_pretagging.py new file mode 100644 index 000000000..2f7780678 --- /dev/null +++ b/docs/source/docker/advanced/code_examples/python_run_pretagging.py @@ -0,0 +1,124 @@ +import json +import lightly +from lightly.openapi_generated.swagger_client.models.dataset_type import DatasetType +from lightly.openapi_generated.swagger_client.models.datasource_purpose import DatasourcePurpose + +# Create the Lightly client to connect to the API. +client = lightly.api.ApiWorkflowClient(token="YOUR_TOKEN") + +# Create a new dataset on the Lightly Platform. In this example we use pretagging +# on images. We can also use videos instead by setting dataset_type=DatasetType.VIDEOS +client.create_dataset('your-dataset-name', dataset_type=DatasetType.IMAGES) + +# Pick one of the following three blocks depending on where your data is +# AWS S3 +# Input bucket +client.set_s3_config( + resource_path="s3://bucket/input/", + region='eu-central-1', + access_key='S3-ACCESS-KEY', + secret_access_key='S3-SECRET-ACCESS-KEY', + purpose=DatasourcePurpose.INPUT +) +# Output bucket +client.set_s3_config( + resource_path="s3://bucket/output/", + region='eu-central-1', + access_key='S3-ACCESS-KEY', + secret_access_key='S3-SECRET-ACCESS-KEY', + purpose=DatasourcePurpose.LIGHTLY +) + + +# or Google Cloud Storage +# Input bucket +client.set_gcs_config( + resource_path="gs://bucket/input/", + project_id="PROJECT-ID", + credentials=json.dumps(json.load(open('credentials_read.json'))), + purpose=DatasourcePurpose.INPUT +) +# Output bucket +client.set_gcs_config( + resource_path="gs://bucket/output/", + project_id="PROJECT-ID", + credentials=json.dumps(json.load(open('credentials_write.json'))), + purpose=DatasourcePurpose.LIGHTLY +) + + +# or Azure Blob Storage +# Input bucket +client.set_azure_config( + container_name='my-container/input/', + account_name='ACCOUNT-NAME', + sas_token='SAS-TOKEN', + purpose=DatasourcePurpose.INPUT +) +# Output bucket +client.set_azure_config( + container_name='my-container/output/', + account_name='ACCOUNT-NAME', + sas_token='SAS-TOKEN', + purpose=DatasourcePurpose.LIGHTLY +) + +# Schedule the compute run using our custom config. +# We show here the full default config so you can easily edit the +# values according to your needs. +client.schedule_compute_worker_run( + worker_config={ + 'enable_corruptness_check': True, + 'remove_exact_duplicates': True, + 'enable_training': False, + 'pretagging': True, # to enable pretagging + 'pretagging_debug': True, # we also want debugging images in the report + 'method': 'coreset', + 'stopping_condition': { + 'n_samples': 0.9, + 'min_distance': -1 + } + }, + lightly_config={ + 'loader': { + 'batch_size': 128, + 'shuffle': True, + 'num_workers': -1, + 'drop_last': True + }, + 'model': { + 'name': 'resnet-18', + 'out_dim': 128, + 'num_ftrs': 32, + 'width': 1 + }, + 'trainer': { + 'gpus': 1, + 'max_epochs': 1, + 'precision': 16 + }, + 'criterion': { + 'temperature': 0.5 + }, + 'optimizer': { + 'lr': 1, + 'weight_decay': 0.00001 + }, + 'collate': { + 'input_size': 64, + 'cj_prob': 0.8, + 'cj_bright': 0.7, + 'cj_contrast': 0.7, + 'cj_sat': 0.7, + 'cj_hue': 0.2, + 'min_scale': 0.15, + 'random_gray_scale': 0.2, + 'gaussian_blur': 0.0, + 'kernel_size': 0.1, + 'vf_prob': 0, + 'hf_prob': 0.5, + 'rr_prob': 0 + } + } +) + diff --git a/docs/source/docker/advanced/code_examples/python_run_sequence_selection.py b/docs/source/docker/advanced/code_examples/python_run_sequence_selection.py new file mode 100644 index 000000000..c8f88c1e0 --- /dev/null +++ b/docs/source/docker/advanced/code_examples/python_run_sequence_selection.py @@ -0,0 +1,124 @@ +import json +import lightly +from lightly.openapi_generated.swagger_client.models.dataset_type import DatasetType +from lightly.openapi_generated.swagger_client.models.datasource_purpose import DatasourcePurpose + +# Create the Lightly client to connect to the API. +client = lightly.api.ApiWorkflowClient(token="YOUR_TOKEN") + +# Create a new dataset on the Lightly Platform. +client.create_dataset('pexels', dataset_type=DatasetType.VIDEOS) + +# Pick one of the following three blocks depending on where your data is +# AWS S3 +# Input bucket +client.set_s3_config( + resource_path="s3://bucket/input/", + region='eu-central-1', + access_key='S3-ACCESS-KEY', + secret_access_key='S3-SECRET-ACCESS-KEY', + purpose=DatasourcePurpose.INPUT +) +# Output bucket +client.set_s3_config( + resource_path="s3://bucket/output/", + region='eu-central-1', + access_key='S3-ACCESS-KEY', + secret_access_key='S3-SECRET-ACCESS-KEY', + purpose=DatasourcePurpose.LIGHTLY +) + + +# or Google Cloud Storage +# Input bucket +client.set_gcs_config( + resource_path="gs://bucket/input/", + project_id="PROJECT-ID", + credentials=json.dumps(json.load(open('credentials_read.json'))), + purpose=DatasourcePurpose.INPUT +) +# Output bucket +client.set_gcs_config( + resource_path="gs://bucket/output/", + project_id="PROJECT-ID", + credentials=json.dumps(json.load(open('credentials_write.json'))), + purpose=DatasourcePurpose.LIGHTLY +) + + +# or Azure Blob Storage +# Input bucket +client.set_azure_config( + container_name='my-container/input/', + account_name='ACCOUNT-NAME', + sas_token='SAS-TOKEN', + purpose=DatasourcePurpose.INPUT +) +# Output bucket +client.set_azure_config( + container_name='my-container/output/', + account_name='ACCOUNT-NAME', + sas_token='SAS-TOKEN', + purpose=DatasourcePurpose.LIGHTLY +) + +# Schedule the compute run using our custom config. +# We show here the full default config so you can easily edit the +# values according to your needs. +client.schedule_compute_worker_run( + worker_config={ + 'enable_corruptness_check': False, + 'remove_exact_duplicates': False, + 'enable_training': False, + 'pretagging': False, + 'pretagging_debug': False, + 'method': 'coreset', + 'stopping_condition': { + 'n_samples': 200, # select 200 frames of length 10 frames -> 20 sequences + 'min_distance': -1 + }, + 'selected_sequence_length': 10 # we want sequences of 10 frames lenght + }, + lightly_config={ + 'loader': { + 'batch_size': 128, + 'shuffle': True, + 'num_workers': -1, + 'drop_last': True + }, + 'model': { + 'name': 'resnet-18', + 'out_dim': 128, + 'num_ftrs': 32, + 'width': 1 + }, + 'trainer': { + 'gpus': 1, + 'max_epochs': 1, + 'precision': 16 + }, + 'criterion': { + 'temperature': 0.5 + }, + 'optimizer': { + 'lr': 1, + 'weight_decay': 0.00001 + }, + 'collate': { + 'input_size': 64, + 'cj_prob': 0.8, + 'cj_bright': 0.7, + 'cj_contrast': 0.7, + 'cj_sat': 0.7, + 'cj_hue': 0.2, + 'min_scale': 0.15, + 'random_gray_scale': 0.2, + 'gaussian_blur': 0.0, + 'kernel_size': 0.1, + 'vf_prob': 0, + 'hf_prob': 0.5, + 'rr_prob': 0 + } + } +) + diff --git a/docs/source/docker/advanced/datapool.rst b/docs/source/docker/advanced/datapool.rst index 6735cae47..b7d287b9f 100644 --- a/docs/source/docker/advanced/datapool.rst +++ b/docs/source/docker/advanced/datapool.rst @@ -1,101 +1,109 @@ +.. _ref-datapool: + Datapool ================= -The Lightly Datapool is a tool which allows users to incrementally build up a -dataset for their project. It keeps track of the representations of previously -selected samples and uses this information to pick new samples in order to -maximize the quality of the final dataset. It also allows for combining two -different datasets into one. +Lightly has been designed in a way that you can incrementally build up a +dataset for your project. The software automatically keeps track of the +representations of previously selected samples and uses this information +to pick new samples in order to maximize the quality of the final dataset. +It also allows for combining two different datasets into one. -- | If you're interested in how the datapool works, go to - | --> `How It Works`_ +For example, let's imagine we have a dataset of street videos. After running +the Lightly Worker once we added 4 more street videos to the bucket. +The new raw data might include samples which should be added to your dataset +in the Lightly Platform, so you want to add a subset of them to your dataset. -- | To see how you can use the datapool, check out - | --> `Usage`_ +This workflow is supported by the Lightly Platform using a datapool. +It remembers which raw data in your bucket has already been processed +and will ignore it in future Lightly Worker runs. +Thus you can run the Lightly Worker with the same command again. It will find +your new raw data in the bucket, stream, embed and subsample it and then add it to +your existing dataset. The selection strategy will take the existing data in your dataset +into account when selecting new data to be added to your dataset. -How It Works ---------------- +.. image:: ./images/webapp-embedding-after-2nd-docker.png -The Lightly Datapool keeps track of the selected samples in a csv file called -`datapool_latest.csv`. It contains the filenames of the selected images, their -embeddings, and their weak labels. Additionally, after training a self-supervised -model, the datapool contains the checkpoint `checkpoint_latest.ckpt` which was -used to generate the embeddings. +After the Lightly Worker run we can go to the embedding view of the Lightly Platform +to see the newly added samples there in a new tag. We see that the new samples +(in green) fill some gaps left by the images in the first iteration (in grey). +However, there are still some gaps left, which could be filled by adding more videos +to the bucket and running the Lightly Worker again. -The datapool is located in the `shared` directory. In general, it is a directory -with the following structure: +This workflow of iteratively growing your dataset with the Lightly Worker +has the following advantages: +- You can learn from your findings after each iteration + to know which raw data you need to collect next. +- Only your new data is processed, saving you time and compute cost. +- You don't need to configure anything, just run the same command again. +- Only samples which are different to the existing ones are added to the dataset. -.. code-block:: bash +If you want to search all data in your bucket for new samples +instead of only newly added data, +then set `datasource.process_all=True` in your docker run command. This has the +same effect as creating a new Lightly dataset and running the Lightly Worker from scratch +on the full dataset. We process all data instead of only the newly added ones. - # example of a datapool - datapool/ - +--- datapool_latest.csv - +--- checkpoint_latest.ckpt - +--- history/ - -The files `datapool_latest.csv` and `checkpoint_latest.csv` are updated after every -run of the Lightly Docker. The history folder contains the previous versions of -the datapool. This feature is meant to prevent accidental overrides and can be -deactivated from the command-line (see `Usage`_ for more information). -Usage +Example --------------- -To **initialize** a datapool, simply pass the name of the datapool as an argument -to your docker run command and sample from a dataset as always. The Lightly Docker -will automatically create a datapool directory and populate it with the required -files. +In this example we will do the following steps: -.. note:: To use the datapool feature, the Lightly Docker requires write access - to a shared directory. This directory can be passed with the `-v` flag. +#. Schedule a run to process a cloud bucket with 3 videos +#. Add 2 more videos to the same bucket +#. Run the Lightly Worker with the same config again to use the datapool feature + + +Here we show the content of the bucket before running the Lightly Worker for the +first time. .. code-block:: console - docker run --gpus all --rm -it \ - -v {INPUT_DIR}:/home/input_dir:ro \ - -v {SHARED_DIR}:/home/shared_dir \ - -v {OUTPUT_DIR}:/home/output_dir \ - lightly/worker:latest \ - token=MYAWESOMETOKEN \ - append_weak_labels=False \ - stopping_condition.min_distance=0.1 \ - datapool.name=my_datapool + videos/ + |-- campus4-c0.avi + |-- passageway1-c1.avi + `-- terrace1-c0.avi +Now we can run the following code to select a subset based on the +`min_distance` stopping condition. -To **append** to your datapool, pass the name of an existing datapool as an argument. -The Lightly Docker will read the embeddings and filenames from the existing pool and -consider them during selection. Then, it will update the datapool and checkpoint files. +.. literalinclude:: ./code_examples/python_run_datapool_example.py + :linenos: + :language: python -.. note:: You can't change the dimension of the embeddings once the datapool has - been initialized so choose carefully! +After running the code we have to make sure we have a running Lightly Worker +to process the job. +We can start the Lightly Worker using the following command .. code-block:: console - docker run --gpus all --rm -it \ - -v {OTHER_INPUT_DIR}:/home/input_dir:ro \ - -v {SHARED_DIR}:/home/shared_dir \ - -v {OUTPUT_DIR}:/home/output_dir \ - lightly/worker:latest \ - token=MYAWESOMETOKEN \ - append_weak_labels=False \ - stopping_condition.min_distance=0.1 \ - datapool.name=my_datapool - + docker run --rm --gpus all -it \ + -v /docker-output:/home/output_dir lightly/worker:latest \ + token=YOUR_TOKEN worker.worker_id=YOUR_WORKER_ID -To **deactivate automatic archiving** of the past datapool versions, you can pass -set the flag `keep_history` to False. +After we have processed the initial data and created a dataset, +we've collected more data and our bucket now looks like this: .. code-block:: console - docker run --gpus all --rm -it \ - -v {INPUT_DIR}:/home/input_dir:ro \ - -v {SHARED_DIR}:/home/shared_dir \ - -v {OUTPUT_DIR}:/home/output_dir \ - lightly/worker:latest \ - token=MYAWESOMETOKEN \ - append_weak_labels=False \ - stopping_condition.min_distance=0.1 \ - datapool.name=my_datapool \ - datapool.keep_history=False + videos/ + |-- campus4-c0.avi + |-- campus7-c0.avi + |-- passageway1-c1.avi + |-- terrace1-c0.avi + `-- terrace1-c3.avi + +We can run the same script again (it won't create a new dataset but use the +existing one based on the dataset name). + + +How It Works +--------------- + +The Lightly Datapool keeps track of the selected samples in a csv file called +`datapool_latest.csv`. It contains the filenames of the selected images and their +embeddings. This feature is currently only supported without training of a custom +model. Please make sure `enable_training=False` is set in your worker config. diff --git a/docs/source/docker/advanced/datasource_predictions.rst b/docs/source/docker/advanced/datasource_predictions.rst index 5cbac0d59..e86ab687b 100644 --- a/docs/source/docker/advanced/datasource_predictions.rst +++ b/docs/source/docker/advanced/datasource_predictions.rst @@ -21,7 +21,7 @@ Predictions Folder Structure ---------------------------- In the following, we will outline the format of the predictions required by the -Lightly docker. Everything regarding predictions will take place in a subdirectory +Lightly Worker. Everything regarding predictions will take place in a subdirectory of your configured datasource called `.lightly/predictions`. The general structure of this directory will look like this: @@ -65,7 +65,7 @@ of the subdirectory where your prediction schemas will be located. Only the task names listed within `tasks.json` will be considered. Please ensure that the task name corresponds with the location of your prediction schema. - This allows you to specify which subfolder are considered by the Lightly docker. + This allows you to specify which subfolder are considered by the Lightly Worker. For example, let's say we are working with the following folder structure: @@ -103,7 +103,7 @@ we can specify which subfolders contain relevant predictions in the `tasks.json` .. note:: If you list a subfolder which doesn't contain a valid `schema.json` file, - the Lightly docker will report an error! See below how to create a good `schema.json` file. + the Lightly Worker will report an error! See below how to create a good `schema.json` file. Prediction Schema diff --git a/docs/source/docker/integration/images/webapp-embedding-after-2nd-docker.png b/docs/source/docker/advanced/images/webapp-embedding-after-2nd-docker.png similarity index 100% rename from docs/source/docker/integration/images/webapp-embedding-after-2nd-docker.png rename to docs/source/docker/advanced/images/webapp-embedding-after-2nd-docker.png diff --git a/docs/source/docker/advanced/object_level.rst b/docs/source/docker/advanced/object_level.rst index 7769d0dcf..9cb0a2f10 100644 --- a/docs/source/docker/advanced/object_level.rst +++ b/docs/source/docker/advanced/object_level.rst @@ -24,7 +24,7 @@ Prerequisites In order to use the object level workflow with Lightly, you will need the following things: -- The installed Lightly docker (see :ref:`ref-docker-setup`) +- The installed Lightly Worker (see :ref:`ref-docker-setup`) - A dataset with a configured datasource (see :ref:`ref-docker-with-datasource-datapool`) - Object detection predictions uploaded to the datasource (see next section) @@ -134,39 +134,19 @@ The argument should be set to the task name you used for your predictions. If you uploaded the predictions to e.g. `.lightly/predictions/vehicles_object_detections` then you should set `object_level.task_name` to `vehicles_object_detections`. -The object level job can either be scheduled from the Lightly Web App or -from python code. Examples on how to schedule the job are provided below. +The object level job can be scheduled from from Python code. -.. tabs:: +.. literalinclude:: code_examples/python_run_object_level.py - .. tab:: Web App +After running the Python script to create the job we need to make sure we have +a running Lightly Worker to process the job. We can use the following +code to sping up a Lightly Worker - **Trigger the Job** - - To trigger a new job you can click on the schedule run button on the dataset - overview as shown in the screenshot below: - - .. figure:: ../integration/images/schedule-compute-run.png - - After clicking on the button you will see a wizard to configure the parameters - for the job. - - .. figure:: ../integration/images/schedule-compute-run-config.png - - In this example we have to set the `object_level.task_name` parameter - in the docker config, all other settings are default values. The - resulting docker config should look like this: - - .. literalinclude:: code_examples/object_level_worker_config.txt - :caption: Docker Config - :language: javascript - - The Lightly config remains unchanged. - - .. tab:: Python Code - - .. literalinclude:: code_examples/python_run_object_level.py +.. code-block:: console + docker run --rm --gpus all -it \ + -v /docker-output:/home/output_dir lightly/worker:latest \ + token=YOUR_TOKEN worker.worker_id=YOUR_WORKER_ID .. _object-level-pretagging: @@ -176,20 +156,17 @@ Instead of providing your own predictions, it's also possible to use the built-i set `pretagging=True` in your config and use the `object_level.task_name="lightly_pretagging"`. For more information about the prediction model and classes, go to :ref:`Lightly Pretagging Model ` -.. tabs:: - - .. tab:: Web App - - .. literalinclude:: code_examples/object_level_worker_config_pretagging.txt - :caption: Docker Config - :language: javascript - - The Lightly config remains unchanged. +.. literalinclude:: code_examples/python_run_object_level_pretagging.py - .. tab:: Python Code +After running the Python script to create the job we need to make sure we have +a running Lightly Worker to process the job. We can use the following +code to sping up a Lightly Worker - .. literalinclude:: code_examples/python_run_object_level_pretagging.py +.. code-block:: console + docker run --rm --gpus all -it \ + -v /docker-output:/home/output_dir lightly/worker:latest \ + token=YOUR_TOKEN worker.worker_id=YOUR_WORKER_ID Padding ------- @@ -203,8 +180,8 @@ height of all bounding boxes by 10 percent. Object Crops Dataset -------------------- -Once the docker job is started it fetches all images and predictions from the -remote datasource and processes them. For each prediction, the docker crops +Once the Lightly Worker job is started it fetches all images and predictions from the +remote datasource and processes them. For each prediction, the Lightly Worker crops the object from the full image and creates an embedding for it. Then it selects a subset of the objects and uploads **two** datasets to the Lightly Platform: @@ -276,7 +253,7 @@ Multiple Object Level Runs -------------------------- You can run multiple object level workflows using the same dataset. To start a new run, please select your original full image dataset in the Lightly Web App -and schedule a new run from there. If you are running the docker from Python or +and schedule a new run from there. If you are running the Lightly Worker from Python or over the API, you have to set the `dataset_id` configuration option to the id of the original full image dataset. In both cases make sure that the run is *not* started from the crops dataset as this is not supported! diff --git a/docs/source/docker/advanced/overview.rst b/docs/source/docker/advanced/overview.rst index 8e4536f31..ba194609f 100644 --- a/docs/source/docker/advanced/overview.rst +++ b/docs/source/docker/advanced/overview.rst @@ -6,7 +6,6 @@ Here you learn more advanced usage patterns of Lightly Docker. .. toctree:: :maxdepth: 2 - meta_information.rst datapool.rst pretagging.rst datasource_predictions.rst diff --git a/docs/source/docker/advanced/pretagging.rst b/docs/source/docker/advanced/pretagging.rst index b362a3a74..9249df683 100644 --- a/docs/source/docker/advanced/pretagging.rst +++ b/docs/source/docker/advanced/pretagging.rst @@ -3,7 +3,7 @@ Pretagging ====================== -Lightly Docker supports the use of pre-trained models to tag the dataset. We +Lightly Worker supports the use of pre-trained models to tag the dataset. We call this pretagging. For now, we offer a pre-trained model for object detection optimized for autonomous-driving. @@ -42,7 +42,7 @@ before filtering. The plot shows the distribution of the various detected classes. Further it shows the average number of objects per image. -For every docker run with pretagging enabled we also dump all model predictions +For every Lightly Worker run with pretagging enabled we also dump all model predictions into a json file with the following format: .. code-block:: javascript @@ -81,27 +81,30 @@ into a json file with the following format: Usage --------------- -Pretagging can be activated by passing the following argument to your docker -run command: `pretagging=True` +Pretagging can be activated by passing the following argument to your +Lightly Worker config: `pretagging=True` - `pretagging=True` enables the use of the pretagging model - `pretagging_debug=True` add a few images to the report for debugging showing the image with the bounding box predictions. - `pretagging_upload=True` enables uploading of the predictions to a configured datasource. -The final docker run command to enable pretagging as well as pretagging_debug -should look like this: +A full Python script showing how to create such as job is shown here: + +.. literalinclude:: ./code_examples/python_run_pretagging.py + :linenos: + :language: python + + +After running the Python script to create the job we need to make sure we have +a running Lightly Worker to process the job. We can use the following +code to sping up a Lightly Worker .. code-block:: console - docker run --gpus all --rm -it \ - -v {INPUT_DIR}:/home/input_dir:ro \ - -v {SHARED_DIR}:/home/shared_dir \ - -v {OUTPUT_DIR}:/home/output_dir \ - lightly/worker:latest \ - token=MYAWESOMETOKEN \ - pretagging=True \ - pretagging_debug=True + docker run --rm --gpus all -it \ + -v /docker-output:/home/output_dir lightly/worker:latest \ + token=YOUR_TOKEN worker.worker_id=YOUR_WORKER_ID The following shows an example of how the debugging images in the report look like: @@ -112,29 +115,3 @@ The following shows an example of how the debugging images in the report look li The plot shows the detected bounding boxes from the pretagging overlayed on the image. Use the debug feature to figure out whether the pretagging mechanism works properly on your dataset. - - -Pretagging for Selection -^^^^^^^^^^^^^^^^^^^^^^^^ - -You can also use pretagging to guide the data selection process. This can be -helpful if you for example only care about images where there is at least one -person and more than one car. - -To create such a pretagging selection mechanism you need to create a config file. - -For the example of selecting only images with >=1 person and >=2 cars we can -create a `min_requirements.json` file like this: - -.. code-block:: json - - { - "person": 1, - "car": 2 - } - -Move this file to the shared directory (to make it accessible to the docker -container). -Finally, run the docker with `pretagging=True` -and `pretagging_config=min_requirements.json`. -Only images satisfying all declared requirements will be selected. diff --git a/docs/source/docker/advanced/sequence_selection.rst b/docs/source/docker/advanced/sequence_selection.rst index 96794eb69..d19fdba52 100644 --- a/docs/source/docker/advanced/sequence_selection.rst +++ b/docs/source/docker/advanced/sequence_selection.rst @@ -26,9 +26,9 @@ Usage ----------- To select sequences of length **X** simply add the argument **selected_sequence_length=X** -to your docker run command. Hereby, **X** must be an integer number which evenly divides +to your Lightly Worker run command. Hereby, **X** must be an integer number which evenly divides the **stopping_condition.n_samples**. If **stopping_condition.n_samples** is a fraction, -the Lightly docker will automatically round it to the next multiple of of **X**. +the Lightly Worker will automatically round it to the next multiple of of **X**. For example, let's say we have a folder with two videos @@ -39,26 +39,23 @@ which we randomly downloaded from `Pexels `_: ls /datasets/pexels/ > Pexels Videos 1409899.mp4 Pexels Videos 2495382.mp4 -Now, we want to select sequences of length ten. We use: +Now, we want to select sequences of length ten. We can use the following script: -.. code-block:: console +.. literalinclude:: code_examples/python_run_sequence_selection.py - docker run --gpus all --rm -it \ - -v /datasets/pexels:/home/input_dir:ro \ - -v /outputs/:/home/output_dir \ - lightly/worker:latest \ - token=MYAWESOMETOKEN \ - stopping_condition.n_samples=200 \ - enable_corruptness_check=False \ - remove_exact_duplicates=False \ - dump_dataset=True \ - selected_sequence_length=10 - -The above command will select 20 sequences each consisting of ten frames. The selected -frames are then saved in the output directory for further processing. Note that Lightly -docker currently doesn't support the corruptness check and removing exact duplicates for +The above script will create a run to select 20 sequences each consisting of ten frames. The selected +frames are then saved in the output directory for further processing. Note that Lightly Worker +currently doesn't support the corruptness check and removing exact duplicates for sequence selection. Hence we have to deactivate them in the command above. +To make sure our run gets processed we need to make sure we have a Lightly Worker +running: + +.. code-block:: console + + docker run --rm --gpus all -it \ + -v /docker-output:/home/output_dir lightly/worker:latest \ + token=YOUR_TOKEN worker.worker_id=YOUR_WORKER_ID .. warning:: The stopping condition `n_samples` must be equal to to the number of desired sequences times the `selected_sequence_length`, i.e. **n_samples = n_sequences x selected_sequence_length**. @@ -66,8 +63,8 @@ sequence selection. Hence we have to deactivate them in the command above. In our example, a look at a PCA of the embeddings of the selected frames nicely shows -the 20 selected sequences. The following image is taken from the output of the Lightly -docker: +the 20 selected sequences. The following image is taken from the output of the +Lightly Worker: .. figure:: images/sequence_selection_pca.png :align: center diff --git a/docs/source/docker/configuration/configuration.rst b/docs/source/docker/configuration/configuration.rst index d21ff3d87..d52338ea3 100644 --- a/docs/source/docker/configuration/configuration.rst +++ b/docs/source/docker/configuration/configuration.rst @@ -3,16 +3,16 @@ Configuration =================================== -As the lightly framework the docker solution can be configured using Hydra. +Similar to the +`lightly open-source framework `_, the Lightly Worker solution +can be configured using Hydra as well. -The example below shows how the `token` parameter can be set when running the docker container. +The following example shows how the `token` parameter is set. .. code-block:: console docker run --rm -it \ - -v {INPUT_DIR}:/home/input_dir:ro \ -v {OUTPUT_DIR}:/home/shared_dir \ - --ipc="host" --network="host" \ lightly/worker:latest \ token=MYAWESOMETOKEN @@ -22,9 +22,7 @@ Note that `token` can optionally be passed as a `LIGHTLY_TOKEN` environment vari docker run --rm -it \ -e LIGHTLY_TOKEN=MYAWESOMETOKEN - -v {INPUT_DIR}:/home/input_dir:ro \ -v {OUTPUT_DIR}:/home/shared_dir \ - --ipc="host" --network="host" \ lightly/worker:latest .. _rst-docker-parameters: @@ -51,8 +49,9 @@ The following are parameters which can be passed to the container: # Set to True to check whether installation was successful. sanity_check: False - # Path to a file containing filenames to run the docker on a subset of the - # files in the input directory. The docker will ignore all files in the input + # Path to a file containing filenames to run the Lightly Worker on a subset of the + # files in the input directory (local folder or datasource path). + # The Lightly Worker will ignore all files in the input # directory not listed here. Each filename must be on a separate line and # relative to the input directory. # If you use a cloud bucket as datasource, the path is relative @@ -180,20 +179,8 @@ The following are parameters which can be passed to the container: # optional deterministic unique output subdirectory for run, in place of timestamp run_directory: -Additionally, you can pass all arguments which can be passed to the lightly CLI tool with the `lightly` prefix. -For example, - -.. code-block:: console - - docker run --rm -it \ - -v {INPUT_DIR}:/home/input_dir:ro \ - -v {OUTPUT_DIR}:/home/output_dir \ - lightly/worker:latest \ - token=MYAWESOMETOKEN \ - lightly.loader.batch_size=512 - -sets the batch size during training and embedding to 512. You find a list of all -lightly CLI parameters here: :ref:`ref-cli-config-default` +To get an overview of all possible configuration parameters of Lightly, +please check out :ref:`ref-cli-config-default` Choosing the Right Parameters ----------------------------------- @@ -222,33 +209,3 @@ close to 0 pairwise distance. .. image:: images/histograms_overview.png - - -Increase I/O Performance ------------------------------------ -During the embedding process, the I/O bandwidth can often slow down the computation. A progress bar shows you the current compute -efficiency which is calculated as the time spent on computation compared to overall time per batch. A number close to 1.0 tells you -that your system is well utilized. A number close to 0.0 however, suggests that there is an I/O bottleneck. This can be the case for -datasets consisting of very high-resolution images. Loading them from harddisk and preprocessing can take a lot of time. - -To mitigate the effect of low I/O speed one can use background workers to load the data. First, we need to tell Docker to use -the host system for inter-process communication. Then, we can tell the filter to use multiple workers for data preprocessing. -You can use them by adding the following two parts to your docker run command: - -* **-\-ipc="host"** sets the host for inter-process communication. - This flag needs to be set to use background workers. Since this is an argument - to the docker run command we add it before our filter arguments. - -* **lightly.loader.num_workers=8** sets the number of background processes - to be used for data preprocessing. Usually, the number of physical - CPU cores works well. - -.. code-block:: console - - docker run --rm -it \ - -v {INPUT_DIR}:/home/input_dir:ro \ - -v {OUTPUT_DIR}:/home/output_dir \ - --ipc=host \ - lightly/worker:latest \ - token=MYAWESOMETOKEN \ - lightly.loader.num_workers=8 diff --git a/docs/source/docker/examples/academic_datasets.rst b/docs/source/docker/examples/academic_datasets.rst index cdaf08c50..5ea440c3f 100644 --- a/docs/source/docker/examples/academic_datasets.rst +++ b/docs/source/docker/examples/academic_datasets.rst @@ -1,61 +1,152 @@ ImageNet -=================================== - -Let's have a look at how to run the docker container to analyze and filter the famous -ImageNet dataset. You can reproduce the sample report using the following -command. - -.. code-block:: console - - docker run --gpus all --rm -it \ - -v /datasets/imagenet/train/:/home/input_dir:ro \ - -v /datasets/docker_imagenet_500k:/home/output_dir \ - --ipc="host" \ - lightly/worker:latest \ - token=MYAWESOMETOKEN \ - lightly.collate.input_size=64 \ - lightly.loader.batch_size=256 \ - lightly.loader.num_workers=8 \ - lightly.trainer.max_epochs=0 \ - stopping_condition.n_samples=500000 \ - remove_exact_duplicates=True \ - enable_corruptness_check=False +======== + +Let's have a look at how to run the Lightly Worker to analyze and filter the famous +ImageNet dataset. We are assuming here that the ImageNet dataset is located in an S3 +bucket under `s3://dataset/imagenet/`. Start by creating a dataset and configuring the datasource + +.. note:: For all examples we assume that the Lightly Worker is configured and running. See :ref:`ref-docker-setup` for more information. + + +.. code-block:: python + + from lightly.api import ApiWorkflowClient + from lightly.openapi_generated.swagger_client.models.dataset_type import DatasetType + from lightly.openapi_generated.swagger_client.models.datasource_purpose import DatasourcePurpose + + # Create the Lightly client to connect to the API. + client = ApiWorkflowClient(token="MY_AWESOME_TOKEN") + + # Create a new dataset on the Lightly Platform. + client.create_new_dataset_with_unique_name( + 'imagenet-example', + DatasetType.IMAGES, + ) + + ## AWS S3 + # Input bucket + client.set_s3_config( + resource_path="s3://dataset/imagenet/", + region='eu-central-1', + access_key='S3-ACCESS-KEY', + secret_access_key='S3-SECRET-ACCESS-KEY', + thumbnail_suffix=".lightly/thumbnails/[filename]_thumb.[extension]", + purpose=DatasourcePurpose.INPUT + ) + # Output bucket + client.set_s3_config( + resource_path="s3://output/", + region='eu-central-1', + access_key='S3-ACCESS-KEY', + secret_access_key='S3-SECRET-ACCESS-KEY', + thumbnail_suffix=".lightly/thumbnails/[filename]_thumb.[extension]", + purpose=DatasourcePurpose.LIGHTLY + ) + + + +Next, we schedule a job which extracts 500000 frames with the default Coreset strategy which +selects a diverse set of frames: + + +.. code-block:: python + + client.schedule_compute_worker_run( + worker_config={ + "enable_corruptness_check": False, + "remove_exact_duplicates": True, + "enable_training": False, + "pretagging": False, + "pretagging_debug": False, + "method": "coreset", + "stopping_condition": { + "n_samples": 500000, + "min_distance": -1 + } + } + ) + The complete **processing time** was **04h 37m 02s**. The machine used for this experiment is a cloud instance with -8 cores, 30GB of RAM, and a V100 GPU. The dataset was stored on an SSD drive. +8 cores, 30GB of RAM, and a V100 GPU. The dataset was stored on S3. You can also use the direct link for the `ImageNet `_ report. - - Combining Cityscapes with Kitti ================================ -Using Lightly Docker and the datapool feature we can combine two datasets and -ensure that we only keep the unique samples. +The Lightly Worker's datapool feature allows to update the pool of selected images +whenver new data arrives. This is a common usecase in production systems where new +image data arrives every week. In this example we simulate this process by first +selecting a subset of the Cityscapes dataset and then adding images from Kitti. + + +We start by creating a dataset and configuring the datasource. We assume here that we +have **only the Cityscapes** dataset stored in our S3 bucket under `s3://dataset/kittiscapes`: + +.. code-block:: python + + from lightly.api import ApiWorkflowClient + from lightly.openapi_generated.swagger_client.models.dataset_type import DatasetType + from lightly.openapi_generated.swagger_client.models.datasource_purpose import DatasourcePurpose + + # Create the Lightly client to connect to the API. + client = ApiWorkflowClient(token="MY_AWESOME_TOKEN") + + # Create a new dataset on the Lightly Platform. + client.create_new_dataset_with_unique_name( + 'kittiscapes-example', + DatasetType.IMAGES, + ) + + ## AWS S3 + # Input bucket + client.set_s3_config( + resource_path="s3://dataset/kittiscapes/", + region='eu-central-1', + access_key='S3-ACCESS-KEY', + secret_access_key='S3-SECRET-ACCESS-KEY', + thumbnail_suffix=".lightly/thumbnails/[filename]_thumb.[extension]", + purpose=DatasourcePurpose.INPUT + ) + # Output bucket + client.set_s3_config( + resource_path="s3://output/", + region='eu-central-1', + access_key='S3-ACCESS-KEY', + secret_access_key='S3-SECRET-ACCESS-KEY', + thumbnail_suffix=".lightly/thumbnails/[filename]_thumb.[extension]", + purpose=DatasourcePurpose.LIGHTLY + ) + +The following command schedules a job to select a subset from Cityscapes: + +.. code-block:: python + + client.schedule_compute_worker_run( + worker_config={ + "enable_corruptness_check": False, + "remove_exact_duplicates": True, + "enable_training": False, + "pretagging": False, + "pretagging_debug": False, + "method": "coreset", + "stopping_condition": { + "n_samples": -1, + "min_distance": 0.2, + } + } + ) -.. code-block:: console - - docker run --shm-size="512m" --gpus all --rm -it \ - -v /datasets/cityscapes/leftImg8bit/train/:/home/input_dir:ro \ - -v /datasets/docker_out_cityscapes:/home/output_dir \ - -v /datasets/docker_out_cityscapes:/home/shared_dir \ - -e --ipc="host" --network="host" lightly/worker:latest \ - token=MYAWESOMETOKEN lightly.loader.num_workers=8 \ - stopping_condition.min_distance=0.2 remove_exact_duplicates=True \ - enable_corruptness_check=False enable_training=True \ - lightly.trainer.max_epochs=20 lightly.optimizer.lr=1.0 \ - lightly.trainer.precision=32 lightly.loader.batch_size=256 \ - lightly.collate.input_size=64 datapool.name=autonomous_driving The report for running the command can be found here: :download:`Cityscapes.pdf <../resources/datapool_example_cityscapes.pdf>` Since the Cityscapes dataset has subfolders for the different cities Lightly -Docker uses them as weak labels for the embedding plot as shown below. +worker uses them as weak labels for the embedding plot as shown below. .. figure:: ../resources/cityscapes_scatter_umap_k_15_no_overlay.png :align: center @@ -65,30 +156,39 @@ Docker uses them as weak labels for the embedding plot as shown below. subfolders (cities) of the Cityscapes dataset. -Now we can use the datapool and pre-trained model to select the interesting -frames from Kitti and add them to Cityscapes: +Now we can use the datapool to select the interesting +frames from Kitti and add them to Cityscapes. For this, first **add all images +from Kitti to the S3 bucket** and then simply run the same command as above again. +The Lightly Worker will detect which images have already been processed and only work with +the new images. + -.. code-block:: console +.. code-block:: python - docker run --shm-size="512m" --gpus all --rm -it \ - -v /datasets/kitti/training/image_2/:/home/input_dir:ro \ - -v /datasets/docker_out_cityscapes:/home/output_dir \ - -v /datasets/docker_out_cityscapes:/home/shared_dir \ - -e --ipc="host" --network="host" lightly/worker:latest \ - token=MYAWESOMETOKEN lightly.loader.num_workers=8 \ - stopping_condition.min_distance=0.2 remove_exact_duplicates=True \ - enable_corruptness_check=False enable_training=False \ - lightly.trainer.max_epochs=20 lightly.optimizer.lr=1.0 \ - lightly.trainer.precision=32 lightly.loader.batch_size=256 \ - lightly.collate.input_size=64 datapool.name=autonomous_driving + client.schedule_compute_worker_run( + worker_config={ + "enable_corruptness_check": False, + "remove_exact_duplicates": True, + "enable_training": False, + "pretagging": False, + "pretagging_debug": False, + "method": "coreset", + "stopping_condition": { + "n_samples": -1, + "min_distance": 0.2, + } + } + ) -We will end up with new plots in the report due to the datapool. The plots show +The dataset from the beginning will now contain images from both datasets and +new plots have been generated in the report. The plots show the embeddings and highlight with blue color the samples which have been added -from the new dataset. In our experiment, we see that Lighlty Docker added several +from the new dataset. In our experiment, we see that Lightly Worker added several new samples outside of the previous embedding distribution. This is great, since it shows that Cityscapes and Kitti have different data and we can combine the two datasets. + .. figure:: ../resources/datapool_umap_scatter_before_threshold_0.2.png :align: center :alt: An example of the newly selected examples when we use diff --git a/docs/source/docker/examples/datasets_in_the_wild.rst b/docs/source/docker/examples/datasets_in_the_wild.rst index a8bae823a..c72b01fad 100644 --- a/docs/source/docker/examples/datasets_in_the_wild.rst +++ b/docs/source/docker/examples/datasets_in_the_wild.rst @@ -1,13 +1,14 @@ Extract Diverse Video Frames ============================= -The following example is a showcase how the lightly docker solution can be used -to extract frames from a video based on their uniqueness -rather than based on timestamps. +The following example is a showcase how the Lightly Worker can be used +to extract frames from a video based on their uniqueness rather than based on timestamps. + +.. note:: For all examples we assume that the Lightly Worker is configured and running. See :ref:`ref-docker-setup` for more information. Using ffmpeg ------------------------------ +------------ Using tools such as ffmpeg we can extract frames from a video using a simple one-liner like this: @@ -46,78 +47,93 @@ the framerate is very easy and helps us reduce the amount of extracted data. On the other hand, even a video with 5 fps might contain lots of similar frames or even worse, we might miss some frames with lots of "action". -Using Lightly Docker ------------------------------ +Using the Lightly Worker +------------------------ -Lightly Docker has been designed to give engineers an alternative to using +The Lightly Worker has been designed to give engineers an alternative to using fixed framerates for frame extraction. How about selecting frames based on their similarity? In this example, we use the following video: https://www.pexels.com/de-de/video/3719157/ -We download the video to a local folder */dataset/video/*. We can use wget in -a terminal under linux or MacOS to download the video (just make sure you -navigated to the directory where you want to download the video to). - -Let us extract frames from the video using ffmpeg. We want to get 5 frames per -second (fps). Create a new directory called */dataset/frames_ffmpeg/*. Using ffmpeg we can -extract the frames with the following command: +We store the video in a storage bucket, e.g. under *s3://dataset/video/*. We can use wget in +a terminal under linux or MacOS to download the video and then either upload it via drag and drop +or with the `aws cli `_. + + +Now, let's extract 99 frames using the Lightly Worker. We start by creating a dataset and configuring the S3 bucket as +a datasource. We call the dataset `frame-extraction-example` and use the input type `VIDEOS`. We configure the datasource to point at `s3://dataset/video/`. + +.. code-block:: python + + from lightly.api import ApiWorkflowClient + from lightly.openapi_generated.swagger_client.models.dataset_type import DatasetType + from lightly.openapi_generated.swagger_client.models.datasource_purpose import DatasourcePurpose + + # Create the Lightly client to connect to the API. + client = ApiWorkflowClient(token="MY_AWESOME_TOKEN") + + # Create a new dataset on the Lightly Platform. + client.create_new_dataset_with_unique_name( + 'frame-extraction-example', + DatasetType.VIDEOS, + ) + + ## AWS S3 + # Input bucket + client.set_s3_config( + resource_path="s3://dataset/video/", + region='eu-central-1', + access_key='S3-ACCESS-KEY', + secret_access_key='S3-SECRET-ACCESS-KEY', + thumbnail_suffix=".lightly/thumbnails/[filename]_thumb.[extension]", + purpose=DatasourcePurpose.INPUT + ) + # Output bucket + client.set_s3_config( + resource_path="s3://output/", + region='eu-central-1', + access_key='S3-ACCESS-KEY', + secret_access_key='S3-SECRET-ACCESS-KEY', + thumbnail_suffix=".lightly/thumbnails/[filename]_thumb.[extension]", + purpose=DatasourcePurpose.LIGHTLY + ) + + +Next, we schedule a job which extracts 99 frames with the default Coreset strategy which +selects a diverse set of frames: + + +.. code-block:: python + + client.schedule_compute_worker_run( + worker_config={ + "enable_corruptness_check": True, + "remove_exact_duplicates": True, + "enable_training": False, + "pretagging": False, + "pretagging_debug": False, + "method": "coreset", + "stopping_condition": { + "n_samples": 99, + "min_distance": -1 + } + } + ) + +The extracted frames can now be found in the output bucket (`s3://output`) and can easily be accessed from the `Lightly Platform `_. +To perform a random selection we can simply replace "coreset" with "random" as our selection method. Note that Coreset is the default method. + + +For comparison, we extracted frames from the video using ffmpeg with the following command: .. code-block:: console ffmpeg -i raw/video.mp4 -filter:v "fps=5" frames_ffmpeg/%d.png -Extracting the frames without introducing compression artifacts is using lots of -storage. In this example, we have a small video of 6.4 MBytes. Once extracted, -the .png frames together with the video consume 553.4 MBytes. This is a -70x increase! - -.. list-table:: - :widths: 50 50 50 30 - :header-rows: 1 - - * - Metric - - ffmpeg extracted frames - - Lightly using video - - Reduction - * - Storage Consumption - - 447 MBytes + 6.4 MBytes - - 6.4 MBytes - - 70.84x - -.. note:: Why not extract the frames as compressed .jpg images? Extracting the - frames as .jpg would indeed reduce storage consumption. The video from - our example would end up using (14 MBytes + 6.4 MBytes). However, for - critical applications where robustness and accuracy of the model are - key, we have to think about the final system in production. Is your - production system working with the raw camera stream (uncompressed) or - with compressed frames (e.g. .jpg)? Very often we don’t have time to - compress a frame in real-time systems or don’t want to introduce - compression artifacts. You should also think about whether you want - to train a model on compressed data whereas in production is runs - using raw data. - -Now we want to do the same using Lightly Docker. Since the ffmpeg command -extracted 99 frames let's extract 99 frames as well: - -.. code-block:: console - - docker run --gpus all --rm -it -v /dataset/video/:/home/input_dir:ro \ - -v \/datasets/videos/docker_out:/home/output_dir \ - -v /datasets/docker_shared_dir:/home/shared_dir -e --ipc="host" \ - --network="host" lightly/worker:latest token=MYAWESOMETOKEN \ - lightly.collate.input_size=64 lightly.loader.batch_size=32 ' - lightly.loader.num_workers=8 lightly.trainer.max_epochs=10 \ - stopping_condition.n_samples=100 remove_exact_duplicates=True \ - enable_corruptness_check=False enable_training=False dump_dataset=True \ - method=coreset - -To perform a random selection we can simply replace coreset with random as -our selected method. Note that coreset is the default method. - -Let's have a look at some statistics of the two obtained datasets: +The table below shows a comparison of the different extraction methods: .. list-table:: :widths: 50 50 50 50 50 @@ -159,6 +175,7 @@ Let's have a look at some statistics of the two obtained datasets: - 1.8525 - 1.7822 + We notice the following when looking at this table: - The **min distance** between two samples was 0 after ffmpeg selection whereas the @@ -177,6 +194,38 @@ As you see in this example just selecting every N-th frame is similar to selecting frames randomly. More sophisticated selection strategies, such as the coreset selection strategy, result in much higher sample diversity. The docker has been optimized for these selection strategies. + .. note:: Note that by default the embeddings of the dataset will be normalized to unit vector length. Max L2 distance between two vectors is - therefore 2.0 (two vectors pointing in opposite directions). \ No newline at end of file + therefore 2.0 (two vectors pointing in opposite directions). + + +Now let's take a look at the storage requirements. If we would extract all frames from the video +and then run a selection algorithm on them we would need 553.4 MBytes. However, the Lightly Worker +can process the video directly so we require only 6.4 MBytes of storage. This means it requires 70x less storage! + + +.. list-table:: + :widths: 50 50 50 30 + :header-rows: 1 + + * - Metric + - ffmpeg extracted frames + - Lightly using video + - Reduction + * - Storage Consumption + - 447 MBytes + 6.4 MBytes + - 6.4 MBytes + - 70.84x + +.. note:: Why not extract the frames as compressed .jpg images? Extracting the + frames as .jpg would indeed reduce storage consumption. The video from + our example would end up using (14 MBytes + 6.4 MBytes). However, for + critical applications where robustness and accuracy of the model are + key, we have to think about the final system in production. Is your + production system working with the raw camera stream (uncompressed) or + with compressed frames (e.g. .jpg)? Very often we don’t have time to + compress a frame in real-time systems or don’t want to introduce + compression artifacts. You should also think about whether you want + to train a model on compressed data whereas in production is runs + using raw data. diff --git a/docs/source/docker/examples/overview.rst b/docs/source/docker/examples/overview.rst index 6632988b4..754408481 100644 --- a/docs/source/docker/examples/overview.rst +++ b/docs/source/docker/examples/overview.rst @@ -1,11 +1,11 @@ Examples -================= +======== -We provide examples of how Lightly Docker can be used on various academic and +We provide examples of how the Lightly worker can be used on various academic and wild datasets. .. toctree:: :maxdepth: 1 - + datasets_in_the_wild.rst academic_datasets.rst \ No newline at end of file diff --git a/docs/source/docker/getting_started/first_steps.rst b/docs/source/docker/getting_started/first_steps.rst index 1f4a0f84f..19fe2b85b 100644 --- a/docs/source/docker/getting_started/first_steps.rst +++ b/docs/source/docker/getting_started/first_steps.rst @@ -3,14 +3,13 @@ First Steps =================================== -The Lightly Docker solution follows a train, embed, select flow using -self-supervised learning. +The Lightly worker follows a train, embed, select workflow: .. code-block:: console - +-------+ +-------+ +--------+ - | Train +----->+ Embed +----->+ Select | - +-------+ +-------+ +--------+ + +--------+ +---------+ +--------+ + | Train +----->+ Embed +----->+ Select | + +--------+ +---------+ +--------+ #. You can either use a pre-trained model from the model zoo or fine-tune a model on your unlabeled dataset using self-supervised learning. The output @@ -20,437 +19,379 @@ self-supervised learning. represented using a low-dimensional vector. The output of the embed step is a .csv file. -#. Finally, based on the embeddings and additional information we can use - one of the selection strategies to pick the relevant data for you. - The output of the select step is a list of filenames as well as - analytics in form of a pdf report with plots. +#. Finally, based on the embeddings and additional information, such as predictions or + metdata, we can use one of the selection strategies to pick the relevant data for you. + The output of the selection is a list of selected input samples as well as analytics in form of a pdf report with plots. -You can use each of the three steps independently as well. E.g. you can use -the Lightly Docker to embed a dataset and train a linear classifier on top of -them. +The Lightly worker can easily be triggered from your Python code. There are various parameters you can configure and we put a lot of effort to also expose the full configuration of the lightly self-supervised learning framework. +You could use the Lightly worker to train a self-supervised model instead of using the Python framework. -The docker solution can be used as a command-line interface. You run the container, tell it where to find data, and where to store the result. That's it. -There are various parameters you can pass to the container. We put a lot of effort to also expose the full lightly framework configuration. -You could use the docker solution to train a self-supervised model instead of using the Python framework. +Volume Mapping +-------------- -Before jumping into the detail let's have a look at some basics. -The docker container can be used as a simple script. You can control parameters by changing flags. - -Use the following command to get an overview of the available parameters: - -.. code-block:: console - - docker run --gpus all --rm -it lightly/worker:latest --help - -.. note:: In case the command fails because docker does not detect your GPU - you want to make sure `nvidia-docker` is installed. - You can follow the guide - `here `_. - - -Storage Access ------------------------------------ - -We use volume mapping provided by the docker run command to process datasets. -A docker container itself is not considered to be a good place to store your data. -Volume mapping allows the container to work with the filesystem of the host system. - - -There are **three** types of volume mappings: - -* **Input Directory:** - The input directory contains the dataset we want to process. The format of the input data should be either a single - folder containing all the images or a folder containing a subfolder which holds the images. - See the tutorial :ref:`input-structure-label` for more information. - The container has only **read access** to this directory (note the *:ro* at - the end of the volume mapping). - Instead of using a local input directory you can also use a cloud storage - bucket on S3, GCS, or Azure as a remote datasource. For reference, head to - :ref:`ref-docker-with-datasource`. -* **Shared Directory:** - The shared directory allows the user to pass additional inputs such as embeddings or model checkpoints - to the container. The checkpoints should be generated by the lightly Python package or by the docker - container and the embeddings should be in the format specified in the tutorial "Structure Your Input". - The container requires only **read access** to this directory. -* **Output Directory:** - The output directory is the place where the results from all computations made by the container are stored. - See `Reporting`_ and `Docker Output`_ for additional information. The container requires **read and - write access** to this directory. - -.. note:: Docker volume or port mappings always follow the scheme that you first - specify the host systems port followed by the internal port of the - container. E.g. **-v /datasets:/home/datasets** would mount /datasets - from your system to /home/datasets in the docker container. - - -Typically, your docker command would start like this: - -- Map *{INPUT_DIR}* (from your system) to */home/input_dir* in the container - - *e.g. /path/to/my/cat/dataset:/home/input_dir:ro* - -- Map *{OUTPUT_DIR}* (from your system) to */home/output_dir* in the container - - *e.g. /path/where/I/want/the/docker/output:/home/output_dir* - -- Specify the token to authenticate your user +Before we jump into the details of how to submit jobs, we need to start the Lightly image in +worker mode (as outlined in :ref:`ref-docker-setup`). .. code-block:: console docker run --gpus all --rm -it \ - -v {INPUT_DIR}:/home/input_dir:ro \ -v {OUTPUT_DIR}:/home/output_dir \ lightly/worker:latest \ - token=MYAWESOMETOKEN + token=MY_AWESOME_TOKEN \ + worker.worker_id=MY_WORKER_ID -Now, let's see how this will look in action! -.. note:: Learn how to obtain your :ref:`ref-authentication-token`. - -.. warning:: Don't forget to replace **{INPUT_DIR}** and **{OUTPUT_DIR}** with the path - to your local input and output directory. You must not change the - path after the **:** since this path is describing the internal - file system within the container! - -When running the above docker command you will find a new folder with the current date -and time in the {OUTPUT_DIR} folder. This can be inconvenient if you want to run the docker -in an automated pipeline as the current date and time change. - -Using the **run_directory** parameter you can use a custom and deterministic output folder. -The following docker run command would for example store the output in the -*{OUTPUT_DIR}/docker_out* folder. - -.. code-block:: console - - docker run --gpus all --rm -it \ - -v {INPUT_DIR}:/home/input_dir:ro \ - -v {OUTPUT_DIR}:/home/output_dir \ - lightly/worker:latest \ - token=MYAWESOMETOKEN \ - run_directory="docker_out" - -Specify Relevant Files ----------------------------- -Oftentimes not all files in a directory are relevant. In that case, it's possible -to pass a list of filenames to the Lightly docker -using the `relevant_filenames_file` configuration option. -It will then only consider the listed filenames -and ignore all others. To do so, you can create a text file which -contains one relevant filename per line and then pass the path to the text file -to the docker run command. This works for videos and images. - -For example, if this is your input directory: - -.. code-block:: console +Here, we use volume mapping provided by the docker run command to provide an output directory. +A docker container itself is not considered to be a good place to store data. +Volume mapping allows the worker to interact with the filesystem of the host system. - /path/to/my/data/ - L my-video.mp4 - L my-other-video.mp4 - L some/subfolder/ - L my-third-video.mp4 +The Lightly worker requires that an `{OUTPUT_DIR}` is specified where it can store +the results of all the computations. See `Reporting`_ and `Worker Output`_ for additional information. +The worker requires **read and write access** to this directory. -Then you can specify two input files by creating the following **filenames.txt**: - -.. code-block:: console - - my-video.mp4 - some/subfolder/my-third-video.mp4 +.. warning:: Docker volume or port mappings always follow the scheme that you first + specify the host systems port followed by the internal port of the + container. E.g. **-v /outputs:/home/outputs** would mount /outputs + from your system to /home/outputs in the docker container. -If you use a cloud bucket as input datasource, upload the file to it -and copy the path of the file relative to the datasource root. -If you use a cloud bucket and specified a separate input and output bucket, -put the file in the .lightly folder of the output bucket -and copy the path of the file relative to the output datasource root. +.. note:: Learn how to obtain your :ref:`ref-authentication-token`. -E.g. if your dataset is at `path/to/dataset` and your relevant_filenames.txt at -`path/to/dataset/subdir/relevant_filenames.txt`, -then copy the path `subdir/relevant_filenames.txt`. +Now, let's see how this will look in action! -If you use a local input directory, place the file in the shared directory -and copy the path relative to it. -Then you can add `relevant_filenames_file='subdir/relevant_filenames.txt'` -to the docker run command and the Lightly docker will only consider **my-video.mp4** and **my-third-video.mp4**. +.. _rst-worker-creating-a-dataset: -Embedding a Dataset and Selecting from it ------------------------------------------ +Creating a Dataset +------------------ -To embed your images with a pre-trained model, you can run the docker solution with this command: +For every job you want to submit, you require a `dataset_id` of a corresponding dataset in the Lightly API. +You can get the `dataset_id` either by creating a new dataset from Python or by re-using an existing dataset (see :ref:`ref-datapool`). -.. code-block:: console - docker run --gpus all --rm -it \ - -v {INPUT_DIR}:/home/input_dir:ro \ - -v {OUTPUT_DIR}:/home/output_dir \ - lightly/worker:latest \ - token=MYAWESOMETOKEN \ - remove_exact_duplicates=True \ - enable_corruptness_check=True \ - stopping_condition.n_samples=0.3 +.. code-block:: python + :caption: Creating a new dataset from Python -The command above does the following: + from lightly.api import ApiWorkflowClient + from lightly.openapi_generated.swagger_client.models.dataset_type import DatasetType -- **remove_exact_duplicates=True** Check your dataset for corrupt images + # Create the Lightly client to connect to the API. + client = ApiWorkflowClient(token="MY_AWESOME_TOKEN") -- **enable_corruptness_check=True** Removes exact duplicates + # Create a new dataset on the Lightly Platform. + client.create_dataset( + 'dataset-name', + DatasetType.IMAGES # can be DatasetType.VIDEOS when working with videos + ) + dataset_id = client.dataset_id -- **stopping_condition.n_samples=0.3** Selects 30% of the images using the - default method (coreset). Selecting 30% means that the remaining dataset - will be 30% of the initial dataset size. You can also specify the exact - number of remaining images by setting **n_samples** to an integer value. - This allows you to specify the minimum allowed distance between two image - embeddings in the output dataset. After normalizing the input embeddings - to unit length, this value should be between 0 and 2. This is often a more - convenient method when working with different data sources and trying to - combine them in a balanced way. +You can see the dataset under https://app.lightly.ai/datasets -- **stopping_condition.min_distance=0.2** would remove all samples which are - closer to each other than 0.2. +Next, the dataset requires read and write access to your storage bucket. You can +re-use the `client` from the previous step. If you create a new `ApiWorkflowClient` +make sure to specify the `dataset_id` in the constructor. -The docker creates just an output file with the selected -filenames for you. You can also tell the program to copy the selected files into -the output folder by adding the parameter **dump_dataset=True** to the command. +.. tabs:: -Train a Self-Supervised Model ------------------------------------ + .. tab:: S3 -Sometimes it may be beneficial to finetune a self-supervised model on your -dataset before embedding the images. This may be the case when the dataset is -from a specific domain (e.g. for medical images). + .. code-block:: python + :caption: Giving access to storage buckets from Python -The command below will **train a self-supervised model** for (default: 100) -epochs on the images stored in the input directory before embedding the images -and selecting from them. + from lightly.openapi_generated.swagger_client.models.datasource_purpose import DatasourcePurpose -.. code-block:: console + ## AWS S3 + # Input bucket + client.set_s3_config( + resource_path="s3://bucket/input/", + region='eu-central-1' + access_key='S3-ACCESS-KEY', + secret_access_key='S3-SECRET-ACCESS-KEY', + purpose=DatasourcePurpose.INPUT + ) + # Output bucket + client.set_s3_config( + resource_path="s3://bucket/output/", + region='eu-central-1' + access_key='S3-ACCESS-KEY', + secret_access_key='S3-SECRET-ACCESS-KEY', + purpose=DatasourcePurpose.LIGHTLY + ) - docker run --gpus all --rm -it \ - -v {INPUT_DIR}:/home/input_dir:ro \ - -v {OUTPUT_DIR}:/home/output_dir \ - lightly/worker:latest \ - token=MYAWESOMETOKEN \ - enable_training=True -The training of the model is identical to using the lightly open-source package -with the following command: + .. tab:: GCS -.. code-block:: console + .. code-block:: python + :caption: Giving access to storage buckets from Python - lightly-train input_dir={INPUT_DIR} + import json + from lightly.openapi_generated.swagger_client.models.datasource_purpose import DatasourcePurpose -**Checkpoints** from your training process will be stored in the output directory. You can continue training from such -a checkpoint by copying the checkpoint to the shared directory and then passing the checkpoint filename to the container: + ## Google Cloud Storage + # Input bucket + client.set_gcs_config( + resource_path="gs://bucket/input/", + project_id="PROJECT-ID", + credentials=json.dumps(json.load(open('credentials_read.json'))), + purpose=DatasourcePurpose.INPUT + ) + # Output bucket + client.set_gcs_config( + resource_path="gs://bucket/output/", + project_id="PROJECT-ID", + credentials=json.dumps(json.load(open('credentials_write.json'))), + purpose=DatasourcePurpose.LIGHTLY + ) -.. code-block:: console - docker run --gpus all --rm -it \ - -v {INPUT_DIR}:/home/input_dir:ro \ - -v {SHARED_DIR}:/home/shared_dir \ - -v {OUTPUT_DIR}:/home/output_dir \ - lightly/worker:latest \ - token=MYAWESOMETOKEN \ - stopping_condition.n_samples=0.3 \ - enable_training=True \ - checkpoint=lightly_epoch_99.ckpt + .. tab:: Azure -You may not always want to train for exactly 100 epochs with the default settings. The next section will -explain how to customize the default settings. + .. code-block:: python + :caption: Giving access to storage buckets from Python + from lightly.openapi_generated.swagger_client.models.datasource_purpose import DatasourcePurpose -Accessing Lightly Input Parameters ------------------------------------ -The docker container is a wrapper around the lightly Python package. -Hence, for training and embedding the user can access all the settings from -the lightly command-line tool. Just prepend the parameter with **lightly** to -do so. + ## Azure + # Input bucket + client.set_azure_config( + container_name='my-container/input/', + account_name='ACCOUNT-NAME', + sas_token='SAS-TOKEN', + purpose=DatasourcePurpose.INPUT + ) + # Output bucket + client.set_azure_config( + container_name='my-container/output/', + account_name='ACCOUNT-NAME', + sas_token='SAS-TOKEN', + purpose=DatasourcePurpose.LIGHTLY + ) -.. code-block:: console - docker run --gpus all --rm -it \ - -v {INPUT_DIR}:/home/input_dir:ro \ - -v {OUTPUT_DIR}:/home/output_dir \ - lightly/worker:latest \ - token=MYAWESOMETOKEN \ - remove_exact_duplicates=True \ - enable_corruptness_check=True \ - stopping_condition.n_samples=0.3 \ - enable_training=True \ - lightly.trainer.max_epochs=10 \ - lightly.collate.input_size=64 \ - lightly.loader.batch_size=256 \ - lightly.trainer.precision=16 \ - lightly.model.name=resnet-101 +.. warning:: + The credentials passed above need to provide Lightly with `LIST` and `READ` access to the input bucket and + with `LIST`, `READ`, and `WRITE` access to the output bucket. See :ref:`dataset-creation-gcloud-bucket`, + :ref:`dataset-creation-aws-bucket`, and :ref:`dataset-creation-azure-storage` for help + with configuring the different roles. +Scheduling a Simple Job +----------------------- -A list of all input parameters can be found here: :ref:`rst-docker-parameters` +Now that everything is in place, let's configure and run a simple job +.. code-block:: python + :caption: Scheduling a job from Python -.. _docker-sampling-from-embeddings: + client.schedule_compute_worker_run( + worker_config={ + "enable_corruptness_check": True, + "remove_exact_duplicates": True, + "enable_training": False, + "pretagging": False, + "pretagging_debug": False, + "method": "coreset", + "stopping_condition": { + "n_samples": 0.1, + "min_distance": -1 + } + } + ) -Selecting from Embeddings File ----------------------------------- -It is also possible to sample directly from embedding files generated by previous runs. For this, -move the embeddings file to the shared directory, and specify the filename like so: +The command schedules a job with the following configurations: + +- **enable_corruptness_check=True** Checks your dataset for corrupt images + +- **remove_exact_duplicates=True** Removes exact duplicates + +- **stopping_condition.n_samples=0.1** Selects 10% of the images using the + default method (coreset). Selecting 10% means that the remaining dataset + will be 10% of the initial dataset size. You can also specify the exact + number of remaining images by setting **n_samples** to an integer. + -.. code-block:: console +The worker should pick up the job after a few seconds and start working on it. The +status of the current run and scheduled jobs can be seen under https://app.lightly.ai/compute/runs - docker run --gpus all --rm -it \ - -v {INPUT_DIR}:/home/input_dir:ro \ - -v {SHARED_DIR}:/home/shared_dir \ - -v {OUTPUT_DIR}:/home/output_dir \ - lightly/worker:latest \ - token=MYAWESOMETOKEN \ - remove_exact_duplicates=True \ - enable_corruptness_check=False \ - stopping_condition.n_samples=0.3 \ - embeddings=my_embeddings.csv +After the job was processed, the selected data will be accessible in the configured dataset. The +report can be accessed from the compute worker runs page mentioned just above. -The embeddings file should follow the structure of the .csv file created by the -lightly CLI: :ref:`ref-cli-embeddings-lightly` or as described in :ref:`ref-docker-meta-information`. -Manually Inspecting the Embeddings ----------------------------------- -Every time you run Lightly Docker you will find an `embeddings.csv` file in the -output directory. This file contains the embeddings of all samples in your dataset. -You can use the embeddings for clustering or manual inspection of your dataset. +There's an alternative stopping condition to `n_samples`, the `min_distance` -.. figure:: images/colab_embeddings_example.png - :align: center - :alt: Example plot of working with embeddings.csv - - Example plot of working with embeddings.csv - - -We provide an -`example notebook `_ -to learn more about how to work with the embeddings. +- **stopping_condition.min_distance=0.2** would remove all samples which are + closer to each other than 0.2. This allows you to specify the minimum allowed distance between two image + embeddings in the output dataset. After normalizing the input embeddings + to unit length, this value should be between 0 and 2. This is often a more + convenient method when working with different data sources and trying to + combine them in a balanced way. -Selecting from Video Files --------------------------- -In case you are working with video files, it is possible to point the docker container -directly to the video files. This prevents the need to extract the individual frames beforehand. -To do so, simply store all videos you want to work with in a single directory, the lightly software -will automatically load all frames from the videos. -.. code-block:: console - # work on a single video - data/ - +-- my_video.mp4 +Training a Self-Supervised Model +-------------------------------- - # work on several videos - data/ - +-- my_video_1.mp4 - +-- my_video_2.avi +Sometimes it may be beneficial to finetune a self-supervised model on your +dataset before embedding the images. This may be the case when the dataset is +from a specific domain (e.g. for medical images). -As you can see, the videos do not need to be in the same file format. An example command for a folder -structure as shown above could then look like this: +The command below will **train a self-supervised model** for (default: 100) +epochs on the input images before embedding the images and selecting from them. + + +.. code-block:: python + :caption: Scheduling a job with self-supervised training from Python + + client.schedule_compute_worker_run( + worker_config={ + "enable_corruptness_check": True, + "remove_exact_duplicates": True, + "enable_training": True, + "pretagging": False, + "pretagging_debug": False, + "method": "coreset", + "stopping_condition": { + "n_samples": 0.1, + "min_distance": -1 + } + } + ) + +You may not always want to train for exactly 100 epochs with the default settings. +The Lightly worker is a wrapper around the lightly Python package. +Hence, for training and embedding the user can access all the settings from the lightly command-line tool. + + +.. code-block:: python + :caption: Accessing the lightly parameters from Python + + client.schedule_compute_worker_run( + worker_config={ + "enable_corruptness_check": True, + "remove_exact_duplicates": True, + "enable_training": True, + "pretagging": False, + "pretagging_debug": False, + "method": "coreset", + "stopping_condition": { + "n_samples": 0.1, + "min_distance": -1 + } + }, + lightly_config={ + 'loader': { + 'batch_size': 16, + 'shuffle': True, + 'num_workers': -1, + 'drop_last': True + }, + 'model': { + 'name': 'resnet-18', + 'out_dim': 128, + 'num_ftrs': 32, + 'width': 1 + }, + 'trainer': { + 'gpus': 1, + 'max_epochs': 100, + 'precision': 32 + }, + 'criterion': { + 'temperature': 0.5 + }, + 'optimizer': { + 'lr': 1, + 'weight_decay': 0.00001 + }, + 'collate': { + 'input_size': 64, + 'cj_prob': 0.8, + 'cj_bright': 0.7, + 'cj_contrast': 0.7, + 'cj_sat': 0.7, + 'cj_hue': 0.2, + 'min_scale': 0.15, + 'random_gray_scale': 0.2, + 'gaussian_blur': 0.5, + 'kernel_size': 0.1, + 'vf_prob': 0, + 'hf_prob': 0.5, + 'rr_prob': 0 + } + } + ) + + +Specifying Relevant Files +------------------------- +Oftentimes not all files in a bucket are relevant. In that case, it's possible +to pass a list of filenames to the worker using the `relevant_filenames_file` configuration option. +It will then only consider the listed filenames and ignore all others. To do so, you can create a text file which +contains one relevant filename per line and then pass the path to the text file when scheduling the job. This works for videos and images. + +.. warning:: The `relevant_filenames_file` is expected to be in the **output bucket** as specified above (see `Creating a Dataset`_). And must always be + located in a subdirectory called `.lightly`. + +For example, let's say you're working with the following file structure in an S3 bucket where +you are only interested in `image_1.png` and `subdir/image_3.png` .. code-block:: console - docker run --gpus all --rm -it \ - -v {INPUT_DIR}:/home/input_dir:ro \ - -v {SHARED_DIR}:/home/shared_dir \ - -v {OUTPUT_DIR}:/home/output_dir \ - lightly/worker:latest \ - token=MYAWESOMETOKEN \ - stopping_condition.n_samples=0.3 + s3://my-input-bucket/ + L image_1.png + L subdir/ + L image_2.png + L image_3.png -Where {INPUT_DIR} is the path to the directory containing the video files. -You can let Lightly Docker automatically extract the selected frames and save -them in the output folder using `dump_dataset=True`. +Then you can add a file called `relevant_filenames.txt` to your output bucket with the following content -.. code-block:: console - - docker run --gpus all --rm -it \ - -v {INPUT_DIR}:/home/input_dir:ro \ - -v {SHARED_DIR}:/home/shared_dir \ - -v {OUTPUT_DIR}:/home/output_dir \ - lightly/worker:latest \ - token=MYAWESOMETOKEN \ - stopping_condition.n_samples=0.3 \ - dump_dataset=True +.. code-block:: text + :caption: relevant_filenames.txt + image_1.png + subdir/image_3.png -.. note:: The `dump_dataset` feature by default saves the images in the `png` format. This can take a lot of time - when working with high-resolution videos. You can speed up the process by specifying the output format - `output_image_format='jpg'` or the resolution `output_image_size=X` of the images. +The output bucket should then look like this: -Removing Exact Duplicates ---------------------------- -With the docker solution, it is possible to remove **only exact duplicates** from the dataset. For this, -simply set the stopping condition `n_samples` to 1.0 (which translates to 100% of the data). The exact command is: .. code-block:: console - docker run --gpus all --rm -it \ - -v {INPUT_DIR}:/home/input_dir:ro \ - -v {SHARED_DIR}:/home/shared_dir \ - -v {OUTPUT_DIR}:/home/output_dir \ - lightly/worker:latest \ - token=MYAWESOMETOKEN \ - remove_exact_duplicates=True \ - stopping_condition.n_samples=1. - - -.. _ref-docker-upload-to-platform: + s3://my-output-bucket/ + L .lightly/ + L relevant_filenames.txt -Upload Sampled Dataset To Lightly Platform ------------------------------------------- -Lightly Docker can automatically push the selected dataset as well as its -embeddings to the Lightly Platform. +The corresponding Python command to submit a job would then be as follows: -Imagine you have a dataset of 100 videos with 10'000 frames each. 1 Million frames -in total. Using Lightly Docker and the coreset method we sample the most diverse -50'000 images (a reduction of 20x). Now we push the 50'000 images to the -Lightly Platform for a more interactive analysis. We can access all metadata as -well as the embedding view to explore the dataset, find clusters and further curate -the dataset. -Finally, we can use the Active Learning capabilities of the Lightly Platform to -iteratively train, predict, label the dataset in chunks until we reach the desired -model accuracy. - -To push the selected dataset automatically after running Lightly Docker you can -append `upload_dataset=True` to the docker run command. - -E.g. - -.. code-block:: console - - docker run --gpus all --rm -it \ - -v {INPUT_DIR}:/home/input_dir:ro \ - -v {SHARED_DIR}:/home/shared_dir \ - -v {OUTPUT_DIR}:/home/output_dir \ - lightly/worker:latest \ - token=MYAWESOMETOKEN \ - stopping_condition.n_samples=50'000 \ - stopping_condition.min_distance=0.3 \ - upload_dataset=True - -You can upload only thumbnails (to save bandwidth) or only metadata (for privacy -sensitive data) by -adding the argument `lightly.upload=thumbnails` or `lightly.upload=meta`. - -.. note:: You must specify the stopping condition `n_samples` and set the value - below 75'000 (the current limit of a dataset in the Lightly Platform). - We recommend setting both stopping conditions (`min_distance` and - `n_samples`) in which case selecting stops as soon as the first - condition is met. +.. code-block:: python + :caption: Scheduling a job with relevant filenames from Python + client.schedule_compute_worker_run( + worker_config={ + "relevant_filenames_file": ".lightly/relevant_filenames.txt", + "enable_corruptness_check": True, + "remove_exact_duplicates": True, + "enable_training": False, + "pretagging": False, + "pretagging_debug": False, + "method": "coreset", + "stopping_condition": { + "n_samples": 0.1, + "min_distance": -1 + } + } + ) Reporting ------------------------------------ +--------- -To facilitate sustainability and reproducibility in ML, the docker container +To facilitate sustainability and reproducibility in ML, the Lightly worker has an integrated reporting component. For every dataset, you run through the container an output directory gets created with the exact configuration used for the experiment. Additionally, plots, statistics, and more information collected @@ -462,35 +403,8 @@ an automatically generated PDF report. Sample reports can be found on the `Lightly website `_. -.. _ref-docker-runs: - -Live View of Docker Status -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -You can get a live status update of the currently running docker runs through -the `cloud platform `_. - -To use the new feature simply follow the steps: - -#. Make sure you have the latest docker version installed - (see :ref:`ref-docker-download-and-install`) -#. Open a browser and navigate to the `Lightly Platform `_ -#. In the navigation menu on the top click on **My Docker Runs** -#. Once you start the Lightly Docker you should see the dashboard of the current - run. Please make sure that you use the same token for the docker run as you - find in the dashboard. - -In the dashboard, you see a -list of your docker runs and a live update of the active runs. Use this -view to see whether the data selection is still running as expected. - -.. image:: images/docker_runs_overview.png - -.. note:: Note that only status updates and error messages are transmitted. - - -Docker Output -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Worker Output +^^^^^^^^^^^^^ The output directory is structured in the following way: @@ -510,7 +424,7 @@ The output directory is structured in the following way: * plots: A directory containing the plots which were produced for the report. * report.pdf - To provide a simple overview of the filtering process the docker container automatically generates a report. + To provide a simple overview of the filtering process the Lightly worker automatically generates a report. The report contains * information about the job (duration, processed files etc.) @@ -520,9 +434,7 @@ The output directory is structured in the following way: * visualizations of the dataset * nearest neighbors of retained images among the removed ones -* **NEW** report.json - * The report is also available as a report.json file. Any value from the pdf - pdf report can be easily be accessed. +* The report is also available as a report.json file. Any value from the pdf report can be easily be accessed. Below you find a typical output folder structure. @@ -546,7 +458,7 @@ Below you find a typical output folder structure. | |-- corrupt_filenames.txt | |-- duplicate_filenames.txt | |-- removed_filenames.txt - | '-- sampled_filenames.txt + | '-- sampled_filenames_excluding_datapool.txt |-- lightly_epoch_1.ckpt |-- plots | |-- distance_distr_after.png @@ -572,7 +484,7 @@ Below you find a typical output folder structure. -Evaluation of the Selection Proces +Evaluation of the Selection Process ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ **Histograms and Plots** @@ -595,35 +507,20 @@ as shown below. In our experiments, removing 7% of the dataset results in a mode Having such a high-density region can lead to biased models trained on this particular dataset. A heavy tail towards high distances shows that there is at least one high-density region outside the main cluster of samples. -**Retained/Removed Image Pairs** - -The report also displays examples of retained images with their nearest neighbor among the removed images. This is a good heuristic to see whether the number -of retained samples is too small or too large: If the pairs are are very different, this may be a sign that too many samples were removed. If the pairs are similar, -it is suggested that more images are removed. -With the argument stopping_condition.n_samples=X you can set the number of samples which should be kept. - -.. code-block:: console +Manually Inspecting the Embeddings +---------------------------------- +Every time you run Lightly worker you will find an `embeddings.csv` file in the +output directory. This file contains the embeddings of all samples in your dataset. +You can use the embeddings for clustering or manual inspection of your dataset. - docker run --gpus all --rm -it \ - -v {INPUT_DIR}:/home/input_dir:ro \ - -v {OUTPUT_DIR}:/home/output_dir \ - lightly/worker:latest \ - token=MYAWESOMETOKEN \ - remove_exact_duplicates=True \ - enable_corruptness_check=False \ - stopping_condition.n_samples=500 +.. figure:: images/colab_embeddings_example.png + :align: center + :alt: Example plot of working with embeddings.csv -With the argument n_example_images you can determine how many pairs are shown. Note that this must be an even number. + Example plot of working with embeddings.csv -.. code-block:: console - docker run --gpus all --rm -it \ - -v {INPUT_DIR}:/home/input_dir:ro \ - -v {OUTPUT_DIR}:/home/output_dir \ - lightly/worker:latest \ - token=MYAWESOMETOKEN \ - remove_exact_duplicates=True \ - enable_corruptness_check=False \ - stopping_condition.n_samples=0.3 \ - n_example_images=32 +We provide an +`example notebook `_ +to learn more about how to work with the embeddings. diff --git a/docs/source/docker/getting_started/setup.rst b/docs/source/docker/getting_started/setup.rst index 9e2803d32..33e1153c0 100644 --- a/docs/source/docker/getting_started/setup.rst +++ b/docs/source/docker/getting_started/setup.rst @@ -1,13 +1,13 @@ .. _ref-docker-setup: Setup -=================================== +===== Analytics -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +^^^^^^^^^ -The docker container currently reports usage metrics to our analytics software +The Lightly worker currently reports usage metrics to our analytics software (we use mixpanel) which uses https encrypted GET and POST requests to https://api.mixpanel.com. The transmitted data includes information about crashes and the number of samples that have been filtered. However, **the data does not include input / output samples**, @@ -16,25 +16,52 @@ filenames, or any other information which can be sensitive to our customers. Licensing -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +^^^^^^^^^ The licensing and account management is done through the :ref:`ref-authentication-token` as if you would use lightly. The token will be used to authenticate your account. -The authentication happens at every run of the container. Make sure the docker -container has a working internet connection and has access to -https://api.lightly.ai. +The authentication happens at every run of the worker. Make sure the Lightly worker +has a working internet connection and has access to https://api.lightly.ai. + + + +Download the Python client +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +We recommend to use the `lightly` Python package to interact with the Lightly API. It offers +helper functions to create and delete datasets, schedule jobs, and access the results: + +.. code-block:: console + + pip install lightly + +See :ref:`rst-installing` for details. + + + +Download the Python client +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +We recommend to use the `lightly` Python package to interact with the Lightly API. It offers +helper functions to create and delete datasets, schedule jobs, and access the results: + +.. code-block:: console + + pip install lightly + +See :ref:`rst-installing` for details. .. _ref-docker-download-and-install: -Download the Docker Image -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Download the Lightly Worker +^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Ask your account manager from Lightly for the credentials -to download the docker container. +The Lightly worker comes as a Docker image. Ask your account manager from Lightly for the credentials +to download the image. -In short, installing the Docker container consists of the following steps: +In short, installing the Docker image consists of the following steps: #. Copy the *container-credentials.json* to the instance you want to use for filtering #. Authenticate Docker to download the Lightly image @@ -44,8 +71,8 @@ In short, installing the Docker container consists of the following steps: **First**, we need to access the private container registry of Lightly. You received a *container-credentials.json* file from your account manager. -**Second**, to be able to download the docker image you need to log in with these credentials. -The following command will authenticate your installed docker account. +**Second**, to be able to download the Docker image you need to log in with these credentials. +The following command will authenticate your installed Docker account. We assume *container-credentials.json* is in your current directory. .. code-block:: console @@ -60,12 +87,12 @@ If the above command does not work, try the following: .. note:: When docker is freshly installed only the root user - can run docker commands. There are two ways to work in this case. + can run Docker commands. There are two ways to work in this case. #. give your user permission to run - recommended docker (see https://docs.docker.com/engine/install/linux-postinstall/) -#. run docker commands as root (always replace `docker` with `sudo docker`) - functional but less secure +#. run Docker commands as root (always replace `docker` with `sudo docker`) - functional but less secure For example, to authenticate as non-root user you would run @@ -85,13 +112,13 @@ Using the following command you pull the latest image from our European cloud se Until version 2.1.8 the latest image was named `eu.gcr.io/boris-250909/lightly/sampling:latest` from version 2.2 onwards the image is now called `eu.gcr.io/boris-250909/lightly/worker:latest`. - Please make sure to update any old docker run commands to use the new image name. + Please make sure to update any old Docker run commands to use the new image name. The downloaded image has a long name. We can reduce it by making use of *docker tag*. The following experiments are using the following image name *lightly/worker:latest*. -Create a new docker tag using the following command: +Create a new Docker tag using the following command: .. code-block:: console @@ -101,12 +128,33 @@ Create a new docker tag using the following command: .. note:: If you don't want to tag the image name you can replace lightly/worker:latest by eu.gcr.io/boris-250909/lightly/worker:latest for all commands in this documentation. + +Update the Lightly Worker +^^^^^^^^^^^^^^^^^^^^^^^^^ + +To update the Lightly worker we simply need to pull the latest docker image. + +.. code-block:: console + + docker pull eu.gcr.io/boris-250909/lightly/worker:latest + +Don't forget to tag the image again after pulling it. + +.. code-block:: console + + docker tag eu.gcr.io/boris-250909/lightly/worker:latest lightly/worker:latest + + +.. note:: You can download a specific version of the Docker image by indicating the version number + instead of `latest`. We follow semantic versioning standards. + + .. _ref-docker-setup-sanity-check: Sanity Check -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +^^^^^^^^^^^^ -**Finally**, verify the correctness of the docker container by running the following command: +**Next**, verify that the Lightly worker is installed correctly by running the following command: .. code-block:: console @@ -119,20 +167,57 @@ You should see an output similar to this one: [2022-05-02 20:37:27] Lightly Docker Solution v2.2.0 [2022-05-02 20:37:27] Congratulations! It looks like the Lightly container is running! -Head on to :ref:`rst-docker-first-steps` to see how to sample your dataset! +.. _ref-worker-register: + +Register the Lightly Worker +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Finally**, start the Lightly worker in waiting mode. In this mode, the worker will long-poll +the Lightly API for new jobs to process. To do so, a worker first needs to be registered. + + +.. note:: You only have to register each worker once. The registry is required because + it's possible to have several workers registered at the same time working on different + jobs in parallel. -Update Lightly Docker -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. code-block:: python + + # execute the following code once to get a worker_id + from lightly.api import ApiWorkflowClient + + client = ApiWorkflowClient(token='MY_AWESOME_TOKEN') # replace this by your token + worker_id = client.register_compute_worker() + print(worker_id) + +Store the `worker_id` in a secure location and then start the worker with -To update the docker we simply need to pull the latest docker image. .. code-block:: console - docker pull eu.gcr.io/boris-250909/lightly/worker:latest + docker run --gpus all --rm -it \ + -v {OUTPUT_DIR}:/home/output_dir \ + lightly/worker:latest \ + token=MY_AWESOME_TOKEN \ + worker.worker_id=MY_WORKER_ID + + +.. note:: All registered workers and their ids can be found under https://app.lightly.ai/compute/workers. + +All outputs generated by jobs will be stored in `{OUTPUT_DIR}`. The output directory will be explained in more detail in the :ref:`rst-docker-first-steps`. -Don't forget to tag the image again after pulling it. .. code-block:: console - docker tag eu.gcr.io/boris-250909/lightly/worker:latest lightly/worker:latest + [2022-06-03 07:57:34] Lightly Docker Solution v2.2.0 + [2022-06-03 07:57:34] You are using docker build: Wed Jun 1 09:51:10 UTC 2022. + [2022-06-03 07:57:34] Starting worker with id 61f27c8bf2f5d06164071415 + [2022-06-03 07:57:34] Worker started. Waiting for jobs... + +.. note:: In case the command fails because docker does not detect your GPU + you want to make sure `nvidia-docker` is installed. + You can follow the guide + `here `_. + + +Head on to :ref:`rst-docker-first-steps` to see how to schedule a job! diff --git a/docs/source/docker/integration/dagster_aws.rst b/docs/source/docker/integration/dagster_aws.rst index 52b35d820..5013d591d 100644 --- a/docs/source/docker/integration/dagster_aws.rst +++ b/docs/source/docker/integration/dagster_aws.rst @@ -2,33 +2,25 @@ .. _ref-docker-integration-aws-dagster: Data Pre-processing Pipeline on AWS with Dagster -=================================================== +================================================ Introduction -------------- -Data collection and pre-processing pipelines have become more and more automated in the recent years. The Lightly Docker can take on a crucial role +Data collection and pre-processing pipelines have become more and more automated in the recent years. The Lightly Worker can take on a crucial role in such a pipeline as it can reliably filter out redundant images and corrupted images with high throughput. This guide shows how to write a simple automated data pre-processing pipeline which performs the following steps: 1. Download a random video from `Pexels `_. 2. Upload the video to an S3 bucket. -3. Run the Lightly Docker on the video to extract a diverse set of frames for further processing: - - a. Spin up an EC2 instance. - - b. Run the Lightly Docker - - c. Store the extracted frames in the S3 bucket - - d. Stop the EC2 instance +3. Run the Lightly Worker on the video to extract a diverse set of frames for further processing: Here, the first two steps simulate a data collection process. .. note:: - The datapool option of the Lightly Docker allows it to remember frames/images it has seen + The datapool option of the Lightly Worker allows it to remember frames/images it has seen in past executions of the pipeline and ignore images which are too similar to already known ones. @@ -38,89 +30,88 @@ Dagster is an open-source data orchestrator for machine learning. It enables bui debugging data processing pipelines. Click `here `__ to learn more. -Setting up the EC2 Instance ------------------------------ -The first step is to set up the EC2 instance. For the purposes of this tutorial, -it's recommended to pick an instance with a GPU (like the g4dn.xlarge) and the "Deep Learning AMI (Ubuntu 18.04) Version 48.0" AMI. -See `this guide `_ to get started. Connect to the instance. - - -Next, the Lightly Docker should be installed. Please follow the instructions `here `__. -You can test if the installation was successfull like this: - -.. code-block:: console - - docker run --rm -it lightly/worker:latest sanity_check=True - -To run the docker remotely, it's recommended to write a `run.sh` script with default parameters. The other parameters can then -be changed by passing command line arguments. Use the following as a starting point and adapt it to your needs: - -.. code-block:: shell - - # general - IMAGE=lightly/worker:latest - - INPUT_DIR=$1 - SHARED_DIR=/home/ubuntu/shared_dir - OUTPUT_DIR=/home/ubuntu/lightly-aws-bucket/output_dir - - # api - TOKEN=YOUR_LIGHTLY_TOKEN - - # run command - docker run --gpus all --rm --shm-size="512m" \ - -v ${INPUT_DIR}:/home/input_dir \ - -v ${OUTPUT_DIR}:/home/output_dir \ - -v ${SHARED_DIR}:/home/shared_dir \ - --ipc="host" --network "host" \ - ${IMAGE} token=${TOKEN} \ - lightly.loader.num_workers=0 \ - enable_corruptness_check=True \ - remove_exact_duplicates=True \ - stopping_condition.n_samples=0.1 \ - upload_dataset=True \ - dump_dataset=True \ - datapool.name=lightly-datapool \ - >> /home/ubuntu/log.txt - - -.. note:: - - The above run command samples 10% of the frames for every input. After selection, it uploads the selected images to the Lightly Platform - and saves them to the output directory. The datapool option allows the Lightly Docker to remember already seen frames and adapt decisions based - on this knowledge. Learn more about the configuration of the `run.sh` file `here `_. - - - Setting up the S3 Bucket -------------------------- If you don't have an S3 bucket already, follow `these `_ instructions to create one. For the purpose of this tutorial, name the bucket `lightly-aws-bucket`. If you want to use a different S3 bucket, remember to replace all occurences of `lightly-aws-bucket` in the rest of this guide. +.. note:: + Make sure you have access to credentials to provide Lightly with `LIST` and `READ` access to the input bucket and + with `LIST`, `READ`, and `WRITE` access to the output bucket. See :ref:`dataset-creation-gcloud-bucket`, + :ref:`dataset-creation-aws-bucket`, and :ref:`dataset-creation-azure-storage` for help + with configuring the different roles. -To access the data in the S3 bucket, the S3 bucket must be mounted on the EC2 instance. This can be done with the s3fs library. +Then, configure a dataset in the Lightly Platform which will represent the state of your datapool: -First, install the library: +.. code-block:: python -.. code-block:: console + from lightly.api import ApiWorkflowClient + from lightly.openapi_generated.swagger_client.models.dataset_type import DatasetType + from lightly.openapi_generated.swagger_client.models.datasource_purpose import DatasourcePurpose + + # Create the Lightly client to connect to the API. + client = ApiWorkflowClient(token="YOUR_LIGHTLY_TOKEN") + + # Create a new dataset on the Lightly Platform. + client.create_new_dataset_with_unique_name( + 'my-datapool-name', + DatasetType.IMAGES # can be DatasetType.VIDEOS when working with videos + ) + print(f'Dataset id: {client.dataset_id}') + + ## AWS S3 + # Input bucket + client.set_s3_config( + resource_path="s3://lightly-aws-bucket/pexels", + region='eu-central-1' + access_key='S3-ACCESS-KEY', + secret_access_key='S3-SECRET-ACCESS-KEY', + thumbnail_suffix=".lightly/thumbnails/[filename]_thumb.[extension]", + purpose=DatasourcePurpose.INPUT + ) + # Output bucket + client.set_s3_config( + resource_path="s3://lightly-aws-bucket/outputs/", + region='eu-central-1' + access_key='S3-ACCESS-KEY', + secret_access_key='S3-SECRET-ACCESS-KEY', + thumbnail_suffix=".lightly/thumbnails/[filename]_thumb.[extension]", + purpose=DatasourcePurpose.LIGHTLY + ) + +Make sure to note the dataset id somewhere safe as you'll need it throughout this tutorial. - sudo apt install s3fs -Then, set the `user_allow_other` flag in the `/etc/fuse.conf` file and add the following line to `/etc/fstab`: +Setting up the EC2 Instance +----------------------------- +The next step is to set up the EC2 instance. For the purposes of this tutorial, +it's recommended to pick an instance with a GPU (like the g4dn.xlarge) and the "Deep Learning AMI (Ubuntu 18.04) Version 48.0" AMI. +See `this guide `_ to get started. Connect to the instance. -.. code-block:: console - s3fs#lightly-aws-bucket /home/ubuntu/lightly-aws-bucket/ fuse _netdev,allow_other,umask=000,passwd_file=/home/ubuntu/.passwd-s3fs 0 0 +Next, the Lightly Worker should be installed on the instance. Please follow the instructions `here `__. +Make sure you have the API token and the worker id from the setup steps. Start the worker in waiting mode with the following arguments: -Finally, create a password file which contains your AWS credentials and mount the S3 bucket: +.. code-block:: shell -.. code-block:: console + # general + IMAGE=lightly/worker:latest + + OUTPUT_DIR=/home/ubuntu/output_dir/ + + # api + TOKEN=YOUR_LIGHTLY_TOKEN + WORKER_ID=MY_WORKER_ID - echo "YOUR_AWS_ACCESS_KEY_ID:YOUR_AWS_ACCSESS_KEY" >> ~/.passwd-s3fs - mkdir ~/lightly-aws-bucket - sudo mount -a + # run command + # this makes the Lightly Worker start up and wait for jobs + docker run --gpus all --rm -it \ + -v ${OUTPUT_DIR}:/home/output_dir \ + lightly/worker:latest \ + token=${TOKEN} \ + worker.worker_id=${WORKER_ID} Integration @@ -223,7 +214,7 @@ working directory. Don't forget to set the `PEXELS_API_KEY`. The next solid in the pipeline (`s3.py`) uploads the video to the S3 bucket. It saves the video -in a randomly created subfolder in the S3 bucket and passes the object name to the next solid. +in a randomly created subfolder in the S3 bucket. Set the `BUCKET_NAME` and `REGION_NAME` to your bucket name and region of the EC2 instance. @@ -268,9 +259,9 @@ Set the `BUCKET_NAME` and `REGION_NAME` to your bucket name and region of the EC """ - # upload file to lightly-aws-bucket/input_dir/RANDOM_STRING/basename.mp4 + # upload file to lightly-aws-bucket/pexels/RANDOM_STRING/basename.mp4 object_name = os.path.join( - 'input_dir', + 'pexels', self.random_subfolder(), os.path.basename(filename) ) @@ -304,160 +295,63 @@ Set the `BUCKET_NAME` and `REGION_NAME` to your bucket name and region of the EC return object_name -Finally, the last solid in the pipeline (`lightly.py`) spins up the EC2 instance, runs the Lightly Docker on the object name passed -by the last solid, and then stops the EC2 instance again. Set the `REGION_NAME`, `INSTANCE_ID`, and `MOUNTED_DIR` if -necessary. - +Finally, the last solid in the pipeline (`lightly.py`) runs the Lightly Worker on the newly collected videos. +Set the `YOUR_LIGHTLY_TOKEN`, `YOUR_DATASET_ID` accordingly. .. code-block:: python import os import time - import boto3 - from botocore.exceptions import ClientError - from dagster import solid + TOKEN: str = 'YOUR_LIGHTLY_TOKEN' + DATASET_ID: str = 'YOUR_DATASET_ID' - REGION_NAME: str = 'YOUR_REGION_NAME' # e.g. eu-central-1 - INSTANCE_ID: str = 'YOUR_INSTANCE_ID' - MOUNTED_DIR: str = '/home/ubuntu/lightly-aws-bucket' - class EC2Client: - """EC2 client to start, run, and stop instances. + class LightlyClient: + """Lightly client to run the Lightly Worker. """ - def __init__(self): - self.ec2 = boto3.client('ec2', region_name=REGION_NAME) - self.ssm = boto3.client('ssm', region_name=REGION_NAME) - - - def wait(self, client, wait_for: str, **kwargs): - """Waits for a certain status of the ec2 or ssm client. - - """ - waiter = client.get_waiter(wait_for) - waiter.wait(**kwargs) - print(f'{wait_for}: OK') - + def __init__(self, token: str, dataset_id: str): + self.token = token + self.dataset_id = dataset_id - def start_instance(self, instance_id: str): - """Starts the EC2 instance with the given id. + def run_lightly_worker(): + """Runs the Lightly Worker on the EC2 instance. """ - # Do a dryrun first to verify permissions - try: - self.ec2.start_instances( - InstanceIds=[instance_id], - DryRun=True - ) - except ClientError as e: - if 'DryRunOperation' not in str(e): - raise - # Dry run succeeded, run start_instances without dryrun - try: - self.ec2.start_instances( - InstanceIds=[instance_id], - DryRun=False - ) - except ClientError as e: - print(e) - - self.wait(self.ec2, 'instance_exists') - self.wait(self.ec2, 'instance_running') - - - def stop_instance(self, instance_id: str): - """Stops the EC2 instance with the given id. - - """ - # Do a dryrun first to verify permissions - try: - self.ec2.stop_instances( - InstanceIds=[instance_id], - DryRun=True - ) - except ClientError as e: - if 'DryRunOperation' not in str(e): - raise - - # Dry run succeeded, call stop_instances without dryrun - try: - self.ec2.stop_instances( - InstanceIds=[instance_id], - DryRun=False - ) - except ClientError as e: - print(e) - - self.wait(self.ec2, 'instance_stopped') - - - def run_command(self, command: str, instance_id: str): - """Runs the given command on the instance with the given id. - - """ - - # Make sure the instance is OK - time.sleep(10) - - response = self.ssm.send_command( - DocumentName='AWS-RunShellScript', - Parameters={'commands': [command]}, - InstanceIds=[instance_id] + client = ApiWorkflowClient( + token=self.token, + dataset_id=self.dataset_id ) - command_id = response['Command']['CommandId'] - - # Make sure the command is pending - time.sleep(10) - - try: - self.wait( - self.ssm, - 'command_executed', - CommandId=command_id, - InstanceId=INSTANCE_ID, - WaiterConfig={ - 'Delay': 5, - 'MaxAttempts': 1000, + client.schedule_compute_worker_run( + worker_config={ + "enable_corruptness_check": True, + "remove_exact_duplicates": True, + "enable_training": False, + "pretagging": False, + "pretagging_debug": False, + "method": "coreset", + "stopping_condition": { + "n_samples": 0.1, + "min_distance": -1 } - ) - except: - # pretty print error message - import pprint - pprint.pprint( - self.ssm.get_command_invocation( - CommandId=command_id, - InstanceId=INSTANCE_ID, - ) - ) + } + ) @solid - def run_lightly_onprem(object_name: str) -> None: - """Dagster solid to run Lightly On-premise on a remote EC2 instance. - - Args: - object_name: - S3 object containing the input video(s) for Lightly. + def run_lightly_worker() -> None: + """Dagster solid to run Lightly Worker on a remote EC2 instance. """ - # object name is of format path/RANDOM_DIR/RANDOM_NAME.mp4 - # so the input directory is the RANDOM_DIR - input_dir = object_name.split('/')[-2] - - # input dir is mounted_dir/input_dir/batch/ - input_dir = os.path.join(MOUNTED_DIR, 'input_dir', input_dir) - - ec2_client = EC2Client() - ec2_client.start_instance(INSTANCE_ID) - ec2_client.run_command(f'/home/ubuntu/run.sh {input_dir}', INSTANCE_ID) - ec2_client.stop_instance(INSTANCE_ID) + lightly_client = LightlyClient(TOKEN, DATASET_ID) + lightly_client.run_lightly_worker() To put the solids together in a single pipeline, save the following code in `aws_example_pipeline.py`: @@ -484,8 +378,8 @@ To put the solids together in a single pipeline, save the following code in `aws """ file_name = download_random_video_from_pexels() - object_name = upload_video_to_s3(file_name) - run_lightly_onprem(object_name) + upload_video_to_s3(file_name) + run_lightly_onprem() Dagster allows to visualize pipelines in a web interface. The following command diff --git a/docs/source/docker/integration/overview.rst b/docs/source/docker/integration/overview.rst index 1105736ce..ef403acca 100644 --- a/docs/source/docker/integration/overview.rst +++ b/docs/source/docker/integration/overview.rst @@ -1,6 +1,6 @@ Integration =================================== -Here you learn how to integrate the Lightly Docker into data pre-processing pipelines. +Here you learn how to integrate the Lightly worker into data pre-processing pipelines. .. toctree:: @@ -8,5 +8,4 @@ Here you learn how to integrate the Lightly Docker into data pre-processing pipe docker_with_datasource.rst docker_trigger_from_api.rst - s3fs-fuse.rst dagster_aws.rst diff --git a/docs/source/docker/known_issues_faq.rst b/docs/source/docker/known_issues_faq.rst index db0674fde..dcc57d11a 100644 --- a/docs/source/docker/known_issues_faq.rst +++ b/docs/source/docker/known_issues_faq.rst @@ -3,7 +3,7 @@ Known Issues and FAQ =================================== -Docker is slow when working with long videos +Lightly Worker is slow when working with long videos --------------------------------------------------- We are working on this issue internally. For now we suggest to split the large @@ -22,7 +22,7 @@ What exactly happens here? - `-reset_timestamps 1`, makes sure we reset the timestamps (each video starts from 0) - `output%03d.mp4`, name of the output vidoes (output001.mp4, output002.mp4, ...) -Docker Crashes when running with GPUs +Lightly Worker Crashes when running with GPUs ------------------------------------- You run the docker with `--gpus all` and encounter the following error? @@ -37,7 +37,7 @@ Try to install `nvidia-docker` following the guide `here `_. -Shared Memory Error when running Lightly Docker +Shared Memory Error when running Lightly Worker ----------------------------------------------- The following error message appears when the docker runtime has not enough @@ -67,7 +67,7 @@ the docker run command: docker run --shm-size="512m" --gpus all -Docker crashes because of too many open files +Lightly Worker crashes because of too many open files ----------------------------------------------- The following error message appears when the docker runtime has not enough @@ -141,9 +141,7 @@ The token (along with other Hydra configuration) will be printed to stdout, and .. code-block:: console docker run --rm -it \ - -v {INPUT_DIR}:/home/input_dir:ro \ -v {OUTPUT_DIR}:/home/shared_dir \ - --ipc="host" --network="host" \ lightly/worker:latest \ token=MYAWESOMETOKEN \ ... @@ -154,8 +152,6 @@ This can be avoided by setting your `token` via the `LIGHTLY_TOKEN` environment docker run --rm -it \ -e LIGHTLY_TOKEN=MYAWESOMETOKEN - -v {INPUT_DIR}:/home/input_dir:ro \ -v {OUTPUT_DIR}:/home/shared_dir \ - --ipc="host" --network="host" \ lightly/worker:latest \ ... diff --git a/docs/source/docker/overview.rst b/docs/source/docker/overview.rst index 82db13828..14d8a80dd 100644 --- a/docs/source/docker/overview.rst +++ b/docs/source/docker/overview.rst @@ -1,5 +1,5 @@ -Docker -=================================== +Lightly Worker +============== We all know that sometimes when working with ML data we deal with really BIG datasets. The cloud solution is great for exploration, prototyping and an easy way to work with lightly. But there is more! @@ -12,22 +12,17 @@ and an easy way to work with lightly. But there is more! With the introduction of our on-premise solution, you can **process larger datasets completely on your end without data leaving your infrastructure**. We worked hard to make this happen and are very proud to present you with the following specs: -* **NEW** :ref:`ref-docker-with-datasource` -* **NEW** :ref:`integration-docker-trigger-from-api` - -* :ref:`ref-docker-active-learning` using Lightly Docker - -* Automatically upload the selected dataset to the Lightly Platform (see :ref:`ref-docker-upload-to-platform`) +* :ref:`ref-docker-active-learning` using Lightly Worker * See your docker runs live in the Lightly Platform (see :ref:`ref-docker-runs`) -* Lightly Docker has built-in pretagging models (see :ref:`ref-docker-pretagging`) +* Lightly Worker has built-in pretagging models (see :ref:`ref-docker-pretagging`) * Use this feature to pre-label your dataset or to only select images which contain certain objects * Supported object categories are: bicycle, bus, car, motorcycle, person, train, truck -* Select from more than 1 Million samples within a few hours! +* Select from more than 10 Million samples within a few hours! * Runs directly with videos without prior extraction of the frames! @@ -44,7 +39,7 @@ We worked hard to make this happen and are very proud to present you with the fo * Check for exact duplicates and report them - * We expose the full lightly framework config + * We expose the full lightly OSS framework config * Automated reporting of the datasets for each run diff --git a/docs/source/docker_archive/advanced/active_learning.rst b/docs/source/docker_archive/advanced/active_learning.rst new file mode 100644 index 000000000..81aba4fd5 --- /dev/null +++ b/docs/source/docker_archive/advanced/active_learning.rst @@ -0,0 +1,340 @@ +.. _ref-docker-active-learning: + +Active Learning +=============== + +Lightly makes use of active learning scores to select the samples which will yield +the biggest improvements of your machine learning model. The scores are calculated +on-the-fly based on model predictions and provide the selection algorithm with feedback +about the uncertainty of the model for the given sample. + +Learn more about the concept of active learning scores: +:ref:`lightly-active-learning-scorers`. + +.. note:: Note that the active learning features require a minimum + Lightly Worker of version 2.2. You can check your installed version of the + Lightly Worker by running the :ref:`ref-docker-setup-sanity-check`. + +Prerequisites +-------------- +In order to do active learning with Lightly, you will need the following things: + +- The installed Lightly docker (see :ref:`ref-docker-setup`) +- A dataset with a configured datasource (see :ref:`ref-docker-with-datasource-datapool`) +- Your predictions uploaded to the datasource (see :ref:`ref-docker-datasource-predictions`) + +.. note:: + + The dataset does not need to be new! For example, an initial selection without + active learning can be used to train a model. The predictions from this model + can then be used to improve your dataset by adding new images to it through active learning. + + +Selection +------------------------- +Once you have everything set up as described above, you can do an active learning +iteration by specifying the following three things in your Lightly docker config: + +- `method` +- `active_learning.task_name` +- `active_learning.score_name` + +Here's an example of how to configure an active learning run: + + +.. tabs:: + + .. tab:: Web App + + **Trigger the Job** + + To trigger a new job you can click on the schedule run button on the dataset + overview as shown in the screenshot below: + + .. figure:: ../integration/images/schedule-compute-run.png + + After clicking on the button you will see a wizard to configure the parameters + for the job. + + .. figure:: ../integration/images/schedule-compute-run-config.png + + In this example we have to set the `active_learning.task_name` parameter + in the docker config. Additionally, we set the `method` to `coral` which + simultaneously considers the diversity and the active learning scores of + the samples. All other settings are default values. The + resulting docker config should look like this: + + .. literalinclude:: code_examples/active_learning_worker_config.txt + :caption: Docker Config + :language: javascript + + The Lightly config remains unchanged. + + .. tab:: Python Code + + .. literalinclude:: code_examples/python_run_active_learning.py + + +After the worker has finished its job you can see the selected images with their +active learning score in the web-app. + + +Active Learning with Custom Scores (not recommended as of March 2022) +---------------------------------------------------------------------- + +.. note:: + This is not recommended anymore as of March 2022 and will be deprecated in the future! + + +For running an active learning step with the Lightly docker, we need to perform +3 steps: + +1. Create an `embeddings.csv` file. You can use your own models or the Lightly docker for this. +2. Add your active learning scores as an additional column to the embeddings file. +3. Use the Lightly docker to perform an active learning iteration on the scores. + +Learn more about the concept of active learning +:ref:`lightly-active-learning-scorers`. + + +Create Embeddings +^^^^^^^^^^^^^^^^^ + +You can create embeddings using your own model. Just make sure the resulting +`embeddings.csv` file matches the required format: +:ref:`ref-cli-embeddings-lightly`. + +Alternatively, you can run the docker as usual and as described in the +:ref:`rst-docker-first-steps` section. +The only difference is that you set the number of samples to be selected to 1.0, +as this simply creates an embedding of the full dataset. + +E.g. create and run a bash script with the following content: + +.. code:: + + # Have this in a step_1_run_docker_create_embeddings.sh + INPUT_DIR=/path/to/your/dataset + SHARED_DIR=/path/to/shared + OUTPUT_DIR=/path/to/output + + TOKEN= # put your token here + N_SAMPLES=1.0 + + docker run --gpus all --rm -it \ + -v ${INPUT_DIR}:/home/input_dir:ro \ + -v ${SHARED_DIR}:/home/shared_dir:ro \ + -v ${OUTPUT_DIR}:/home/output_dir \ + lightly/worker:latest \ + token=${TOKEN} \ + lightly.loader.num_workers=4 \ + stopping_condition.n_samples=${N_SAMPLES}\ + method=coreset \ + enable_training=True \ + lightly.trainer.max_epochs=20 + +Running it will create a terminal output similar to the following: + +.. code-block:: + + [2021-09-29 13:32:11] Loading initial dataset... + [2021-09-29 13:32:11] Found 372 input images in input_dir. + [2021-09-29 13:32:11] Lightly On-Premise License is valid + [2021-09-29 13:32:11] Checking for corrupt images (disable with enable_corruptness_check=False). + Corrupt images found: 0: 100%|██████████████████| 372/372 [00:01<00:00, 310.35it/s] + [2021-09-29 13:32:14] Training self-supervised model. + GPU available: True, used: True + [2021-09-29 13:32:57,696][lightning][INFO] - GPU available: True, used: True + TPU available: None, using: 0 TPU cores + [2021-09-29 13:32:57,697][lightning][INFO] - TPU available: None, using: 0 TPU cores + LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0] + [2021-09-29 13:32:57,697][lightning][INFO] - LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0] + + | Name | Type | Params + ----------------------------------------- + 0 | model | SimCLR | 11.2 M + 1 | criterion | NTXentLoss | 0 + ----------------------------------------- + 11.2 M Trainable params + 0 Non-trainable params + [2021-09-29 13:34:29,772][lightning][INFO] - Saving latest checkpoint... + Epoch 19: 100%|████████████████████████████████| 23/23 [00:04<00:00, 5.10it/s, loss=2.52, v_num=0] + [2021-09-29 13:34:29] Embedding images. + Compute efficiency: 0.90: 100%|█████████████████████████| 24/24 [00:01<00:00, 21.85it/s] + [2021-09-29 13:34:31] Saving embeddings to output_dir/2021-09-29/13:32:11/data/embeddings.csv. + [2021-09-29 13:34:31] Unique embeddings are stored in output_dir/2021-09-29/13:32:11/data/embeddings.csv + [2021-09-29 13:34:31] Normalizing embeddings to unit length (disable with normalize_embeddings=False). + [2021-09-29 13:34:31] Normalized embeddings are stored in output_dir/2021-09-29/13:32:11/data/normalized_embeddings.csv + [2021-09-29 13:34:31] Sampling dataset with stopping condition: n_samples=372 + [2021-09-29 13:34:31] Skipped sampling because the number of remaining images is smaller than the number of requested samples. + [2021-09-29 13:34:31] Writing report to output_dir/2021-09-29/13:32:11/report.pdf. + [2021-09-29 13:35:04] Writing csv with information about removed samples to output_dir/2021-09-29/13:32:11/removed_samples.csv + [2021-09-29 13:35:04] Done! + +By running it, this will create an `embeddings.csv` file +in the output directory. Locate it and save the path to it. +E.g. It may be found under +`/path/to/output/2021-09-28/15:47:34/data/embeddings.csv` + +It should look similar to this: + ++----------------+--------------+--------------+--------------+--------------+---------+ +| filenames | embedding_0 | embedding_1 | embedding_2 | embedding_3 | labels | ++================+==============+==============+==============+==============+=========+ +| cats/0001.jpg | 0.29625183 | 0.50055015 | 0.36491454 | 0.8156051 | 0 | ++----------------+--------------+--------------+--------------+--------------+---------+ +| dogs/0005.jpg | 0.36491454 | 0.29625183 | 0.38491454 | 0.36491454 | 1 | ++----------------+--------------+--------------+--------------+--------------+---------+ +| cats/0014.jpg | 0.8156051 | 0.59055015 | 0.29625183 | 0.50055015 | 0 | ++----------------+--------------+--------------+--------------+--------------+---------+ + + +Add Active Learning Scores +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If you want to use the predictions from your model as active learning scores, +you can use the :ref:`lightly-active-learning-scorers` from the lightly pip package. + +.. note:: You can also use your own scorers. Just make sure that you get a value + between `0.0` and `1.0` for each sample. A number close to `1.0` should + indicate a very important sample you want to be selected with a higher + probability. + +We provide a simple Python script to append a list of `scores` to the `embeddings.csv` file. + +.. code-block:: python + + # Have this in a step_2_add_al_scores.py + + from typing import Iterable + import csv + import os + + """ + Run your detection model here + Use the scorers offered by lightly to generate active learning scores. + """ + + # Let's assume that you have one active learning score for every image. + # WARNING: The order of the scores MUST match the order of filenames + # in the embeddings.csv. + scores: Iterable[float] = # must be an iterable of floats, + # e.g. a list of float or a 1d-numpy array + + # define the function to add the scores to the embeddings.csv + def add_al_scores_to_csv( + input_file_path: str, output_file_path: str, + scores: Iterable[float], column_name: str = "al_score" + ): + with open(input_file_path, 'r') as read_obj: + with open(output_file_path, 'w') as write_obj: + csv_reader = csv.reader(read_obj) + csv_writer = csv.writer(write_obj) + + # add the column name + first_row = next(csv_reader) + first_row.append(column_name) + csv_writer.writerow(first_row) + + # add the scores + for row, score in zip(csv_reader, scores): + row.append(str(score)) + csv_writer.writerow(row) + + # use the function + # adapt the following line to use the correct path to the embeddings.csv + input_embeddings_csv = '/path/to/output/2021-07-28/12:00:00/data/embeddings.csv' + output_embeddings_csv = input_embeddings_csv.replace('.csv', '_al.csv') + add_al_scores_to_csv(input_embeddings_csv, output_embeddings_csv, scores) + + print("Use the following path to the embeddings_al.csv in the next step:") + print(output_embeddings_csv) + +Running it will create a terminal output similar to the following: + +.. code-block:: + + (base) user@machine:~/GitHub/playground/docker_with_al$ sudo python3 step_2_add_al_scores.py + Use the following path to the embedding.csv in the next step: + /path/to/output/2021-07-28/12:00:00/data/embeddings_al.csv + +Your embeddings_al.csv should look similar to this: + ++----------------+--------------+--------------+--------------+--------------+---------+-----------+ +| filenames | embedding_0 | embedding_1 | embedding_2 | embedding_3 | labels | al_score | ++================+==============+==============+==============+==============+=========+===========+ +| cats/0001.jpg | 0.29625183 | 0.50055015 | 0.36491454 | 0.8156051 | 0 | 0.7231 | ++----------------+--------------+--------------+--------------+--------------+---------+-----------+ +| dogs/0005.jpg | 0.36491454 | 0.29625183 | 0.38491454 | 0.36491454 | 1 | 0.91941 | ++----------------+--------------+--------------+--------------+--------------+---------+-----------+ +| cats/0014.jpg | 0.8156051 | 0.59055015 | 0.29625183 | 0.50055015 | 0 | 0.01422 | ++----------------+--------------+--------------+--------------+--------------+---------+-----------+ + + +Run Active Learning using the Docker +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +At this point you should have an `embeddings.csv` file with the active learning +scores in a column named `al_scores`. + +We can now perform an active learning iteration using the `coral` selection strategy. In order +to do the selection on the `embeddings.csv` file we need to make this file +accessible to the docker. We can do this by using the `shared_dir` feature of the +docker as described in :ref:`docker-sampling-from-embeddings`. + +E.g. use the following bash script. + +.. code-block:: bash + + #!/bin/bash -e + + # Have this in a step_3_run_docker_coral.sh + + INPUT_DIR=/path/to/your/dataset/ + SHARED_DIR=/path/to/shared/ + OUTPUT_DIR=/path/to/output/ + + EMBEDDING_FILE= # insert the path printed in the last step here. + # e.g. /path/to/output/2021-07-28/12:00:00/data/embeddings_al.csv + + cp INPUT_EMBEDDING_FILE SHARED_DIR # copy the embedding file to the shared directory + EMBEDDINGS_REL_TO_SHARED=embeddings_al.csv + + + TOKEN= # put your token here + N_SAMPLES= # Choose how many samples you want to use here, e.g. 0.1 for 10 percent. + + docker run --gpus all --rm -it \ + -v ${INPUT_DIR}:/home/input_dir:ro \ + -v ${SHARED_DIR}:/home/shared_dir:ro \ + -v ${OUTPUT_DIR}:/home/output_dir \ + lightly/worker:latest \ + token=${TOKEN} \ + lightly.loader.num_workers=4 \ + stopping_condition.n_samples=${N_SAMPLES}\ + method=coral \ + enable_training=False \ + dump_dataset=True \ + upload_dataset=False \ + embeddings=${EMBEDDINGS_REL_TO_SHARED} \ + active_learning_score_column_name="al_score" \ + scorer="" + +Your terminal output should look similar to this: + +.. code-block:: + + [2021-09-29 09:36:27] Loading initial embedding file... + [2021-09-29 09:36:27] Output images will not be resized. + [2021-09-29 09:36:27] Found 372 input images in shared_dir/embeddings_al.csv. + [2021-09-29 09:36:27] Lightly On-Premise License is valid + [2021-09-29 09:36:28] Removing exact duplicates (disable with remove_exact_duplicates=False). + [2021-09-29 09:36:28] Found 0 exact duplicates. + [2021-09-29 09:36:28] Unique embeddings are stored in shared_dir/embeddings_al.csv + [2021-09-29 09:36:28] Normalizing embeddings to unit length (disable with normalize_embeddings=False). + [2021-09-29 09:36:28] Normalized embeddings are stored in output_dir/2021-09-29/09:36:27/data/normalized_embeddings.csv + [2021-09-29 09:36:28] Sampling dataset with stopping condition: n_samples=10 + [2021-09-29 09:36:28] Sampled 10 images. + [2021-09-29 09:36:28] Writing report to output_dir/2021-09-29/09:36:27/report.pdf. + [2021-09-29 09:36:56] Writing csv with information about removed samples to output_dir/2021-09-29/09:36:27/removed_samples.csv + [2021-09-29 09:36:56] Done! diff --git a/docs/source/docker_archive/advanced/code_examples/active_learning_worker_config.txt b/docs/source/docker_archive/advanced/code_examples/active_learning_worker_config.txt new file mode 100644 index 000000000..1f52ad826 --- /dev/null +++ b/docs/source/docker_archive/advanced/code_examples/active_learning_worker_config.txt @@ -0,0 +1,21 @@ +{ + enable_corruptness_check: true, + remove_exact_duplicates: true, + enable_training: false, + pretagging: false, + pretagging_debug: false, + method: 'coral', + stopping_condition: { + n_samples: 0.1, + min_distance: -1 + }, + scorer: 'object-frequency', + scorer_config: { + frequency_penalty: 0.25, + min_score: 0.9 + }, + active_learning: { + task_name: 'my-classification-task', + score_name: 'uncertainty_margin' + } +} \ No newline at end of file diff --git a/docs/source/docker_archive/advanced/code_examples/object_level_worker_config.txt b/docs/source/docker_archive/advanced/code_examples/object_level_worker_config.txt new file mode 100644 index 000000000..a4740f931 --- /dev/null +++ b/docs/source/docker_archive/advanced/code_examples/object_level_worker_config.txt @@ -0,0 +1,24 @@ +{ + object_level: { + task_name: 'vehicles_object_detections' + }, + enable_corruptness_check: true, + remove_exact_duplicates: true, + enable_training: false, + pretagging: false, + pretagging_debug: false, + method: 'coreset', + stopping_condition: { + n_samples: 0.1, + min_distance: -1 + }, + scorer: 'object-frequency', + scorer_config: { + frequency_penalty: 0.25, + min_score: 0.9 + }, + active_learning: { + task_name: '', + score_name: 'uncertainty_margin' + } +} \ No newline at end of file diff --git a/docs/source/docker_archive/advanced/code_examples/object_level_worker_config_pretagging.txt b/docs/source/docker_archive/advanced/code_examples/object_level_worker_config_pretagging.txt new file mode 100644 index 000000000..39ce861cf --- /dev/null +++ b/docs/source/docker_archive/advanced/code_examples/object_level_worker_config_pretagging.txt @@ -0,0 +1,24 @@ +{ + object_level: { + task_name: 'lightly_pretagging' + }, + enable_corruptness_check: true, + remove_exact_duplicates: true, + enable_training: false, + pretagging: true, + pretagging_debug: false, + method: 'coreset', + stopping_condition: { + n_samples: 0.1, + min_distance: -1 + }, + scorer: 'object-frequency', + scorer_config: { + frequency_penalty: 0.25, + min_score: 0.9 + }, + active_learning: { + task_name: '', + score_name: 'uncertainty_margin' + } +} \ No newline at end of file diff --git a/docs/source/docker_archive/advanced/code_examples/python_run_active_learning.py b/docs/source/docker_archive/advanced/code_examples/python_run_active_learning.py new file mode 100644 index 000000000..c5955d1be --- /dev/null +++ b/docs/source/docker_archive/advanced/code_examples/python_run_active_learning.py @@ -0,0 +1,74 @@ +import lightly + +# Create the Lightly client to connect to the API. +client = lightly.api.ApiWorkflowClient(token="TOKEN", dataset_id="DATASET_ID") + +# Schedule the docker run with +# - "active_learning.task_name" set to your task name +# - "method" set to "coral" +# All other settings are default values and we show them so you can easily edit +# the values according to your need. +client.schedule_compute_worker_run( + worker_config={ + "enable_corruptness_check": True, + "remove_exact_duplicates": True, + "enable_training": False, + "pretagging": False, + "pretagging_debug": False, + "method": "coral", + "stopping_condition": { + "n_samples": 0.1, + "min_distance": -1 + }, + "scorer": "object-frequency", + "scorer_config": { + "frequency_penalty": 0.25, + "min_score": 0.9 + }, + "active_learning": { + "task_name": "my-classification-task", + "score_name": "uncertainty_margin" + } + }, + lightly_config={ + 'loader': { + 'batch_size': 16, + 'shuffle': True, + 'num_workers': -1, + 'drop_last': True + }, + 'model': { + 'name': 'resnet-18', + 'out_dim': 128, + 'num_ftrs': 32, + 'width': 1 + }, + 'trainer': { + 'gpus': 1, + 'max_epochs': 100, + 'precision': 32 + }, + 'criterion': { + 'temperature': 0.5 + }, + 'optimizer': { + 'lr': 1, + 'weight_decay': 0.00001 + }, + 'collate': { + 'input_size': 64, + 'cj_prob': 0.8, + 'cj_bright': 0.7, + 'cj_contrast': 0.7, + 'cj_sat': 0.7, + 'cj_hue': 0.2, + 'min_scale': 0.15, + 'random_gray_scale': 0.2, + 'gaussian_blur': 0.5, + 'kernel_size': 0.1, + 'vf_prob': 0, + 'hf_prob': 0.5, + 'rr_prob': 0 + } + } +) \ No newline at end of file diff --git a/docs/source/docker_archive/advanced/code_examples/python_run_object_level.py b/docs/source/docker_archive/advanced/code_examples/python_run_object_level.py new file mode 100644 index 000000000..1f779d3bf --- /dev/null +++ b/docs/source/docker_archive/advanced/code_examples/python_run_object_level.py @@ -0,0 +1,75 @@ +import lightly + +# Create the Lightly client to connect to the API. +client = lightly.api.ApiWorkflowClient(token="TOKEN", dataset_id="DATASET_ID") + +# Schedule the docker run with the "object_level.task_name" argument set. +# All other settings are default values and we show them so you can easily edit +# the values according to your need. +client.schedule_compute_worker_run( + worker_config={ + "object_level": { + "task_name": "vehicles_object_detections" + }, + "enable_corruptness_check": True, + "remove_exact_duplicates": True, + "enable_training": False, + "pretagging": False, + "pretagging_debug": False, + "method": "coreset", + "stopping_condition": { + "n_samples": 0.1, + "min_distance": -1 + }, + "scorer": "object-frequency", + "scorer_config": { + "frequency_penalty": 0.25, + "min_score": 0.9 + }, + "active_learning": { + "task_name": "", + "score_name": "uncertainty_margin" + } + }, + lightly_config={ + 'loader': { + 'batch_size': 16, + 'shuffle': True, + 'num_workers': -1, + 'drop_last': True + }, + 'model': { + 'name': 'resnet-18', + 'out_dim': 128, + 'num_ftrs': 32, + 'width': 1 + }, + 'trainer': { + 'gpus': 1, + 'max_epochs': 100, + 'precision': 32 + }, + 'criterion': { + 'temperature': 0.5 + }, + 'optimizer': { + 'lr': 1, + 'weight_decay': 0.00001 + }, + 'collate': { + 'input_size': 64, + 'cj_prob': 0.8, + 'cj_bright': 0.7, + 'cj_contrast': 0.7, + 'cj_sat': 0.7, + 'cj_hue': 0.2, + 'min_scale': 0.15, + 'random_gray_scale': 0.2, + 'gaussian_blur': 0.5, + 'kernel_size': 0.1, + 'vf_prob': 0, + 'hf_prob': 0.5, + 'rr_prob': 0 + } + } +) diff --git a/docs/source/docker_archive/advanced/code_examples/python_run_object_level_pretagging.py b/docs/source/docker_archive/advanced/code_examples/python_run_object_level_pretagging.py new file mode 100644 index 000000000..8e5903112 --- /dev/null +++ b/docs/source/docker_archive/advanced/code_examples/python_run_object_level_pretagging.py @@ -0,0 +1,76 @@ +import lightly + +# Create the Lightly client to connect to the API. +client = lightly.api.ApiWorkflowClient(token="TOKEN", dataset_id="DATASET_ID") + +# Schedule the docker run with the "object_level.task_name" argument set to +# "lightly_pretagging" and with "pretagging" set to True. +# All other settings are default values and we show them so you can easily edit +# the values according to your need. +client.schedule_compute_worker_run( + worker_config={ + "object_level": { + "task_name": "lightly_pretagging" + }, + "enable_corruptness_check": True, + "remove_exact_duplicates": True, + "enable_training": False, + "pretagging": True, + "pretagging_debug": False, + "method": "coreset", + "stopping_condition": { + "n_samples": 0.1, + "min_distance": -1 + }, + "scorer": "object-frequency", + "scorer_config": { + "frequency_penalty": 0.25, + "min_score": 0.9 + }, + "active_learning": { + "task_name": "", + "score_name": "uncertainty_margin" + } + }, + lightly_config={ + 'loader': { + 'batch_size': 16, + 'shuffle': True, + 'num_workers': -1, + 'drop_last': True + }, + 'model': { + 'name': 'resnet-18', + 'out_dim': 128, + 'num_ftrs': 32, + 'width': 1 + }, + 'trainer': { + 'gpus': 1, + 'max_epochs': 100, + 'precision': 32 + }, + 'criterion': { + 'temperature': 0.5 + }, + 'optimizer': { + 'lr': 1, + 'weight_decay': 0.00001 + }, + 'collate': { + 'input_size': 64, + 'cj_prob': 0.8, + 'cj_bright': 0.7, + 'cj_contrast': 0.7, + 'cj_sat': 0.7, + 'cj_hue': 0.2, + 'min_scale': 0.15, + 'random_gray_scale': 0.2, + 'gaussian_blur': 0.5, + 'kernel_size': 0.1, + 'vf_prob': 0, + 'hf_prob': 0.5, + 'rr_prob': 0 + } + } +) diff --git a/docs/source/docker_archive/advanced/datapool.rst b/docs/source/docker_archive/advanced/datapool.rst new file mode 100644 index 000000000..6735cae47 --- /dev/null +++ b/docs/source/docker_archive/advanced/datapool.rst @@ -0,0 +1,101 @@ +Datapool +================= + +The Lightly Datapool is a tool which allows users to incrementally build up a +dataset for their project. It keeps track of the representations of previously +selected samples and uses this information to pick new samples in order to +maximize the quality of the final dataset. It also allows for combining two +different datasets into one. + +- | If you're interested in how the datapool works, go to + | --> `How It Works`_ + +- | To see how you can use the datapool, check out + | --> `Usage`_ + + +How It Works +--------------- + +The Lightly Datapool keeps track of the selected samples in a csv file called +`datapool_latest.csv`. It contains the filenames of the selected images, their +embeddings, and their weak labels. Additionally, after training a self-supervised +model, the datapool contains the checkpoint `checkpoint_latest.ckpt` which was +used to generate the embeddings. + +The datapool is located in the `shared` directory. In general, it is a directory +with the following structure: + + +.. code-block:: bash + + # example of a datapool + datapool/ + +--- datapool_latest.csv + +--- checkpoint_latest.ckpt + +--- history/ + +The files `datapool_latest.csv` and `checkpoint_latest.csv` are updated after every +run of the Lightly Docker. The history folder contains the previous versions of +the datapool. This feature is meant to prevent accidental overrides and can be +deactivated from the command-line (see `Usage`_ for more information). + +Usage +--------------- + +To **initialize** a datapool, simply pass the name of the datapool as an argument +to your docker run command and sample from a dataset as always. The Lightly Docker +will automatically create a datapool directory and populate it with the required +files. + +.. note:: To use the datapool feature, the Lightly Docker requires write access + to a shared directory. This directory can be passed with the `-v` flag. + +.. code-block:: console + + docker run --gpus all --rm -it \ + -v {INPUT_DIR}:/home/input_dir:ro \ + -v {SHARED_DIR}:/home/shared_dir \ + -v {OUTPUT_DIR}:/home/output_dir \ + lightly/worker:latest \ + token=MYAWESOMETOKEN \ + append_weak_labels=False \ + stopping_condition.min_distance=0.1 \ + datapool.name=my_datapool + + +To **append** to your datapool, pass the name of an existing datapool as an argument. +The Lightly Docker will read the embeddings and filenames from the existing pool and +consider them during selection. Then, it will update the datapool and checkpoint files. + +.. note:: You can't change the dimension of the embeddings once the datapool has + been initialized so choose carefully! + +.. code-block:: console + + docker run --gpus all --rm -it \ + -v {OTHER_INPUT_DIR}:/home/input_dir:ro \ + -v {SHARED_DIR}:/home/shared_dir \ + -v {OUTPUT_DIR}:/home/output_dir \ + lightly/worker:latest \ + token=MYAWESOMETOKEN \ + append_weak_labels=False \ + stopping_condition.min_distance=0.1 \ + datapool.name=my_datapool + + +To **deactivate automatic archiving** of the past datapool versions, you can pass +set the flag `keep_history` to False. + +.. code-block:: console + + docker run --gpus all --rm -it \ + -v {INPUT_DIR}:/home/input_dir:ro \ + -v {SHARED_DIR}:/home/shared_dir \ + -v {OUTPUT_DIR}:/home/output_dir \ + lightly/worker:latest \ + token=MYAWESOMETOKEN \ + append_weak_labels=False \ + stopping_condition.min_distance=0.1 \ + datapool.name=my_datapool \ + datapool.keep_history=False diff --git a/docs/source/docker_archive/advanced/datasource_metadata.rst b/docs/source/docker_archive/advanced/datasource_metadata.rst new file mode 100644 index 000000000..8cc8edfd0 --- /dev/null +++ b/docs/source/docker_archive/advanced/datasource_metadata.rst @@ -0,0 +1,233 @@ +.. _ref-docker-datasource-metadata: + +Add Metadata to a Datasource +=============================== + +Lightly can make use of metadata collected alongside your images or videos. Provided, +metadata can be used to steer the selection process and to analyze the selected dataset +in the Lightly Platform. + + +Metadata Folder Structure +---------------------------- + +Following, we outline the format in which metadata can be added to a +Lightly datasource. Everything regarding metadata will take place in a subdirectory +of your configured datasource called `.lightly/metadata`. The general structure +of this directory will look like this: + + +.. code-block:: bash + + datasource/my_dataset + + image_1.png + + image_2.png + + ... + + image_N.png + + .lightly/metadata + + schema.json + + image_1.json + ... + + image_N.json + + +All of the `.json` files are explained in the next sections. + + + + +Metadata Schema +--------------- +The schema defines the format of the metadata and helps the Lightly Platform to correctly identify +and display different types of metadata. + +You can provide this information to Lightly by adding a `schema.json` to the +`.lightly/metadata` directory. The `schema.json` file must contain a list of +configuration entries. Each of the entries is a dictionary with the following keys: + + - `name`: Identifier of the metadata in the UI. + - `path`: Concatenation of the keys to access the metadata in a dictionary. + - `defaultValue`: The fallback value if there is no metadata available. + - `valueDataType`: One of + + - `NUMERIC_INT` + - `NUMERIC_FLOAT` + - `CATEGORICAL_INT` + - `CATEGORICAL_STRING` + - `CATEGORICAL_BOOLEAN` + + +For example, let's say we have additional information about the scene and weather for each +of the images we have collected. A possible schema could look like this: + +.. code-block:: javascript + :caption: .lightly/metadata/schema.json + + [ + { + "name": "Scene", + "path": "scene", + "defaultValue": "undefined", + "valueDataType": "CATEGORICAL_STRING" + } + { + "name": "Weather description", + "path": "weather.description", + "defaultValue": "nothing", + "valueDataType": "CATEGORICAL_STRING" + }, + { + "name": "Temperature", + "path": "weather.temperature", + "defaultValue": 0.0, + "valueDataType": "NUMERIC_FLOAT" + }, + { + "name": "Air pressure", + "path": "weather.air_pressure", + "defaultValue": 0, + "valueDataType": "NUMERIC_INT" + }, + { + "name": "Vehicle ID", + "path": "vehicle_id", + "defaultValue": 0, + "valueDataType": "CATEGORICAL_INT" + } + ] + + + + +Metadata Files +-------------- +Lightly requires a single metadata file per image or video. If an image or video has no corresponding metadata file, +Lightly assumes the default value from the `schema.json`. If a metadata file is provided for a full video, +Lightly assumes that the metadata is valid for all frames in that video. + +To provide metadata for an image or a video, place a metadata file with the same name +as the image or video in the `.lightly/metadata` directory but change the file extension to +`.json`. The file should contain the metadata in the format defined under :ref:`ref-metadata-format`. + + +.. code-block:: bash + + # filename of the metadata for file FILENAME.EXT + .lightly/metadata/${FILENAME}.json + + # example: my_image.png + .lightly/metadata/my_image.json + + # example: my_video.mp4 + .lightly/metadata/my_video.json + + +When working with videos it's also possible to provide metadata on a per-frame basis. +Then, Lightly requires a metadata file per frame. If a frame has no corresponding metadata file, +Lightly assumes the default value from the `schema.json`. Lightly uses a naming convention to +identify frames: The filename of a frame consists of the video filename, the frame number +(padded to the length of the number of frames in the video), the video format separated +by hyphens. For example, for a video with 200 frames, the frame number will be padded +to length three. For a video with 1000 frames, the frame number will be padded to length four (99 becomes 0099). + + +.. code-block:: bash + + # filename of the metadata of the Xth frame of video FILENAME.EXT + # with 200 frames (padding: len(str(200)) = 3) + .lightly/metadata/${FILENAME}-${X:03d}-${EXT}.json + + # example: my_video.mp4, frame 99/200 + .lightly/metadata/my_video-099-mp4.json + + # example: my_subdir/my_video.mp4, frame 99/200 + .lightly/metadata/my_subdir/my_video-099-mp4.json + + +.. _ref-metadata-format: + +Metadata Format +--------------- + +The metadata json files for images and videos require the keys `file_name`, `type`, and `metadata` key. +Here, `file_name` serves as a unique identifier to retrieve the original file for which the metadata was collected, +`type` indicates whether the metadata is per "video", "frame", or "image", and `metadata` contains the actual metadata. + +For our example from above, a metadata file corresponding to a image/video/frame should look like this: + + +.. tabs:: + + + .. tab:: Video + + .. code-block:: javascript + :caption: .lightly/metadata/my_video.json + + { + "file_name": "my_video.mp4", + "type": "video", + "metadata": { + "scene": "city street", + "weather": { + "description": "sunny", + "temperature": 23.2, + "air_pressure": 1 + }, + "vehicle_id": 321, + } + } + + .. tab:: Frame + + .. code-block:: javascript + :caption: .lightly/metadata/my_video-099-mp4.json + + { + "file_name": "my_video-099-mp4.png", + "type": "frame", + "metadata": { + "scene": "city street", + "weather": { + "description": "sunny", + "temperature": 23.2, + "air_pressure": 1 + }, + "vehicle_id": 321, + } + } + + .. tab:: Image + + .. code-block:: javascript + :caption: .lightly/metadata/my_image.png + + { + "file_name": "my_image.png", + "type": "image", + "metadata": { + "scene": "highway", + "weather": { + "description": "rainy", + "temperature": 10.5, + "air_pressure": 1 + }, + "vehicle_id": 321, + } + } + + + + +Next Steps +---------- + +If metadata is provided, the Lightly Worker will automatically detect and load it into +the Lightly Platform where it can be visualized and analyzed after running a selection. + +For example, it's possible to visualize the different categories of metadata in the Lightly +Platform scatter plot. In the following example we visualized the categorical metadata "Scene" +from the BDD100k dataset. + + +.. figure:: images/bdd100k_demo_metadata.jpg diff --git a/docs/source/docker_archive/advanced/datasource_predictions.rst b/docs/source/docker_archive/advanced/datasource_predictions.rst new file mode 100644 index 000000000..5cbac0d59 --- /dev/null +++ b/docs/source/docker_archive/advanced/datasource_predictions.rst @@ -0,0 +1,477 @@ +.. _ref-docker-datasource-predictions: + +Add Predictions to a Datasource +=============================== + +Lightly can not only use images you provided in a datasource, but also predictions of a ML model on your images. +They are used for active learning for selecting images based on the objects in them. +Furthermore, object detection predictions can be used running Lightly on object level. +By providing the predictions in the datasource, +you have full control over them and they scale well to millions of samples. +Furthermore, if you add new samples to your datasource, you can simultaneously +add their predictions to the datasource. +If you already have labels instead of predictions, you can treat them +just as predictions and upload them the same way. + +.. note:: Note that working with predictions requires a minimum + Lightly Worker of version 2.2. You can check your installed version of the + Lightly Worker by running the :ref:`ref-docker-setup-sanity-check`. + +Predictions Folder Structure +---------------------------- + +In the following, we will outline the format of the predictions required by the +Lightly docker. Everything regarding predictions will take place in a subdirectory +of your configured datasource called `.lightly/predictions`. The general structure +of this directory will look like this: + + +.. code-block:: bash + + datasource/my_dataset + + image_1.png + + image_2.png + + ... + + image_N.png + + .lightly/predictions/ + + tasks.json + + task_1/ + + schema.json + + image_1.json + ... + + image_N.json + + task_2/ + + schema.json + + image_1.json + ... + + image_N.json + + + +Where each subdirectory corresponds to one prediction task (e.g. a classification task +and an object detection task). All of the files are explained in the next sections. + + +Prediction Tasks +---------------- +To let Lightly know what kind of prediction tasks you want to work with, Lightly +needs to know their names. It's very easy to let Lightly know which tasks exist: +simply add a `tasks.json` in your storage bucket stored at the subdirectory `.lightly/predictions/`. + +The `tasks.json` file must include a list of your task names which must match name +of the subdirectory where your prediction schemas will be located. + +.. note:: + + Only the task names listed within `tasks.json` will be considered. + Please ensure that the task name corresponds with the location of your prediction schema. + This allows you to specify which subfolder are considered by the Lightly docker. + +For example, let's say we are working with the following folder structure: + +.. code-block:: bash + + .lightly/predictions/ + + tasks.json + + classification_weather/ + + schema.json + ... + + classification_scenery/ + + schema.json + ... + + object_detection_people/ + + schema.json + ... + + semantic_segmentation_cars/ + + schema.json + ... + + some_directory_containing_irrelevant_things/ + + +we can specify which subfolders contain relevant predictions in the `tasks.json`: + +.. code-block:: javascript + :caption: .lightly/predictions/tasks.json + + [ + "classification_weather", + "classification_scenery", + "object_detection_people", + "semantic_segmentation_cars", + ] + +.. note:: + + If you list a subfolder which doesn't contain a valid `schema.json` file, + the Lightly docker will report an error! See below how to create a good `schema.json` file. + + +Prediction Schema +----------------- +For Lightly it's required to store a prediction schema. The schema defines the +format of the predictions and helps the Lightly Platform to correctly identify +and display classes. It also helps to prevent errors as all predictions which +are loaded are validated against this schema. + +Every schema must include the type of the predictions for this task. +For classification and object detection the prediction schema must also include +all the categories and their corresponding ids. For other tasks, such as keypoint +detection, it can be useful to store additional information like which keypoints +are connected with each other by an edge. + +You can provide all this information to Lightly by adding a `schema.json` to the +directory of the respective task. The schema.json file must have a key `categories` +with a corresponding list of categories following the COCO annotation format. +It must also have a key `task_type` indicating the type of the predictions. +The `task_type` must be one of: + + - classification + - object-detection + - semantic-segmentation + + +For example, let's say we are working with a classification model predicting the weather on an image. +The three classes are sunny, clouded, and rainy. + + +.. code-block:: javascript + :caption: .lightly/predictions/classification_weather/schema.json + + { + "task_type": "classification", + "categories": [ + { + "id": 0, + "name": "sunny" + }, + { + "id": 1, + "name": "clouded" + }, + { + "id": 2, + "name": "rainy" + } + ] + } + + + +Prediction Files +---------------- +Lightly requires a **single prediction file per image**. The file should be a .json +following the format defined under :ref:`ref-prediction-format` and stored in the subdirectory +`.lightly/predictions/${TASK_NAME}` in the storage bucket the dataset was configured with. +In order to make sure Lightly can match the predictions to the correct source image, +it's necessary to follow the naming convention: + +.. code-block:: bash + + # filename of the prediction for image FILENAME.EXT + .lightly/predictions/${TASK_NAME}/${FILENAME}.json + + # example: my_image.png, classification + .lightly/predictions/my_classification_task/my_image.json + + # example: my_subdir/my_image.png, classification + .lightly/predictions/my_classification_task/my_subdir/my_image.json + + +Prediction Files for Videos +--------------------------- +When working with videos, Lightly requires a prediction file per frame. Lightly +uses a naming convention to identify frames: The filename of a frame consists of +the video filename, the video format, and the frame number (padded to the length +of the number of frames in the video) separated by hyphens. For example, for a +video with 200 frames, the frame number will be padded to length three. For a video +with 1000 frames, the frame number will be padded to length four (99 becomes 0099). + +.. code-block:: bash + + # filename of the predictions of the Xth frame of video FILENAME.EXT + # with 200 frames (padding: len(str(200)) = 3) + .lightly/predictions/${TASK_NAME}/${FILENAME}-${X:03d}-${EXT}.json + + # example: my_video.mp4, frame 99/200 + .lightly/predictions/my_classification_task/my_video-099-mp4.json + + # example: my_subdir/my_video.mp4, frame 99/200 + .lightly/predictions/my_classification_task/my_subdir/my_video-099-mp4.json + + +.. _ref-prediction-format: + +Prediction Format +----------------- +Predictions for an image must have a `file_name` and `predictions`. +Here, `file_name` serves as a unique identifier to retrieve the image for which +the predictions are made and predictions is a list of `Prediction Singletons` for the corresponding task. + +Example classification: + +.. code-block:: javascript + :caption: .lightly/predictions/classification_weather/my_image.json + + { + "file_name": "my_image.png", + "predictions": [ // classes: [sunny, clouded, rainy] + { + "category_id": 0, + "probabilities": [0.8, 0.1, 0.1] + } + ] + } + +Example object detection: + +.. code-block:: javascript + :caption: .lightly/predictions/object_detection/my_image.json + + { + "file_name": "my_image.png", + "predictions": [ // classes: [person, car] + { + "category_id": 0, + "bbox": [140, 100, 80, 90], // x, y, w, h coordinates in pixels + "score": 0.8 + }, + { + "category_id": 1, + "bbox": [...], + "score": 0.9 + }, + { + "category_id": 0, + "bbox": [...], + "score": 0.5 + } + ] + } + +Example semantic segmentation: + +.. code-block:: javascript + :caption: .lightly/predictions/semantic_segmentation_cars/my_image.json + + { + "file_name": "my_image.png", + "predictions": [ // classes: [background, car] + { + "category_id": 0, + "segmentation": [100, 80, 90, 85, ...], //run length encoded binary segmentation mask + "score": 0.8 + }, + { + "category_id": 1, + "segmentation": [...], + "score": 0.9 + }, + ] + } + +Note: The filename should always be the full path from the root directory. + + +Prediction Singletons +--------------------- +The prediction singletons closely follow the `COCO results `_ format while dropping +the `image_id`. Note the the `category_id` must be the same as the one defined +in the schema and that the probabilities (if provided) must follow the order of the category ids. + +**Classification:** + +For classification, please use the following format: + +.. code-block:: javascript + + [{ + "category_id" : int, + "probabilities" : [p0, p1, ..., pN] // optional, sum up to 1.0 + }] + +**Object Detection:** + +For detection with bounding boxes, please use the following format: + +.. code-block:: javascript + + [{ + "category_id" : int, + "bbox" : [x, y, width, height], // coordinates in pixels + "score" : float, + "probabilities" : [p0, p1, ..., pN] // optional, sum up to 1.0 + }] + +The bounding box format follows the `COCO results `_ documentation. + +.. note:: + + Bounding Box coordinates are pixels measured from the top left image corner. + +**Semantic Segmentation:** + +For semantic segmentation, please use the following format: + +.. code-block:: javascript + + [{ + "category_id" : int, + "segmentation" : [int, int, ...], // run length encoded binary segmentation mask + "score" : float, + "probabilities" : [p0, p1, ..., pN] // optional, sum up to 1.0 + }] + +Each segmentation prediction contains the binary mask for one category and a +corresponding score. The score determines the likelihood of the segmentation +belonging to that category. Optionally, a list of probabilities can be provided +containing a probability for each category, indicating the likeliness that the +segment belongs to that category. + +Segmentations are defined with binary masks where each pixel is either set to 0 +or 1 if it belongs to the background or the object, respectively. +The segmentation masks are compressed using run length encoding to reduce file size. +Binary segmentation masks can be converted to the required format using the +following function: + +.. code-block:: python + + import numpy as np + + def encode(binary_mask): + """Encodes a (H, W) binary segmentation mask with run length encoding. + + The run length encoding is an array with counts of subsequent 0s and 1s + in the binary mask. The first value in the array is always the count of + initial 0s. + + Examples: + + >>> binary_mask = [ + >>> [0, 0, 1, 1], + >>> [0, 1, 1, 1], + >>> [0, 0, 0, 1], + >>> ] + >>> encode(binary_mask) + [2, 2, 1, 3, 3, 1] + """ + flat = np.concatenate(([-1], np.ravel(binary_mask), [-1])) + borders = np.nonzero(np.diff(flat))[0] + rle = np.diff(borders) + if flat[1]: + rle = np.concatenate(([0], rle)) + return rle.tolist() + +Segmentation models oftentimes output a probability for each pixel and category. +Storing such probabilities can quickly result in large file sizes if the input +images have a high resolution. To reduce storage requirements, Lightly expects +only a single score or probability per segmentation. If you have scores or +probabilities for each pixel in the image, you have to first aggregate them +into a single score/probability. We recommend to take either the median or mean +score/probability over all pixels within the segmentation mask. The example +below shows how pixelwise segmentation predictions can be converted to the +format required by Lightly. + +.. code-block:: python + + # Make prediction for a single image. The output is assumed to be a tensor + # with shape (categories, height, width). + segmentation = model(image) + + # Most probable object category per pixel. + category = segmentation.argmax(dim=0) + + # Convert to lightly predictions. + predictions = [] + for category_id in category.unique(): + binary_mask = category == category_id + median_score = segmentation[category_id, binary_mask].median() + predictions.append({ + 'category_id': int(category_id), + 'segmentation': encode(binary_mask), + 'score': float(median_score), + }) + + prediction = { + 'file_name': 'image_name.png', + 'predictions': predictions, + } + + +.. note:: + + Support for keypoint detection is coming soon! + + + +Creating the predictions folder +------------------------------- + +For creating the predictions folder, we recommend writing a script that takes your predictions and +saves them in the format just outlined. You can either save the predictions first on your local machine +and then upload them to your datasource or save them directly to your datasource. + +As an example, the following script takes an object detection `COCO predictions file `_. +It needs the path to the predictions file and the output directory +where the `.lightly` folder should be created as input. +Don't forget to change these 2 parameters at the top of the script. + +.. code-block:: python + + ### CHANGE THESE PARAMETERS + output_filepath = "/path/to/create/.lightly/dir" + annotation_filepath = "/path/to/_annotations.coco.json" + + ### Optionally change these parameters + task_name = "my_object_detection_task" + task_type = "object-detection" + + import json + import os + from pathlib import Path + + # create prediction directory + path_predictions = os.path.join(output_filepath, '.lightly/predictions') + Path(path_predictions).mkdir(exist_ok=True, parents=True) + + # Create task.json + path_task_json = os.path.join(path_predictions, 'tasks.json') + tasks = [task_name] + with open(path_task_json, 'w') as f: + json.dump(tasks, f) + + # read coco annotations + with open(annotation_filepath, 'r') as f: + coco_dict = json.load(f) + + # Create schema.json for task + path_predictions_task = os.path.join(path_predictions, tasks[0]) + Path(path_predictions_task).mkdir(exist_ok=True) + schema = { + "task_type": task_type, + "categories": coco_dict['categories'] + } + path_schema_json = os.path.join(path_predictions_task, 'schema.json') + with open(path_schema_json, 'w') as f: + json.dump(schema, f) + + # Create predictions themselves + image_id_to_prediction = dict() + for image in coco_dict['images']: + prediction = { + 'file_name': image['file_name'], + 'predictions': [], + } + image_id_to_prediction[image['id']] = prediction + for ann in coco_dict['annotations']: + pred = { + 'category_id': ann['category_id'], + 'bbox': ann['bbox'], + 'score': ann.get('score', 0) + } + image_id_to_prediction[ann['image_id']]['predictions'].append(pred) + + for prediction in image_id_to_prediction.values(): + filename_prediction = os.path.splitext(prediction['file_name'])[0] + '.json' + path_to_prediction = os.path.join(path_predictions_task, filename_prediction) + with open(path_to_prediction, 'w') as f: + json.dump(prediction, f) diff --git a/docs/source/docker_archive/advanced/images/bdd100k_demo_metadata.jpg b/docs/source/docker_archive/advanced/images/bdd100k_demo_metadata.jpg new file mode 100644 index 0000000000000000000000000000000000000000..552140d0d9a72dd426e474adef58ba5a9c886e0e GIT binary patch literal 140542 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
  • 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

    }Q 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