Skip to main content

Dataverse SDK For Python

Dataverse is a MLOPs platform for assisting in data selection, data visualization and model training in computer vision. Use Dataverse-SDK for Python to help you to interact with the Dataverse platform by Python. Currently, the library supports:

  • Create Project with your input ontology and sensors
  • Get Project by project-id
  • Create Dataset from your AWS storage or local
  • Get Dataset by dataset-id
  • List models for your selected project-id
  • Get and download your model

Package (PyPi) | Source code

Getting started

Install the package

pip install dataverse-sdk

Prerequisites: You must have an Dataverse Platform Account and Python 3.10+ to use this package.

Create the client

Interaction with the Dataverse site starts with an instance of the DataverseClient class. You need site url, an email-account and its password to instantiate the client object.

from dataverse_sdk import *
from dataverse_sdk.connections import get_connection
from dataverse_sdk.constants import DataverseHost

client = DataverseClient(
    host=DataverseHost.PRODUCTION.value, email="XXX", password="***", service_id="xxxx-xxxx-xx-xxx", alias="default", force = False
)
assert client is get_connection("default")

# Should provide different alias if you are trying to connect to different workspaces
client2 = DataverseClient(
    host=DataverseHost.PRODUCTION.value, email="account-2", password="***", service_id="xxxx-xxxx-xx-xxx", alias="client2", force = False
)
assert client2 is get_connection(client2.alias)

client3 = DataverseClient(
    host=DataverseHost.PRODUCTION.value, email="XXX", password="", service_id="xxxx-xxxx-xx-xxx", access_token="xxx", alias="client3", force = False
)
assert client3 is get_connection(client3.alias)
  • Input arguments:
Argument name Type/Options Default Description
host str *-- the host url of the dataverse site
email str *-- the email account of your dataverse workspace
password str *-- the password of your dataverse workspace
service_id str *-- The service id of the dataverse you want to connect
alias str 'default' the connection alias of your dataverse client
force bool False whether force to replace the connection if the given alias exists
access_token str None instead of password to do authentication

Key concepts

Once you've initialized a DataverseClient, you can interact with Dataverse from the initialized object.

Examples

The following sections provide examples for the most common DataVerse tasks including:

Get User

The get_user method is to list the current user info. You can get the detail info, such as role, permission and user detail.

user = client.get_user()

List Projects

The list_projects method will list all projects of the given sites.

  • Example Usage:
projects = client.list_projects(current_user = True,
                                exclude_sensor_type=SensorType.LIDAR,
                                image_type=OntologyImageType._2D_BOUNDING_BOX)
  • Input arguments:
Argument name Type/Options Default Description
current_user bool True only show the projects of current user
exclude_sensor_type SensorType.CAMERA
SensorType.LIDAR
None exclude the projects with the given sensor type
image_type OntologyImageType._2D_BOUNDING_BOX
OntologyImageType.SEMANTIC_SEGMENTATION
OntologyImageType.INSTANCE_SEGMENTATION
OntologyImageType.CLASSIFICATION
OntologyImageType.POINT
OntologyImageType.POLYGON
OntologyImageType.POLYLINE
OntologyImageType.VQA
None only include the projects with the given image type

Create Project

The create_project method will create project on the connected site with the defined ontology and sensors.

  • Example Usage:
# 1) Create ontology with ontologyclass object
ontology = Ontology(
    name="sample ontology",
    image_type=OntologyImageType._2D_BOUNDING_BOX,
    pcd_type = None,
    classes=[
        OntologyClass(name="Pedestrian", rank=1, color="#234567"),
        OntologyClass(name="Truck", rank=2, color="#345678"),
        OntologyClass(name="Car", rank=3, color="#456789"),
        OntologyClass(name="Cyclist", rank=4, color="#567890"),
        OntologyClass(name="DontCare", rank=5, color="#6789AB"),
        OntologyClass(name="Misc", rank=6, color="#789AB1"),
        OntologyClass(name="Van", rank=7, color="#89AB12"),
        OntologyClass(name="Tram", rank=8, color="#9AB123"),
        OntologyClass(name="Person_sitting", rank=9, color="#AB1234"),
    ],
)

For project with camera sensor, there would be only one image_type for one project. You could choose from [OntologyImageType._2D_BOUNDING_BOX, OntologyImageType.SEMANTIC_SEGMENTATION, OntologyImageType.INSTANCE_SEGMENTATION, OntologyImageType.CLASSIFICATION, OntologyImageType.POINT, OntologyImageType.POLYGON, OntologyImageType.POLYLINE, OntologyImageType.VQA].

For project with lidar sensor, your should assign pcd_type = OntologyPcdType.CUBOID for the ontology.

# 2) Create your sensor list with name / SensorType
sensors = [
    Sensor(name="camera1", type=SensorType.CAMERA),
    Sensor(name="lidar1", type=SensorType.LIDAR),
]

# 3) Create your project tag attributes (Optional)
project_tag = ProjectTag(
    attributes=[
        {"name": "year", "type": "number"},
        {
            "name": "unknown_object",
            "type": "option",
            "options": [{"value": "fire"}, {"value": "leaves"}, {"value": "water"}],
        },
    ]
)

# 4) Create your project with your ontology/sensors/project_tag
project = client.create_project(name="Sample project", ontology=ontology, sensors=sensors, project_tag=project_tag)
  • Input arguments for creating project:
Argument name Type/Options Default Description
name str *-- name of your project
ontology Ontology *-- the Ontology basemodel data of current project
sensors list[Sensor] *-- the list of Sensor basemodel data of your project
project_tag ProjectTag None your project tags
description str None your project description

*--: required argument without default


Get Project

The get_project method retrieves the project from the connected site. The project_id parameter is the unique integer ID of the project, not its "name" property.

project = client.get_project(project_id= 1, client_alias=client.alias) # if client_alias is not provided, we'll get it from client

Edit Project

For editing project contents, we have four functions below for add/edit project tag and ontology classes.

Add New Project Tags

  • Note: Can not create existing project tag!
tag = {
        "attributes": [
            {
                "name": "month",
                "type": "number"
            },
            {
                "name": "weather",
                "type": "option",
                "options": [{"value":"sunny"}, {"value":"rainy"}, {"value":"cloudy"}
                ]
            }]}
project_tag= ProjectTag(**tag)
#should provided client_alias if calling from client
client.add_project_tag(project_id = 10, project_tag=project_tag, client_alias=client.alias)
#OR
project.add_project_tag(project_tag=project_tag)

Edit Project Tags

** Note:

  1. Can not edit project tag that does not exist
  2. Can not modify the data type of existing project tags
  3. Can not provide attributes with existing options
tag = {
        "attributes": [
            {
                "name": "weather",
                "type": "option",
                "options": [{"value":"unknown"}, {"value":"snowy"}
                ]
            }]}
project_tag= ProjectTag(**tag)
#should provided client_alias if calling from client
client.edit_project_tag(project_id = 10, project_tag=project_tag, client_alias=client.alias)
#OR
project.edit_project_tag(project_tag=project_tag)

Add New Ontology Classes

  • Note: Can not add existing ontology class!
new_classes = [OntologyClass(name="obstruction",
                    rank=9,
                    color="#AB4321",
                    attributes=[{
                    "name":
                    "status",
                    "type":
                    "option",
                    "options": [{
                    "value": "static"}, {"value": "moving"
                    }]}])]
#should provided client_alias if calling from client
client.add_ontology_classes(project_id=24, ontology_classes=new_classes, client_alias=client.alias)
#OR
project.add_ontology_classes(ontology_classes=new_classes)

Edit Ontology Classes

** Note:

  1. Can not edit ontology class that does not exist
  2. Can not modify the data type of existing ontology class attributes
  3. Can not provide attributes with existing options
edit_classes = [OntologyClass(name="obstruction",
                    color="#AB4321",
                    attributes=[{
                    "name":
                    "status",
                    "type":
                    "option",
                    "options": [{
                    "value": "unknown"}]}])]
#should provided client_alias if calling from client
client.edit_ontology_classes(project_id=24, ontology_classes=edit_classes, client_alias=client.alias)
#OR
project.edit_ontology_classes(ontology_classes=edit_classes)

Update Ontology Alias

  1. Get the csv file of alias map for your project
client.generate_alias_map(project_id=123, alias_file_path="./alias.csv")
  1. Fill the alias in the csv file and save (DO NOT modify other fields)

  2. Update alias for your project with the alias file path

client.update_alias(project_id=123, alias_file_path= "/Users/Downloads/alias.csv" )

Create Dataset

Required fields by data_source:

data_source storage_url container_name data_folder Notes
DataSource.AWS *-- - *-- use access_key_id + secret_access_key for a private S3 bucket
DataSource.LOCAL - - *-- local folder; SDK uploads files and sends create_dataset_uuid for you
DataSource.SDK - *-- *-- offline MinIO import: container_name = bucket, data_folder = path in bucket; needs Dataverse deployed in offline mode

*--: required for this data_source · -: not used (can be omitted)

DataSource.DATA_GENERATION and DataSource.PRE_IMPORT require a data_source_search_body that the SDK does not currently send, so they are not supported via create_dataset.

DataSource.EXISTING_DATASETS / EXISTING_DATASLICES only appear on datasets you read back from the API; they are not inputs for create_dataset.

Use create_dataset to import dataset from cloud storage

dataset_data = {
    "name": "Dataset 1",
    "data_source": DataSource.AWS,
    "storage_url": "storage/url",
    "data_folder": "datafolder/to/vai_anno",
    "type": DatasetType.ANNOTATED_DATA,
    "annotation_format": AnnotationFormat.VISION_AI,
    "annotations": ["groundtruth"],
    "sequential": False,
    "render_pcd": False,
    "generate_metadata": False,
    "access_key_id": "aws s3 access key id",  # only for private s3 bucket, don't need to assign it in case of public s3 bucket
    "secret_access_key": "aws s3 secret access key",  # only for private s3 bucket, don't need to assign it in case of public s3 bucket
}
dataset = project.create_dataset(**dataset_data)
  • Input arguments for creating dataset from cloud storage:
Argument name Type/Options Default Description
name str *-- name of your dataset
data_source DataSource.AWS *-- the datasource of your dataset
storage_url str *-- your cloud storage url
data_folder str *-- the relative data folder from the storage_url
type DatasetType.ANNOTATED_DATA
DatasetType.RAW_DATA
*-- your dataset type (annotated or raw data)
annotation_format AnnotationFormat.VISION_AI
AnnotationFormat.KITTI
AnnotationFormat.COCO
AnnotationFormat.YOLO
AnnotationFormat.IMAGE
AnnotationFormat.BDDP
AnnotationFormat.VIDEO
AnnotationFormat.VLM
*-- the format of your annotation data
annotations list[str] None list of names for your annotation data folders, such as ["groundtruth"]
sequential bool False data is sequential or not
render_pcd bool False render pcd preview image or not
generate_metadata bool False generate image meta data or not
description str None your dataset description
access_key_id str None access key id for AWS private s3 bucket
secret_access_key str None secret access key for AWS private s3 bucket

*--: required for cloud storage


Use create_dataset to import dataset from LOCAL

dataset_data2 = {
    "name": "dataset-local-upload",
    "data_source": DataSource.LOCAL,
    "data_folder": "/YOUR/TARGET/LOCAL/FOLDER",
    "type": DatasetType.ANNOTATED_DATA, # or DatasetType.RAW_DATA for images
    "annotation_format": AnnotationFormat.VISION_AI,
    "annotations": ["groundtruth"],  # remove it when type is DatasetType.RAW_DATA
    "sequential": False,
    "generate_metadata": False,
}
dataset2 = project.create_dataset(**dataset_data2)

Your could also use the script for importing dataset from local

python tools/import_dataset_from_local.py -host {YOUR_HOST} -e {your-account-email} -p {PASSWORD} -s {service-id}  -project {project-id} --folder {/YOUR/TARGET/LOCAL/FOLDER} -name {dataset-name} -type {raw_data OR annotated_data} -anno {image OR vision_ai} --sequential

List and Get Dataset

The list_datasets method would return the list of dataset under the given project

project = client.get_project(project_id=1)
datasets:list = project.list_datasets()

OR

datasets:list = client.list_datasets(project_id=1, client_alias=client.alias )

The get_dataset method retrieves the dataset info from the connected site. The dataset_id parameter is the unique integer ID of the dataset, not its "name" property.

dataset = client.get_dataset(dataset_id=5)

List and Get Dataslices

# list dataslices with project_id
client.list_dataslices(project_id=101, client_alias=client.alias)

# Get target dataslice data
dataslice_data = client.get_dataslice(dataslice_id=504)

Export Dataslice and Download

# Trigger export and get export record id
export_record = client.export_dataslice(dataslice_id=504)
# Use export record id to download export data
client.download_export_dataslice_data(dataslice_id=504, export_record_id=export_record["export_record_id"])

List Models

The list_models method will list all the models in the given project. You can filter models by type using the type parameter.

Basic Usage

# Method 1: Using client
models = client.list_models(project_id=1, client_alias=client.alias)

# Method 2: Using project object
project = client.get_project(project_id=1)
models = project.list_models()

Filtering by Model Type

You can filter models by type using strings or lists of strings. The SDK supports multiple model types:

# Filter by single type using string
models = client.list_models(project_id=1, type="trained", client_alias=client.alias)

# Filter by single type using list
models = client.list_models(project_id=1, type=["trained"], client_alias=client.alias)

# Filter by multiple types using list
models = client.list_models(
    project_id=1,
    type=["trained", "byom", "uploaded"],
    client_alias=client.alias
)

Available Model Types

String Value Description
"trained" Trained models
"byom" Bring Your Own Model
"uploaded" Uploaded models

Input Arguments

Argument name Type/Options Default Description
project_id int *-- The project ID
client_alias str None The client alias
type "trained", "byom", "uploaded", list["trained", "byom", "uploaded] ["trained", "byom"] Model types to filter by

*--: required argument without default


Get Model

The get_model method will get the model detail info by the given model-id

model = client.get_model(model_id=30, client_alias=client.alias)
model = project.get_model(model_id=30)

From the given model, we could get the model convert records as below

model_record = client.get_convert_record(convert_record_id=1, client_alias=client.alias)
OR
model_record = model.get_convert_record(convert_record_id=1)

  • If the converted model format is onnx, you could download the model as below.
# Get the target convert record, and download labels.txt and model.onnx
model_record = model.get_convert_record(convert_record_id=5)
status, label_file_path = model_record.get_label_file(save_path="./labels.txt", timeout=6000)
status, onnx_model_path = model_record.get_onnx_model_file(save_path="./model.onnx", timeout=6000)

Create VQA Project

The create_vqa_project method will create project on the connected site with the defined questions/answer_type.

  • Example Usage:
# 1) Create question class with question and answer type pair
question_answer = [ QuestionClass(class_name="question1", rank=1, question="Is any person found in the picture?",
                    answer_type="boolean"),
                    QuestionClass(class_name="question2", rank=2, question="What is the blob color of traffic light?",   answer_type="option",answer_options=["red","yellow","green"])
                   ]
# 2) Create your VQA project as below
project = client.create_vqa_project(name="vqa-project", sensor_name="camera1", ontology_name="vqa-ontology", question_answer=question_answer)
  • Input arguments for creating project:
Argument name Type/Options Default Description
name str *-- name of your project
sensor_name str *-- the camera sensor name
ontology_name str *-- the ontology name
question_answer list[QuestionClass] *-- your question/answer_type. QuestionClass.answer_type valid values: boolean, option, number, text
description str None your project description

*--: required argument without default


Edit VQA Ontology

** Note:

  1. Can not edit question answer type
  2. Can not update with existing answer options
  3. Can not add question with existing rank id
create_questions = [QuestionClass(class_name="question3", rank=3, question="Age?",answer_type="number")]
update_questions = [{"rank": 2, "question": "What is the blob color of traffic light?(the closet one)", "options":["black"] }]

# Through client
client.edit_vqa_ontology(project_id=24, ontology_name="ontology-new-name",
                         create=create_questions,
                         update=update_questions,
                         client_alias=client.alias)

# Through project object
project.edit_vqa_ontology(ontology_name="ontology-new-name",
                          create=create_questions,
                          update=update_questions)

Get Question List

The function below could help you get the question list of VQA project (which could help you to prepare the annotated data)

output = client.get_question_list(project_id=107, output_file_path="./question.json" )

Quick Tools

Import Your Local Dataset

python tools/import_dataset_from_local.py -host {YOUR_HOST} -e {your-account-email} -p {PASSWORD} -s {service-id}  -project {project-id} --folder {/YOUR/TARGET/LOCAL/FOLDER} -name {dataset-name} -type {raw_data OR annotated_data} -anno {image OR vision_ai} --sequential

Import VQA Local Dataset

python tools/import_vqa_dataset.py -host {YOUR_HOST} -e {your-account-email} -p {PASSWORD} -s {service-id} -project {project-id} --folder {/YOUR/TARGET/LOCAL/FOLDER} -type {raw_data OR annotated_data}

Export Dataslice and download files

python tools/export_dataslice.py -host {YOUR_HOST}  -e {your-account-email} -p {PASSWORD} -s {service-id} -dataslice {dataslice_id} -f {/YOUR/TARGET/LOCAL/file.zip}

Export Large Dataslice and download files

python tools/export_dataslice_large.py -host {YOUR_HOST} -e {your-account-email} -p {PASSWORD} -s {service-id} -dataslice {dataslice_id} --anno {export-model-name / groundtruth} --target_folder {folder path} --export-format {coco, visionai, yolo, vlm ...etc}

Upload videos to create session tasks

python tools/upload_videos_create_session.py -host {YOUR_HOST} -e {your-account-email} -p {PASSWORD} -s {service-id} -f {/YOUR/VIDEOS/LOCAL/FOLDER} -n {session-name}
  • Advanced arguments for video curation (sequential data):
Argument name Type/Options Default Description
--video-curation bool False enable video curation (sequential data)
--global-mean-threshold float 0.001 Threshold for the video's global average motion magnitude (0.000001 ~ 0.01). Higher values are stricter (flag more clips as low-motion); lower values are looser (flag fewer clips).
--per-patch-256-min-threshold float 0.000001 Minimum average motion magnitude allowed in any 256x256 pixel patch (0.000001 ~ 0.0001). Higher values are stricter per-patch (flag more clips when any 256x256 patch is too still); lower values are looser (flag fewer clips).
--split-duration int 5 Set the length of each split clip in seconds (2 ~ 30s).

Python Readme

Metadata

Release files for dataverse-sdk 2.6.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dataverse-sdk 2.6.1
File Size Uploaded
dataverse_sdk-2.6.1.tar.gz 54.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for dataverse-sdk 2.6.1
File Interpreter ABI Platform
dataverse_sdk-2.6.1-py3-none-any.whl Python 3 none any Details

Total release size: 111.9 kB

Release files / dataverse_sdk-2.6.1.tar.gz

Download URL dataverse_sdk-2.6.1.tar.gz
Size 54.6 kB
Tags Source
SHA-256 checksum
How to use checksums
4f5ebe494057f5a8518e6f8b283883215c8dcb49ba33a50c9f9f70835bb912e6
BLAKE2b-256 checksum
How to use checksums
d94d93854f6000fe954f18ce7b2ade1746ff84a76a6d43ab9fbf66121bff6c5c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.13

Release files / dataverse_sdk-2.6.1-py3-none-any.whl

Download URL dataverse_sdk-2.6.1-py3-none-any.whl
Size 57.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
afc8299011e701aecbeb488e35d726b74bcbe28ff70ceea44d39fddb0d34967e
BLAKE2b-256 checksum
How to use checksums
fecccd619bfc45403767f8af2ae7a1624a89a90c8d79816b5c3ee5a2dcb5b51e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.13

Release history Release notifications | RSS feed

2.7.0

2 release files

This release

2.6.1 This release

2 release files

2.6.0

2 release files

2.5.4

2 release files

2.5.3

2 release files

2.5.2

2 release files

2.5.1

2 release files

2.5.0

2 release files

2.4.3

2 release files

2.4.2

2 release files

2.4.1

2 release files

2.4.0

2 release files

2.3.1

2 release files

2.3.0

2 release files

2.2.2

2 release files

2.2.1

2 release files

2.2.0

2 release files

2.1.3

2 release files

2.1.2

2 release files

2.1.1

2 release files

2.1.0

2 release files

2.0.1

2 release files

1.7.2

2 release files

1.6.2

2 release files

1.6.1

2 release files

1.6.0

2 release files

1.5.3

2 release files

1.5.2

2 release files

1.5.1

2 release files

1.5.0

2 release files

1.4.1

2 release files

1.4.0

2 release files

1.3.2

2 release files

1.3.1

2 release files

1.3.0

2 release files

1.2.1

2 release files

1.1.0

2 release files

1.0.0

2 release files

0.5.0

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page