forked from ridouaneg/DeepFootballAnalysis
-
Notifications
You must be signed in to change notification settings - Fork 0
/
benchmark_detection.py
190 lines (150 loc) · 5.5 KB
/
benchmark_detection.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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
# Compare detection methods thanks to metrics and a dev set
import utils
import numpy as np
import os
import detection_yolo as yolo
import matplotlib.pyplot as plt
import time
# get predictions from the detection method
def predictions(image_path, detection_method="yolo"):
bndbx_detected = []
if detection_method=="yolo":
bndbx_detected = yolo.detection_yolo(image_path)
elif detection_method=="rcnn":
bndbx_detected = yolo.detection_rcnn(image_path)
elif detection_method=="kmeans":
print(" ")
else:
print("The detection method doesn't exist.")
return bndbx_detected
def mean(l):
n = len(l)
if n == 0:
res = 0
else:
sum = 0
for i in range(n):
sum += l[i]
res = sum / n
return res
def AP_compl(recalls, r):
# retourne le premier indice de recalls tq la valeur soit >= r
ind = 0
while recalls[ind] < r:
ind += 1
return ind
def IoU(bndbx_d, bndbx_l):
xmin1, ymin1, xmax1, ymax1 = bndbx_d
label, xmin2, ymin2, xmax2, ymax2 = bndbx_l
xA = max(xmin1, xmin2)
yA = max(ymin1, ymin2)
xB = min(xmax1, xmax2)
yB = min(ymax1, ymax2)
intersection = max(0, xB - xA + 1) * max(0, yB - yA + 1)
aire1 = (xmax1 - xmin1 + 1) * (ymax1 - ymin1 + 1)
aire2 = (xmax2 - xmin2 + 1) * (ymax2 - ymin2 + 1)
union = aire1 + aire2 - intersection
eps = 10**(-8)
iou = intersection / (union + eps)
return iou
# calculate precision and recall
def precision_and_recall_top_k(bndbx_truth, bndbx_detected, IoU_min, k):
# ATTENTION : bndbx_detected = [ [(x1, y1, x2, y2), probability] , ...]
# ATTENTION : precision and recall needs to be calculated on top K predictions
# classed by probability
# ATTENTION : we need to remove double detection
bndbx_detected = bndbx_detected[0:k]
n_T = len(bndbx_truth)
n_P = k
n_TP = 0
n_FP = 0
for i in range(n_P):
l_tmp = [IoU(bndbx_detected[i][0], bndbx_truth[j][0]) for j in range(n_T)]
if (max(l_tmp) >= IoU_min):
n_TP += 1
else:
n_FP += 1
precision = n_TP / n_P
recall = n_TP / n_T
return precision, recall
def precision_and_recall_list(bndbx_truth, bndbx_detected, IoU_min):
precisions = []
recalls = []
for k in range(1, len(bndbx_detected)):
precision, recall = precision_and_recall_top_k(bndbx_truth, bndbx_detected, IoU_min, k)
precisions.append(precision)
recalls.append(recall)
precisions.append(0)
recalls.append(1)
return precisions, recalls
def AP(bndbx_truth, bndbx_detected, IoU_min):
precisions, recalls = precision_and_recall_list(bndbx_truth, bndbx_detected, IoU_min)
tmp = [0.1*i for i in range(11)]
sum = 0
try:
i_tmp = recalls.index(1) + 1
except ValueError:
i_tmp = len(precisions) + 1
precisions = precisions[:i_tmp]
recalls = recalls[:i_tmp]
print('Precisions | Recalls')
print('--------------------')
for j in range(len(precisions)):
print("%.2f" % precisions[j], ' | ', "%.2f" % recalls[j])
#plt.plot(recalls, precisions)
#plt.show()
for r in tmp:
# ind = AP_compl(recalls, r) # premier indice de recalls tq la valeur soit >= r
sum += max(precisions[AP_compl(recalls, r):])
AP = (1 / 11) * sum
return AP
def mAP(path_test_repo_images, path_test_repo_labels, detection_method="yolo", IoU_min = 0.50):
"""
Given two directories (images and associated labels) and a detection method,
return de Mean Average Precision for this method on the given datas.
Attention : datas must be sorted in alphabetical order !
"""
image_filenames = []
label_filenames = []
for image_filename in os.listdir('images'):
image_filenames.append('images' + '/' + image_filename)
for label_filename in os.listdir('labels'):
label_filenames.append('labels' + '/' + label_filename)
image_filenames = sorted(image_filenames)
label_filenames = sorted(label_filenames)
APs = []
print('')
print('mAP evaluation on the images of the test repository "images"')
print('Configuration :')
print('.............. IoU minimum : ', IoU_min)
print('.............. Detection method : ', detection_method)
debut = time.clock()
for image_filename, label_filename in zip(image_filenames, label_filenames):
print('')
print('Image name : ' + image_filename)
print('Processing..........')
bndbx_truth = utils.read_label(label_filename)
bndbx_detected = predictions(image_filename, detection_method)
print('Number of labelled objects : ', len(bndbx_truth))
print('Number of detected objects : ', len(bndbx_detected))
ap = AP(bndbx_truth, bndbx_detected, IoU_min)
APs.append(ap)
print('Average Precision (AP) : ', "%.2f" % ap)
print('..........Finished')
mAP = mean(APs)
fin = time.clock()
print('')
print('Mean Average Precision (mAP) : ', "%.2f" % mAP)
print('Execution time : ', "%.2f" % (fin - debut), ' secondes')
print('')
return mAP
# given a frame and its labels :
# path_image, path_label
#path_image = "images/fifa_test_frame100.jpg"
#path_label = "labels/fifa_test_frame100.xml"
#img = utils.read_image(path_image)
#bndbx_truth = utils.read_label(path_label)
#bndbx_detected = predictions(path_image)
#bndbx_detected = bndbx_truth
#precision, recall = precision_and_recall(bndbx_truth, bndbx_detected, 0.50)
#print(precision, recall)