长沙哪里有做网站的公司,自己给别人做网站挣钱吗,wordpress使用手机号登录,提高搜索引擎排名Pycocotools介绍
为使用户更好地使用 COCO数据集, COCO 提供了各种 API。COCO是一个大型的图像数据集#xff0c;用于目标检测、分割、人的关键点检测、素材分割和标题生成。这个包提供了Matlab、Python和luaapi#xff0c;这些api有助于在COCO中加载、解析和可视化注释。
…Pycocotools介绍
为使用户更好地使用 COCO数据集, COCO 提供了各种 API。COCO是一个大型的图像数据集用于目标检测、分割、人的关键点检测、素材分割和标题生成。这个包提供了Matlab、Python和luaapi这些api有助于在COCO中加载、解析和可视化注释。
coco api地址: https://github.com/cocodataset/cocoapi
安装pycocotools 两种方式都可以试试
# for linux and windows
pip install pycocotools
# for windows
pip install githttps://github.com/philferriere/cocoapi.git#subdirectoryPythonAPIpython-pycocotools
核心文件 coco.py cocoeval.py mask.py 这三个文件
coco.py
该文件定义了以下 API:
#这个文件实现了访问 COCO 数据集的接口.可以进行 COCO 标注信息的加载, 解析和可视化操作.
class COCO: # 用于加载 COCO 标注文件并准备所需的数据结构.def createIndex() #创建索引def info() #打印标注文件信息def getAnnIds() #获取满足条件的标注信息ids def Catids() #获取满足条件的类别idsdef getImgids() #获取满足条件的图片的 idsdef loadAnns() #加载指定 ids 对应的标注信息def loadCats() #加载指定 ids 对应的类别def loadImgs() #加载指定 ids 对应的图片def showAnns() #打印制定标注信息def loadRes() #加载算法的结果并创建可用于访问数据的 API def annToMask() #将 segmentation 标注信息转换为二值 maskdef download() #下载图像def loadNumpyAnnotations() #加载numpy格式数据def annToRLE() # polygons格式转换在给定的 API 中, “ann”annotation, “cat”category, and “img”image
COCO 类的构造函数负责加载 json 文件, 并将其中的标注信息建立关联关系.
关联关系存在于以下两个变量中:
imgToAnns: 将图片 id 和标注信息 关联;catToImgs: 将类别 id 和图片 id 关联.
这样做的好处就是: 对于给定的图片 id, 就可以快速找到其所有的标注信息; 对于给定的类别 id, 就可以快速找到属于该类的所有图片.
class COCO:def __init__(self, annotation_fileNone):构造函数, 用来读取关联标注信息.:param annotation_file (str): 标注文件路径名:return:# 加载数据集# 定义数据成员self.dataset, self.anns, self.cats, self.imgs dict(),dict(),dict(),dict()self.imgToAnns, self.catToImgs defaultdict(list), defaultdict(list)# 加载标注信息if not annotation_file None:print(loading annotations into memory...)tic time.time()dataset json.load(open(annotation_file, r))# dataset 的类型为 dictassert type(dataset)dict, annotation file format {} not supported.format(type(dataset))print(Done (t{:0.2f}s).format(time.time()- tic))self.dataset datasetself.createIndex()def createIndex(self):创建索引, 属于构造函数的一部分. # create indexprint(creating index...)anns, cats, imgs {}, {}, {}# imgToAnns: 将图片 id 和标注信息 关联; 给定图片 id, 就可以找到其所有的标注信息# catToImgs: 将类别 id 和图片 id 关联; 给定类别 id, 就可以找到属于这类的所有图片imgToAnns,catToImgs defaultdict(list),defaultdict(list)if annotations in self.dataset:for ann in self.dataset[annotations]:imgToAnns[ann[image_id]].append(ann)anns[ann[id]] annif images in self.dataset:for img in self.dataset[images]:imgs[img[id]] imgif categories in self.dataset:for cat in self.dataset[categories]:cats[cat[id]] catif annotations in self.dataset and categories in self.dataset:for ann in self.dataset[annotations]:catToImgs[ann[category_id]].append(ann[image_id])print(index created!!!)# 给几个类成员赋值self.anns annsself.imgs imgsself.cats catsself.imgToAnns imgToAnnsself.catToImgs catToImgs理解数据关联关系的重点是对 imgToAnns 变量类型的理解. 其中, imgToAnns 的类型为: defaultdict(class ‘list’). dict 中的键为 id, 值为一个 list, 包含所有的属于这张图的标注信息. 其中 list 的成员类型为字典, 其元素是 “annotations” 域内的一条(或多条)标注信息.
{ 289343: [{id: 1768, area: 702.1057499999998, segmentation: [[510.66, ... 510.45, 423.01]], bbox: [473.07, 395.93, 38.65, 28.67], category_id: 18, iscrowd: 0, image_id: 289343},...]
}getAnnIds() - 获取标注信息的 ids def getAnnIds(self, imgIds[], catIds[], areaRng[], iscrowdNone):获取满足给定条件的标注信息 id. 如果未指定条件, 则返回整个数据集上的标注信息 id:param imgIds (int 数组) : 通过图片 ids 指定catIds (int 数组) : 通过类别 ids 指定areaRng (float 数组) : 通过面积大小的范围, 2 个元素. (e.g. [0 inf]) 指定iscrowd (boolean) : get anns for given crowd label (False or True):return: ids (int 数组) : 满足条件的标注信息的 idsimgIds imgIds if _isArrayLike(imgIds) else [imgIds]catIds catIds if _isArrayLike(catIds) else [catIds]if len(imgIds) len(catIds) len(areaRng) 0:anns self.dataset[annotations]else:if not len(imgIds) 0:lists [self.imgToAnns[imgId] for imgId in imgIds if imgId in self.imgToAnns]anns list(itertools.chain.from_iterable(lists))else:anns self.dataset[annotations]anns anns if len(catIds) 0 else [ann for ann in anns if ann[category_id] in catIds]anns anns if len(areaRng) 0 else [ann for ann in anns if ann[area] areaRng[0] and ann[area] areaRng[1]]if not iscrowd None:ids [ann[id] for ann in anns if ann[iscrowd] iscrowd]else:ids [ann[id] for ann in anns]return idsshowAnns() - 显示给定的标注信息
def showAnns(self, anns):显示给定的标注信息. 一般在这个函数调用之前, 已经调用过图像显示函数: plt.imshow() :param anns (object 数组): 要显示的标注信息:return: Noneif len(anns) 0:return 0if segmentation in anns[0] or keypoints in anns[0]:datasetType instanceselif caption in anns[0]:datasetType captionselse:raise Exception(datasetType not supported)# 目标检测的标注数据if datasetType instances:ax plt.gca()ax.set_autoscale_on(False)polygons []color []for ann in anns:# 为每个标注 mask 生成一个随机颜色c (np.random.random((1, 3))*0.60.4).tolist()[0]# 边界 mask 标注信息if segmentation in ann:if type(ann[segmentation]) list:# polygonfor seg in ann[segmentation]:# 每个点是多边形的角点, 用 (x, y) 表示poly np.array(seg).reshape((int(len(seg)/2), 2))polygons.append(Polygon(poly))color.append(c)else:# maskt self.imgs[ann[image_id]]if type(ann[segmentation][counts]) list:rle maskUtils.frPyObjects([ann[segmentation]], t[height], t[width])else:rle [ann[segmentation]]m maskUtils.decode(rle)img np.ones( (m.shape[0], m.shape[1], 3) )if ann[iscrowd] 1:color_mask np.array([2.0,166.0,101.0])/255if ann[iscrowd] 0:color_mask np.random.random((1, 3)).tolist()[0]for i in range(3):img[:,:,i] color_mask[i]ax.imshow(np.dstack( (img, m*0.5) ))# 人体关节点 keypoints 标注信息if keypoints in ann and type(ann[keypoints]) list:# turn skeleton into zero-based indexsks np.array(self.loadCats(ann[category_id])[0][skeleton])-1kp np.array(ann[keypoints])x kp[0::3]y kp[1::3]v kp[2::3]for sk in sks:if np.all(v[sk]0):plt.plot(x[sk],y[sk], linewidth3, colorc)plt.plot(x[v0], y[v0],o,markersize8, markerfacecolorc, markeredgecolork,markeredgewidth2)plt.plot(x[v1], y[v1],o,markersize8, markerfacecolorc, markeredgecolorc, markeredgewidth2)p PatchCollection(polygons, facecolorcolor, linewidths0, alpha0.4)ax.add_collection(p)p PatchCollection(polygons, facecolornone, edgecolorscolor, linewidths2)ax.add_collection(p)elif datasetType captions:for ann in anns:print(ann[caption])读取数据进行可视化
from pycocotools.coco import COCO
import numpy as np
from skimage import io # scikit-learn 包
import matplotlib.pyplot as plt
import pylab
pylab.rcParams[figure.figsize] (8.0, 10.0)#COCO 是一个类, 因此, 使用构造函数创建一个 COCO 对象, 构造函数首先会加载 json 文件,
# 然后解析图片和标注信息的 id, 根据 id 来创建其关联关系.dataDirF:/Dataset/COCO/val2017/val2017
dataTypeval2017
annFileF:/Dataset/COCO/val2017/stuff_annotations_trainval2017/stuff_{}.json.format(dataType)
# 初始化标注数据的 COCO api
cocoCOCO(annFile)
print(数据加载成功)#显示 COCO 数据集中的具体类和超类
cats coco.loadCats(coco.getCatIds())
nms [cat[name] for cat in cats]
print(COCO categories: \n{}\n.format( .join(nms)))
print(类别总数为 %d % len(nms))
nms set([cat[supercategory] for cat in cats])
print(COCO supercategories: \n{}.format( .join(nms)))
print(超类总数为%d % len(nms))#加载并显示指定 图片 id
catIds coco.getCatIds(catNms[person,dog,skateboard]);
imgIds coco.getImgIds(catIdscatIds );
imgIds coco.getImgIds(imgIds [324158])
img coco.loadImgs(imgIds[np.random.randint(0,len(imgIds))])[0]
I io.imread(img[coco_url])
plt.axis(off)
plt.imshow(I)
plt.show()#加载并将 “segmentation” 标注信息显示在图片上
# 加载并显示标注信息
plt.imshow(I)
plt.axis(off)
annIds coco.getAnnIds(imgIdsimg[id], catIdscatIds, iscrowdNone)
anns coco.loadAnns(annIds)
coco.showAnns(anns)mAP计算
mAP是目标检测中常用的评价标准尤其是在COCO数据集中可以看到不同的mAP的评价指标本文对这一系列指标做详细的解读
首先要引入四个概念
TPTrue positive: IOU0.5的检测框个数注意每个GT box只能计算一次TNTrue negative) : IOU 0.5没有被检测到GT也没有标注的数量。也就是本来是负样例分类也是负样例。本文map计算没有用到该指标。FPFalse positive: IOU 0.5的检测框的个数或是检测到同一个GT box的多余检测框的数量FNFalse negative没有检测到的GT box的数量 举个例子上图有两只猫绿色的框分别代表两个GT box真实框红色的代表预测框。比较大的红框因为大于0.5的IOU阈值所以是TP比较小的红框因为值小于0.5所以是FP。另外右下角的小猫没有被检测到属于漏检也就是FN。
注意【图中的0.9和0.3代表类别的置信度不是IOU】如果不理解IOU的话可以移步至《IOU、GIOU、DIOU、CIOU损失函数详解》有详细描述
再来介绍两个评价指标
1.Precision(查准率)TP/(TP FP)代表模型预测的所有目标中预测正确目标的占比。 如图一张图有5只猫但是我们只有一个阈值大于0.5的红框也就是TP 1因为没有其他阈值小于0.5的框所以FP0. Pricision 1 /(10) 1 也就是100%查准率。但是能说这个网络的效果很好吗显然不能因为其他四只猫都没有被识别出来因此就引入了查全率。
Recall(查全率): TP/(TPFN)代表所有真实目标中模型预测正确目标的比例。 我们再看这张图图中有5只猫但是有很多红色框框出现在图中。首先看TP5个GT box都有红框正确预测到虽然IOU0.5的红框不止一个但每个GT box只算一次再看FN图中没有漏检的物体所以FP 0 。Recall 5/(50) 1 也就是100%的查全率但图中乱七八糟的杂框显然效果不好简单通过Recall率来评价检测质量也不合理。
所以我们又引入了两个指标
AP precision - Recall 曲线的面积mAP各类别AP的平均值
举一个例子具体算IOU和mAP 如上图有两只猫每只猫分别有一个绿色的GT box两个红色的box代表预测框。因为有两个目标所以设置num_obj 2。接下来我们用表格描述图中预测框的信息表格有两行数据按照第二列类别置信度0.98和0.61降序排序第一列代表属于哪个实例第三列代表IOU是否大于0.5注意哦不是图片里面的0.98和0.61的置信度这里用的是IOU评价指标如果你不清楚的话不妨花点时间看一下《IOU、GIOU、DIOU、CIOU损失函数详解》。 接下来我们再输入一张图片包括一个目标所以num_obj21 3图中又包含两个红色预测框我们把它按照类别置信度排序继续加入表格 图中两个预测框都属于第三个实例所以GT ID3中间红框的IOU0.5所以为True右边的红框IOU小于0.5所以是False。 我们输入第三张图片图片中包括四个绿色的GT box框ID分别为4~7)有三个红色的预测框其中id为5的猫猫没有对应的预测框。 最左边的红框类别置信度(0.52)最低加入表格的最后一行。ID为6和7的猫猫对应预测框也分别加入表格中。因为这三个框IOU都大于0.5所以都设置为True 我们从以下几种不同的指标方法同VOC2010分别计算Precision和Recall 1.假设confidence 0.9才算正确匹配观察表格只有第一行满足匹配条件因此TP 1 FP 0根据匹配条件只检测到一个图片而且是正确的所以不存在误检FN67个目标找出来1个漏检6个。 Precision 1 / (10) 1Recall 1 /(1 6) 0.14 。 2.假设conficende 0.89算是正确匹配观察表格前两行满足条件TP2 FP0, FN5, Precision 2/(20) 1。 Recall 2 / (25) 0.28。 以此类推假设confidence 0.5是正确匹配所有的行都满足条件此时TP 5 FP 2FN 2ID为2和5的猫漏检。Precision 5/(52) 0.71。 Recall 5 / 52 0.71。 将上述的步骤计算出的Precision和Recall列成上表所示。对于横坐标Recall而言需要滤除重复信息也就是对下图的0.57的Recall有三行只保留Precision最大的一行其他两行不计算。 将上图的5个点绘图图中的阴影部分的面积就是上面说的AP。具体计算如下AP(0.14-0)*1 (0.28-0.14)*1(0.42-0.28)*1 (0.57-0.42)*1 (0.71-0.57)*0.71 0.67。所以猫这个类别的AP就是0.67同样把所有类别的AP值计算出来取平均我们就得到了mAP. 附precision和recall计算源码
# 计算每个类别的precision和recall
def calc_recall_precision(gt_list, pred_list): bin_gt np.array(gt_list, dtypenp.bool) # gt的标签如果包含该类别则类别为True否则为Falsearr_pred np.array(pred_list, dtypenp.float) # 预测类别的置信度p_list pred_listp_list.sort()recall_list []precision_list []threshold_list []for i in range(201): # 阈值从0到1以0.05为区间间隔计算每个区间的准召率score_base i * 0.005 # 当前阈值bin_pred arr_pred float(score_base) # 是否大于阈值tp np.sum(bin_pred bin_gt) # 大于阈值且是正确类别tn np.sum((~bin_pred) (~bin_gt)) fp np.sum(bin_pred (~bin_gt)) # 置信度大于阈值但预测类别错误fn np.sum((~bin_pred) (bin_gt)) # 是真实类别但置信度小于阈值没检测到p (tp 0.0) / (tp fp 0.000001) # precision tp /tp fp代表预测正确的类别占比。r (tp 0.0) / (tp fn 0.000001) # recall tp / (tp fn) 代表查全率if (tpfp)1 or (tpfn)1: continuerecall_list.append(r)precision_list.append(p)threshold_list.append(score_base)# reverse是反转列表对于recall来说是变成升序序列precision和threshold变成降序序列recall_list.reverse() # [0.28 0.30, 0.42, 0.46,.....]precision_list.reverse() # [0.99, 0.98, 0.96, ......]threshold_list.reverse() # [0.81, 0.80, 0.75, ......]return recall_list, precision_list, threshold_list# 计算所有类别的平均precision和recall
def cal_average_class_pr(pred, target): # 两个参数的shape[batch_size, num_classes]pre_sum, rec_sum, count 0,0,0 # 初始化precision和recall的值for i in range(len(target[0])): # 循环次数等价于类别个数pred_list pred[:, i]gt_list target[:, i]pred_list.tolist()gt_list.tolist()rec, prec, thresh calc_recall_precision(gt_list, pred_list)rec np.asarray(rec, dtypenp.float32)prec np.asarray(prec, dtypenp.float32)thresh np.asarray(thresh, dtypenp.float32)idx np.where(rec0.8) # 查全率大于0.8的索引if len(idx[0].tolist())0:# 找到recall首次大于0.8的索引输出当前索引对应的reccall,precision,thresholdrec_v rec[idx[0][0]] prec_v prec[idx[0][0]]thresh_v thresh[idx[0][0]]print(Class: {}, prec: {:.4f}, rec: {:.4f}, thresh: {:.4}.format(i1, prec_v, rec_v, thresh_v))pre_sum pre_sum prec_vrec_sum rec_sum rec_vcount count 1return pre_sum/count, rec_sum/count COCO评价指标
API介绍 首先看第一部分的AP
AP代表 IOU从0.5到0.95间隔0.05计算一次mAP, 取平均mAP即为最终结果。
AP0.5和AP0.75则分别代表IOU为0.5和0.75的mAP值
第二部分 : AP Across Scales
代表小、中、大三个类别的mAP将面积小于322像素点的归为小目标面积大于962的归为大目标介于二者之间的为中等目标。计算不同目标的mAP。
第三部分AR
代表查全率。三组分别代表每张图片限定检测1、10、100个目标能够得到相应的Recall的值。
第四部分AR Across Scales
代表对应不同尺度的Recall值。
初步实现目标检测任务mAP计算
首先要弄清楚cocoapi指定的数据格式训练网络预测的结果在官网的Evaluate下拉框中选择Results Format可以看到每种任务的指定数据格式要求。 这里主要讲讲针对目标检测的格式。根据官方文档给的预测结果格式可以看到我们需要以列表的形式保存结果列表中的每个元素对应一个检测目标每个元素都是字典类型每个目标记录了四个信息
image_id记录该目标所属图像的idint类型category_id记录预测该目标的类别索引注意这里索引是对应stuff中91个类别的索引信息int类型bbox记录预测该目标的边界框信息注意对应目标的[xmin, ymin, width, height] (list[float]类型)score记录预测该目标的概率float类型
下图是训练在coco2017验证集上预测的结果 接着将预测结果保存成json文件后面需要使用到
import jsonresults [] # 所有预测的结果都保存在该list中
# write predict results into json file
json_str json.dumps(results, indent4)
with open(predict_results.json, w) as json_file:json_file.write(json_str)数据准备
COCO2017验证集json文件instances_val2017.json 链接: https://pan.baidu.com/s/1ArWe8Igt_q0iJG6FCcH8mg 密码: sa0j
示例代码
from pycocotools.coco import COCO
from pycocotools.cocoeval import COCOeval# accumulate predictions from all images
# 载入coco2017验证集标注文件
coco_true COCO(annotation_file/data/coco2017/annotations/instances_val2017.json)
# 载入网络在coco2017验证集上预测的结果
coco_pre coco_true.loadRes(predict_results.json)coco_evaluator COCOeval(cocoGtcoco_true, cocoDtcoco_pre, iouTypebbox)
coco_evaluator.evaluate()
coco_evaluator.accumulate()
coco_evaluator.summarize()输出结果
loading annotations into memory...
Done (t0.43s)
creating index...
index created!
Loading and preparing results...
DONE (t0.65s)
creating index...
index created!
Running per image evaluation...
Evaluate annotation type *bbox*
DONE (t21.15s).
Accumulating evaluation results...
DONE (t2.88s).Average Precision (AP) [ IoU0.50:0.95 | area all | maxDets100 ] 0.233Average Precision (AP) [ IoU0.50 | area all | maxDets100 ] 0.415Average Precision (AP) [ IoU0.75 | area all | maxDets100 ] 0.233Average Precision (AP) [ IoU0.50:0.95 | area small | maxDets100 ] 0.104Average Precision (AP) [ IoU0.50:0.95 | areamedium | maxDets100 ] 0.262Average Precision (AP) [ IoU0.50:0.95 | area large | maxDets100 ] 0.323Average Recall (AR) [ IoU0.50:0.95 | area all | maxDets 1 ] 0.216Average Recall (AR) [ IoU0.50:0.95 | area all | maxDets 10 ] 0.319Average Recall (AR) [ IoU0.50:0.95 | area all | maxDets100 ] 0.327Average Recall (AR) [ IoU0.50:0.95 | area small | maxDets100 ] 0.145Average Recall (AR) [ IoU0.50:0.95 | areamedium | maxDets100 ] 0.361Average Recall (AR) [ IoU0.50:0.95 | area large | maxDets100 ] 0.463一个具体实现的例子
mAPMean Average Precision均值平均准确率即检测多个目标类别的平均准确率。在目标检测领域mAP是一个最为常用的指标。具体概念不叙述本文主要讲如何利用Github上一些开源项目计算自己网络的mAP值等信息。首先给出两个Github链接链接1链接2。这两个链接项目都可以帮助我们计算mAP的值用法也差不多链接1感觉用起来更简单点链接2的功能更全面点绘制的Precision-Recall曲线更准。本文主要介绍下链接项目1的使用方法利用项目1最终能得到如下图所示的计算结果虽然也能绘制P-R曲线但感觉绘制的不准确。 项目的使用流程
使用方法流程主要分为如下几步1 克隆项目代码2创建ground-truth文件并将文件复制到克隆项目的 input/ground-truth/ 文件夹中3创建detection-results文件并将文件复制到克隆项目的 input/detection-results/ 文件夹中4将与detection-results对应的验证图像文件放入克隆项目 input/images-optional 文件夹中该步骤为可选项可以不放入图像如果放入图像会将标注框、检测框都绘制在图像上方便后期分析结果5在项目文件夹中打开终端并执行指令python main.py即可得到结果结果全部保存在克隆项目的results文件夹中。
1克隆代码
打开项目1https://github.com/Cartucho/mAP进行克隆或者直接使用git克隆。
2创建ground-truth文件
在项目的readme中有给出事例
例如图像1中的标注信息image_1.txt文件的命名要与图像命名相同每一行的参数为类别名称、左上角x坐标、左上角y坐标、右下角x坐标、右下角y坐标
class_name left top right bottom [difficult]参数difficult是可选项每一个图像文件对应生成一个txt文件与PASCAL VOC的xml文件一样一一对应。
tvmonitor 2 10 173 238
book 439 157 556 241
book 437 246 518 351 difficult
pottedplant 272 190 316 259将所有生成好的文件复制到克隆项目的 input/ground-truth/ 文件夹中
3创建detection-results文件
同样在项目的readme中有给出事例
对于图像1的实际预测信息image_1.txt文件的命名要与图像命名相同每一行的参数为类别名称、预测概率、预测左上角x坐标、预测左上角y坐标、预测右下角x坐标、预测右下角y坐标
class_name confidence left top right bottom每个预测图像对应生成一个txt文件
tvmonitor 0.471781 0 13 174 244
cup 0.414941 274 226 301 265
book 0.460851 429 219 528 247
chair 0.292345 0 199 88 436
book 0.269833 433 260 506 336将所有生成好的预测文件复制到克隆项目的 input/detection-results/ 文件夹中
4复制图像文件可选
将与detection-results对应的验证图像文件放入克隆项目 input/images-optional 文件夹中该步骤为可选项可以不放入图像如果放入图像会将标注框、检测框都绘制在图像上方便后期分析结果
5开始计算
在项目文件夹中打开终端并执行指令python main.py即可得到结果结果全部保存在克隆项目的results文件夹中注该项目的计算结果是IOU阈值取0.5的结果
通过以上步骤就能够得到出训练网络的预测mAP使用起来也是非常的简单。对于需要绘制Precision-Recall曲线的同学可以使用**链接2**中的项目代码。项目2的使用步骤其实基本相同且需要准备的文件也都是一样的不同的是使用的指令。 cup 0.414941 274 226 301 265 book 0.460851 429 219 528 247 chair 0.292345 0 199 88 436 book 0.269833 433 260 506 336 将所有生成好的预测文件复制到克隆项目的 input/detection-results/ 文件夹中#### 4复制图像文件可选将与detection-results对应的验证图像文件放入克隆项目 input/images-optional 文件夹中该步骤为可选项可以不放入图像如果放入图像会将标注框、检测框都绘制在图像上方便后期分析结果#### 5开始计算在项目文件夹中打开终端并执行指令python main.py即可得到结果结果全部保存在克隆项目的results文件夹中**注该项目的计算结果是IOU阈值取0.5的结果**通过以上步骤就能够得到出训练网络的预测mAP使用起来也是非常的简单。对于需要绘制Precision-Recall曲线的同学可以使用**[链接2](https://github.com/rafaelpadilla/Object-Detection-Metrics)**中的项目代码。项目2的使用步骤其实基本相同且需要准备的文件也都是一样的不同的是使用的指令。