自定义元数据在数据管理和分析中扮演着重要角色。它不仅可以帮助更高效地检索和组织数据,还能为推断结果提供额外的上下文信息。例如,假设是一家在美国拥有三个工厂的汽车制造商。在分析推断结果时,可能会考虑添加以下信息:工厂的地理位置、图像拍摄的生产线、某个特定操作是否成功以及推断的预期结果(例如颜色为蓝色)。
通过向推断结果附加额外的数据,可以在模型监控仪表板中显示这些数据。当使用Roboflow的推断容器或托管推断API进行推断请求时,会在响应中收到一个推断ID。使用这个ID,可以将其添加到推断ID数组中,以附加元数据。字段名称是属性的名称,值是该属性的值。
例如,如果想将地理位置信息附加到推断结果上,会将字段名称设置为“location”,值将是一个位置,如“united_states”。需要注意的是,字段名称和字段值完全由用户定义。务必保持格式一致,包括字母的大小写。例如,字段名称:“my_location”和字段名称:“My_location”将被视为两个不同的元数据值。
以下是一个使用curl命令的示例请求,用于将自定义元数据附加到推断结果上。这个请求将元数据发送到Roboflow的API,并包含API密钥、数据数组以及每个数据项的推断ID、字段名称和字段值。
curl --location --request POST 'https://api.roboflow.com/${WORKSPACE}/inference-stats/metadata' \
--header 'Content-Type: application/json' \
--data-raw '{
"api_key": "",
"data": [
{
"inference_ids": ["a12a19a9-a933-44c9-970c-a55ea03bb453"],
"field_name": "camera_location",
"field_value": "canada"
},
{
"inference_ids": ["accf0af9-bdf0-4b22-8106-6988d4cada5a"],
"field_name": "camera_location",
"field_value": "emea"
}
]
}'
响应状态码可能为200或400,分别表示请求成功或请求无效。
{
"status": "ok"
}
{
"error": "Invalid request"
}
import requests
from inference_sdk import InferenceHTTPClient
# 设置API密钥和工作区ID
api_key = "YOUR_API_KEY"
workspace = "YOUR_WORKSPACE_ID"
# 设置默认值
field_name = "test_field"
field_value = "test_value"
model_id = "coco/24"
image_path = "https://cdn.britannica.com/79/232779-050-6B0411D7/German-Shepherd-dog-Alsatian.jpg"
api_url = "https://detect.roboflow.com"
# 初始化客户端
print("Initializing the InferenceHTTPClient...")
client = InferenceHTTPClient(api_url=api_url, api_key=api_key)
# 运行推断
result = client.infer(image_path, model_id=model_id)
print("Result:", result)
# 从结果中提取推断ID
inference_id = result.get('inference_id')
if inference_id:
print("Inference ID:", inference_id)
else:
raise ValueError("Inference ID not found in the response.")
url = f"https://api.roboflow.com/{workspace}/inference-stats/metadata"
# 设置POST请求的头部和数据
headers = {
"Content-Type": "application/json"
}
data = {
"api_key": api_key,
"data": [
{
"inference_ids": [inference_id],
"field_name": field_name,
"field_value": field_value
}
]
}
# 发送POST请求以附加自定义元数据
response = requests.post(url, headers=headers, json=data)
# 检查响应状态
if response.status_code == 200:
print("Custom metadata attached successfully:", response.json())
else:
print("Failed to attach custom metadata:", response.text)