faster rcnn网络结构,fastrcnn网络模型
本文介绍了基于pytorch1.0的fast-rcnn源代码。单击以获取源代码。
当fast-rcnn训练完成后,我们需要评估训练结果的检测能力。此时,使用evaluate_detections函数。其调用方式如下:
Print(评估检测)IMDB . evaluate _ detections(all _ boxes,output _ dir)evaluate_detections函数的输入参数:all_boxes:存储所有检测的结果。二维数组(21*4952,即类别数*图片数)的每个位置表示图片中类别的检测目标位置和置信度。如下图所示:01号类别在0000号图片中检测到两个属于该类别的目标,前四列表示目标左上角和右下角的坐标,最后一列表示目标的置信度。(如果没有检测到目标,则为空)
Output_dir:文件保存路径evaluate_detections函数的调用:imdb是combined_roidb函数内部get_imdb函数的返回值。get_imdb函数如下:
def get_imdb(name): 按名称获取imdb(图像数据库)。如果名称不在__sets中:引发KeyError(未知数据集:{} )。format(name))Return __sets[name]()其中_ _ sets是一个字典,字典的键是数据集的名称,字典的值是一个lambda表达式(即函数指针)。该字典在factory.py文件中创建,并根据数据集名称进行分配,如以下代码所示:
_ _ sets={ } from datasets . Pascal _ VOC import Pascal _ VOC # Set VOC _ year _ split for year in[ 2007 , 2012]: for split in [train , val , trainval ,Test]: name= VOC _ {} _ {} 。Format (year,split)__sets[name]=(lambda split=split,year=year: Pascal _ VOC (split,year))执行上述代码后,_ _ sets字典被赋值为
{voc_2007_train :函数lambda在0x7f2ad449bf28, voc_2007_val :函数lambda在0x7f2a85348f28, voc_2007_trainval :函数lambda在0x7f2a85353a60, voc_2007_test :函数lambda在0x7f2a85353ae8, voc_2012_train :函数lambda在0x7f2a85353b70, VOC _ VOCPascal_voc是一个类,即调用该类的构造函数,返回该类的一个实例。所以imdb实际上就是pascal_voc的一个实例。
00-evaluate_detections函数的内容:evaluate _ detections函数被imdb类的多个子类覆盖。从上面的介绍可以看出,我们这里所说的是在pascal_voc类中实现的函数。具体代码如下:
def evaluate_detections(self,all _ boxes,output_dir): self。_ write _ VOC _ results _ file(all _ box)self。_ do _ python _ eval(output _ dir)if self . config[ MATLAB _ eval ]:self。_ do _ MATLAB _ eval(output _ dir)if self . config[ clean up ]:用于self中的cls。_ classes:if cls== _ _ background _ _ :continue filename=self。_get_voc_results_file_template()。format(cls) os.remove(文件名)
_write_voc_results_file函数:在 ~/data/VOC dev kit 2007/results/VOC 2007/main 目录下,为每个类别生成一个文本文件,存储属于该类别的每张图片中检测到的目标的置信度和位置信息。比如“飞机”对应的结果文件名叫做:COMP4 _ DET _测试_飞机. txt,信息以图片编号、置信度、位置信息的格式保存。
def _ write _ VOC _ results _ file(self,all _ box):for cls _ ind,cls in enumerate(self。classes):如果cls== _ _ background _ _ :继续打印(写入{} VOC结果文件)。格式(cls))文件名=自身get_voc_results_file_template().format(cls) with open(filename, wt) as f: for im_ind,index in enumerate(self。image _ index):dets=all _ boxes[cls _ ind][im _ ind]if dets==[]:continue # VOCdevkit需要xrange(dets.shape[0])中k的从一开始的索引:f . write( {:s } {:3f } {:1f } {:1f } {:1f } {:1f } {:1f } {:1f } \ n .格式(index,dets[k,-1],dets[k,0] 1,dets[k,1] 1,dets[k,2] 1,dets[k,3] 1)
_do_python_eval函数:根据上面的结果文件,对不同类别的结果进行评估,写入输出文件。
其中voc_eval是主要函数,其参数如下:
filename:_ write _ VOC _ results _ file得到的不同类别对应的文件annopath:地面实况的可扩展标记语言文件,记录了该图片中存在的目标类别及位置等信息。imagesetfile:测试的图像列表,即所有图片的编号。cls:类别cachedir:根据图像集文件图片名解析annopath-xml文件得到的文件,文件格式是每个图像名对应图像中的盒子和类别等,如不存在会在voc_eval函数生成ovthresh:重叠的阈值返回值:召回(召回率)、精度(准确率)、AP(平均精度)平均正确率
def _do_python_eval(self,output _ dir= output ):annopath=OS。路径。加入(自己)._devkit_path, VOC self ._年,批注, {:s} .XML )imageset file=OS。路径。加入(自己)._devkit_path, VOC self ._年,图像集,主,自我._image_set .txt )缓存目录=OS。路径。加入(自己)._devkit_path, annotations _ cache )APS=[]# 2010年更改的帕斯卡VOC度量use_07_metric=True if int(self ._year) 2010年其他假印刷( VOC07公制?(是如果使用_ 07 _ metric否则否))如果不是OS。路径。isdir(输出目录):OS。mkdir(output _ dir)for I,cls in enumerate(self ._ classes):if cls== _ _ background _ _ :continue filename=self ._get_voc_results_file_template().format(cls) rec,prec,ap=voc_eval( filename,annopath,imagesetfile,cls,cachedir,ovthresh=0.5,use _ 07 _ metric=use _ 07 _ metric)APS=[AP]print( AP for { }={:4f } .用open(OS)格式化(cls,AP))。路径。join(output _ dir,cls _pr.pkl ), wb) as f: pickle.dump({rec: rec, prec: prec, ap: ap},f) print(Mean AP={:4f}).格式(NP。mean(APS)))print( ~ ~ ~ ~ ~ ~ ~ ~ )print( Results:)for AP in APS:print( {:3f } ).格式(美联社))打印( {:3f} .格式(NP。意思是(APS)))打印( ~ ~ ~ ~ ~ ~ ~ ~ )打印()打印(-)打印(用**非官方** Python评估代码计算的结果打印(结果应该非常接近官方的MATLAB评估代码。)打印(用`。/tools/reval.py - matlab."给你的论文。")打印(-谢谢,管理层)打印(-)参考文章:https://www。金淑。B2 f 6389
https://blog.csdn.net/zouyu1746430162/article/details/53911555
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。