You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免ClearML重复上传具有相同ID的标注?

问题解决:确保单帧仅上传一个标注

你的代码中连续两次调用allegro_frame.add_annotation,尽管使用了相同的ann_id,但该方法默认是追加标注而非覆盖,因此最终会上传两个重复标注。要实现每个帧仅上传一个标注,可采用以下几种方案:

方案1:移除重复的添加操作

最直接的方式是删掉重复的add_annotation调用,只保留一次:

from typing import List
from allegroai import Dataset, DatasetVersion, SingleFrame, DataView
from allegroai.dataframe.annotation import BoundingBox2D

allegro_frame = SingleFrame(
    source="/irrelevant/source.png"
)
ann_id = "the_id"
label = "the_label"
# 仅保留一次标注添加
allegro_frame.add_annotation(id=ann_id, box2d_xywh=(100, 100, 100, 100), labels=(label,))

allegro_frames: List[SingleFrame] = [
    allegro_frame
]

dataset_name = r"clml_test_dataset"
version_name = r"clml_test_version"
dataset = Dataset.create(dataset_name=dataset_name)
version = DatasetVersion.create_version(dataset_name=dataset_name, version_name=version_name)
version.add_frames(allegro_frames)

方案2:添加前检查标注是否存在

如果业务逻辑中可能会触发重复添加操作,可以先检查当前帧是否已存在该ID的标注,仅在不存在时添加:

from typing import List
from allegroai import Dataset, DatasetVersion, SingleFrame, DataView
from allegroai.dataframe.annotation import BoundingBox2D

allegro_frame = SingleFrame(
    source="/irrelevant/source.png"
)
ann_id = "the_id"
label = "the_label"

# 检查是否已有该ID的标注
if not any(ann.id == ann_id for ann in allegro_frame.annotations):
    allegro_frame.add_annotation(id=ann_id, box2d_xywh=(100, 100, 100, 100), labels=(label,))

allegro_frames: List[SingleFrame] = [
    allegro_frame
]

dataset_name = r"clml_test_dataset"
version_name = r"clml_test_version"
dataset = Dataset.create(dataset_name=dataset_name)
version = DatasetVersion.create_version(dataset_name=dataset_name, version_name=version_name)
version.add_frames(allegro_frames)

方案3:使用set_annotation替代add_annotation

部分版本的Allegro SDK提供了set_annotation方法,该方法会直接覆盖同ID的标注(若已存在),而非追加:

from typing import List
from allegroai import Dataset, DatasetVersion, SingleFrame, DataView
from allegroai.dataframe.annotation import BoundingBox2D

allegro_frame = SingleFrame(
    source="/irrelevant/source.png"
)
ann_id = "the_id"
label = "the_label"
# 使用set_annotation替代add_annotation
allegro_frame.set_annotation(id=ann_id, box2d_xywh=(100, 100, 100, 100), labels=(label,))
# 即使重复调用也只会保留最后一次的标注(若需要)
# allegro_frame.set_annotation(id=ann_id, box2d_xywh=(100, 100, 100, 100), labels=(label,))

allegro_frames: List[SingleFrame] = [
    allegro_frame
]

dataset_name = r"clml_test_dataset"
version_name = r"clml_test_version"
dataset = Dataset.create(dataset_name=dataset_name)
version = DatasetVersion.create_version(dataset_name=dataset_name, version_name=version_name)
version.add_frames(allegro_frames)

内容的提问来源于stack exchange,提问作者Gulzar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 05:26:27