【实例分割|Detectron2】计算实例漏检数量
问题背景
对于单张图像中实例超过 100 的情形(maskrcnn 预测超过 100 个实例),难免会出现漏检的情形,通过代码实现对漏检数量的计算,作为评估的指标。
代码实现
计算 COCO 标签中实例数量
"""
从标签文件中计算每张图像中实例的数量
"""
import os
import json
import string
import numpy as np
def count_instances(json_path: string) -> dict:
with open(json_path,'rb') as f:
# 打印 json 文件的相关信息
data = json.load(f)
print("Keys: ", data.keys())
print("Images num: ", len(data["images"]))
print("Annotations num: ", len(data["annotations"]))
# 获取所有标签文件名称
file_name_list = []
for image in data["images"]:
file_name_list.append(image["file_name"])
# print("file_name list: ", file_name_list)
# 获取每个标签文件中的实例数量
count = np.zeros(len(data["images"]), dtype=int)
for annotation in data["annotations"]:
count[annotation["image_id"] - 1] = count[annotation["image_id"] - 1] + 1
# print("count list: ", count.tolist())
f.close()
return dict(zip(file_name_list, count))
if __name__ == "__main__":
path = "/home/zth/HardDisk/Datasets/nematode/origin_dataset/coco/annotations/instances_test.json"
print(count_instances(path))
结合 Detectron2 模型预测代码
if args.input:
# 从标签文件中统计实例数量
path = "/home/zth/HardDisk/Datasets/nematode/nematode_new/annotations/instances_test2017.json"
instance_num = count_instances(path)
print(instance_num)
if len(args.input) == 1:
args.input = glob.glob(os.path.expanduser(args.input[0]))
assert args.input, "The input path(s) was not found"
for path in tqdm.tqdm(args.input, disable=not args.output):
file_name = path.split("/")[-1]
# use PIL, to be consistent with evaluation
img = read_image(path, format="BGR")
start_time = time.time()
predictions, visualized_output, mask = demo.run_on_image(img)
logger.info(
"{}: {} in {:.2f}s".format(
path,
"detected {} instances".format(len(predictions["instances"]))
if "instances" in predictions
else "finished",
time.time() - start_time,
)
)
print(" 图像分辨率:", img.shape, "实例数量:", len(predictions["instances"]), " 漏检数量:", instance_num[file_name] - len(predictions["instances"]), " 误检率:", (instance_num[file_name] - len(predictions["instances"]))/len(predictions["instances"]))
智能推荐
JDK容器类Map源码解读
java.util.Map接口是JDK1.2开始提供的一个基于键值对的散列表接口,其设计的初衷是为了替换JDK1.0中的java.util.Dictionary抽象类。Dictionary是JDK最初的键值对类,它不可以存储null作为key和value,目前这个类早已不被使用了。目前都是在使用Map接口,它是可以存储null值作为key和value,但Map的key是不可以重复的。其常用的实现类...
vue移动端中手写一个树形结构业务,页面见里面
我这个业务需求是根据后台传给我的树形结构数据写的一个选择仓库的功能 由于一开始选框架选错了用cube ui 导致现在好多功能都必须自己写,所以才有了现在。 上图是我的第一级别 上图是我的最后一级 我这里实现是用的递归 首先当然是在页面写上获取仓库的接口啦 先上html js代码 可能注释不是很详细, 第一次发表这么长一段 有什么问题可以在下面说一下,我看到就回复...
WebRTC 系列文章 一对一视频通话和文字聊天
WebRTC 系列文章 一对一视频通话和文字聊天 环境准备 码代码 首先是信令服务器 引入依赖 信令服务器 网页 javascrpit 测试结果 这是WebRTC系列文章的第三篇。这次我们来实现一个可以一对一视频通话和有文字聊天功能的项目。 如果你对WebSocket、ICE、SDP、这些知识还不是很了解的话,推荐你先看下文章末尾的几篇推荐文章。 在此特别感谢 前端李老师的帮助 环境准备 桌面游览...
LeetCode -844. 比较含退格的字符串(栈、双指针)
比较含退格的字符串 方法一(栈): 方法二:双指针 一个字符是否会被删掉,只取决于该字符后面的退格符,而与该字符前面的退格符无关。因此当我们逆序地遍历字符串,就可以立即确定当前字符是否会被删掉。...
Java递归与迭代求斐波那契数列
Fibonacci 数列: 指的是这样一个数列:1、1、2、3、5、8、13、21、34……即从第三项开始,每一项等于它的前两项之和。 递归 程序调用自身的编程技巧称为递归。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的...
猜你喜欢
Redis(三):Redis的内存淘汰机制与持久化机制
一:Redis的内存淘汰机制 redis 设置过期时间 Redis中有个设置时间过期的功能,即对存储在 redis 数据库中的值可以设置一个过期时间。作为一个缓存数据库,这是非常实用的。如我们一般项目中的 token 或者一些登录信息,尤其是短信验证码都是有时间限制的,按照传统的数据库处理方式,一般都是自己判断过期,这样无疑会严重影响项目性能。 我们 set key 的时候,都可以给...
druid连接池配置监控页面
jdbc.properties相关配置 spring-content.xml相关配置 web.xml 相关配置 以上三种配置完成后输入localhost:8080/druid/index.jsp,监控页面显示如下图: ...
用基数排序实现单词按字典序排序(包含大写)
输入字符串的处理: 所以字符串中最长单词的长度为mxp 基数排序时将每一个长度小于mxp的字符串后位填补‘A’ 即Cards Cap中mxp=4,Cap–>CapAA 这样所有的字符串就统一长度。 代码:...
OsgEarth加载DEM高程切片
DEM数据下载 登录地理空间数据云,导航到高级检索,选择数据集(SRTMDEM 90M 分辨率原始高程数据),并设置好行政区进行检索。 DEM数据拼接 下载的SRTM数据为分块的*.img栅格数据,使用QGIS加载数据,并使用Raster -> Miscellaneous -> Merge... 工具拼接,并保存成*.tif格式。 DEM数据切片 osgea...