(detpath, annopath, test_imgid_list, cls_name, ovthresh=0.5,
             use_07_metric=False, use_diff=False)
return rec, prec, ap
:param detpath:
  :param annopath:
  :param test_imgid_list: it 's a list that contains the img_name of test_imgs
  :param cls_name:
  :param ovthresh:
  :param use_07_metric:
  :param use_diff:
  :return:
def voc_eval(detpath, annopath, test_imgid_list, cls_name, ovthresh=0.5,
             use_07_metric=False, use_diff=False):
  '''

  :param detpath:
  :param annopath:
  :param test_imgid_list: it 's a list that contains the img_name of test_imgs
  :param cls_name:
  :param ovthresh:
  :param use_07_metric:
  :param use_diff:
  :return:
  '''
  # 1. parse xml to get gtboxes

  # read list of images
  imagenames = test_imgid_list

  recs = {}
  for i, imagename in enumerate(imagenames):
    recs[imagename] = parse_rec(os.path.join(annopath, imagename+'.xml'))
    # if i % 100 == 0:
    #   print('Reading annotation for {:d}/{:d}'.format(
    #     i + 1, len(imagenames)))

  # 2. get gtboxes for this class.
  class_recs = {}
  num_pos = 0
  # if cls_name == 'person':
  #   print ("aaa")
  for imagename in imagenames:
    R = [obj for obj in recs[imagename] if obj['name'] == cls_name]
    bbox = np.array([x['bbox'] for x in R])
    if use_diff:
      difficult = np.array([False for x in R]).astype(np.bool)
    else:
      difficult = np.array([x['difficult'] for x in R]).astype(np.bool)
    det = [False] * len(R)
    num_pos = num_pos + sum(~difficult)  # ignored the diffcult boxes
    class_recs[imagename] = {'bbox': bbox,
                             'difficult': difficult,
                             'det': det} # det means that gtboxes has already been detected

  # 3. read the detection file
  detfile = os.path.join(detpath, "det_"+cls_name+".txt")
  with open(detfile, 'r') as f:
    lines = f.readlines()

  # for a line. that is [img_name, confidence, xmin, ymin, xmax, ymax]
  splitlines = [x.strip().split(' ') for x in lines]  # a list that include a list
  image_ids = [x[0] for x in splitlines]  # img_id is img_name
  confidence = np.array([float(x[1]) for x in splitlines])
  BB = np.array([[float(z) for z in x[2:]] for x in splitlines])

  nd = len(image_ids) # num of detections. That, a line is a det_box.
  tp = np.zeros(nd)
  fp = np.zeros(nd)

  if BB.shape[0] > 0:
    # sort by confidence
    sorted_ind = np.argsort(-confidence)
    sorted_scores = np.sort(-confidence)
    BB = BB[sorted_ind, :]
    image_ids = [image_ids[x] for x in sorted_ind]  #reorder the img_name

    # go down dets and mark TPs and FPs
    for d in range(nd):
      R = class_recs[image_ids[d]]  # img_id is img_name
      bb = BB[d, :].astype(float)
      ovmax = -np.inf
      BBGT = R['bbox'].astype(float)

      if BBGT.size > 0:
        # compute overlaps
        # intersection
        # ixmin = np.maximum(BBGT[:, 0], bb[0])
        # iymin = np.maximum(BBGT[:, 1], bb[1])
        # ixmax = np.minimum(BBGT[:, 2], bb[2])
        # iymax = np.minimum(BBGT[:, 3], bb[3])
        # iw = np.maximum(ixmax - ixmin + 1., 0.)
        # ih = np.maximum(iymax - iymin + 1., 0.)
        # inters = iw * ih
        #
        # # union
        # uni = ((bb[2] - bb[0] + 1.) * (bb[3] - bb[1] + 1.) +
        #        (BBGT[:, 2] - BBGT[:, 0] + 1.) *
        #        (BBGT[:, 3] - BBGT[:, 1] + 1.) - inters)
        #
        # overlaps = inters / uni
        overlaps = []
        for i in range(len(BBGT)):
          overlap = iou_rotate.iou_rotate_calculate1(np.array([bb]),
                                                      BBGT[i],
                                                      use_gpu=False)[0]
          overlaps.append(overlap)
        ovmax = np.max(overlaps)
        jmax = np.argmax(overlaps)

      if ovmax > ovthresh:
        if not R['difficult'][jmax]:
          if not R['det'][jmax]:
            tp[d] = 1.
            R['det'][jmax] = 1
          else:
            fp[d] = 1.
      else:
        fp[d] = 1.

  # 4. get recall, precison and AP
  fp = np.cumsum(fp)
  tp = np.cumsum(tp)
  rec = tp / float(num_pos)
  # avoid divide by zero in case the first detection matches a difficult
  # ground truth
  prec = tp / np.maximum(tp + fp, np.finfo(np.float64).eps)
  ap = voc_ap(rec, prec, use_07_metric)

  return rec, prec, ap
def voc_eval ( detpath , annopath , test_imgid_list , cls_name , ovthresh = 0.5 , use_07_metric = False , use_diff = False ) : # 1. parse xml to get gtboxes # read list of images imagenames = test_imgid_list recs = { } for i , imagename in enumerate ( imagenames ) : recs [ imagename ] = parse_rec ( os . path . join ( annopath , imagename + '.xml' ) ) # if i % 100 == 0: #   print('Reading annotation for {:d}/{:d}'.format( #     i + 1, len(imagenames))) # 2. get gtboxes for this class. class_recs = { } num_pos = 0 # if cls_name == 'person': #   print ("aaa") for imagename in imagenames : R = [ obj for obj in recs [ imagename ] if obj [ 'name' ] == cls_name ] bbox = np . array ( [ x [ 'bbox' ] for x in R ] ) if use_diff : difficult = np . array ( [ False for x in R ] ) . astype ( np . bool ) else : difficult = np . array ( [ x [ 'difficult' ] for x in R ] ) . astype ( np . bool ) det = [ False ] * len ( R ) num_pos = num_pos + sum ( ~ difficult ) # ignored the diffcult boxes class_recs [ imagename ] = { 'bbox' : bbox , 'difficult' : difficult , 'det' : det } # det means that gtboxes has already been detected # 3. read the detection file detfile = os . path . join ( detpath , "det_" + cls_name + ".txt" ) with open ( detfile , 'r' ) as f : lines = f . readlines ( ) # for a line. that is [img_name, confidence, xmin, ymin, xmax, ymax] splitlines = [ x . strip ( ) . split ( ' ' ) for x in lines ] # a list that include a list image_ids = [ x [ 0 ] for x in splitlines ] # img_id is img_name confidence = np . array ( [ float ( x [ 1 ] ) for x in splitlines ] ) BB = np . array ( [ [ float ( z ) for z in x [ 2 : ] ] for x in splitlines ] ) nd = len ( image_ids ) # num of detections. That, a line is a det_box. tp = np . zeros ( nd ) fp = np . zeros ( nd ) if BB . shape [ 0 ] > 0 : # sort by confidence sorted_ind = np . argsort ( - confidence ) sorted_scores = np . sort ( - confidence ) BB = BB [ sorted_ind , : ] image_ids = [ image_ids [ x ] for x in sorted_ind ] #reorder the img_name # go down dets and mark TPs and FPs for d in range ( nd ) : R = class_recs [ image_ids [ d ] ] # img_id is img_name bb = BB [ d , : ] . astype ( float ) ovmax = - np . inf BBGT = R [ 'bbox' ] . astype ( float ) if BBGT . size > 0 : # compute overlaps # intersection # ixmin = np.maximum(BBGT[:, 0], bb[0]) # iymin = np.maximum(BBGT[:, 1], bb[1]) # ixmax = np.minimum(BBGT[:, 2], bb[2]) # iymax = np.minimum(BBGT[:, 3], bb[3]) # iw = np.maximum(ixmax - ixmin + 1., 0.) # ih = np.maximum(iymax - iymin + 1., 0.) # inters = iw * ih # # # union # uni = ((bb[2] - bb[0] + 1.) * (bb[3] - bb[1] + 1.) + #        (BBGT[:, 2] - BBGT[:, 0] + 1.) * #        (BBGT[:, 3] - BBGT[:, 1] + 1.) - inters) # # overlaps = inters / uni overlaps = [ ] for i in range ( len ( BBGT ) ) : overlap = iou_rotate . iou_rotate_calculate1 ( np . array ( [ bb ] ) , BBGT [ i ] , use_gpu = False ) [ 0 ] overlaps . append ( overlap ) ovmax = np . max ( overlaps ) jmax = np . argmax ( overlaps ) if ovmax > ovthresh : if not R [ 'difficult' ] [ jmax ] : if not R [ 'det' ] [ jmax ] : tp [ d ] = 1. R [ 'det' ] [ jmax ] = 1 else : fp [ d ] = 1. else : fp [ d ] = 1. # 4. get recall, precison and AP fp = np . cumsum ( fp ) tp = np . cumsum ( tp ) rec = tp / float ( num_pos ) # avoid divide by zero in case the first detection matches a difficult # ground truth prec = tp / np . maximum ( tp + fp , np . finfo ( np . float64 ) . eps ) ap = voc_ap ( rec , prec , use_07_metric ) return rec , prec , ap