1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- import argparse
- import json
- import os
- from pycocotools.coco import COCO
- def new_path(old_path):
- # 使用os.path.dirname获取目录部分
- directory = os.path.dirname(old_path)
- # 使用os.path.basename获取文件名部分(包括扩展名)
- filename_with_extension = os.path.basename(old_path)
- # 使用os.path.splitext分割文件名和扩展名
- filename, extension = os.path.splitext(filename_with_extension)
- # 修改文件名部分,添加_filter并重新组合扩展名
- new_filename = filename + '_filter' + extension
- # 如果directory为空(即文件名只包含一个文件名没有目录),则使用'.'作为目录
- if not directory:
- directory = '.'
- # 使用os.path.join组合目录和新的文件名
- return os.path.join(directory, new_filename)
- def process_coco(file, annot_name, output=""):
- # 初始化COCO对象
- coco = COCO(file)
- # 获取所有的类别信息
- categories = coco.loadCats(coco.getCatIds())
- # 找到"line"类别的ID
- cat_id = []
- for cat in categories:
- if cat['name'] in annot_name:
- cat_id.append(cat['id'])
- if cat_id is None:
- print("Category not found in annotations.")
- else:
- # 获取所有的标注
- annotations = coco.dataset['annotations']
- # 创建一个新的标注列表,不包含"line"类别的标注
- new_annotations = [ann for ann in annotations if ann['category_id'] not in cat_id]
- # 将新的标注列表写回到一个新的JSON文件中
- if output == "":
- output = new_path(file)
- with open(output, 'w') as f:
- coco.dataset['annotations'] = new_annotations
- json.dump(coco.dataset, f, ensure_ascii=True, indent=2)
- def main():
- parser = argparse.ArgumentParser("删除特定标注信息\n")
- parser.add_argument("input", help="输入路径")
- parser.add_argument("type", help="数据标注格式类型,目前支持coco")
- parser.add_argument("--labels", nargs='+', help="需要清除的标签")
- parser.add_argument("--output", help="[可选]输出路径")
- args = parser.parse_args()
- if args.type == 'coco':
- process_coco(args.input, args.labels)
- if __name__ == "__main__":
- main()
|