-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcli.py
More file actions
109 lines (91 loc) · 3.71 KB
/
cli.py
File metadata and controls
109 lines (91 loc) · 3.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#!/usr/bin/env python3
"""
CLI for AnnotationParser
========================
Позволяет парсить, сохранять, фильтровать аннотации через командную строку.
Все функции можно вызывать по отдельности.
"""
import argparse
from pathlib import Path
import sys
from ..annotation_parser import create, parse_labelme, save_labelme
from ..annotation_parser.api.shapes_api import (
filter_shapes,
get_shapes_by_label,
)
from ..annotation_parser.public_enums import ShapeType
def main():
parser = argparse.ArgumentParser(
description="AnnotationParser CLI: parse, save, filter annotation files."
)
subparsers = parser.add_subparsers(dest='command', required=True)
# parse
parse_p = subparsers.add_parser("parse", help="Parse annotation file")
parse_p.add_argument("--file", required=True, help="Path to annotation file")
parse_p.add_argument("--adapter", required=True, help="Adapter name (labelme, coco, etc.)")
# save
save_p = subparsers.add_parser("save", help="Save shapes to annotation file")
save_p.add_argument("--file", required=True, help="Path to annotation file to parse")
save_p.add_argument("--adapter", required=True, help="Adapter name")
save_p.add_argument("--out", required=True, help="Path to output file")
save_p.add_argument("--backup", action="store_true", help="Save backup .bak file")
# filter
filter_p = subparsers.add_parser("filter", help="Filter shapes by label or other predicate")
filter_p.add_argument("--file", required=True, help="Path to annotation file to parse")
filter_p.add_argument("--adapter", required=True, help="Adapter name")
filter_p.add_argument("--label", help="Filter by label")
filter_p.add_argument("--number", type=int, help="Filter by number")
filter_p.add_argument("--wz_number", type=int, help="Filter by working zone number (wz_number)")
args = parser.parse_args()
if args.command == "parse":
do_parse(args)
elif args.command == "save":
do_save(args)
elif args.command == "filter":
do_filter(args)
else:
parser.print_help()
def do_parse(args):
file = Path(args.file)
try:
parser = create(file, args.adapter)
shapes = parser.parse()
print(f"Parsed {len(shapes)} shapes:")
for shape in shapes:
print(shape)
except Exception as e:
print(f"[ERROR] {e}")
sys.exit(1)
def do_save(args):
file = Path(args.file)
out_file = Path(args.out)
try:
parser = create(file, args.adapter)
shapes = parser.parse()
save_labelme(shapes, out_file, backup=args.backup)
print(f"Saved {len(shapes)} shapes to '{out_file}'. Backup: {args.backup}")
except Exception as e:
print(f"[ERROR] {e}")
sys.exit(1)
def do_filter(args):
file = Path(args.file)
try:
parser = create(file, args.adapter)
shapes = parser.parse()
filtered = shapes
# Логика фильтрации
if args.label:
filtered = get_shapes_by_label(filtered, args.label)
if args.number is not None:
# Применяем фильтрацию по номеру (custom predicate)
filtered = tuple(s for s in filtered if getattr(s, "number", None) == args.number)
if args.wz_number is not None:
filtered = tuple(s for s in filtered if getattr(s, "wz_number", None) == args.wz_number)
print(f"Filtered shapes ({len(filtered)}):")
for shape in filtered:
print(shape)
except Exception as e:
print(f"[ERROR] {e}")
sys.exit(1)
if __name__ == "__main__":
main()