Low level method to send and update both Annotations and Raw Data
Long Running Operation
This operation only returns the input_id. Inputs are processed in the background by our distributed workers. Depending on factors such as type of file, account type, and system load, your file may be available in Diffgram almost immediately or may take several hours.
Example use cases
- Send predictions to be corrected by humans or validated
- Send existing annotation data to act as starting point for annotations
- Send just the raw data. (instance_list may be empty).
Send Existing Instances and Raw Data (SDK)
You can use this endpoint to send instances and update existing files labels, and attributes. Just send any new data on the instance_list
fields, or on the frame_packet_map
field in the case of video.
Example of sending instances with the SDK
Label Names Are only supported on the SDK, Not On Direct HTTP Calls
When ingesting pre-labeled data using direct HTTP calls, you need to provide the
label_file_id
key on each of the instances instead of the label name (name
key on the example). The Python SDK has the ability to obtain thelabel_file_id
from the label name, that's why the below examples do not include alabel_file_id
key on the instance data payload.
instance_alpha = {
'type': 'box',
'name': 'cat',
'x_max': 128,
'x_min': 48,
'y_min': 97,
'y_max': 128
}
instance_bravo = {
'type': 'box',
'name': 'cat',
'x_max': 128,
'x_min': 1,
'y_min': 1,
'y_max': 128
}
# Combine into image packet
image_packet = {
'instance_list' : [instance_alpha, instance_bravo],
'media' : {
'url' : "https://www.readersdigest.ca/wp-content/uploads/sites/14/2011/01/4-ways-cheer-up-depressed-cat.jpg",
'type' : 'image'
}
}
result = project.file.from_packet(image_packet)
Example for Sending Instances with python requests.
Danger: mode='update_with_existing' and 'update'
The default mode='update' will add any of the provided instances in the
instance_list
parameter and will not overwrite data. However usingupdate_with_existing
is a destructive action and might remove instances if they are not provided on the instance list.Think about
update
mode as "appending" new instances to the file andupdate_with_existing
mode as "replacing" all instances on the file with the new ones provided.
import base64
import requests
diffgram_client = {
"host": "<MY_DIFFGRAM_HOST>",
"project_string_id": "<MY_DIFFGRAM_PROJECT_STRING_ID>",
"client_id": "<MY_DIFFGRAM_CLIENT_ID>",
"client_secret": "<MY_DIFFGRAM_CLIENT_SECRET>",
}
auth = base64.b64encode((diffgram_client['client_id'] + ":" + diffgram_client['client_secret']).encode())
body = {
'file_id': '<THE FILE ID TO UPDATE>',
'instance_list': 'The new instances or existing instance list to update',
'frame_packet_map': 'The new instances or existing instance list to update (for video only)',
'mode': 'update', # Update will append, use update_with_existing to delete existing instances and replace them.
}
headers = {
"accept": "application/json",
"content-type": "application/json",
"authorization": f"Basic {auth.decode()}"
}
url = f"{diffgram_client['host']}/api/v1/walrus/project/{diffgram_client['project_string_id']}/input/packet"
response = requests.post(url, json=body, headers=headers)
response.json()
For reference on how to attach attributes to the instance list check: Uploading/Updating Files With Attributes