【TT100K中对test结果按照目标大小进行分类评估 anno_func.py】

2024-02-20 04:32

本文主要是介绍【TT100K中对test结果按照目标大小进行分类评估 anno_func.py】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

caffe 官方例程之R-CNN

def eval_annos(annos_gd, annos_rt, iou=0.75, imgids=None, check_type=True, types=None, minscore=40, minboxsize=0, maxboxsize=400, match_same=True):ac_n, ac_c = 0,0	#accuracyrc_n, rc_c = 0,0	#recallif imgids==None:imgids = annos_rt['imgs'].keys()	#字典 dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}if types!=None:							#key:valuetypes = { t:0 for t in types }		#类似{1: 0, 2: 0, 3: 0, 4: 0, 5: 0}miss = {"imgs":{}}	#字典的嵌套?wrong = {"imgs":{}}right = {"imgs":{}}for imgid in imgids:	#对于某一张图片v = annos_rt['imgs'][imgid]		#预测的图片vg = annos_gd['imgs'][imgid]	#实际的convert = lambda objs: [ [ obj['bbox'][key] for key in ['xmin','ymin','xmax','ymax']] for obj in objs]#不是常规的双层循环,按照括号来说,后面是外层循环#lambda x, y: x*y#函数输入是x和y,输出是它们的积x*yobjs_g = vg["objects"]	#实际的目标objs_r = v["objects"]	#预测的目标bg = convert(objs_g)	#实际的边框br = convert(objs_r)	#预测的边框match_g = [-1]*len(bg)	#边框是否匹配?一开始都是-1?列表的乘法即为重复match_r = [-1]*len(br)	#列表的加法为拼接if types!=None:for i in range(len(match_g)):if not types.has_key(objs_g[i][  'category']):#如果键在字典里返回true,否则返回false。match_g[i] = -2	#真实框的类别没有检测出来?真实框的类别不在设定的检测范围内?所以是没用的?for i in range(len(match_r)):if not types.has_key(objs_r[i]['category']):match_r[i] = -2 #预测框的类别没有检测出来?所以也是没用的?for i in range(len(match_r)):if objs_r[i].has_key('score') and objs_r[i]['score']<minscore:#我一直没找到这个score的定义,不知道这是个什么分数match_r[i] = -2	#分数太低就淘汰?就没用了?matches = []			#空的列表for i,boxg in enumerate(bg):	#枚举 enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)#组合为一个索引序列,同时列出下标和数据for j,boxr in enumerate(br):if match_g[i] == -2 or match_r[j] == -2:continue	#if continue的用法(跳过本次循环,执行下一个循环)if match_same and objs_g[i]['category'] != objs_r[j]['category']: continue	#分类不一样就淘汰?#match_same是传进来的参数tiou = calc_iou(boxg, boxr)		#如果分类一致就计算iou(不一定是同一个目标)if tiou>iou:					#大于输入的阈值,有可能是同一目标?matches.append((tiou, i, j))#列表中添加元组?matches = sorted(matches, key=lambda x:-x[0])	#按第一个元素(tiou)反向(由大到小)排列#lambda函数示例:#lambda x, y: x*y#函数输入是x和y,输出是它们的积x*yfor tiou, i, j in matches:if match_g[i] == -1 and match_r[j] == -1:	#不是-2就证明起码不是没用的?match_g[i] = jmatch_r[j] = i	#记录对应关系?for i in range(len(match_g)):boxsize = box_long_size(objs_g[i]['bbox'])erase = Falseif not (boxsize>=minboxsize and boxsize<maxboxsize):erase = True	#大小不符合就擦除?#if types!=None and not types.has_key(objs_g[i]['category']):#    erase = Trueif erase:if match_g[i] >= 0:match_r[match_g[i]] = -2	#match_g[i] = jmatch_g[i] = -2for i in range(len(match_r)):boxsize = box_long_size(objs_r[i]['bbox'])if match_r[i] != -1: continueif not (boxsize>=minboxsize and boxsize<maxboxsize):match_r[i] = -2	#??????预测框大小不符合也删掉?miss["imgs"][imgid] = {"objects":[]}wrong["imgs"][imgid] = {"objects":[]}right["imgs"][imgid] = {"objects":[]}miss_objs = miss["imgs"][imgid]["objects"]wrong_objs = wrong["imgs"][imgid]["objects"]right_objs = right["imgs"][imgid]["objects"]tt = 0for i in range(len(match_g)):if match_g[i] == -1:	#类别存在但没找到匹配对象miss_objs.append(objs_g[i])for i in range(len(match_r)):if match_r[i] == -1:	#类别存在但没找到匹配对象obj = copy.deepcopy(objs_r[i])obj['correct_catelog'] = 'none'wrong_objs.append(obj)elif match_r[i] != -2:	#类别存在且找到匹配对象j = match_r[i]      obj = copy.deepcopy(objs_r[i])if not check_type or objs_g[j]['category'] == objs_r[i]['category']:	#优先级&&如果分类一致right_objs.append(objs_r[i])tt+=1	#分类正确的计数else:		#分类不正确?obj['correct_catelog'] = objs_g[j]['category']wrong_objs.append(obj)rc_n += len(objs_g) - match_g.count(-2)	#计数 全部的真实框-没用的ac_n += len(objs_r) - match_r.count(-2)	#计数 全部的预测框-没用的ac_c += tt	#分类正确的计数rc_c += tt	#分类正确的计数if types==None:	#types是传进来的参数styps = "all"elif len(types)==1:styps = types.keys()[0]elif not check_type or len(types)==0:styps = "none"else:styps = "[%s, ...total %s...]"%(types.keys()[0], len(types))report = "iou:%s, size:[%s,%s), types:%s, accuracy:%s, recall:%s"% (iou, minboxsize, maxboxsize, styps, 1 if ac_n==0 else ac_c*1.0/ac_n, 1 if rc_n==0 else rc_c*1.0/rc_n)summury = {"iou":iou,"accuracy":1 if ac_n==0 else ac_c*1.0/ac_n,"recall":1 if rc_n==0 else rc_c*1.0/rc_n,"miss":miss,"wrong":wrong,"right":right,"report":report}return summury

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
25
25
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这篇关于【TT100K中对test结果按照目标大小进行分类评估 anno_func.py】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/727054

相关文章

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

linux解压缩 xxx.jar文件进行内部操作过程

《linux解压缩xxx.jar文件进行内部操作过程》:本文主要介绍linux解压缩xxx.jar文件进行内部操作,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、解压文件二、压缩文件总结一、解压文件1、把 xxx.jar 文件放在服务器上,并进入当前目录#

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

Linux使用scp进行远程目录文件复制的详细步骤和示例

《Linux使用scp进行远程目录文件复制的详细步骤和示例》在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令,它允许在远程主机之间复制文件和目录,... 目录1. 什么是scp?2. 语法3. 示例示例 1: 复制本地目录到远程主机示例 2: 复制远程主

windows系统上如何进行maven安装和配置方式

《windows系统上如何进行maven安装和配置方式》:本文主要介绍windows系统上如何进行maven安装和配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. Maven 简介2. maven的下载与安装2.1 下载 Maven2.2 Maven安装2.

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y