-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtollingvision-sample.py
More file actions
133 lines (109 loc) · 5.75 KB
/
Copy pathtollingvision-sample.py
File metadata and controls
133 lines (109 loc) · 5.75 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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import grpc
import os
import re
import sys
import csv
import os
from concurrent import futures
from tollingvision_scsinfo import TollingVisionServiceStub, EventRequest, Image
def list_files_recursively(folder):
file_list = []
for root, _, files in os.walk(folder):
for file in files:
if re.match(r'.*\.(png|jpg|bmp)$', file.lower()):
file_list.append(os.path.join(root, file))
return file_list
def group_images(files, group_regex):
groups = {}
group_pattern = re.compile(group_regex)
for file in files:
match = group_pattern.match(os.path.basename(file))
if match:
group = match.group()
if group not in groups:
groups[group] = []
groups[group].append(file)
return groups
def create_event_request(files, front_regex, rear_regex, overview_regex):
front_images = []
rear_images = []
overview_images = []
front_pattern = re.compile(front_regex)
rear_pattern = re.compile(rear_regex)
overview_pattern = re.compile(overview_regex)
for file in files:
with open(file, 'rb') as f:
image_data = f.read()
image = Image(data=image_data)
if overview_pattern.match(os.path.basename(file)):
overview_images.append(image)
elif front_pattern.match(os.path.basename(file)):
front_images.append(image)
elif rear_pattern.match(os.path.basename(file)):
rear_images.append(image)
if not front_images and not rear_images and not overview_images:
return None
return EventRequest(front_image=front_images, rear_image=rear_images, overview_image=overview_images)
def format_plate(plate):
return f"{plate.text} {plate.country} {plate.state} {plate.category} {plate.confidence}% (text: {plate.text_confidence}%|state: {plate.plate_type_confidence}%)"
def format_mmr(mmr):
return f"{mmr.make} {mmr.model} ({mmr.category} {mmr.view_point} {mmr.color})"
def main():
if len(sys.argv) != 10:
print("Usage: python3 tollingvision-sample.py <service_url> <secured> <max_parallel_requests> <image_folder_path> <csv_file_path> <group_regex> <front_regex> <rear_regex> <overview_regex>")
sys.exit(1)
service_url = sys.argv[1]
secured = sys.argv[2].lower() == 'true'
max_parallel_requests = int(sys.argv[3])
image_folder_path = sys.argv[4]
csv_file_path = sys.argv[5]
group_regex = sys.argv[6]
front_regex = sys.argv[7]
rear_regex = sys.argv[8]
overview_regex = sys.argv[9]
if secured:
#os.environ["GRPC_DEFAULT_SSL_ROOTS_FILE_PATH"] = "/etc/ssl/certs/ca-certificates.crt"
channel_credentials = grpc.ssl_channel_credentials()
channel = grpc.secure_channel(service_url, channel_credentials)
else:
channel = grpc.insecure_channel(service_url)
stub = TollingVisionServiceStub(channel)
image_files = list_files_recursively(image_folder_path)
grouped_images = group_images(image_files, group_regex)
print("Total analyze service calls:", len(grouped_images))
with open(csv_file_path, 'w', newline='') as csvfile:
csv_writer = csv.writer(csvfile)
csv_writer.writerow(["Front Image", "Rear Image", "Overview Image", "Node", "Front Plate", "Front Plate Alternative", "Rear Plate", "Rear Plate Alternative", "MMR", "MMR Alternative"])
def analyze_group(group, files):
print("Processing group:", group)
event_request = create_event_request(files, front_regex, rear_regex, overview_regex)
if event_request is None:
return
responses = stub.analyze(event_request)
for response in responses:
if response.HasField('event_result'):
result = response.event_result
overview_files_list = [f for f in files if re.match(overview_regex, os.path.basename(f))]
front_files_list = [f for f in files if re.match(front_regex, os.path.basename(f)) and f not in overview_files_list]
rear_files_list = [f for f in files if re.match(rear_regex, os.path.basename(f)) and f not in overview_files_list]
front_files = "|".join(front_files_list)
rear_files = "|".join(rear_files_list)
overview_files = "|".join(overview_files_list)
front_plate = format_plate(result.front_plate) if result.HasField('front_plate') else ""
front_plate_alt = "|".join(format_plate(p) for p in result.front_plate_alternative)
rear_plate = format_plate(result.rear_plate) if result.HasField('rear_plate') else ""
rear_plate_alt = "|".join(format_plate(p) for p in result.rear_plate_alternative)
mmr = format_mmr(result.mmr) if result.HasField('mmr') else ""
mmr_alt = "|".join(format_mmr(m) for m in result.mmr_alternative)
csv_writer.writerow([front_files, rear_files, overview_files, result.node, front_plate, front_plate_alt, rear_plate, rear_plate_alt, mmr, mmr_alt])
with futures.ThreadPoolExecutor(max_workers=max_parallel_requests) as executor:
future_to_group = {executor.submit(analyze_group, group, files): group for group, files in grouped_images.items()}
for future in futures.as_completed(future_to_group):
group = future_to_group[future]
try:
future.result()
except Exception as e:
print(f"Group {group} generated an exception: {e}")
channel.close()
if __name__ == '__main__':
main()