File size: 3,429 Bytes
5d92054
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# File: processing.pyx
# cython: language_level=3, boundscheck=False, wraparound=False, nonecheck=False, cdivision=True

import numpy as np
cimport numpy as np
import pandas as pd
cimport pandas as pd
from libc.math cimport isnan
from cpython.mem cimport PyMem_Malloc, PyMem_Free

# Define C types for better performance
ctypedef np.float32_t DTYPE_t
ctypedef np.int32_t ITYPE_t

def process_bbox_depth_cy(np.ndarray[DTYPE_t, ndim=2] depth_map,
                         int y_min, int y_max, int x_min, int x_max):
    """
    Optimized bbox depth calculations using Cython
    """
    cdef:
        int i, j, count = 0
        double sum_val = 0.0
        double mean_val = 0.0
        np.ndarray[DTYPE_t, ndim=1] flat_vals
        int flat_size = 0
        
    for i in range(y_min, y_max):
        for j in range(x_min, x_max):
            if not isnan(depth_map[i, j]):
                sum_val += depth_map[i, j]
                count += 1
    
    if count > 0:
        mean_val = sum_val / count
        
    # Create array for trimmed mean calculation
    flat_vals = np.zeros(count, dtype=np.float32)
    flat_size = 0
    
    for i in range(y_min, y_max):
        for j in range(x_min, x_max):
            if not isnan(depth_map[i, j]):
                flat_vals[flat_size] = depth_map[i, j]
                flat_size += 1
                
    return mean_val, np.median(flat_vals), np.percentile(flat_vals, [20, 80])

def handle_overlaps_cy(np.ndarray[DTYPE_t, ndim=2] depth_map,
                      np.ndarray[ITYPE_t, ndim=2] boxes):
    """
    Optimized overlap handling using Cython
    """
    cdef:
        int n_boxes = boxes.shape[0]
        int i, j
        int y_min1, y_max1, x_min1, x_max1
        int y_min2, y_max2, x_min2, x_max2
        double area1, area2, area_intersection
        bint* to_remove = <bint*>PyMem_Malloc(n_boxes * sizeof(bint))
        
    if not to_remove:
        raise MemoryError()
        
    try:
        for i in range(n_boxes):
            to_remove[i] = False
            
        for i in range(n_boxes):
            if to_remove[i]:
                continue
                
            y_min1, x_min1, y_max1, x_max1 = boxes[i]
            
            for j in range(i + 1, n_boxes):
                if to_remove[j]:
                    continue
                    
                y_min2, x_min2, y_max2, x_max2 = boxes[j]
                
                # Calculate intersection
                y_min_int = max(y_min1, y_min2)
                y_max_int = min(y_max1, y_max2)
                x_min_int = max(x_min1, x_min2)
                x_max_int = min(x_max1, x_max2)
                
                if y_min_int < y_max_int and x_min_int < x_max_int:
                    area1 = (y_max1 - y_min1) * (x_max1 - x_min1)
                    area2 = (y_max2 - y_min2) * (x_max2 - x_min2)
                    area_intersection = (y_max_int - y_min_int) * (x_max_int - x_min_int)
                    
                    if area_intersection / min(area1, area2) >= 0.70:
                        if area1 < area2:
                            to_remove[i] = True
                            break
                        else:
                            to_remove[j] = True
                            
        return np.array([i for i in range(n_boxes) if not to_remove[i]], dtype=np.int32)
                            
    finally:
        PyMem_Free(to_remove)