delete_annot.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import argparse
  2. import json
  3. import os
  4. from pycocotools.coco import COCO
  5. def new_path(old_path):
  6. # 使用os.path.dirname获取目录部分
  7. directory = os.path.dirname(old_path)
  8. # 使用os.path.basename获取文件名部分(包括扩展名)
  9. filename_with_extension = os.path.basename(old_path)
  10. # 使用os.path.splitext分割文件名和扩展名
  11. filename, extension = os.path.splitext(filename_with_extension)
  12. # 修改文件名部分,添加_filter并重新组合扩展名
  13. new_filename = filename + '_filter' + extension
  14. # 如果directory为空(即文件名只包含一个文件名没有目录),则使用'.'作为目录
  15. if not directory:
  16. directory = '.'
  17. # 使用os.path.join组合目录和新的文件名
  18. return os.path.join(directory, new_filename)
  19. def process_coco(file, annot_name, output=""):
  20. # 初始化COCO对象
  21. coco = COCO(file)
  22. # 获取所有的类别信息
  23. categories = coco.loadCats(coco.getCatIds())
  24. # 找到"line"类别的ID
  25. cat_id = []
  26. for cat in categories:
  27. if cat['name'] in annot_name:
  28. cat_id.append(cat['id'])
  29. if cat_id is None:
  30. print("Category not found in annotations.")
  31. else:
  32. # 获取所有的标注
  33. annotations = coco.dataset['annotations']
  34. # 创建一个新的标注列表,不包含"line"类别的标注
  35. new_annotations = [ann for ann in annotations if ann['category_id'] not in cat_id]
  36. # 将新的标注列表写回到一个新的JSON文件中
  37. if output == "":
  38. output = new_path(file)
  39. with open(output, 'w') as f:
  40. coco.dataset['annotations'] = new_annotations
  41. json.dump(coco.dataset, f, ensure_ascii=True, indent=2)
  42. def main():
  43. parser = argparse.ArgumentParser("删除特定标注信息\n")
  44. parser.add_argument("input", help="输入路径")
  45. parser.add_argument("type", help="数据标注格式类型,目前支持coco")
  46. parser.add_argument("--labels", nargs='+', help="需要清除的标签")
  47. parser.add_argument("--output", help="[可选]输出路径")
  48. args = parser.parse_args()
  49. if args.type == 'coco':
  50. process_coco(args.input, args.labels)
  51. if __name__ == "__main__":
  52. main()