-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathadd_missing_data.py
More file actions
112 lines (93 loc) · 5.25 KB
/
Copy pathadd_missing_data.py
File metadata and controls
112 lines (93 loc) · 5.25 KB
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
103
104
105
106
107
108
109
110
111
112
import csv
import numpy as np
from scipy.interpolate import interp1d
from util import extract_numeric_values
def interpolate_bounding_boxes(data):
# Extract necessary data columns from input data
frame_numbers = np.array([int(row['frame_nmr']) for row in data])
car_ids = np.array([int(float(row['car_id'])) for row in data])
car_bboxes = np.array([list(map(float, row['car_bbox'][1:-1].split())) for row in data])
license_plate_bboxes = np.array([list(map(float, row['license_plate_bbox'][1:-1].split())) for row in data])
# Extract numeric values from the 'car_speed' column using the 'extract_numeric_values' function
speeds_list = [extract_numeric_values(row['car_speed']) for row in data]
interpolated_data = []
unique_car_ids = np.unique(car_ids)
for car_id in unique_car_ids:
frame_numbers_ = [p['frame_nmr'] for p in data if int(float(p['car_id'])) == int(float(car_id))]
print(frame_numbers_, car_id)
# Filter data for a specific car ID
car_mask = car_ids == car_id
car_frame_numbers = frame_numbers[car_mask]
car_bboxes_interpolated = []
license_plate_bboxes_interpolated = []
speeds_interpolated = []
first_frame_number = car_frame_numbers[0]
last_frame_number = car_frame_numbers[-1]
for i in range(len(car_bboxes[car_mask])):
frame_number = car_frame_numbers[i]
car_bbox = car_bboxes[car_mask][i]
license_plate_bbox = license_plate_bboxes[car_mask][i]
# Check if 'car_speed' is available for the current frame and car ID
if len(speeds_list[i]) > 0:
speed = speeds_list[i][0]
else:
speed = 0 # Default speed if 'car_speed' is not available
if i > 0:
prev_frame_number = car_frame_numbers[i - 1]
prev_car_bbox = car_bboxes_interpolated[-1]
prev_license_plate_bbox = license_plate_bboxes_interpolated[-1]
prev_speed = speeds_interpolated[-1]
if frame_number - prev_frame_number > 1:
# Interpolate missing frames' bounding boxes
frames_gap = frame_number - prev_frame_number
x = np.array([prev_frame_number, frame_number])
x_new = np.linspace(prev_frame_number, frame_number, num=frames_gap, endpoint=False)
interp_func = interp1d(x, np.vstack((prev_car_bbox, car_bbox)), axis=0, kind='linear')
interpolated_car_bboxes = interp_func(x_new)
interp_func = interp1d(x, np.vstack((prev_license_plate_bbox, license_plate_bbox)), axis=0,
kind='linear')
interpolated_license_plate_bboxes = interp_func(x_new)
interp_func_speed = interp1d(x, [prev_speed, speed], kind='linear')
interpolated_speed = interp_func_speed(x_new)
car_bboxes_interpolated.extend(interpolated_car_bboxes[1:])
license_plate_bboxes_interpolated.extend(interpolated_license_plate_bboxes[1:])
speeds_interpolated.extend(interpolated_speed[1:])
car_bboxes_interpolated.append(car_bbox)
license_plate_bboxes_interpolated.append(license_plate_bbox)
speeds_interpolated.append(speed)
for i in range(len(car_bboxes_interpolated)):
frame_number = first_frame_number + i
row = {}
row['frame_nmr'] = str(frame_number)
row['car_id'] = str(car_id)
row['car_bbox'] = ' '.join(map(str, car_bboxes_interpolated[i]))
row['license_plate_bbox'] = ' '.join(map(str, license_plate_bboxes_interpolated[i]))
row['car_speed'] = str(speeds_interpolated[i])
# Check if the frame number and car ID exist in the input data
data_indices = np.where((frame_numbers == frame_number) & (car_ids == car_id))[0]
if len(data_indices) > 0:
# Original row, retrieve values from the input data if available
original_row = data[data_indices[0]]
row['license_plate_bbox_score'] = original_row.get('license_plate_bbox_score', '0')
row['license_number'] = original_row.get('license_number', '0')
row['license_number_score'] = original_row.get('license_number_score', '0')
else:
# Imputed row, set the following fields to '0'
row['license_plate_bbox_score'] = '0'
row['license_number'] = '0'
row['license_number_score'] = '0'
interpolated_data.append(row)
return interpolated_data
# Load the CSV file
with open('speed_test.csv', 'r') as file:
reader = csv.DictReader(file)
data = list(reader)
# Interpolate missing data
interpolated_data = interpolate_bounding_boxes(data)
# Write updated data to a new CSV file
header = ['frame_nmr', 'car_id', 'car_bbox', 'car_speed', 'license_plate_bbox', 'license_plate_bbox_score',
'license_number', 'license_number_score']
with open('speed_test_interpolated.csv', 'w', newline='') as file:
writer = csv.DictWriter(file, fieldnames=header)
writer.writeheader()
writer.writerows(interpolated_data)