voc_eval.py 解析
来源:互联网 发布:收看地方电视台的软件 编辑:程序博客网 时间:2024/06/05 14:04
参考:https://github.com/rbgirshick/py-faster-rcnn/blob/master/lib/datasets/voc_eval.py
代码块
# --------------------------------------------------------# Fast/er R-CNN# Licensed under The MIT License [see LICENSE for details]# Written by Bharath Hariharan# --------------------------------------------------------import xml.etree.ElementTree as ET #读取xml。import osimport cPickle #序列化存储模块。import numpy as npdef parse_rec(filename):#解析读取xml函数。 """ Parse a PASCAL VOC xml file """ tree = ET.parse(filename) objects = [] for obj in tree.findall('object'): obj_struct = {} obj_struct['name'] = obj.find('name').text obj_struct['pose'] = obj.find('pose').text obj_struct['truncated'] = int(obj.find('truncated').text) obj_struct['difficult'] = int(obj.find('difficult').text) bbox = obj.find('bndbox') obj_struct['bbox'] = [int(bbox.find('xmin').text), int(bbox.find('ymin').text), int(bbox.find('xmax').text), int(bbox.find('ymax').text)] objects.append(obj_struct) return objectsdef voc_ap(rec, prec, use_07_metric=False): #单个测量AP的函数。 """ ap = voc_ap(rec, prec, [use_07_metric]) Compute VOC AP given precision and recall. If use_07_metric is true, uses the VOC 07 11 point method (default:False). """ if use_07_metric: # 11 point metric ap = 0. for t in np.arange(0., 1.1, 0.1): if np.sum(rec >= t) == 0: p = 0 else: p = np.max(prec[rec >= t]) ap = ap + p / 11. else: # correct AP calculation # first append sentinel values at the end mrec = np.concatenate(([0.], rec, [1.])) mpre = np.concatenate(([0.], prec, [0.])) # compute the precision envelope for i in range(mpre.size - 1, 0, -1): mpre[i - 1] = np.maximum(mpre[i - 1], mpre[i]) # to calculate area under PR curve, look for points # where X axis (recall) changes value i = np.where(mrec[1:] != mrec[:-1])[0] # and sum (\Delta recall) * prec ap = np.sum((mrec[i + 1] - mrec[i]) * mpre[i + 1]) return apdef voc_eval(detpath, ######主函数 annopath, imagesetfile, classname, cachedir, ovthresh=0.5, use_07_metric=False): """rec, prec, ap = voc_eval(detpath, annopath, imagesetfile, classname, [ovthresh], [use_07_metric]) Top level function that does the PASCAL VOC evaluation. detpath: Path to detections detpath.format(classname) should produce the detection results file. #产生的txt文件,里面是一张图片的各个detection。 annopath: Path to annotations annopath.format(imagename) should be the xml annotations file. #xml 文件与对应的图像相呼应。 imagesetfile: Text file containing the list of images, one image per line. #一个txt文件,里面是每个图片的地址,每行一个地址。 classname: Category name (duh) #种类的名字,即类别。 cachedir: Directory for caching the annotations #缓存标注的目录。 [ovthresh]: Overlap threshold (default = 0.5) #重叠的多少大小。 [use_07_metric]: Whether to use VOC07's 11 point AP computation (default False) #是否使用VOC07的11点AP计算。 """ # assumes detections are in detpath.format(classname) # assumes annotations are in annopath.format(imagename) # assumes imagesetfile is a text file with each line an image name # cachedir caches the annotations in a pickle file # first load gt 加载ground truth。 if not os.path.isdir(cachedir): os.mkdir(cachedir) cachefile = os.path.join(cachedir, 'annots.pkl') #即将新建文件的路径。 # read list of images with open(imagesetfile, 'r') as f: lines = f.readlines() #读取文本里的所以文本行,作为众多文图片的路径。 imagenames = [x.strip() for x in lines] #所有文件名字。 if not os.path.isfile(cachefile): #如果cachefile文件不存在,则 # load annots recs = {} for i, imagename in enumerate(imagenames): recs[imagename] = parse_rec(annopath.format(imagename)) #这里的format不知道啥意思 if i % 100 == 0: print 'Reading annotation for {:d}/{:d}'.format( i + 1, len(imagenames)) #进度条。 # save print 'Saving cached annotations to {:s}'.format(cachefile) with open(cachefile, 'w') as f: cPickle.dump(recs, f) #写入cPickle文件里面。写入的是一个字典,左侧为xml文件名,右侧为文件里面个各个参数。 else: # load with open(cachefile, 'r') as f: recs = cPickle.load(f) #如果已经有了这个cPickle文件,则加载一下。 # extract gt objects for this class #对每张图片的xml获取函数指定类的bbox等。 class_recs = {} npos = 0 for imagename in imagenames: R = [obj for obj in recs[imagename] if obj['name'] == classname] #获取每个文件中某种类别的物体。 bbox = np.array([x['bbox'] for x in R]) #抽取bbox difficult = np.array([x['difficult'] for x in R]).astype(np.bool) #different基本都为0. det = [False] * len(R) #list中形参len(R)个False。 npos = npos + sum(~difficult) #自增,sum求得的值基本都为0。 class_recs[imagename] = {'bbox': bbox, 'difficult': difficult, 'det': det} # read dets detfile = detpath.format(classname) with open(detfile, 'r') as f: lines = f.readlines() splitlines = [x.strip().split(' ') for x in lines] image_ids = [x[0] for x in splitlines] #图片index。 confidence = np.array([float(x[1]) for x in splitlines]) #类别置信度 BB = np.array([[float(z) for z in x[2:]] for x in splitlines]) #变为浮点型的bbox。 # sort by confidence sorted_ind = np.argsort(-confidence) #对confidence的index根据值大小进行降序排列。 sorted_scores = np.sort(-confidence) #降序排列。 BB = BB[sorted_ind, :] #重排bbox,由大概率到小概率。 image_ids = [image_ids[x] for x in sorted_ind] 对图片进行重排。 # go down dets and mark TPs and FPs nd = len(image_ids) tp = np.zeros(nd) fp = np.zeros(nd) #归零。 for d in range(nd): R = class_recs[image_ids[d]] 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 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. # compute precision recall fp = np.cumsum(fp) tp = np.cumsum(tp) rec = tp / float(npos) # 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
阅读全文
0 0
- voc_eval.py 解析
- py列表解析例子
- LogisticRegression.py 解析
- py解析xml
- Test.py文件解析
- create_pascal_tf_record.py 代码解析
- input_data.py解析
- Keystone controller.py & routers.py代码解析
- py-faster-rcnn demo.py解析
- py-faster-rcnn demo.py解析
- mlp.py解析(Multilayer Perceptron)
- Django源码解析:setting.py
- Faster-Rcnn demo.py解析
- 【深度学习:目标检测】 py-faster-rcnn demo.py解析
- python解析xml——generateDS.py
- Python模块安装与setup.py解析
- tensorflow0.10.0 ptb_word_lm.py 源码解析
- caffe实战之classify.py解析
- QT4 configure 学习备忘
- android常用布局
- java对日期的操作
- vue轮播图插件vue-awesome-swiper的引入及使用
- linux下的find文件查找命令与grep文件内容查找命令
- voc_eval.py 解析
- struts2中Action配置的默认值
- 03-JDBC操作java语言数据库
- docker Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon runn
- 内存地址与寻址
- 迭代器模式
- postMessage 跨文档消息传递
- POJ 2115(解线性同余方程)
- EditText光标不显示问题