Accumulate per image evaluation results and store the result in self.eval :param p: input params for evaluation :return: None
(self, p = None)
| 308 | } |
| 309 | |
| 310 | def accumulate(self, p = None): |
| 311 | ''' |
| 312 | Accumulate per image evaluation results and store the result in self.eval |
| 313 | :param p: input params for evaluation |
| 314 | :return: None |
| 315 | ''' |
| 316 | print('Accumulating evaluation results...') |
| 317 | tic = time.time() |
| 318 | if not self.evalImgs: |
| 319 | print('Please run evaluate() first') |
| 320 | # allows input customized parameters |
| 321 | if p is None: |
| 322 | p = self.params |
| 323 | p.catIds = [-1] |
| 324 | T = len(p.iouThrs) |
| 325 | R = len(p.recThrs) |
| 326 | K = 1 |
| 327 | A = len(p.areaRng) |
| 328 | M = len(p.maxDets) |
| 329 | precision = -np.ones((T,R,K,A,M)) # -1 for the precision of absent categories |
| 330 | recall = -np.ones((T,K,A,M)) |
| 331 | scores = -np.ones((T,R,K,A,M)) |
| 332 | |
| 333 | # create dictionary for future indexing |
| 334 | _pe = self._paramsEval |
| 335 | catIds = [-1] |
| 336 | setK = set(catIds) |
| 337 | setA = set(map(tuple, _pe.areaRng)) |
| 338 | setM = set(_pe.maxDets) |
| 339 | setI = set(_pe.imgIds) |
| 340 | # get inds to evaluate |
| 341 | k_list = [n for n, k in enumerate(p.catIds) if k in setK] |
| 342 | # print(k_list, "KKK") |
| 343 | m_list = [m for n, m in enumerate(p.maxDets) if m in setM] |
| 344 | # print(m_list, "MM") |
| 345 | a_list = [n for n, a in enumerate(map(lambda x: tuple(x), p.areaRng)) if a in setA] |
| 346 | # print(a_list, "AA") |
| 347 | i_list = [n for n, i in enumerate(p.imgIds) if i in setI] |
| 348 | # print(i_list, "II") |
| 349 | I0 = len(_pe.imgIds) |
| 350 | # print(I0,"I)") |
| 351 | A0 = len(_pe.areaRng) |
| 352 | # print(A0, "A0") |
| 353 | # retrieve E at each category, area range, and max number of detections |
| 354 | for k, k0 in enumerate(k_list): |
| 355 | Nk = k0*A0*I0 |
| 356 | for a, a0 in enumerate(a_list): |
| 357 | Na = a0*I0 |
| 358 | for m, maxDet in enumerate(m_list): |
| 359 | E = [self.evalImgs[Nk + Na + i] for i in i_list] |
| 360 | E = [e for e in E if not e is None] |
| 361 | if len(E) == 0: |
| 362 | continue |
| 363 | dtScores = np.concatenate([e['dtScores'][0:maxDet] for e in E]) |
| 364 | |
| 365 | # different sorting method generates slightly different results. |
| 366 | # mergesort is used to be consistent as Matlab implementation. |
| 367 | inds = np.argsort(-dtScores, kind='mergesort') |