File size: 2,923 Bytes
09462dc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import numpy as np
import copy

def get_bbox_area(bbox):
    x1, y1, x2, y2 = bbox
    return (x2 - x1) * (y2 - y1)

def check_single_human_requirements(det_result):
    # filter results
    if len(det_result) > 3 or len(det_result) == 0:
        return False
    elif len(det_result) == 1:
        return True
    elif len(det_result) > 1: # [2, 3]
        bbox_areas = [get_bbox_area(bbox) for bbox in det_result]
        # 获取最大 bbox 面积的索引
        max_ind = max(range(len(bbox_areas)), key=lambda i: bbox_areas[i])
        # 获取次大面积(需要排除 max_ind)
        other_indices = [i for i in range(len(bbox_areas)) if i != max_ind]
        second_max_area = max([bbox_areas[i] for i in other_indices])

        max_area = bbox_areas[max_ind]
        if max_area < 2 * second_max_area:
            return False
        else:
            return True
    
def human_select(poses, det_results, multi_person):
    new_poses = []
    new_det_results = []
    for pose, det_result in zip(poses, det_results):
        if multi_person:
            new_pose, new_det_result = get_multi_human(pose, det_result)
        else:
            new_pose, new_det_result = get_single_human(pose, det_result)
        new_poses.append(new_pose)
        new_det_results.append(new_det_result)
    return new_poses, new_det_results


def get_single_human(pose, det_result):
    if len(det_result) <= 1:
        return pose, det_result
    else:
        bbox_areas = [get_bbox_area(bbox) for bbox in det_result]
        max_ind = max(range(len(bbox_areas)), key=lambda i: bbox_areas[i])
        pose_copy = copy.deepcopy(pose)
        pose_copy['bodies']['candidate'] = pose_copy['bodies']['candidate'][max_ind:max_ind+1]
        pose_copy['bodies']['subset'] = pose_copy['bodies']['subset'][max_ind:max_ind+1]
        pose_copy['hands'] = pose_copy['hands'][2*max_ind:2*max_ind+2]
        pose_copy['faces'] = pose_copy['faces'][max_ind:max_ind+1]
        return pose_copy, det_result[max_ind:max_ind+1]

def check_multi_human_requirements(det_result):
    # filter results
    if len(det_result) < 2 or len(det_result) > 4:  # 2-4个人
        return False
    else: # [3, 6]
        bbox_areas = [get_bbox_area(bbox) for bbox in det_result]
        # 获取最大 bbox 面积的索引
        max_ind = max(range(len(bbox_areas)), key=lambda i: bbox_areas[i])
        max_area = bbox_areas[max_ind]
        
        # 选择面积大于等于最大面积50%的bbox
        selected_indices = [i for i in range(len(bbox_areas)) if bbox_areas[i] >= 0.5 * max_area]   # 包含max_ind
        
        # 检查选中的bbox数量是否大于等于2
        if len(selected_indices) >= 2:
            return True
        else:
            return False

def get_multi_human(pose, det_result):
    # 后续再筛比较好,后续从65帧里面筛的时候可以把背景里的人的筛掉
    return pose, det_result