Skip to main content
Image groups can consist of images with different dimensions. In contrast, image sequences are images that all have the same dimensions. When images of varying dimensions are grouped together, multiple image sequences are created, each containing files that share the same dimensions.

Create Image Groups

From Existing Files

from pathlib import Path
from uuid import UUID

from encord import EncordUserClient

# --- Configuration ---
SSH_PATH = "/Users/chris-encord/ssh-private-key.txt"
FOLDER_ID = "00000000-0000-0000-0000-000000000000"

# --- Connect to Encord ---
user_client: EncordUserClient = EncordUserClient.create_with_ssh_private_key(
    ssh_private_key_path=SSH_PATH,
    # For US platform users use "https://api.us.encord.com"
    domain="https://api.encord.com",
)

folder = user_client.get_storage_folder(FOLDER_ID)

group_uuid: UUID = folder.create_image_group(
    file_paths=[
        Path("/path/to/front.jpg"),
        Path("/path/to/side.jpg"),
        Path("/path/to/rear.jpg"),
    ],
    title="vehicle-inspection-001",
)

print(f"Created image group with UUID: {group_uuid}")
From Local Files

from encord import EncordUserClient
from encord.orm.dataset import LongPollingStatus
from encord.orm.storage import DataUploadImageGroupFromItems
from encord.storage import DataUploadItems

user_client = EncordUserClient.create_with_ssh_private_key(
    ssh_private_key_path="<private_key_path>"
)

storage_folder = user_client.get_storage_folder("<folder_hash>")

image_group = DataUploadImageGroupFromItems(
    image_items=[
        "11111111-1111-1111-1111-111111111111",
        "22222222-2222-2222-2222-222222222222",
        "33333333-3333-3333-3333-333333333333",
    ],
    title="My Image Group",
)

upload_job_id = storage_folder.add_private_data_to_folder_start(
    integration_id="<integration_id>",
    private_files=DataUploadItems(
        image_groups_from_items=[image_group]
    ),
)

result = storage_folder.add_private_data_to_folder_get_result(upload_job_id)

if result.status == LongPollingStatus.DONE:
    print("Image group created successfully!")

Create Image Sequences

From Existing Files

from pathlib import Path
from uuid import UUID

from encord import EncordUserClient

# --- Configuration ---
SSH_PATH = "/Users/chris-encord/ssh-private-key.txt"
FOLDER_ID = "00000000-0000-0000-0000-000000000000"

# --- Connect to Encord ---
user_client: EncordUserClient = EncordUserClient.create_with_ssh_private_key(
    ssh_private_key_path=SSH_PATH,
    # For US platform users use "https://api.us.encord.com"
    domain="https://api.encord.com",
)

folder = user_client.get_storage_folder(FOLDER_ID)

sequence_uuid: UUID = folder.create_image_sequence(
    file_paths=[
        Path("/path/to/frame001.jpg"),
        Path("/path/to/frame002.jpg"),
        Path("/path/to/frame003.jpg"),
    ],
    title="drive-sequence-001",
)

print(f"Created image sequence with UUID: {sequence_uuid}")
From Local Files

from encord import EncordUserClient
from encord.orm.dataset import LongPollingStatus
from encord.orm.storage import DataUploadImageGroupFromItems
from encord.storage import DataUploadItems

# --- Configuration ---
SSH_PATH = "/Users/chris-encord/ssh-private-key.txt"  # Replace with your SSH private key path
FOLDER_ID = "00000000-0000-0000-0000-000000000000"  # Replace with the Folder ID
INTEGRATION_ID = "00000000-0000-0000-0000-000000000000"  # Replace with the Integration ID

# --- Connect to Encord ---
user_client = EncordUserClient.create_with_ssh_private_key(
    ssh_private_key_path=SSH_PATH,
    domain="https://api.encord.com",
)

storage_folder = user_client.get_storage_folder(FOLDER_ID)

image_sequence = DataUploadImageGroupFromItems(
    image_items=[
        "11111111-1111-1111-1111-111111111111",
        "22222222-2222-2222-2222-222222222222",
        "33333333-3333-3333-3333-333333333333",
    ],
    title="drive-sequence-001",
    create_video=True,
)

upload_job_id = storage_folder.add_private_data_to_folder_start(
    integration_id=INTEGRATION_ID,
    private_files=DataUploadItems(
        image_groups_from_items=[image_sequence],
    ),
)

result = storage_folder.add_private_data_to_folder_get_result(upload_job_id)

if result.status == LongPollingStatus.DONE:
    print("Image sequence created successfully.")

Create at Scale

For large-scale imports, create image groups and image sequences from a JSON manifest. This is the recommended approach when importing hundreds or thousands of grouped images because it avoids making one SDK request per group.

Image Groups


from pathlib import Path

from encord import EncordUserClient
from encord.orm.dataset import LongPollingStatus
from encord.storage import DataUploadItems

SSH_PATH = "/path/to/ssh-private-key.txt"
FOLDER_ID = "00000000-0000-0000-0000-000000000000"
JSON_FILE = Path("./image-groups.json")

user_client = EncordUserClient.create_with_ssh_private_key(
    ssh_private_key_path=SSH_PATH,
    # For US platform users use "https://api.us.encord.com"
    domain="https://api.encord.com",
)

folder = user_client.get_storage_folder(FOLDER_ID)

upload_job_id = folder.add_private_data_to_folder_start(
    DataUploadItems(file_path=JSON_FILE)
)

result = folder.add_private_data_to_folder_get_result(
    upload_job_id,
    timeout_seconds=600,
)

if result.status == LongPollingStatus.DONE:
    print("Upload complete.")
    print(result)
else:
    print("Upload did not complete within the timeout.")
    print(result)

Image Sequences

from pathlib import Path

from encord import EncordUserClient
from encord.orm.dataset import LongPollingStatus
from encord.storage import DataUploadItems

SSH_PATH = "/path/to/ssh-private-key.txt"
FOLDER_ID = "00000000-0000-0000-0000-000000000000"
JSON_FILE = Path("./image-sequences.json")

user_client = EncordUserClient.create_with_ssh_private_key(
    ssh_private_key_path=SSH_PATH,
    # For US platform users use "https://api.us.encord.com"
    domain="https://api.encord.com",
)

folder = user_client.get_storage_folder(FOLDER_ID)

upload_job_id = folder.add_private_data_to_folder_start(
    DataUploadItems(file_path=JSON_FILE)
)

result = folder.add_private_data_to_folder_get_result(
    upload_job_id,
    timeout_seconds=600,
)

if result.status == LongPollingStatus.DONE:
    print("Upload complete.")
    print(result)
else:
    print("Upload did not complete within the timeout.")
    print(result)