|
@@ -18,7 +18,8 @@ from utils.ry_system_util import *
|
|
|
from utils.video_util import *
|
|
|
from collections import defaultdict
|
|
|
import traceback
|
|
|
-
|
|
|
+from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
|
+from multiprocessing import Pool, cpu_count
|
|
|
import json
|
|
|
import time
|
|
|
import math
|
|
@@ -136,27 +137,90 @@ def calculate_distance(video1, video2):
|
|
|
|
|
|
def group_videos(videos, distance_threshold):
|
|
|
grid_size = calculate_grid_size(distance_threshold)
|
|
|
- grid = defaultdict(list)
|
|
|
- groups = {}
|
|
|
+ grid = defaultdict(lambda:{"count":0,"list":[]})
|
|
|
+ groups = []
|
|
|
|
|
|
for video in videos:
|
|
|
grid_key = get_grid_key(video.latitude, video.longitude, grid_size)
|
|
|
- grid[grid_key].append(video)
|
|
|
-
|
|
|
- for grid_key, grid_videos in grid.items():
|
|
|
- for video in grid_videos:
|
|
|
- grouped = False
|
|
|
- for group_id, group in list(groups.items()):
|
|
|
- for v in group["videos"]:
|
|
|
- if calculate_distance(video, v) < distance_threshold:
|
|
|
- groups[group_id]["videos"].append(video)
|
|
|
- groups[group_id]["count"] += 1
|
|
|
- grouped = True
|
|
|
- break
|
|
|
- if grouped:
|
|
|
- break
|
|
|
- if not grouped:
|
|
|
- group_id = video.cameraIndexCode
|
|
|
- groups[group_id] = {"count": 1, "videos": [video]}
|
|
|
+ grid['%s-%s'%grid_key]['count']+=1
|
|
|
+ grid['%s-%s'%grid_key]['latitude'] = (grid_key[0] + 0.5) * grid_size
|
|
|
+ grid['%s-%s'%grid_key]['longitude'] = (grid_key[1] + 0.5) * grid_size
|
|
|
+ grid['%s-%s'%grid_key]['list'].append(video)
|
|
|
+ if grid['%s-%s'%grid_key]['count']>1:
|
|
|
+ grid['%s-%s' % grid_key]['type'] ='2'
|
|
|
+ else:grid['%s-%s'%grid_key]['type'] ='1'
|
|
|
+ groups = list(grid.values())
|
|
|
+ # for group_id, group in list(grid.items()):
|
|
|
+ # groups.append(group)
|
|
|
+ # #使用多线程计算距离
|
|
|
+ # def process_video(video, grid_videos, groups, distance_threshold):
|
|
|
+ # grouped = False
|
|
|
+ # for group_id, group in list(groups.items()):
|
|
|
+ # for v in group["videos"]:
|
|
|
+ # if calculate_distance(video, v) < distance_threshold:
|
|
|
+ # groups[group_id]["videos"].append(video)
|
|
|
+ # groups[group_id]["count"] += 1
|
|
|
+ # grouped = True
|
|
|
+ # break
|
|
|
+ # if grouped:
|
|
|
+ # break
|
|
|
+ # if not grouped:
|
|
|
+ # group_id = video.cameraIndexCode
|
|
|
+ # groups[group_id] = {"count": 1, "videos": [video]}
|
|
|
+ #
|
|
|
+ # with ThreadPoolExecutor() as executor:
|
|
|
+ # futures = []
|
|
|
+ # for grid_key, grid_videos in grid.items():
|
|
|
+ # for video in grid_videos:
|
|
|
+ # futures.append(executor.submit(process_video, video, grid_videos, groups, distance_threshold))
|
|
|
+ # for future in as_completed(futures):
|
|
|
+ # future.result() # 确保所有任务完成
|
|
|
+
|
|
|
+ # for grid_key, grid_videos in grid.items():
|
|
|
+ # for video in grid_videos:
|
|
|
+ # grouped = False
|
|
|
+ # for group_id, group in list(groups.items()):
|
|
|
+ # for v in group["videos"]:
|
|
|
+ # if calculate_distance(video, v) < distance_threshold:
|
|
|
+ # groups[group_id]["videos"].append(video)
|
|
|
+ # groups[group_id]["count"] += 1
|
|
|
+ # grouped = True
|
|
|
+ # break
|
|
|
+ # if grouped:
|
|
|
+ # break
|
|
|
+ # if not grouped:
|
|
|
+ # group_id = video.cameraIndexCode
|
|
|
+ # groups[group_id] = {"count": 1, "videos": [video]}
|
|
|
+
|
|
|
+
|
|
|
+ # 使用多进程处理每个网格中的视频
|
|
|
|
|
|
+ # with Pool(processes=cpu_count()) as pool:
|
|
|
+ # for grid_key, grid_videos in grid.items():
|
|
|
+ # # 初始化局部分组
|
|
|
+ # partial_groups = pool.starmap(process_video, [(video, grid_videos, groups.copy(), distance_threshold) for video in grid_videos])
|
|
|
+ # # 合并局部分组结果
|
|
|
+ # for partial_group in partial_groups:
|
|
|
+ # for group_id, group in partial_group.items():
|
|
|
+ # if group_id in groups:
|
|
|
+ # groups[group_id]["videos"].extend(group["videos"])
|
|
|
+ # groups[group_id]["count"] += group["count"]
|
|
|
+ # else:
|
|
|
+ # groups[group_id] = group
|
|
|
+ # return groups
|
|
|
return groups
|
|
|
+def process_video(video, grid_videos, groups, distance_threshold):
|
|
|
+ grouped = False
|
|
|
+ for group_id, group in list(groups.items()):
|
|
|
+ for v in group["videos"]:
|
|
|
+ if calculate_distance(video, v) < distance_threshold:
|
|
|
+ group["videos"].append(video)
|
|
|
+ group["count"] += 1
|
|
|
+ grouped = True
|
|
|
+ break
|
|
|
+ if grouped:
|
|
|
+ break
|
|
|
+ if not grouped:
|
|
|
+ group_id = video.cameraIndexCode
|
|
|
+ groups[group_id] = {"count": 1, "videos": [video]}
|
|
|
+ return groups
|