-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtraffix.py
126 lines (97 loc) · 4.25 KB
/
traffix.py
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import yaml
from threading import Thread
from time import sleep
from traffix.vision.image_retrieving import ImageRetriever
from traffix.vision.vehicle_counting import VehicleCounter
from traffix.utils.time_series_utils import DataProcessor
from traffix.prediction.time_series import Predictor
from traffix.schedule.scheduling import Scheduler
from traffix.utils.interface import Interface, DisplayCanvas, SumCanvas
if __name__ == "__main__":
try:
with open("config.yaml") as file:
try:
config = yaml.safe_load(file)
except yaml.YAMLError as exc:
print(exc)
exit()
videos = []
video_threads = []
vehicle_counters = []
vehicle_counter_threads = []
traffic_count_recorders = []
traffic_predictors = []
interface = Interface()
# Initialise video sources and traffic viewers
for idx, view in enumerate(config["views"]):
videos.append(
ImageRetriever(
view["name"],
view["source"],
float(view["fps"])))
video_threads.append(Thread(target=videos[-1].play_source))
roi = ((view["roi"]["y1"], view["roi"]["y2"]),
(view["roi"]["x1"], view["roi"]["x2"]))
vehicle_counters.append(
VehicleCounter(
config["vehicle_counter"]["yolo_weights"],
roi,
interface.get_display_canvas(idx),
config["vehicle_counter"]["target_classes"]))
vehicle_counter_threads.append(
Thread(target=vehicle_counters[-1].process_source,
args=[videos[-1]]))
# Initialise traffic count data and predictors
history_depth = config["traffic_predictor"]["history_depth"]
prediction_depth = config["traffic_predictor"]["prediction_depth"]
hidden_size= config["traffic_predictor"]["hidden_size"]
num_stacked_layers = config["traffic_predictor"]["num_stacked_layers"]
for predictor in config["traffic_predictors"]:
traffic_count_recorders.append(DataProcessor(
data_csv=predictor["initial_data"],
n_lookback=history_depth,
n_predict=prediction_depth,
index_title="index",
vehicle_count_title="vehicle_count"))
traffic_count_recorders[-1].fit_self()
traffic_predictors.append(Predictor(
1,
output_size=prediction_depth,
hidden_size=hidden_size,
num_stacked_layers=num_stacked_layers,
n_lookback=history_depth,
n_predict=prediction_depth))
traffic_predictors[-1].load_model(predictor["model_weights"])
# Initialise the scheduler module
paths = []
for i in range(config["scheduler"]["paths"]):
path = []
for line_idx in config["scheduler"][f"path_{i}"]:
line = (vehicle_counters[line_idx],
traffic_count_recorders[line_idx],
traffic_predictors[line_idx])
path.append(line)
paths.append(path)
scheduler = Scheduler(interface,
paths,
config["scheduler"]["schedule_period"],
history_depth,
prediction_depth)
for video_thread in video_threads:
video_thread.daemon = True
video_thread.start()
for vehicle_counter_thread in vehicle_counter_threads:
vehicle_counter_thread.daemon = True
vehicle_counter_thread.start()
schedule_thread = Thread(target=scheduler.run_schedule)
schedule_thread.daemon = True
schedule_thread.start()
interface.run_main_loop()
except KeyboardInterrupt:
print("Stopping vehicle counters...")
for vehicle_counter in vehicle_counters:
vehicle_counter.stop()
sleep(1.0)
print("Stopping video sources...")
for video in videos:
video.stop()