Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -4,7 +4,12 @@ import json
|
|
4 |
import os
|
5 |
from pathlib import Path
|
6 |
|
7 |
-
|
|
|
|
|
|
|
|
|
|
|
8 |
|
9 |
class AnnotationManager:
|
10 |
def __init__(self):
|
@@ -22,7 +27,8 @@ class AnnotationManager:
|
|
22 |
if not annotations:
|
23 |
return False, "No annotations drawn"
|
24 |
|
25 |
-
#
|
|
|
26 |
for ann in annotations:
|
27 |
if len(ann) != 5:
|
28 |
return False, "Invalid annotation format"
|
@@ -36,13 +42,22 @@ class AnnotationManager:
|
|
36 |
if not label or label not in CATEGORIES:
|
37 |
return False, f"Invalid or missing label. Must be one of: {', '.join(CATEGORIES)}"
|
38 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
39 |
return True, ""
|
40 |
|
41 |
def add_annotation(self, bbox_data):
|
42 |
"""Add or update annotations for an image"""
|
43 |
is_valid, error_msg = self.validate_annotations(bbox_data)
|
44 |
if not is_valid:
|
45 |
-
return self.get_json_annotations(), error_msg
|
46 |
|
47 |
image_path, annotations = bbox_data
|
48 |
filename = os.path.basename(image_path)
|
@@ -56,9 +71,9 @@ class AnnotationManager:
|
|
56 |
self.annotations[filename] = formatted_annotations
|
57 |
|
58 |
# Count annotations by type
|
59 |
-
|
60 |
-
|
61 |
-
success_msg = f"Successfully saved for {filename}: {
|
62 |
|
63 |
return self.get_json_annotations(), success_msg
|
64 |
|
@@ -69,7 +84,7 @@ class AnnotationManager:
|
|
69 |
def clear_annotations(self):
|
70 |
"""Clear all annotations"""
|
71 |
self.annotations = {}
|
72 |
-
return "", "All annotations cleared"
|
73 |
|
74 |
def create_interface():
|
75 |
annotation_mgr = AnnotationManager()
|
@@ -80,14 +95,14 @@ def create_interface():
|
|
80 |
|
81 |
**Instructions:**
|
82 |
1. Upload an image using the upload button in the annotator
|
83 |
-
2. Draw bounding boxes and select
|
84 |
3. Click 'Save Annotations' to add to the collection
|
85 |
4. Repeat for all images
|
86 |
5. Copy the combined JSON when finished
|
87 |
|
88 |
-
**
|
89 |
-
- advertisement:
|
90 |
-
- text:
|
91 |
""")
|
92 |
|
93 |
with gr.Row():
|
|
|
4 |
import os
|
5 |
from pathlib import Path
|
6 |
|
7 |
+
# Define categories and their limits
|
8 |
+
CATEGORY_LIMITS = {
|
9 |
+
"advertisement": 1, # Maximum 1 advertisement annotation per image
|
10 |
+
"text": 2 # Maximum 2 text annotations per image
|
11 |
+
}
|
12 |
+
CATEGORIES = list(CATEGORY_LIMITS.keys())
|
13 |
|
14 |
class AnnotationManager:
|
15 |
def __init__(self):
|
|
|
27 |
if not annotations:
|
28 |
return False, "No annotations drawn"
|
29 |
|
30 |
+
# Count annotations per category
|
31 |
+
category_counts = {cat: 0 for cat in CATEGORIES}
|
32 |
for ann in annotations:
|
33 |
if len(ann) != 5:
|
34 |
return False, "Invalid annotation format"
|
|
|
42 |
if not label or label not in CATEGORIES:
|
43 |
return False, f"Invalid or missing label. Must be one of: {', '.join(CATEGORIES)}"
|
44 |
|
45 |
+
# Count this annotation
|
46 |
+
category_counts[label] += 1
|
47 |
+
|
48 |
+
# Check category limits
|
49 |
+
for category, count in category_counts.items():
|
50 |
+
limit = CATEGORY_LIMITS[category]
|
51 |
+
if count > limit:
|
52 |
+
return False, f"Too many {category} annotations. Maximum allowed: {limit}"
|
53 |
+
|
54 |
return True, ""
|
55 |
|
56 |
def add_annotation(self, bbox_data):
|
57 |
"""Add or update annotations for an image"""
|
58 |
is_valid, error_msg = self.validate_annotations(bbox_data)
|
59 |
if not is_valid:
|
60 |
+
return self.get_json_annotations(), f"❌ Error: {error_msg}"
|
61 |
|
62 |
image_path, annotations = bbox_data
|
63 |
filename = os.path.basename(image_path)
|
|
|
71 |
self.annotations[filename] = formatted_annotations
|
72 |
|
73 |
# Count annotations by type
|
74 |
+
counts = {cat: sum(1 for ann in annotations if ann[4] == cat) for cat in CATEGORIES}
|
75 |
+
counts_str = ", ".join(f"{count} {cat}" for cat, count in counts.items())
|
76 |
+
success_msg = f"✅ Successfully saved for {filename}: {counts_str}"
|
77 |
|
78 |
return self.get_json_annotations(), success_msg
|
79 |
|
|
|
84 |
def clear_annotations(self):
|
85 |
"""Clear all annotations"""
|
86 |
self.annotations = {}
|
87 |
+
return "", "🗑️ All annotations cleared"
|
88 |
|
89 |
def create_interface():
|
90 |
annotation_mgr = AnnotationManager()
|
|
|
95 |
|
96 |
**Instructions:**
|
97 |
1. Upload an image using the upload button in the annotator
|
98 |
+
2. Draw bounding boxes and select the appropriate label
|
99 |
3. Click 'Save Annotations' to add to the collection
|
100 |
4. Repeat for all images
|
101 |
5. Copy the combined JSON when finished
|
102 |
|
103 |
+
**Annotation Limits per Image:**
|
104 |
+
- advertisement: Maximum 1 annotation
|
105 |
+
- text: Maximum 2 annotations
|
106 |
""")
|
107 |
|
108 |
with gr.Row():
|