|
@@ -584,6 +584,7 @@ def process_frames(
|
|
|
for obj in object_tracker.tracked_objects.values()
|
|
|
if obj["id"] in stationary_object_ids
|
|
|
]
|
|
|
+
|
|
|
for region in regions:
|
|
|
detections.extend(
|
|
|
detect(
|
|
@@ -599,7 +600,7 @@ def process_frames(
|
|
|
#########
|
|
|
# merge objects, check for clipped objects and look again up to 4 times
|
|
|
#########
|
|
|
- refining = True
|
|
|
+ refining = len(regions) > 0
|
|
|
refine_count = 0
|
|
|
while refining and refine_count < 4:
|
|
|
refining = False
|
|
@@ -654,44 +655,49 @@ def process_frames(
|
|
|
|
|
|
## drop detections that overlap too much
|
|
|
consolidated_detections = []
|
|
|
- # group by name
|
|
|
- detected_object_groups = defaultdict(lambda: [])
|
|
|
- for detection in detections:
|
|
|
- detected_object_groups[detection[0]].append(detection)
|
|
|
-
|
|
|
- # loop over detections grouped by label
|
|
|
- for group in detected_object_groups.values():
|
|
|
- # if the group only has 1 item, skip
|
|
|
- if len(group) == 1:
|
|
|
- consolidated_detections.append(group[0])
|
|
|
- continue
|
|
|
|
|
|
- # sort smallest to largest by area
|
|
|
- sorted_by_area = sorted(group, key=lambda g: g[3])
|
|
|
-
|
|
|
- for current_detection_idx in range(0, len(sorted_by_area)):
|
|
|
- current_detection = sorted_by_area[current_detection_idx][2]
|
|
|
- overlap = 0
|
|
|
- for to_check_idx in range(
|
|
|
- min(current_detection_idx + 1, len(sorted_by_area)),
|
|
|
- len(sorted_by_area),
|
|
|
- ):
|
|
|
- to_check = sorted_by_area[to_check_idx][2]
|
|
|
- # if 90% of smaller detection is inside of another detection, consolidate
|
|
|
- if (
|
|
|
- area(intersection(current_detection, to_check))
|
|
|
- / area(current_detection)
|
|
|
- > 0.9
|
|
|
+ # if detection was run on this frame, consolidate
|
|
|
+ if len(regions) > 0:
|
|
|
+ # group by name
|
|
|
+ detected_object_groups = defaultdict(lambda: [])
|
|
|
+ for detection in detections:
|
|
|
+ detected_object_groups[detection[0]].append(detection)
|
|
|
+
|
|
|
+ # loop over detections grouped by label
|
|
|
+ for group in detected_object_groups.values():
|
|
|
+ # if the group only has 1 item, skip
|
|
|
+ if len(group) == 1:
|
|
|
+ consolidated_detections.append(group[0])
|
|
|
+ continue
|
|
|
+
|
|
|
+ # sort smallest to largest by area
|
|
|
+ sorted_by_area = sorted(group, key=lambda g: g[3])
|
|
|
+
|
|
|
+ for current_detection_idx in range(0, len(sorted_by_area)):
|
|
|
+ current_detection = sorted_by_area[current_detection_idx][2]
|
|
|
+ overlap = 0
|
|
|
+ for to_check_idx in range(
|
|
|
+ min(current_detection_idx + 1, len(sorted_by_area)),
|
|
|
+ len(sorted_by_area),
|
|
|
):
|
|
|
- overlap = 1
|
|
|
- break
|
|
|
- if overlap == 0:
|
|
|
- consolidated_detections.append(
|
|
|
- sorted_by_area[current_detection_idx]
|
|
|
- )
|
|
|
-
|
|
|
- # now that we have refined our detections, we need to track objects
|
|
|
- object_tracker.match_and_update(frame_time, consolidated_detections)
|
|
|
+ to_check = sorted_by_area[to_check_idx][2]
|
|
|
+ # if 90% of smaller detection is inside of another detection, consolidate
|
|
|
+ if (
|
|
|
+ area(intersection(current_detection, to_check))
|
|
|
+ / area(current_detection)
|
|
|
+ > 0.9
|
|
|
+ ):
|
|
|
+ overlap = 1
|
|
|
+ break
|
|
|
+ if overlap == 0:
|
|
|
+ consolidated_detections.append(
|
|
|
+ sorted_by_area[current_detection_idx]
|
|
|
+ )
|
|
|
+ # now that we have refined our detections, we need to track objects
|
|
|
+ object_tracker.match_and_update(frame_time, consolidated_detections)
|
|
|
+ # else, just update the frame times for the stationary objects
|
|
|
+ else:
|
|
|
+ object_tracker.update_frame_times(frame_time)
|
|
|
|
|
|
# add to the queue if not full
|
|
|
if detected_objects_queue.full():
|