如何避免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
相关产品推荐
相关产品推荐

